diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 9cbc0903429..412aa25ddf4 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -68,8 +68,6 @@ These are the few directives we have for project maintainers. These are not steadfast rules as maintainers are expected to use their best judgement when operating. -Our team is entirely voluntary, as such we extend our thanks to maintainers, issue managers, and contributors alike for helping keep the project alive. - ### Issue Managers @@ -94,6 +92,10 @@ For more information reference the [Issue Manager Guide](.github/guides/ISSUE_MA +--- + +Our team is entirely voluntary, as such we extend our thanks to maintainers, issue managers, and contributors alike for helping keep the project alive. + ## Development Guides #### Writing readable code diff --git a/.github/alternate_byond_versions.txt b/.github/alternate_byond_versions.txt index 111e573827e..e1496d438cd 100644 --- a/.github/alternate_byond_versions.txt +++ b/.github/alternate_byond_versions.txt @@ -5,4 +5,4 @@ # Format is version: map # Example: # 500.1337: runtimestation -515.1621: runtimestation +515.1627: runtimestation diff --git a/.github/guides/STYLE.md b/.github/guides/STYLE.md index 3c49962bcfb..c9b284bd338 100644 --- a/.github/guides/STYLE.md +++ b/.github/guides/STYLE.md @@ -474,7 +474,7 @@ deal_damage(10) // Fine! The proc name makes it obvious `10` is the damage...at deal_damage(10, FIRE) // Also fine! `FIRE` makes it obvious the second parameter is damage type. deal_damage(damage = 10) // Redundant, but not prohibited. -use_power(30) // Fine! `30` is obviously something like watts. +use_energy(30 JOULES) // Use energy in joules. turn_on(30) // Not fine! turn_on(power_usage = 30) // Fine! diff --git a/.github/workflows/auto_changelog.yml b/.github/workflows/auto_changelog.yml index 540b8a624bc..6c40415fd34 100644 --- a/.github/workflows/auto_changelog.yml +++ b/.github/workflows/auto_changelog.yml @@ -14,7 +14,7 @@ jobs: if: github.event.pull_request.merged == true steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Run auto changelog uses: actions/github-script@v6 with: diff --git a/.github/workflows/autowiki.yml b/.github/workflows/autowiki.yml index 91ab12cdb19..82d164e0c7c 100644 --- a/.github/workflows/autowiki.yml +++ b/.github/workflows/autowiki.yml @@ -20,10 +20,10 @@ jobs: echo "SECRETS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Restore BYOND cache if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/BYOND key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 79ddf2c65f7..216111097fe 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -22,40 +22,40 @@ jobs: group: run_linters-${{ github.head_ref || github.run_id }} cancel-in-progress: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore SpacemanDMM cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/SpacemanDMM key: ${{ runner.os }}-spacemandmm - name: Restore Yarn cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: Restore Node cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.nvm key: ${{ runner.os }}-node-${{ hashFiles('dependencies.sh') }} restore-keys: | ${{ runner.os }}-node- - name: Restore Bootstrap cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: tools/bootstrap/.cache key: ${{ runner.os }}-bootstrap-${{ hashFiles('tools/requirements.txt') }} restore-keys: | ${{ runner.os }}-bootstrap- - name: Restore Rust cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cargo key: ${{ runner.os }}-rust - name: Restore Cutter cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: tools/icon_cutter/cache key: ${{ runner.os }}-cutter-${{ hashFiles('dependencies.sh') }} @@ -123,9 +123,9 @@ jobs: group: compile_all_maps-${{ github.head_ref || github.run_id }} cancel-in-progress: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore BYOND cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/BYOND key: ${{ runner.os }}-byond @@ -152,7 +152,7 @@ jobs: group: find_all_maps-${{ github.head_ref || github.run_id }} cancel-in-progress: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Find Maps id: map_finder run: | @@ -219,10 +219,12 @@ jobs: name: Compare Screenshot Tests runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + - 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@v3 + uses: actions/download-artifact@v4 with: path: artifacts - name: ls -R @@ -243,7 +245,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@v3 + uses: actions/upload-artifact@v4 with: name: bad-screenshots path: artifacts/screenshot_comparisons @@ -257,9 +259,9 @@ jobs: group: test_windows-${{ github.head_ref || github.run_id }} cancel-in-progress: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore Yarn cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} diff --git a/.github/workflows/codeowner_reviews.yml.disabled b/.github/workflows/codeowner_reviews.yml.disabled index a461a96d931..a9e78b35136 100644 --- a/.github/workflows/codeowner_reviews.yml.disabled +++ b/.github/workflows/codeowner_reviews.yml.disabled @@ -10,7 +10,7 @@ jobs: steps: # Checks-out your repository under $GITHUB_WORKSPACE, so the job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 #Parse the Codeowner file - name: CodeOwnersParser diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 528db56a27e..6511f340625 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -31,7 +31,7 @@ jobs: sudo apt-get install dos2unix - name: "Checkout" if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 25 persist-credentials: false diff --git a/.github/workflows/docker_publish.yml b/.github/workflows/docker_publish.yml index e16b9e2f892..daf078d2d4c 100644 --- a/.github/workflows/docker_publish.yml +++ b/.github/workflows/docker_publish.yml @@ -10,7 +10,7 @@ jobs: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build and Publish Docker Image to Registry uses: elgohr/Publish-Docker-Github-Action@v5 diff --git a/.github/workflows/gbp.yml b/.github/workflows/gbp.yml index ef782f39814..221d0462e25 100644 --- a/.github/workflows/gbp.yml +++ b/.github/workflows/gbp.yml @@ -16,7 +16,7 @@ jobs: echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup git if: steps.value_holder.outputs.ACTIONS_ENABLED run: | @@ -24,7 +24,7 @@ jobs: git config --global user.email "<>" - name: Checkout alternate branch if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v3 + uses: actions/checkout@v4 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 a180cb9b8ef..4dd327abecd 100644 --- a/.github/workflows/gbp_collect.yml +++ b/.github/workflows/gbp_collect.yml @@ -18,7 +18,7 @@ jobs: echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v3 + uses: actions/checkout@v4 - 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@v3 + uses: actions/checkout@v4 with: ref: "gbp-balances" # The branch name path: gbp-balances diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 468eee78644..e2234ca7ee0 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -14,9 +14,9 @@ jobs: runs-on: ubuntu-22.04 concurrency: gen-docs steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/SpacemanDMM key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} diff --git a/.github/workflows/remove_guide_comments.yml b/.github/workflows/remove_guide_comments.yml new file mode 100644 index 00000000000..e3a4ac3feda --- /dev/null +++ b/.github/workflows/remove_guide_comments.yml @@ -0,0 +1,18 @@ +# Removes guide comments from PRs when opened, so that when we merge them +# and reuse the pull request description, the clutter is not left behind +name: Remove guide comments +on: + pull_request_target: + types: [opened] +jobs: + remove_guide_comments: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Remove guide comments + uses: actions/github-script@v6 + with: + script: | + const { removeGuideComments } = await import('${{ github.workspace }}/tools/pull_request_hooks/removeGuideComments.js') + await removeGuideComments({ github, context }) diff --git a/.github/workflows/rerun_flaky_tests.yml b/.github/workflows/rerun_flaky_tests.yml index 24c3ec95197..7f498de1443 100644 --- a/.github/workflows/rerun_flaky_tests.yml +++ b/.github/workflows/rerun_flaky_tests.yml @@ -10,7 +10,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.run_attempt == 1 }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Rerun flaky tests uses: actions/github-script@v6 with: @@ -22,7 +22,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.run_attempt == 2 }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Report flaky tests uses: actions/github-script@v6 with: diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index 404119d9880..368430162d3 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -28,9 +28,9 @@ jobs: - 3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore BYOND cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/BYOND key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} @@ -64,9 +64,9 @@ jobs: bash tools/ci/run_server.sh ${{ inputs.map }} - name: Upload screenshot tests if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: test_artifacts_${{ inputs.map }} + name: test_artifacts_${{ inputs.map }}_${{ inputs.major }}_${{ inputs.minor }} path: data/screenshots_new/ retention-days: 1 - name: Check client Compatibility diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml index f1f1dec2649..c61d09fa890 100644 --- a/.github/workflows/show_screenshot_test_results.yml +++ b/.github/workflows/show_screenshot_test_results.yml @@ -25,7 +25,7 @@ jobs: echo "SECRETS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Prepare module if: steps.secrets_set.outputs.SECRETS_ENABLED run: | diff --git a/.github/workflows/test_merge_bot.yml b/.github/workflows/test_merge_bot.yml index 4eb62752c06..c77e5077944 100644 --- a/.github/workflows/test_merge_bot.yml +++ b/.github/workflows/test_merge_bot.yml @@ -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@v3 + uses: actions/checkout@v4 - 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 6a9316f493a..bd538307aa3 100644 --- a/.github/workflows/tgs_test.yml +++ b/.github/workflows/tgs_test.yml @@ -62,7 +62,7 @@ jobs: dotnet-version: 8.0.x - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - 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 aae81f7e0d8..15d45b7935f 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -11,7 +11,7 @@ jobs: name: Update the TGS DMAPI steps: - name: Clone - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Branch run: | diff --git a/.tgs.yml b/.tgs.yml index 880ca67a61b..76a53577b50 100644 --- a/.tgs.yml +++ b/.tgs.yml @@ -3,7 +3,7 @@ version: 1 # The BYOND version to use (kept in sync with dependencies.sh by the "TGS Test Suite" CI job) # Must be interpreted as a string, keep quoted -byond: "515.1630" +byond: "515.1633" # Folders to create in "/Configuration/GameStaticFiles/" static_files: # Config directory should be static diff --git a/.vscode/launch.json b/.vscode/launch.json index 42a293a3338..bf3a209531d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,6 +8,13 @@ "preLaunchTask": "Build All", "dmb": "${workspaceFolder}/${command:CurrentDMB}" }, + { + "type": "byond", + "request": "launch", + "name": "Launch DreamSeeker (low memory mode)", + "preLaunchTask": "Build All (low memory mode)", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + }, { "type": "byond", "request": "launch", @@ -16,6 +23,14 @@ "dmb": "${workspaceFolder}/${command:CurrentDMB}", "dreamDaemon": true }, + { + "type": "byond", + "request": "launch", + "name": "Launch DreamDaemon (low memory mode)", + "preLaunchTask": "Build All (low memory mode)", + "dmb": "${workspaceFolder}/${command:CurrentDMB}", + "dreamDaemon": true + }, { "name": "Debug External Libraries", "type": "cppvsdbg", @@ -27,6 +42,18 @@ "-trusted" ], "preLaunchTask": "Build All" + }, + { + "name": "Debug External Libraries (low memory mode)", + "type": "cppvsdbg", + "request": "launch", + "program": "${command:dreammaker.returnDreamDaemonPath}", + "cwd": "${workspaceRoot}", + "args": [ + "${command:dreammaker.getFilenameDmb}", + "-trusted" + ], + "preLaunchTask": "Build All (low memory mode)" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 35e9fafdb33..d7c1bfc1d1e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,6 +13,7 @@ }, "files.eol": "\n", "files.insertFinalNewline": true, + "git.branchProtection": ["master"], "gitlens.advanced.blame.customArguments": ["-w"], "tgstationTestExplorer.project.resultsType": "json", "[javascript]": { diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 711a13c7846..18fb2fde152 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -24,6 +24,30 @@ "dependsOn": "dm: reparse", "label": "Build All" }, + { + "type": "process", + "command": "tools/build/build", + "args": ["-DLOWMEMORYMODE"], + "windows": { + "command": ".\\tools\\build\\build.bat", + "args": ["-DLOWMEMORYMODE"] + }, + "options": { + "env": { + "DM_EXE": "${config:dreammaker.byondPath}" + } + }, + "problemMatcher": [ + "$dreammaker", + "$tsc", + "$eslint-stylish" + ], + "group": { + "kind": "build" + }, + "dependsOn": "dm: reparse", + "label": "Build All (low memory mode)" + }, { "type": "dreammaker", "dme": "tgstation.dme", diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_smoking_room.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_smoking_room.dmm index 7d422677278..faa5cf18ae9 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_smoking_room.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_smoking_room.dmm @@ -54,6 +54,10 @@ /obj/structure/chair/comfy{ dir = 1 }, +/obj/effect/decal/remains/human/smokey{ + pixel_x = -3; + pixel_y = 9 + }, /turf/open/floor/carpet/blue, /area/ruin/smoking_room/room) "k" = ( @@ -245,11 +249,6 @@ /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) "R" = ( -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/effect/decal/cleanable/ash/large{ - pixel_x = -1; - pixel_y = 5 - }, /obj/structure/showcase/machinery/tv/broken, /turf/open/floor/carpet/blue, /area/ruin/smoking_room/room) @@ -279,17 +278,12 @@ /turf/open/floor/stone, /area/ruin/smoking_room/house) "W" = ( -/obj/effect/spawner/random/entertainment/cigarette_pack, /obj/structure/chair/plastic{ dir = 8 }, /obj/effect/spawner/random/entertainment/cigarette_pack, /obj/effect/decal/cleanable/ash/large, /obj/structure/sign/calendar/directional/east, -/obj/effect/decal/remains/human/smokey{ - pixel_x = -3; - pixel_y = 9 - }, /turf/open/floor/carpet/blue, /area/ruin/smoking_room/room) "X" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index 356bed29f9f..f344652d623 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -2601,9 +2601,7 @@ pixel_x = 15; pixel_y = 14 }, -/mob/living/basic/frog{ - name = "Peter Jr." - }, +/mob/living/basic/frog/icemoon_facility, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/operations) "TK" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm index fdfb9632b76..df0bf1c0880 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm @@ -69,6 +69,11 @@ /obj/machinery/hydroponics/soil, /turf/open/floor/grass/fairy, /area/ruin/powered/hermit) +"vy" = ( +/obj/item/cultivator/rake, +/obj/item/cultivator, +/turf/open/floor/grass/fairy, +/area/ruin/powered/hermit) "wf" = ( /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, /obj/structure/table/wood, @@ -326,7 +331,7 @@ ph ph uw bp -bp +vy bp WK gr diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm index 808fb0cba60..a32777c4440 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm @@ -145,7 +145,7 @@ }, /area/ruin/unpowered/buried_library) "aO" = ( -/mob/living/basic/pet/fox, +/mob/living/basic/pet/fox/icemoon, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, @@ -327,7 +327,7 @@ /area/ruin/unpowered/buried_library) "cA" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/basic/pet/fox, +/mob/living/basic/pet/fox/icemoon, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, @@ -394,7 +394,7 @@ /obj/structure/fluff/paper{ dir = 1 }, -/mob/living/basic/pet/fox, +/mob/living/basic/pet/fox/icemoon, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, diff --git a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm index 53732130d59..2fd52e14425 100644 --- a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm +++ b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm @@ -5793,6 +5793,13 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/bar) +"Lu" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/ruin/syndicate_lava_base/main) "Lw" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 1 @@ -9105,7 +9112,7 @@ pI xc Uo Tm -cu +Lu Yf rv us diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm new file mode 100644 index 00000000000..ef32d3e8ed9 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm @@ -0,0 +1,1244 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aK" = ( +/obj/structure/rack, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/effect/spawner/random/entertainment/lighter, +/obj/effect/spawner/random/entertainment/lighter, +/obj/effect/spawner/random/entertainment/lighter, +/obj/machinery/light/directional/south, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"bT" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"ck" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"dm" = ( +/obj/machinery/door/airlock/engineering, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"fy" = ( +/obj/machinery/light/directional/south, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/machinery/light/directional/north, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"fF" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"fH" = ( +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"fX" = ( +/obj/structure/sink/directional/east{ + has_water_reclaimer = 0 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"go" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"ia" = ( +/obj/effect/spawner/random/structure/billboard/lizardsgas, +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"iK" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/advanced, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"jY" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/rack, +/obj/item/reagent_containers/condiment/yoghurt{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/reagent_containers/condiment/yoghurt{ + pixel_x = 6; + pixel_y = -1 + }, +/turf/open/floor/iron/freezer, +/area/ruin/lizard_gaslava) +"ks" = ( +/obj/structure/sign/warning/fire/directional/north, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"mn" = ( +/obj/structure/reagent_dispensers/plumbed/fuel, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"mz" = ( +/obj/structure/rack, +/obj/item/food/candy, +/obj/item/food/candy, +/obj/item/food/candy, +/obj/item/food/chocolatebar, +/obj/item/food/chocolatebar{ + pixel_y = 3 + }, +/obj/item/food/chocolatebar{ + pixel_y = 6 + }, +/obj/structure/sign/poster/contraband/hacking_guide/directional/north, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"mG" = ( +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"mY" = ( +/obj/effect/spawner/random/structure/billboard/lizardsgas, +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"nc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"ng" = ( +/obj/machinery/door/airlock/external/ruin, +/turf/open/floor/plating, +/area/ruin/lizard_gaslava) +"om" = ( +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"pp" = ( +/obj/structure/sign/poster/contraband/jumbo_bar/directional/east, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"pJ" = ( +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"rM" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/rack, +/obj/item/food/cheese/mozzarella{ + pixel_y = 5; + pixel_x = -5 + }, +/obj/item/food/cheese/mozzarella{ + pixel_y = -4; + pixel_x = 1 + }, +/obj/item/food/cheese/wheel, +/obj/item/food/cheese/cheese_curds, +/obj/item/food/cheese/curd_cheese, +/turf/open/floor/iron/freezer, +/area/ruin/lizard_gaslava) +"sY" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/plating, +/area/ruin/lizard_gaslava) +"tD" = ( +/obj/structure/rack, +/obj/item/food/chips{ + pixel_x = 7 + }, +/obj/item/food/chips{ + pixel_y = 7; + pixel_x = -4 + }, +/obj/item/food/chips/shrimp{ + pixel_y = 10; + pixel_x = 7 + }, +/obj/item/food/chips/shrimp{ + pixel_y = -4; + pixel_x = -5 + }, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"ub" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"uV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"vt" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/components/tank/oxygen{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"vH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"wl" = ( +/obj/structure/sink/directional/west{ + has_water_reclaimer = 0 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"xH" = ( +/obj/machinery/light/directional/south, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"xW" = ( +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"yH" = ( +/obj/structure/rack, +/obj/item/food/sticko/nutty{ + pixel_y = 5; + pixel_x = -5 + }, +/obj/item/food/sticko{ + pixel_y = 2; + pixel_x = 6 + }, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Ag" = ( +/obj/structure/table, +/obj/item/coffee_cartridge, +/obj/item/coffee_cartridge, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"Ao" = ( +/obj/structure/sign/poster/contraband/tipper_cream_soda/directional/south, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Bf" = ( +/mob/living/basic/lizard, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"BH" = ( +/obj/structure/table/reinforced, +/obj/item/food/hotdog{ + pixel_y = 4; + pixel_x = -2 + }, +/obj/item/food/hotdog{ + pixel_y = -3; + pixel_x = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"BX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"DI" = ( +/turf/template_noop, +/area/template_noop) +"Ef" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Eh" = ( +/obj/structure/table/reinforced, +/obj/item/food/honeybar{ + pixel_y = 5; + pixel_x = -1 + }, +/obj/item/food/honeybar{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/food/honeybar{ + pixel_y = 8; + pixel_x = -1 + }, +/obj/item/food/honeybar{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/food/granola_bar{ + pixel_y = 9; + pixel_x = -1 + }, +/obj/item/food/granola_bar{ + pixel_y = 6; + pixel_x = 2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"El" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/rack, +/obj/item/food/popsicle/creamsicle_berry{ + pixel_y = 4; + pixel_x = -1 + }, +/obj/item/food/popsicle/creamsicle_berry{ + pixel_y = 1; + pixel_x = 5 + }, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/creamsicle_orange{ + pixel_y = 6; + pixel_x = 3 + }, +/turf/open/floor/iron/freezer, +/area/ruin/lizard_gaslava) +"Es" = ( +/obj/structure/sign/warning/fire/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"EA" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/rack, +/obj/item/storage/fancy/egg_box, +/obj/item/storage/fancy/egg_box{ + pixel_y = 9 + }, +/obj/item/storage/fancy/pickles_jar, +/turf/open/floor/iron/freezer, +/area/ruin/lizard_gaslava) +"FA" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"FC" = ( +/obj/structure/sign/poster/fluff/lizards_gas_power/directional/west, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"FL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Gv" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/food/sandwich/blt{ + pixel_y = 6; + pixel_x = -2 + }, +/obj/item/food/little_shiro_sandwich{ + pixel_y = 1 + }, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"GK" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"HI" = ( +/obj/structure/table/reinforced, +/obj/structure/closet/mini_fridge{ + pixel_y = 5 + }, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"HL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"HS" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/rack, +/obj/item/food/cornuto{ + pixel_y = 4; + pixel_x = -3 + }, +/obj/item/food/cornuto{ + pixel_y = -5; + pixel_x = 2 + }, +/obj/item/food/cornuto{ + pixel_y = 5; + pixel_x = 6 + }, +/obj/item/food/cornuto{ + pixel_y = -5; + pixel_x = -3 + }, +/turf/open/floor/iron/freezer, +/area/ruin/lizard_gaslava) +"HW" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/ruin/lizard_gaslava) +"IU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"JX" = ( +/obj/structure/railing, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"Kl" = ( +/obj/structure/rack, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Km" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"KJ" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"Mv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/west, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Nr" = ( +/obj/structure/window/plasma/spawner/directional/west, +/obj/structure/window/spawner/directional/east, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/ruin/lizard_gaslava) +"Ov" = ( +/obj/structure/table, +/obj/machinery/coffeemaker{ + pixel_y = 5 + }, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"PS" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/obj/machinery/power/rtg/advanced, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"Qb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Qt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Rq" = ( +/obj/machinery/computer/security/telescreen/bar{ + pixel_y = -32 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"RA" = ( +/turf/closed/wall, +/area/ruin/lizard_gaslava) +"RK" = ( +/obj/machinery/light/directional/east, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"SL" = ( +/obj/machinery/duct, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"SZ" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"TA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"Uk" = ( +/obj/machinery/duct, +/obj/machinery/light/directional/north, +/turf/open/misc/ashplanet/rocky, +/area/ruin/lizard_gaslava) +"UK" = ( +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/turf/open/floor/iron/smooth, +/area/ruin/lizard_gaslava) +"VD" = ( +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Wa" = ( +/obj/structure/rack, +/obj/item/reagent_containers/condiment/vegetable_oil{ + pixel_y = 5; + pixel_x = -1 + }, +/obj/item/reagent_containers/condiment/vegetable_oil{ + pixel_y = 1; + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/olive_oil, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) +"Xe" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/rack, +/obj/item/storage/cans/sixbeer, +/obj/item/storage/cans/sixsoda, +/turf/open/floor/iron/freezer, +/area/ruin/lizard_gaslava) +"Zf" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/iron, +/area/ruin/lizard_gaslava) + +(1,1,1) = {" +DI +DI +DI +fF +fF +mY +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +ia +mG +mG +DI +DI +"} +(2,1,1) = {" +DI +DI +DI +fH +fH +fH +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +fH +fH +fH +DI +DI +"} +(3,1,1) = {" +DI +DI +DI +fH +fH +fH +DI +DI +ub +FA +FA +FA +FA +FA +FA +FA +FA +GK +DI +DI +fH +fH +fH +DI +DI +"} +(4,1,1) = {" +DI +DI +DI +fH +fH +fH +DI +DI +KJ +fH +SL +SL +SL +SL +SL +SL +SL +JX +DI +DI +fH +fH +fH +DI +DI +"} +(5,1,1) = {" +DI +DI +DI +fH +fH +fH +om +fH +fH +fH +wl +fH +wl +wl +fH +wl +SL +fH +fH +om +fH +fH +fH +DI +DI +"} +(6,1,1) = {" +DI +DI +DI +fH +fH +fH +om +fH +fH +xH +RA +fy +RA +RA +fy +RA +Uk +fH +fH +om +fH +fH +fH +DI +DI +"} +(7,1,1) = {" +DI +DI +DI +fH +fH +fH +om +fH +fH +fH +fX +fH +fX +fX +fH +fX +SL +fH +fH +om +fH +fH +fH +DI +DI +"} +(8,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +fH +fH +SL +SL +SL +SL +SL +SL +SL +fH +DI +DI +DI +DI +DI +DI +DI +"} +(9,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +RK +fH +fH +fH +fH +fH +fH +SL +fH +RK +DI +DI +DI +DI +DI +DI +DI +"} +(10,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +RA +Nr +Nr +Nr +RA +RA +RA +HW +ng +RA +DI +DI +DI +DI +DI +DI +DI +"} +(11,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +RA +Kl +xW +HI +Mv +aK +RA +ks +Es +RA +DI +DI +DI +DI +DI +DI +DI +"} +(12,1,1) = {" +DI +DI +DI +RA +RA +RA +RA +RA +RA +tD +VD +Gv +Bf +Rq +RA +nc +vH +RA +DI +DI +DI +DI +DI +DI +DI +"} +(13,1,1) = {" +DI +DI +DI +RA +Ov +FC +mn +vt +RA +mz +Qt +Km +bT +Zf +RA +sY +ng +RA +DI +DI +DI +DI +DI +DI +DI +"} +(14,1,1) = {" +DI +DI +DI +RA +Ag +pJ +TA +ck +dm +SZ +SZ +HL +SZ +HL +SZ +SZ +IU +RA +DI +DI +DI +DI +DI +DI +DI +"} +(15,1,1) = {" +DI +DI +DI +RA +UK +go +iK +PS +RA +Qt +Qb +xW +xW +jY +El +HS +uV +RA +DI +DI +DI +DI +DI +DI +DI +"} +(16,1,1) = {" +DI +DI +DI +RA +RA +RA +RA +RA +RA +xW +BH +yH +Qt +xW +VD +Qt +Ao +RA +DI +DI +DI +DI +DI +DI +DI +"} +(17,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +RA +xW +Ef +xW +xW +rM +EA +Xe +xW +RA +DI +DI +DI +DI +DI +DI +DI +"} +(18,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +RA +FL +Wa +Eh +xW +Qt +pp +xW +BX +RA +DI +DI +DI +DI +DI +DI +DI +"} +(19,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +RA +RA +RA +RA +RA +RA +RA +RA +RA +RA +DI +DI +DI +DI +DI +DI +DI +"} +(20,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +"} +(21,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +"} +(22,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +"} +(23,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +"} +(24,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +"} +(25,1,1) = {" +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +DI +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index f05c972ec35..5653125ca0e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -208,9 +208,7 @@ "nq" = ( /obj/effect/decal/cleanable/cobweb, /obj/machinery/light/small/directional/north, -/mob/living/basic/pet/dog/bullterrier{ - name = "Saint Nick's Helpful Associate" - }, +/mob/living/basic/pet/dog/bullterrier/lavaland_party, /turf/open/floor/carpet/blue/lavaland, /area/ruin/unpowered) "nI" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm index 3cf1169c0bb..e7a854d6bde 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm @@ -33,7 +33,7 @@ /area/ruin/unpowered/xenonest) "j" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) "l" = ( @@ -55,7 +55,7 @@ /area/ruin/unpowered/xenonest) "t" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) "u" = ( @@ -103,18 +103,18 @@ /area/ruin/unpowered/xenonest) "E" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) "F" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/queen/large{ +/mob/living/basic/alien/queen/large{ desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; name = "alien queen"; pixel_x = -16; - plants_off = 1 + can_plant_weeds = 0 }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) @@ -137,13 +137,13 @@ /area/ruin/unpowered/xenonest) "K" = ( /obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) "L" = ( /obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) @@ -160,8 +160,8 @@ "Q" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) diff --git a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm index d36c5a8b111..9ce70d4d7b1 100644 --- a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm +++ b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm @@ -243,17 +243,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) -"nq" = ( -/obj/machinery/shower/directional/east, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/item/soap, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/allamericandiner) "nr" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -359,6 +348,13 @@ "rd" = ( /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) +"ri" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Trash Dumpster" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/ruin/space/has_grav/allamericandiner) "rG" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/decal/cleanable/dirt, @@ -601,17 +597,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/allamericandiner) -"CF" = ( -/obj/machinery/shower/directional/west, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/item/soap, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/allamericandiner) "Du" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/condiment/peppermill{ @@ -627,6 +612,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"DD" = ( +/obj/machinery/shower/directional/east, +/obj/structure/fluff/shower_drain, +/obj/item/soap, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "DQ" = ( /obj/structure/chair/sofa/right/maroon, /obj/effect/decal/cleanable/dirt, @@ -638,6 +629,13 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"DZ" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Kitchen" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/allamericandiner) "Eo" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -772,13 +770,6 @@ /obj/item/paper/fluff/ruins/allamericandiner, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) -"Ic" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Kitchen" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/kitchen/small, -/area/ruin/space/has_grav/allamericandiner) "Id" = ( /obj/structure/window/reinforced/tinted/spawner/directional/west, /obj/effect/turf_decal/siding/green{ @@ -961,6 +952,12 @@ /obj/item/storage/dice, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"OJ" = ( +/obj/machinery/shower/directional/west, +/obj/structure/fluff/shower_drain, +/obj/item/soap, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "Ph" = ( /obj/structure/chair/sofa/left/maroon{ dir = 4 @@ -1141,13 +1138,6 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/allamericandiner) -"Vn" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Trash Dumpster" - }, -/obj/structure/plasticflaps, -/turf/open/floor/plating, -/area/ruin/space/has_grav/allamericandiner) "Vq" = ( /obj/structure/table/reinforced, /obj/machinery/light/dim/directional/east, @@ -1567,7 +1557,7 @@ oN EK pa Is -Ic +DZ Xw Du FB @@ -2093,7 +2083,7 @@ Kp jx Kp Lp -CF +OJ EK oN oN @@ -2167,7 +2157,7 @@ YX Im YX bE -nq +DD EK oN oN @@ -2229,7 +2219,7 @@ Bn wC qB qB -Vn +ri ck fz vA diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index 2383c4688e3..84a3a2658d3 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -2483,12 +2483,7 @@ pixel_x = 15; pixel_y = 12 }, -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/machinery/shower/directional/east, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/dangerous_research/dorms) diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm index 2123b838f94..114009a169f 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm @@ -78,7 +78,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "hH" = ( -/obj/structure/spider/solid, +/obj/structure/spider/stickyweb/sealed/tough, /obj/item/book/manual/wiki/cytology, /obj/effect/decal/cleanable/plastic, /turf/open/floor/plating, @@ -122,7 +122,7 @@ /area/ruin/space/has_grav/garbagetruck/toystore) "lm" = ( /obj/structure/spider/stickyweb, -/obj/structure/spider/sticky, +/obj/structure/spider/stickyweb/very_sticky, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "mf" = ( @@ -182,7 +182,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "qX" = ( -/obj/structure/spider/sticky, +/obj/structure/spider/stickyweb/very_sticky, /obj/item/food/badrecipe/moldy, /obj/structure/spider/stickyweb, /obj/item/food/spidereggs{ @@ -255,7 +255,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "ts" = ( -/obj/structure/spider/solid, +/obj/structure/spider/stickyweb/sealed/tough, /obj/structure/spider/stickyweb, /obj/structure/closet/crate/trashcart/filled, /turf/open/floor/plating, @@ -840,7 +840,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "XI" = ( -/obj/structure/spider/solid, +/obj/structure/spider/stickyweb/sealed/tough, /obj/item/food/badrecipe/moldy/bacteria, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index c3d6f44415c..1707e06d3c4 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -8,14 +8,6 @@ /obj/structure/sign/warning/biohazard/directional/north, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"ah" = ( -/obj/machinery/door/window/survival_pod/left/directional/east, -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 5 - }, -/obj/item/stack/cable_coil/cut, -/turf/open/floor/mineral/titanium/tiled/purple, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "am" = ( /obj/machinery/research/anomaly_refinery, /turf/open/floor/plating/airless, @@ -72,18 +64,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"cz" = ( -/obj/structure/rack, -/obj/item/reagent_containers/syringe/bluespace{ - pixel_y = 2 - }, -/obj/item/reagent_containers/syringe/bluespace{ - pixel_y = 8 - }, -/obj/structure/window/reinforced/survival_pod/spawner/directional/east, -/obj/machinery/door/window/survival_pod/left/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "cE" = ( /obj/structure/closet{ desc = "It's a storage unit for mining."; @@ -192,11 +172,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"fL" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "fQ" = ( /obj/structure/hedge/opaque, /turf/open/floor/iron/grimy, @@ -315,14 +290,6 @@ }, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"iC" = ( -/obj/machinery/door/window/survival_pod/left/directional/east, -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/tiled/purple, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "iO" = ( /obj/structure/girder/displaced, /turf/open/floor/engine, @@ -360,19 +327,13 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"jB" = ( -/obj/effect/decal/remains/human, -/obj/machinery/door/window/survival_pod/left/directional/east, -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 6 - }, -/turf/open/floor/mineral/titanium/tiled/purple, +"jt" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/turf/open/floor/carpet/black, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "jC" = ( -/mob/living/simple_animal/slime{ - rabid = 1; - slime_type = /datum/slime_type/bluespace - }, +/mob/living/basic/slime/hilbert, /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) @@ -513,6 +474,14 @@ /obj/item/transfer_valve, /turf/open/floor/plating/airless, /area/ruin/space) +"mz" = ( +/obj/structure/rack, +/obj/item/clothing/suit/bio_suit/cmo, +/obj/item/clothing/head/bio_hood/cmo, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/machinery/door/window/survival_pod/left/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "mC" = ( /obj/machinery/chem_mass_spec, /turf/open/floor/mineral/titanium/tiled/blue, @@ -530,10 +499,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"mV" = ( -/obj/machinery/transport/tram_controller/hilbert, -/turf/closed/indestructible/riveted/plastinum/nodiagonal, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "ng" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -559,6 +524,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"nv" = ( +/obj/structure/rack, +/obj/item/reagent_containers/syringe/bluespace{ + pixel_y = 2 + }, +/obj/item/reagent_containers/syringe/bluespace{ + pixel_y = 8 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/machinery/door/window/survival_pod/left/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "nx" = ( /obj/machinery/door/window/left/directional/south, /obj/effect/decal/cleanable/dirt, @@ -574,6 +551,12 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"nK" = ( +/obj/structure/rack, +/obj/item/gun/syringe, +/obj/machinery/door/window/survival_pod/left/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "nM" = ( /obj/structure/lattice, /turf/template_noop, @@ -597,6 +580,14 @@ /obj/item/assembly/signaler, /turf/open/floor/plating/airless, /area/ruin/space) +"nY" = ( +/obj/machinery/door/window/survival_pod/left/directional/east, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 5 + }, +/obj/item/stack/cable_coil/cut, +/turf/open/floor/mineral/titanium/tiled/purple, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "og" = ( /obj/item/slime_extract/bluespace, /obj/effect/decal/cleanable/dirt, @@ -673,6 +664,18 @@ }, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"qj" = ( +/obj/machinery/door/window/survival_pod/left/directional/west, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/tiled/purple, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"qC" = ( +/obj/machinery/transport/tram_controller/hilbert, +/turf/closed/indestructible/riveted/plastinum/nodiagonal, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "qI" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/stack/sheet/bluespace_crystal{ @@ -738,14 +741,6 @@ "sj" = ( /turf/open/floor/circuit/green/anim, /area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom) -"sn" = ( -/obj/machinery/door/window/survival_pod/left/directional/west, -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/tiled/purple, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "sz" = ( /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/hilbertresearchfacility) @@ -804,13 +799,6 @@ /obj/structure/thermoplastic/light, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"ud" = ( -/obj/machinery/door/window/survival_pod/left/directional/west, -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 9 - }, -/turf/open/floor/mineral/titanium/tiled/purple, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "uf" = ( /obj/effect/turf_decal/trimline/neutral/arrow_cw, /obj/effect/turf_decal/trimline/neutral/mid_joiner, @@ -902,10 +890,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "wY" = ( -/mob/living/simple_animal/slime{ - rabid = 1; - slime_type = /datum/slime_type/bluespace - }, +/mob/living/basic/slime/hilbert, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "xb" = ( @@ -1231,6 +1216,13 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"CB" = ( +/obj/machinery/door/window/survival_pod/left/directional/west, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 10 + }, +/turf/open/floor/mineral/titanium/tiled/purple, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "CO" = ( /turf/open/floor/glass, /area/ruin/space/has_grav/powered/hilbertresearchfacility) @@ -1361,6 +1353,13 @@ /obj/item/paper_bin, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Fy" = ( +/obj/machinery/door/window/survival_pod/left/directional/west, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 9 + }, +/turf/open/floor/mineral/titanium/tiled/purple, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "FB" = ( /obj/structure/table/wood, /obj/item/lighter, @@ -1387,6 +1386,15 @@ /obj/structure/table/reinforced, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Gr" = ( +/obj/machinery/door/window/survival_pod/left/directional/west, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/slime/hilbert, +/turf/open/floor/mineral/titanium/tiled/purple, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Gs" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 8 @@ -1425,18 +1433,6 @@ /obj/structure/filingcabinet, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Ht" = ( -/obj/machinery/door/window/survival_pod/left/directional/west, -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/slime{ - rabid = 1; - slime_type = /datum/slime_type/bluespace - }, -/turf/open/floor/mineral/titanium/tiled/purple, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Hu" = ( /obj/machinery/door/puzzle/keycard/hilbert, /turf/open/floor/mineral/plastitanium, @@ -1594,6 +1590,14 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"JW" = ( +/obj/effect/decal/remains/human, +/obj/machinery/door/window/survival_pod/left/directional/east, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 6 + }, +/turf/open/floor/mineral/titanium/tiled/purple, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Kd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/wooden, @@ -1620,14 +1624,6 @@ /obj/structure/fluff/tram_rail/end, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Li" = ( -/obj/structure/rack, -/obj/item/clothing/suit/bio_suit/cmo, -/obj/item/clothing/head/bio_hood/cmo, -/obj/structure/window/reinforced/survival_pod/spawner/directional/west, -/obj/machinery/door/window/survival_pod/left/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Lr" = ( /obj/machinery/photocopier, /turf/open/floor/wood, @@ -1995,6 +1991,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"SL" = ( +/obj/machinery/door/window/survival_pod/left/directional/east, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/tiled/purple, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "SR" = ( /obj/structure/railing{ dir = 4 @@ -2162,13 +2166,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"WE" = ( -/obj/machinery/door/window/survival_pod/left/directional/west, -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 10 - }, -/turf/open/floor/mineral/titanium/tiled/purple, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "WI" = ( /obj/structure/table/wood, /obj/item/food/cornchips/blue, @@ -2289,10 +2286,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Ze" = ( -/mob/living/simple_animal/slime{ - rabid = 1; - slime_type = /datum/slime_type/bluespace - }, +/mob/living/basic/slime/hilbert, /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) @@ -2303,12 +2297,6 @@ }, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Zs" = ( -/obj/structure/rack, -/obj/item/gun/syringe, -/obj/machinery/door/window/survival_pod/left/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Zy" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/siding/wood{ @@ -3151,7 +3139,7 @@ Bo Bo Bo Bo -cz +nv sz Bo Dk @@ -3190,7 +3178,7 @@ Dk Dk Dk Bo -Li +mz te Bo Dk @@ -3230,7 +3218,7 @@ Dk Dk Bo Ok -Zs +nK Bo Dk Dk @@ -3593,11 +3581,11 @@ Bo Bk Bk Bo -ah -jB +nY +JW Bo -iC -jB +SL +JW Bo Dk Dk @@ -3662,7 +3650,7 @@ ZV YV Ok Bo -mV +qC Xi hk KC @@ -3905,11 +3893,11 @@ Bo Dk Dk Bo -sn -WE +qj +CB Bo -ud -Ht +Fy +Gr Bo Dk Dk @@ -4336,7 +4324,7 @@ Dk Dk Bo Th -fL +jt az Bo Vn @@ -4379,7 +4367,7 @@ Bo Cq Bo Th -fL +jt az Bo Dk @@ -4539,7 +4527,7 @@ BY BY OA az -fL +jt Bo "} (57,1,1) = {" @@ -4649,7 +4637,7 @@ Dk Dk Bo Th -fL +jt az Bo Gi diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index e0e6ecb6629..8eba06813a8 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "ab" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium, @@ -368,7 +368,7 @@ /turf/template_noop, /area/ruin/space/has_grav/infested_frigate) "eE" = ( -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /obj/structure/cable, @@ -451,7 +451,6 @@ /obj/effect/turf_decal/tile/bar, /obj/structure/table/reinforced, /obj/structure/closet/mini_fridge/grimy{ - anchored = 1; pixel_y = 6 }, /obj/effect/spawner/random/food_or_drink/refreshing_beverage, @@ -865,7 +864,7 @@ /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) "nG" = ( -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium/red, @@ -1253,7 +1252,7 @@ icon_state = "warningline_red"; dir = 4 }, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/pod/dark, @@ -1348,8 +1347,7 @@ }, /obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, /obj/structure/bed/nest, -/mob/living/simple_animal/hostile/alien/drone{ - del_on_death = 1; +/mob/living/basic/alien/drone{ loot = list(/obj/effect/gibspawner/xeno); faction = list("syndicate","xenomorph") }, @@ -1408,7 +1406,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium, @@ -1496,7 +1494,7 @@ icon_state = "gib1-old" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium/red, @@ -1556,7 +1554,7 @@ /obj/item/ammo_casing/spent, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium/red, @@ -1664,7 +1662,7 @@ /obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, /obj/item/ammo_casing/spent, /obj/item/ammo_casing/spent, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/titanium/tiled/white, @@ -1941,8 +1939,7 @@ /area/ruin/space/has_grav/infested_frigate) "ER" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/alien/sentinel{ - del_on_death = 1; +/mob/living/basic/alien/sentinel{ loot = list(/obj/effect/gibspawner/xeno); faction = list("syndicate","xenomorph") }, @@ -1958,7 +1955,7 @@ /obj/effect/decal/cleanable/glass, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium/red, @@ -2050,7 +2047,7 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium/red, @@ -2077,7 +2074,7 @@ icon_state = "gib1-old" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium, @@ -2098,7 +2095,7 @@ icon_state = "xgibhead"; dir = 4 }, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium, @@ -2201,7 +2198,7 @@ /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) "Jx" = ( -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium, @@ -2809,8 +2806,7 @@ /obj/item/shard{ icon_state = "plastitaniumtiny" }, -/mob/living/simple_animal/hostile/alien/queen/large{ - del_on_death = 1; +/mob/living/basic/alien/queen/large{ loot = list(/obj/effect/gibspawner/xeno,/obj/item/ammo_box/magazine/plastikov9mm,/obj/effect/mob_spawn/corpse/human/syndicatecommando/soft_suit); desc = "What you saw in your dreams last night."; faction = list("syndicate","xenomorph") @@ -3086,7 +3082,7 @@ "Yd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/alien/egg/burst, -/mob/living/simple_animal/hostile/alien{ +/mob/living/basic/alien{ faction = list("syndicate","xenomorph") }, /turf/open/floor/mineral/plastitanium/red, diff --git a/_maps/RandomRuins/SpaceRuins/interdyne.dmm b/_maps/RandomRuins/SpaceRuins/interdyne.dmm index bd0ba4cc2ff..cba624ef05f 100644 --- a/_maps/RandomRuins/SpaceRuins/interdyne.dmm +++ b/_maps/RandomRuins/SpaceRuins/interdyne.dmm @@ -973,12 +973,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "NU" = ( -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/machinery/shower/directional/east, /obj/item/soap/syndie, /obj/machinery/light/blacklight/directional/north, diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index beb0f27084a..2c7a240d679 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -755,9 +755,7 @@ /turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) "NO" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/effect/turf_decal/stripes/line{ dir = 10 }, diff --git a/_maps/RandomRuins/SpaceRuins/meatderelict.dmm b/_maps/RandomRuins/SpaceRuins/meatderelict.dmm index 0c4e9cd740b..3e4bece11e8 100644 --- a/_maps/RandomRuins/SpaceRuins/meatderelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/meatderelict.dmm @@ -733,7 +733,7 @@ /turf/open/indestructible/white, /area/ruin/space/has_grav/powered/biooutpost) "oQ" = ( -/obj/machinery/puzzle_button/meatderelict{ +/obj/machinery/puzzle/button/meatderelict{ pixel_y = 32; queue_size = 4 }, @@ -1669,7 +1669,7 @@ "FI" = ( /obj/item/instrument/piano_synth/headphones, /obj/structure/table, -/obj/machinery/puzzle_button/directional/north{ +/obj/machinery/puzzle/button/directional/north{ used = 1 }, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -1820,7 +1820,7 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/space/has_grav/powered/biooutpost/vault) "Jt" = ( -/obj/machinery/puzzle_button/directional/north{ +/obj/machinery/puzzle/button/directional/north{ id = "md_tosci"; name = "shield power panel" }, @@ -1889,7 +1889,7 @@ /turf/open/indestructible/white, /area/ruin/space/has_grav/powered/biooutpost) "KC" = ( -/obj/machinery/puzzle_button/directional/north{ +/obj/machinery/puzzle/button/directional/north{ id = "md_toeng"; queue_size = 4 }, @@ -2138,7 +2138,7 @@ id = "md_armory" }, /obj/effect/turf_decal/stripes/full, -/obj/machinery/puzzle_keycardpad/directional/south{ +/obj/machinery/puzzle/keycardpad/directional/south{ id = "md_armory"; name = "armory authentication pad"; queue_size = 5 diff --git a/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm b/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm index 6a7c71ad938..c98a43e89c2 100644 --- a/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm +++ b/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm @@ -202,9 +202,9 @@ "GR" = ( /obj/effect/decal/cleanable/blood, /obj/effect/mob_spawn/corpse/human/clown, -/obj/item/ammo_casing/energy/c3dbullet, /obj/effect/decal/cleanable/blood/footprints, /obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/a357/spent, /turf/open/floor/plating/airless, /area/ruin) "Ij" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 07d27b19695..1b8c4a01b0f 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -24,7 +24,7 @@ /area/ruin/space/ancientstation/delta/biolab) "af" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "ag" = ( @@ -47,7 +47,7 @@ /area/ruin/space/ancientstation/charlie/bridge) "ao" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "ap" = ( @@ -727,7 +727,7 @@ /area/ruin/space/ancientstation/delta/ai) "de" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/queen, +/mob/living/basic/alien/queen, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "df" = ( @@ -1509,7 +1509,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/east, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) "gE" = ( @@ -1708,7 +1708,7 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) "hE" = ( -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -2638,7 +2638,7 @@ "lq" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/gibs/old, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "lr" = ( @@ -3234,7 +3234,7 @@ /area/ruin/space/ancientstation/delta/hall) "nN" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "nO" = ( @@ -3907,7 +3907,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 1 }, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /obj/structure/cable, /obj/machinery/light/broken/directional/east, /turf/open/floor/iron, @@ -4459,7 +4459,7 @@ "wr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /obj/machinery/duct, /obj/machinery/light/broken/directional/south, /turf/open/floor/iron, @@ -4976,7 +4976,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 10 }, @@ -6284,7 +6284,7 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) "JZ" = ( -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /obj/structure/alien/weeds, /obj/machinery/light/small/broken/directional/west, /turf/open/floor/iron/dark, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm index 57ff783e409..6773053b46b 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm @@ -1246,7 +1246,7 @@ "fd" = ( /mob/living/basic/bot/medbot/stationary{ faction = list("Syndicate"); - maints_access_required = list("syndicate"); + req_one_access = list("syndicate"); name = "Insurgent Care"; radio_channel = "Syndicate" }, @@ -4618,6 +4618,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/mapping_helpers/apc/syndicate_access, /obj/structure/cable, +/obj/item/folded_navigation_gigabeacon, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/skyrat/interdynefob/bridge/vault) "uf" = ( @@ -5875,8 +5876,7 @@ /obj/effect/turf_decal/siding/dark, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/red/directional/north, -/obj/item/folded_navigation_gigabeacon, -/obj/structure/frame/machine/secured, +/obj/machinery/rnd/server/interdyne, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/skyrat/interdynefob/bridge/vault) "Bj" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm index 7755978bedd..78345ff9f89 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm @@ -4274,7 +4274,7 @@ /area/ruin/space/has_grav/port_tarkon/secoff) "DG" = ( /obj/structure/table/reinforced, -/obj/machinery/reagentgrinder/constructed, +/obj/machinery/reagentgrinder, /obj/machinery/light/small/directional/west, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/port_tarkon/kitchen) @@ -7058,7 +7058,7 @@ dir = 1 }, /obj/structure/table/reinforced, -/obj/machinery/reagentgrinder/constructed, +/obj/machinery/reagentgrinder, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "Wy" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm index 1db27495571..eae8b1f5a76 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm @@ -28,7 +28,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "bF" = ( -/mob/living/simple_animal/hostile/alien/queen/large, +/mob/living/basic/alien/queen/large, /obj/structure/alien/weeds, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) @@ -52,7 +52,7 @@ /area/ruin/space/has_grav/waypoint) "co" = ( /obj/structure/lattice, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/template_noop, /area/ruin) "cV" = ( @@ -67,7 +67,7 @@ /turf/open/floor/carpet/royalblue/airless, /area/ruin/space/has_grav/waypoint) "dz" = ( -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "dQ" = ( @@ -140,7 +140,7 @@ /area/ruin) "hE" = ( /obj/effect/decal/cleanable/blood/tracks, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "iu" = ( @@ -175,12 +175,12 @@ /turf/open/floor/carpet/royalblue/airless, /area/ruin/space/has_grav/waypoint) "kR" = ( -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "lf" = ( /obj/effect/decal/cleanable/blood/drip, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "lr" = ( @@ -241,11 +241,11 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "nC" = ( -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "nO" = ( -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /obj/structure/alien/weeds, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) @@ -351,7 +351,7 @@ pixel_x = -3; pixel_y = 10 }, -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waypoint) "sw" = ( @@ -476,7 +476,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "zy" = ( -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /obj/effect/decal/cleanable/xenoblood, /obj/structure/sign/poster/contraband/lusty_xenomorph/directional/east, /turf/open/floor/iron/dark, @@ -499,7 +499,7 @@ /turf/open/floor/carpet/royalblue/airless, /area/ruin/space/has_grav/waypoint) "Af" = ( -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /obj/structure/alien/weeds/node, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) @@ -517,7 +517,7 @@ /area/ruin/space/has_grav/waypoint) "AG" = ( /obj/effect/decal/cleanable/blood/drip, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "AP" = ( @@ -537,7 +537,7 @@ }, /obj/effect/decal/cleanable/blood/splatter, /obj/machinery/light/small/broken/directional/north, -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waypoint) "BD" = ( @@ -959,7 +959,7 @@ /obj/item/stack/cable_coil{ pixel_y = -3 }, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waypoint) "VK" = ( @@ -971,7 +971,7 @@ /turf/open/floor/carpet/royalblue/airless, /area/ruin/space/has_grav/waypoint) "Wg" = ( -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/waypoint) "Wu" = ( diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index ba0ca4afdf6..b2b8fd17fbe 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -1478,9 +1478,7 @@ /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-110" }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune2" - }, +/obj/effect/decal/cleanable/crayon/rune2, /mob/living/basic/construct/proteon/hostile, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) @@ -1574,9 +1572,7 @@ /area/template_noop) "LL" = ( /mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune2" - }, +/obj/effect/decal/cleanable/crayon/rune2, /obj/effect/gibspawner/human, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index 87cd248283e..b07e336ac44 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -324,7 +324,7 @@ /area/ruin/space/has_grav/thelizardsgas) "Io" = ( /obj/machinery/power/smes{ - charge = 2e+006; + charge = 4e+007; output_level = 0 }, /obj/structure/cable, diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index def97102238..245473c8fae 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -357,9 +357,7 @@ /area/ruin/space/has_grav/waystation/cargobay) "gE" = ( /obj/structure/sign/poster/contraband/missing_gloves/directional/north, -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -466,9 +464,7 @@ /area/ruin/space) "iT" = ( /obj/machinery/light/dim/directional/north, -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/waystation/power) diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 7ad0b42218f..7ed902651a5 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -3002,7 +3002,7 @@ set_luminosity = 6; light_color = "#9bbbff" }, -/mob/living/basic/pet/penguin/baby/permanent, +/mob/living/basic/pet/penguin/baby/permanent/snowdin, /turf/open/misc/ice/smooth, /area/awaymission/cabin/snowforest) "sK" = ( @@ -3725,7 +3725,7 @@ set_luminosity = 6; light_color = "#9bbbff" }, -/mob/living/basic/pet/penguin/emperor, +/mob/living/basic/pet/penguin/emperor/snowdin, /turf/open/misc/ice/smooth, /area/awaymission/cabin/snowforest) "Aa" = ( diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 0b0fba3f0cb..e54d1b87cba 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -1260,7 +1260,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "kE" = ( -/mob/living/basic/spider/giant/hunter, +/mob/living/basic/spider/giant/hunter/away_caves, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "kL" = ( @@ -1332,7 +1332,7 @@ /area/awaymission/caves/northblock) "pC" = ( /obj/item/mjollnir, -/mob/living/basic/spider/giant/nurse, +/mob/living/basic/spider/giant/nurse/away_caves, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1432,7 +1432,7 @@ /obj/machinery/sleeper{ dir = 8 }, -/mob/living/basic/spider/giant/hunter, +/mob/living/basic/spider/giant/hunter/away_caves, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "uO" = ( @@ -1590,7 +1590,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "Bz" = ( -/mob/living/basic/spider/giant/nurse, +/mob/living/basic/spider/giant/nurse/away_caves, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1672,7 +1672,7 @@ "FS" = ( /obj/machinery/light/small/built/directional/north, /obj/structure/spider/stickyweb, -/mob/living/basic/spider/giant/hunter, +/mob/living/basic/spider/giant/hunter/away_caves, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "FV" = ( @@ -1856,10 +1856,7 @@ /turf/open/floor/iron, /area/awaymission/caves/listeningpost) "Qe" = ( -/mob/living/basic/bat{ - desc = "A rare breed of bat which roosts deep in caves."; - name = "Cave Bat" - }, +/mob/living/basic/bat/away_caves, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1871,10 +1868,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_four) "Rt" = ( -/mob/living/basic/bat{ - desc = "A rare breed of bat which roosts deep in caves."; - name = "Cave Bat" - }, +/mob/living/basic/bat/away_caves, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1951,14 +1945,11 @@ /turf/open/floor/iron/recharge_floor, /area/awaymission/caves/bmp_asteroid) "Xa" = ( -/mob/living/basic/bat{ - desc = "A rare breed of bat which roosts deep in caves."; - name = "Cave Bat" - }, +/mob/living/basic/bat/away_caves, /turf/open/floor/iron, /area/awaymission/caves/northblock) "Xs" = ( -/mob/living/basic/spider/giant/hunter, +/mob/living/basic/spider/giant/hunter/away_caves, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1980,7 +1971,7 @@ /area/awaymission/caves/bmp_asteroid/level_two) "XR" = ( /obj/structure/spider/stickyweb, -/mob/living/basic/spider/giant/hunter, +/mob/living/basic/spider/giant/hunter/away_caves, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 5854b77e94a..f8852c06ded 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -521,6 +521,18 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) +"dS" = ( +/obj/structure/alien/weeds, +/mob/living/basic/alien/queen/large{ + desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; + name = "alien queen"; + pixel_x = -16; + can_plant_weeds = 0 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "dU" = ( /obj/structure/fence/cut{ dir = 4 @@ -731,6 +743,14 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) +"fm" = ( +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "fo" = ( /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; @@ -2087,13 +2107,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/awaymission/moonoutpost19/syndicate) -"nz" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) "nE" = ( /obj/machinery/door/poddoor/preopen{ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; @@ -3088,15 +3101,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"tN" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) "tQ" = ( /obj/structure/table, /obj/item/stack/sheet/mineral/plasma, @@ -3223,18 +3227,6 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) -"uH" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/queen/large{ - desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; - name = "alien queen"; - pixel_x = -16; - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) "uK" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/public/glass{ @@ -3338,6 +3330,16 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/closed/wall/r_wall/rust, /area/awaymission/moonoutpost19/research) +"vo" = ( +/obj/machinery/power/smes{ + charge = 3e+007; + input_level = 10000; + inputting = 0; + output_level = 15000 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) "vp" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/closed/wall/r_wall, @@ -3431,6 +3433,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/closed/wall/r_wall, /area/awaymission/moonoutpost19/research) +"vH" = ( +/obj/structure/alien/weeds/node, +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) "vK" = ( /obj/machinery/power/terminal{ dir = 4 @@ -4690,13 +4701,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"EZ" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) "Fc" = ( /obj/machinery/light/floor, /obj/effect/turf_decal/stripes/line{ @@ -5004,13 +5008,6 @@ dir = 8 }, /area/awaymission/moonoutpost19/research) -"Ha" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) "Hd" = ( /obj/item/stack/rods, /obj/item/shard{ @@ -5143,6 +5140,15 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) +"HW" = ( +/obj/structure/alien/weeds, +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) "HY" = ( /obj/structure/sign/departments/science{ pixel_y = 32 @@ -5289,16 +5295,6 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Ja" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) "Jb" = ( /obj/structure/fence/post{ dir = 4 @@ -5368,15 +5364,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"Jw" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) "Jz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, @@ -5502,15 +5489,6 @@ "Ky" = ( /turf/open/floor/iron/white/side, /area/awaymission/moonoutpost19/research) -"KA" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) "KF" = ( /obj/item/banner/command/mundane{ desc = "The banner of Central Command, impaled into the rock upon first landing on this moon."; @@ -5583,6 +5561,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) +"Lu" = ( +/obj/structure/alien/weeds, +/mob/living/basic/alien, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "LA" = ( /obj/item/stack/ore/iron{ pixel_x = -3; @@ -5626,6 +5611,15 @@ }, /turf/open/floor/iron/white/corner, /area/awaymission/moonoutpost19/arrivals) +"LO" = ( +/obj/structure/alien/weeds, +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "LQ" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -5949,14 +5943,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"NU" = ( -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) "NW" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/wood{ @@ -6095,16 +6081,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"OO" = ( -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 10000; - inputting = 0; - output_level = 15000 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) "OQ" = ( /obj/structure/trap/cult, /obj/effect/decal/cleanable/blood/drip, @@ -6832,6 +6808,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/syndicate) +"Tn" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "Ts" = ( /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/siding/purple, @@ -6916,6 +6902,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"Ua" = ( +/obj/structure/alien/weeds, +/mob/living/basic/alien/sentinel, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "Ud" = ( /obj/structure/bed, /obj/item/bedsheet/syndie, @@ -6940,6 +6933,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) +"Ui" = ( +/obj/structure/alien/weeds/node, +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "Uj" = ( /obj/structure/cable, /obj/structure/fluff/tram_rail/end, @@ -7009,15 +7011,6 @@ }, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"UI" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) "UO" = ( /obj/structure/closet/crate/miningcar{ desc = "A mining cart. It's caked with old basalt and lunar debris."; @@ -7119,6 +7112,13 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"VF" = ( +/obj/structure/alien/weeds/node, +/mob/living/basic/alien, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "VH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -26878,7 +26878,7 @@ AP fY fY AP -UI +LO fY bJ um @@ -27391,7 +27391,7 @@ fY fY qA fY -uH +dS AO LY Gj @@ -27645,7 +27645,7 @@ ac ac um bJ -nz +Ua fY fY fY @@ -27907,7 +27907,7 @@ fY fY XO fY -nz +Ua bJ um ac @@ -29209,7 +29209,7 @@ um um bJ AO -Ja +Tn fY um ac @@ -29976,7 +29976,7 @@ ac um um fY -Ha +Lu fY bJ um @@ -30510,7 +30510,7 @@ My My My My -NU +fm My My My @@ -31497,7 +31497,7 @@ ae um bJ fY -Ha +Lu kj um um @@ -31527,7 +31527,7 @@ ac dA dA My -NU +fm Wg My My @@ -32275,7 +32275,7 @@ ac ac ac um -UI +LO um um bl @@ -32285,7 +32285,7 @@ bl bl um fY -Jw +Ui um um um @@ -32309,7 +32309,7 @@ My My My My -NU +fm My My My @@ -33302,7 +33302,7 @@ ac um dz QA -Ha +Lu fY bJ qA @@ -33848,7 +33848,7 @@ My My My My -NU +fm My My My @@ -33929,7 +33929,7 @@ My My My eI -OO +vo op op Xr @@ -34098,7 +34098,7 @@ vs My My My -NU +fm My My My @@ -35387,7 +35387,7 @@ My My My My -NU +fm My My My @@ -35878,7 +35878,7 @@ um um fY fY -EZ +VF fY fY um @@ -36128,7 +36128,7 @@ ac ac um qA -UI +LO fY fY fY @@ -36665,7 +36665,7 @@ My My My My -NU +fm Wg My My @@ -38208,7 +38208,7 @@ My My My My -NU +fm My My My @@ -40803,7 +40803,7 @@ LG dA Wg My -NU +fm dA ae ae @@ -52420,7 +52420,7 @@ pS tb pS pS -tN +vH tb tb tb @@ -55775,7 +55775,7 @@ nw nw nw nw -KA +HW pS pS pS @@ -56807,7 +56807,7 @@ Oq Oq Oq nw -KA +HW pS zY tb @@ -57054,7 +57054,7 @@ zY pS pS nw -KA +HW pS pS pS diff --git a/_maps/RandomZLevels/mothership_astrum.dmm b/_maps/RandomZLevels/mothership_astrum.dmm index 02b8f0c4937..28cad57d43f 100644 --- a/_maps/RandomZLevels/mothership_astrum.dmm +++ b/_maps/RandomZLevels/mothership_astrum.dmm @@ -192,7 +192,7 @@ /area/awaymission/mothership_astrum/deck4) "dk" = ( /obj/structure/alien/weeds/creature, -/mob/living/simple_animal/hostile/alien/sentinel{ +/mob/living/basic/alien/sentinel{ faction = list("Abductor") }, /turf/open/floor/plating/abductor2, @@ -204,7 +204,7 @@ /area/awaymission/mothership_astrum/deck4) "dG" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel{ +/mob/living/basic/alien/sentinel{ faction = list("Abductor") }, /turf/open/floor/plating/abductor2, @@ -475,9 +475,9 @@ /area/awaymission/mothership_astrum/halls) "iF" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ +/mob/living/basic/alien/drone{ faction = list("Abductor"); - plants_off = 1 + can_plant_weeds = 1 }, /turf/open/floor/plating/abductor2, /area/awaymission/mothership_astrum/deck4) @@ -496,9 +496,9 @@ /area/awaymission/mothership_astrum/halls) "iS" = ( /obj/structure/alien/weeds/creature, -/mob/living/simple_animal/hostile/alien/drone{ +/mob/living/basic/alien/drone{ faction = list("Abductor"); - plants_off = 1 + can_plant_weeds = 1 }, /turf/open/floor/plating/abductor2, /area/awaymission/mothership_astrum/deck4) @@ -556,7 +556,7 @@ }, /area/awaymission/mothership_astrum/deck5) "jH" = ( -/mob/living/simple_animal/hostile/alien/sentinel{ +/mob/living/basic/alien/sentinel{ faction = list("Abductor") }, /obj/structure/alien/weeds, @@ -921,9 +921,9 @@ /turf/open/floor/plating/abductor, /area/awaymission/mothership_astrum/halls) "pz" = ( -/mob/living/simple_animal/hostile/alien/drone{ +/mob/living/basic/alien/drone{ faction = list("Abductor"); - plants_off = 1 + can_plant_weeds = 1 }, /turf/open/floor/mineral/abductor, /area/awaymission/mothership_astrum/halls) @@ -2517,9 +2517,9 @@ /area/awaymission/mothership_astrum/halls) "LT" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ +/mob/living/basic/alien/drone{ faction = list("Abductor"); - plants_off = 1 + can_plant_weeds = 1 }, /turf/open/floor/mineral/abductor, /area/awaymission/mothership_astrum/halls) @@ -2897,9 +2897,9 @@ /turf/open/floor/plating/abductor2, /area/awaymission/mothership_astrum/halls) "PI" = ( -/mob/living/simple_animal/hostile/alien/drone{ +/mob/living/basic/alien/drone{ faction = list("Abductor"); - plants_off = 1 + can_plant_weeds = 1 }, /obj/structure/alien/weeds, /turf/open/floor/mineral/abductor, @@ -3095,7 +3095,7 @@ /area/awaymission/mothership_astrum/deck2) "RJ" = ( /obj/structure/alien/weeds/creature, -/mob/living/simple_animal/hostile/alien/queen/large{ +/mob/living/basic/alien/queen/large{ faction = list("Abductor") }, /turf/open/floor/plating/abductor2, @@ -3110,9 +3110,9 @@ /turf/open/floor/iron, /area/awaymission/mothership_astrum/deck2) "Se" = ( -/mob/living/simple_animal/hostile/alien/drone{ +/mob/living/basic/alien/drone{ faction = list("Abductor"); - plants_off = 1 + can_plant_weeds = 1 }, /turf/open/floor/plating/abductor2, /area/awaymission/mothership_astrum/halls) diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm index f40ecc09015..cdea9ba141a 100644 --- a/_maps/RandomZLevels/museum.dmm +++ b/_maps/RandomZLevels/museum.dmm @@ -9,11 +9,18 @@ /obj/machinery/computer/old{ name = "replica computer"; dir = 8; - icon_keyboard = "rd_key"; - icon_screen = "rdcomp" + icon_screen = "rdcomp"; + icon_keyboard = "rd_key" }, /turf/open/floor/iron/smooth_large, /area/awaymission/museum) +"ac" = ( +/obj/structure/sign/poster/contraband/fake_bombable/directional/west, +/obj/structure/closet/crate/bin, +/obj/machinery/light/warm/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "ai" = ( /obj/structure/railing{ dir = 8 @@ -59,6 +66,11 @@ }, /turf/open/indestructible/plating, /area/awaymission/museum) +"ax" = ( +/obj/structure/sink/directional/north, +/obj/structure/mirror/directional/south, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "az" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/entertainment/musical_instrument, @@ -76,6 +88,22 @@ /obj/structure/closet/crate/preopen, /turf/open/indestructible/plating, /area/awaymission/museum) +"aO" = ( +/obj/machinery/button/door/directional/north{ + name = "Lock Control"; + id = "museum_toilet_wontwork" + }, +/obj/effect/mob_spawn/corpse/human/skeleton/museum_chef, +/obj/structure/toilet/museum{ + dir = 4 + }, +/obj/item/keycard/cafeteria, +/obj/item/paper/fluff/museum/chefs_ultimatum, +/obj/machinery/light/small/dim/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "aR" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/siding/dark_blue{ @@ -147,8 +175,8 @@ }, /turf/open/mirage{ dir = 8; - target_turf_x = 11; - range = 1 + range = 1; + target_turf_x = 11 }, /area/awaymission/museum) "bC" = ( @@ -177,8 +205,8 @@ /area/awaymission/museum) "bJ" = ( /mob/living/basic/statue/mannequin{ - dir = 8; - name = "Dale Knox" + name = "Dale Knox"; + dir = 8 }, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/holofloor/white, @@ -229,6 +257,14 @@ /obj/item/storage/box/stickers/googly, /turf/open/floor/iron/dark, /area/awaymission/museum) +"ci" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "cm" = ( /obj/machinery/door/airlock/grunge, /obj/structure/barricade/wooden/crude, @@ -255,8 +291,8 @@ /turf/open/floor/iron/smooth_half, /area/awaymission/museum) "ct" = ( -/obj/structure/chair/comfy, /mob/living/basic/mothroach, +/obj/structure/chair/comfy, /obj/effect/mapping_helpers/mob_buckler, /obj/machinery/light/dim/directional/north, /turf/open/floor/iron/dark/textured_large, @@ -313,8 +349,8 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/item/toy/balloon/corgi, /obj/machinery/status_display/random_message{ - firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS"); - pixel_x = 32 + pixel_x = 32; + firstline_to_secondline = list(NO="LITTERING", "YOU ARE"="BEING WATCHED", "DO NOT TOUCH"="THE EXHIBITS") }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -328,9 +364,9 @@ "cS" = ( /obj/effect/step_trigger/thrower{ direction = 1; - facedir = 1; + mobs_only = 1; tiles = 10; - mobs_only = 1 + facedir = 1 }, /obj/machinery/light/floor, /turf/open/floor/iron, @@ -343,6 +379,14 @@ /obj/structure/plaque/static_plaque/golden/commission/dream, /turf/closed/indestructible/reinforced, /area/awaymission/museum) +"cY" = ( +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/obj/machinery/light/warm/directional/east, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "cZ" = ( /obj/structure/fluff/divine/nexus, /turf/open/floor/cult, @@ -398,9 +442,9 @@ /area/awaymission/museum) "dK" = ( /turf/open/mirage{ + dir = 1; range = 2; - target_turf_y = -4; - dir = 1 + target_turf_y = -4 }, /area/awaymission/museum) "dL" = ( @@ -434,8 +478,8 @@ /area/awaymission/museum) "dY" = ( /mob/living/basic/statue/mannequin{ - hat = /obj/item/clothing/head/helmet/space; - dir = 1 + dir = 1; + hat = /obj/item/clothing/head/helmet/space }, /turf/open/floor/holofloor/hyperspace/ns, /area/awaymission/museum) @@ -462,7 +506,7 @@ /obj/machinery/door/poddoor/shutters/indestructible{ id = "museum_secret" }, -/obj/machinery/puzzle_keycardpad/directional/east{ +/obj/machinery/puzzle/keycardpad/directional/east{ id = "museum_secret" }, /turf/open/floor/iron/dark, @@ -474,15 +518,11 @@ /turf/open/indestructible/plating, /area/awaymission/museum) "ek" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "l"; +/obj/effect/decal/cleanable/crayon/l{ pixel_x = -10 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i" - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "e"; +/obj/effect/decal/cleanable/crayon/i, +/obj/effect/decal/cleanable/crayon/e{ pixel_x = 12 }, /obj/effect/decal/cleanable/dirt/dust, @@ -521,10 +561,10 @@ /turf/open/floor/grass, /area/awaymission/museum) "ex" = ( +/mob/living/basic/mothroach, /obj/structure/chair/stool/bar/directional/west{ can_buckle = 1 }, -/mob/living/basic/mothroach, /obj/effect/mapping_helpers/mob_buckler, /turf/open/floor/wood/large, /area/awaymission/museum) @@ -596,6 +636,15 @@ /obj/structure/plaque/static_plaque/golden/commission/omega, /turf/closed/indestructible/reinforced, /area/awaymission/museum) +"eW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/structure/fluff/wallsign/directional/north{ + name = "Restrooms"; + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "eX" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 4 @@ -605,11 +654,11 @@ }, /area/awaymission/museum) "fa" = ( -/obj/effect/turf_decal/sand/plating, /mob/living/basic/statue/mannequin{ held_item = /obj/item/pickaxe; hat = /obj/item/clothing/suit/hooded/explorer }, +/obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/mining, /turf/open/indestructible/plating, /area/awaymission/museum) @@ -627,6 +676,13 @@ /obj/item/kitchen/fork, /turf/open/floor/wood/tile, /area/awaymission/museum) +"fl" = ( +/obj/machinery/status_display/random_message{ + pixel_x = -32; + firstline_to_secondline = list(CAFETERIA="YUMMY", CAFETERIA="HOTDOGS", ENJOY="YOUR MEAL") + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "fn" = ( /turf/open/floor/holofloor/hyperspace/ns, /area/awaymission/museum) @@ -706,6 +762,11 @@ }, /turf/open/floor/iron, /area/awaymission/museum) +"gg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/shower/directional/east, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "gj" = ( /obj/machinery/door/poddoor/shutters/preopen{ dir = 8 @@ -751,6 +812,10 @@ /obj/machinery/light/small/dim/directional/south, /turf/open/indestructible/plating, /area/awaymission/museum) +"gE" = ( +/obj/item/clothing/suit/caution, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "gG" = ( /obj/effect/turf_decal/siding/dark_blue/corner{ dir = 4 @@ -814,8 +879,8 @@ "hk" = ( /obj/effect/smooths_with_walls, /turf/open/mirage{ - target_turf_y = -29; - dir = 1 + dir = 1; + target_turf_y = -29 }, /area/awaymission/museum) "hl" = ( @@ -827,6 +892,12 @@ }, /turf/open/indestructible/plating, /area/awaymission/museum) +"hm" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/condiment, +/obj/machinery/light/floor, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "hp" = ( /mob/living/basic/mothroach/bar, /turf/open/floor/wood/tile, @@ -874,10 +945,18 @@ "hM" = ( /turf/closed/wall/rock/porous, /area/awaymission/museum) +"hS" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "hT" = ( /mob/living/basic/statue/mannequin{ - dir = 8; name = "Dale Knox"; + dir = 8; held_item = /obj/item/circuitboard }, /obj/structure/sign/flag/nanotrasen/directional/south, @@ -892,8 +971,8 @@ /area/awaymission/museum) "hX" = ( /obj/item/circuitboard{ - icon_state = "flopdrive"; - name = "microprocessor" + name = "microprocessor"; + icon_state = "flopdrive" }, /obj/structure/table/reinforced, /turf/open/floor/circuit/green, @@ -918,15 +997,11 @@ /turf/open/floor/iron/dark, /area/awaymission/museum) "ix" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "l"; +/obj/effect/decal/cleanable/crayon/l{ pixel_x = -10 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i" - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "e"; +/obj/effect/decal/cleanable/crayon/i, +/obj/effect/decal/cleanable/crayon/e{ pixel_x = 12 }, /obj/effect/turf_decal/stripes/line{ @@ -983,6 +1058,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/awaymission/museum) +"iJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/toilet/museum{ + dir = 1 + }, +/obj/structure/curtain, +/obj/structure/broken_flooring/plating, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "iK" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/siding{ @@ -1031,9 +1115,9 @@ }, /obj/effect/step_trigger/thrower{ direction = 1; - facedir = 1; + mobs_only = 1; tiles = 10; - mobs_only = 1 + facedir = 1 }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -1067,10 +1151,20 @@ }, /turf/open/floor/cult, /area/awaymission/museum) +"ju" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/obj/structure/fluff/wallsign/directional/north{ + name = "Restrooms" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "jy" = ( /mob/living/basic/statue/mannequin{ - dir = 8; name = "Dale Knox"; + dir = 8; held_item = /obj/item/circuitboard }, /obj/effect/turf_decal/stripes{ @@ -1082,6 +1176,14 @@ /obj/effect/spawner/structure/window, /turf/open/indestructible/plating, /area/awaymission/museum) +"jC" = ( +/obj/effect/puzzle_poddoor_open{ + icon = 'icons/effects/mapping_helpers.dmi'; + id = "museum_right_wing"; + queue_id = "museum_right_wing" + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) "jF" = ( /obj/machinery/suit_storage_unit/open, /obj/effect/turf_decal/box, @@ -1110,6 +1212,18 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, /area/awaymission/museum) +"jO" = ( +/obj/structure/toilet/museum, +/obj/structure/sign/poster/contraband/fake_bombable/directional/north, +/obj/machinery/button/door/directional/east{ + name = "Lock Control"; + id = "museum_toilet6"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "jP" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/siding/dark_blue/corner{ @@ -1120,13 +1234,16 @@ dir = 9 }, /obj/item/reagent_containers/cup/glass/coffee, +/obj/item/paper/fluff/scrambled_pass{ + puzzle_id = "museum_r_wing_puzzle" + }, /turf/open/floor/iron/dark, /area/awaymission/museum) "jU" = ( /obj/effect/landmark/transport/nav_beacon/tram/platform{ + name = "Exhibit Loading Bay"; specific_transport_id = "museum_cargo"; - platform_code = 2; - name = "Exhibit Loading Bay" + platform_code = 2 }, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) @@ -1193,6 +1310,12 @@ }, /turf/open/floor/iron, /area/awaymission/museum) +"kx" = ( +/obj/machinery/door/airlock/public{ + name = "Restrooms" + }, +/turf/open/floor/iron, +/area/awaymission/museum) "kA" = ( /obj/machinery/conveyor{ dir = 1 @@ -1200,6 +1323,16 @@ /obj/item/vending_refill/wardrobe/coroner_wardrobe, /turf/open/indestructible/plating, /area/awaymission/museum) +"kL" = ( +/obj/machinery/door/poddoor/shutters/window/indestructible{ + dir = 8; + id = "museum_cafeteria" + }, +/obj/machinery/puzzle/keycardpad/directional/south{ + id = "museum_cafeteria" + }, +/turf/open/floor/iron, +/area/awaymission/museum) "kO" = ( /obj/structure/railing{ dir = 8 @@ -1227,6 +1360,19 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/indestructible/plating, /area/awaymission/museum) +"kZ" = ( +/obj/structure/toilet/museum{ + dir = 4 + }, +/obj/machinery/button/door/directional/north{ + name = "Lock Control"; + id = "museum_toilet5"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "la" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1324,11 +1470,11 @@ /turf/open/floor/iron, /area/awaymission/museum) "lT" = ( -/obj/structure/chair/office{ - dir = 1 - }, /mob/living/basic/statue/mannequin{ - hat = /obj/item/clothing/suit/toggle/labcoat/science; + dir = 1; + hat = /obj/item/clothing/suit/toggle/labcoat/science + }, +/obj/structure/chair/office{ dir = 1 }, /obj/machinery/light/floor, @@ -1345,9 +1491,9 @@ specific_transport_id = "museum_cargo" }, /obj/effect/landmark/transport/nav_beacon/tram/platform{ + name = "Internal Loading Bay"; specific_transport_id = "museum_cargo"; - platform_code = 1; - name = "Internal Loading Bay" + platform_code = 1 }, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) @@ -1379,6 +1525,9 @@ }, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) +"ms" = ( +/turf/open/floor/iron, +/area/awaymission/museum/cafeteria) "mA" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/holofloor/beach/water, @@ -1403,9 +1552,9 @@ /area/awaymission/museum) "mS" = ( /mob/living/basic/statue/mannequin{ + dir = 1; held_item = /obj/item/wrench; - hat = /obj/item/clothing/head/utility/hardhat; - dir = 1 + hat = /obj/item/clothing/head/utility/hardhat }, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/blood/gibs, @@ -1436,8 +1585,8 @@ /obj/structure/transport/linear/tram/slow, /obj/structure/tram, /obj/machinery/transport/tram_controller{ - configured_transport_id = "museum_cargo"; - cover_locked = 0 + cover_locked = 0; + configured_transport_id = "museum_cargo" }, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) @@ -1477,8 +1626,8 @@ /turf/open/floor/iron/white, /area/awaymission/museum) "nu" = ( -/obj/effect/decal/cleanable/glass/titanium, /mob/living/basic/mouse/rat, +/obj/effect/decal/cleanable/glass/titanium, /turf/open/floor/iron/white, /area/awaymission/museum) "nv" = ( @@ -1510,9 +1659,9 @@ "nz" = ( /obj/structure/lattice/catwalk/mining, /obj/structure/fluff{ + name = "old plasma extractor"; icon = 'icons/mob/simple/hivebot.dmi'; - icon_state = "fab_robot"; - name = "old plasma extractor" + icon_state = "fab_robot" }, /turf/open/lava/plasma/mafia, /area/awaymission/museum) @@ -1537,9 +1686,9 @@ }, /obj/effect/step_trigger/thrower{ direction = 1; - facedir = 1; + mobs_only = 1; tiles = 10; - mobs_only = 1 + facedir = 1 }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -1588,6 +1737,16 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"nY" = ( +/obj/structure/sign/poster/official/no_erp/directional/north, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) +"nZ" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "od" = ( /obj/structure/fluff/fake_vent, /turf/open/floor/iron, @@ -1648,11 +1807,31 @@ /obj/structure/flora/coconuts, /turf/open/misc/beach/sand, /area/awaymission/museum/mothroachvoid) +"oD" = ( +/obj/structure/toilet/museum{ + dir = 4 + }, +/obj/machinery/button/door/directional/north{ + name = "Lock Control"; + id = "museum_toilet4"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "oI" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/floor, /turf/open/floor/iron, /area/awaymission/museum) +"oP" = ( +/obj/effect/puzzle_poddoor_open{ + id = "museum_cafeteria"; + queue_id = "museum_cafeteria" + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) "oQ" = ( /turf/open/floor/holofloor/beach/coast{ dir = 1 @@ -1694,8 +1873,8 @@ /area/awaymission/museum) "pi" = ( /mob/living/basic/statue/mannequin{ - hat = /obj/item/clothing/head/costume/nursehat; - held_item = /obj/item/clothing/neck/stethoscope + held_item = /obj/item/clothing/neck/stethoscope; + hat = /obj/item/clothing/head/costume/nursehat }, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/holofloor/white, @@ -1729,6 +1908,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, /area/awaymission/museum) +"pz" = ( +/obj/machinery/door/poddoor/shutters/window/indestructible{ + dir = 8; + id = "museum_cafeteria" + }, +/turf/open/floor/iron, +/area/awaymission/museum) "pD" = ( /obj/structure/broken_flooring/corner/always_floorplane/directional/west, /obj/effect/decal/cleanable/dirt/dust, @@ -1758,6 +1944,17 @@ }, /turf/open/indestructible/plating, /area/awaymission/museum) +"pN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "pX" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -1773,6 +1970,10 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/awaymission/museum) +"ql" = ( +/obj/structure/chair/sofa/bench, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "qo" = ( /obj/effect/oneway{ dir = 8 @@ -1784,15 +1985,15 @@ /area/awaymission/museum) "qt" = ( /obj/effect/spawner/random/food_or_drink/booze{ - loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer=10, /obj/item/reagent_containers/cup/glass/bottle/ale=10, /obj/item/reagent_containers/cup/glass/bottle/beer/light=5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor=5, /obj/item/reagent_containers/cup/glass/bottle/whiskey=5, /obj/item/reagent_containers/cup/glass/bottle/gin=5, /obj/item/reagent_containers/cup/glass/bottle/vodka=5, /obj/item/reagent_containers/cup/glass/bottle/tequila=5, /obj/item/reagent_containers/cup/glass/bottle/rum=5, /obj/item/reagent_containers/cup/glass/bottle/vermouth=5, /obj/item/reagent_containers/cup/glass/bottle/cognac=5, /obj/item/reagent_containers/cup/glass/bottle/wine=5, /obj/item/reagent_containers/cup/glass/bottle/kahlua=5, /obj/item/reagent_containers/cup/glass/bottle/amaretto=5, /obj/item/reagent_containers/cup/glass/bottle/hcider=5, /obj/item/reagent_containers/cup/glass/bottle/absinthe=5, /obj/item/reagent_containers/cup/glass/bottle/sake=5, /obj/item/reagent_containers/cup/glass/bottle/grappa=5, /obj/item/reagent_containers/cup/glass/bottle/applejack=5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic=5, /obj/item/reagent_containers/cup/bottle/ethanol=2, /obj/item/reagent_containers/cup/glass/bottle/fernet=2, /obj/item/reagent_containers/cup/glass/bottle/champagne=2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium=2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager=2, /obj/item/reagent_containers/cup/glass/bottle/patron=1, /obj/item/reagent_containers/cup/glass/bottle/kong=1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine=1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka=1, /obj/item/reagent_containers/cup/glass/bottle/trappist=1); spawn_random_offset = 2 }, /turf/open/floor/carpet/cyan, /area/awaymission/museum/mothroachvoid) "qw" = ( /obj/item/flashlight/flare{ - start_on = 1; - icon_state = "flare-on" + icon_state = "flare-on"; + start_on = 1 }, /obj/structure/table, /obj/effect/decal/cleanable/dirt/dust, @@ -1822,6 +2023,10 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine, /area/awaymission/museum) +"qK" = ( +/obj/machinery/vending/hotdog/museum, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "qL" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/siding/dark_blue{ @@ -1879,8 +2084,8 @@ /area/awaymission/museum) "qY" = ( /obj/machinery/power/shuttle_engine/heater{ - dir = 4; - opacity = 1 + opacity = 1; + dir = 4 }, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/indestructible/plating, @@ -1909,22 +2114,29 @@ /turf/open/floor/carpet/executive, /area/awaymission/museum) "rq" = ( +/mob/living/basic/statue/mannequin/suspicious, /obj/effect/decal/cleanable/blood/old, /obj/effect/gibspawner/human, /obj/effect/gibspawner/human, /obj/effect/gibspawner/human, /obj/effect/gibspawner/human, -/mob/living/basic/statue/mannequin/suspicious, /turf/open/floor/iron, /area/awaymission/museum) "rr" = ( /turf/open/floor/wood/tile, /area/awaymission/museum) +"ry" = ( +/obj/machinery/door/airlock{ + name = "Restroom Cabin 6"; + id_tag = "museum_toilet6" + }, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "rA" = ( +/mob/living/basic/mothroach, /obj/structure/chair/comfy/beige{ dir = 8 }, -/mob/living/basic/mothroach, /obj/effect/mapping_helpers/mob_buckler, /turf/open/floor/wood/large, /area/awaymission/museum) @@ -1964,13 +2176,17 @@ dir = 1 }, /obj/structure/railing/corner/end, +/obj/structure/fluff/wallsign/directional/south{ + name = "Cafeteria"; + dir = 4 + }, /turf/open/floor/iron/dark, /area/awaymission/museum) "rU" = ( /mob/living/basic/statue/mannequin{ + name = "Michael Trasen"; dir = 4; - held_item = /obj/item/wrench; - name = "Michael Trasen" + held_item = /obj/item/wrench }, /obj/structure/sign/flag/nanotrasen/directional/south, /obj/machinery/light/small/dim/directional/west, @@ -1997,9 +2213,9 @@ /turf/open/floor/engine, /area/awaymission/museum) "rY" = ( +/mob/living/basic/mouse/rat, /obj/machinery/light/small/broken/directional/north, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/basic/mouse/rat, /turf/open/floor/iron/dark/textured_large, /area/awaymission/museum) "sd" = ( @@ -2110,13 +2326,20 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, /area/awaymission/museum) +"ta" = ( +/obj/machinery/door/airlock{ + name = "Restroom Cabin 5"; + id_tag = "museum_toilet5" + }, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "tc" = ( +/mob/living/basic/mothroach, /obj/structure/lattice/catwalk/mining, /obj/structure/railing{ dir = 6 }, /obj/structure/chair, -/mob/living/basic/mothroach, /obj/effect/mapping_helpers/mob_buckler, /turf/open/misc/grass, /area/awaymission/museum/mothroachvoid) @@ -2136,15 +2359,15 @@ /turf/open/floor/holofloor/asteroid, /area/awaymission/museum) "tj" = ( +/mob/living/basic/statue/mannequin{ + dir = 1; + held_item = /obj/item/wrench; + hat = /obj/item/clothing/head/utility/hardhat + }, /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/line{ dir = 1 }, -/mob/living/basic/statue/mannequin{ - dir = 1; - hat = /obj/item/clothing/head/utility/hardhat; - held_item = /obj/item/wrench - }, /turf/open/indestructible/plating, /area/awaymission/museum) "tk" = ( @@ -2185,7 +2408,7 @@ "tx" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/booze{ - loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer=10, /obj/item/reagent_containers/cup/glass/bottle/ale=10, /obj/item/reagent_containers/cup/glass/bottle/beer/light=5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor=5, /obj/item/reagent_containers/cup/glass/bottle/whiskey=5, /obj/item/reagent_containers/cup/glass/bottle/gin=5, /obj/item/reagent_containers/cup/glass/bottle/vodka=5, /obj/item/reagent_containers/cup/glass/bottle/tequila=5, /obj/item/reagent_containers/cup/glass/bottle/rum=5, /obj/item/reagent_containers/cup/glass/bottle/vermouth=5, /obj/item/reagent_containers/cup/glass/bottle/cognac=5, /obj/item/reagent_containers/cup/glass/bottle/wine=5, /obj/item/reagent_containers/cup/glass/bottle/kahlua=5, /obj/item/reagent_containers/cup/glass/bottle/amaretto=5, /obj/item/reagent_containers/cup/glass/bottle/hcider=5, /obj/item/reagent_containers/cup/glass/bottle/absinthe=5, /obj/item/reagent_containers/cup/glass/bottle/sake=5, /obj/item/reagent_containers/cup/glass/bottle/grappa=5, /obj/item/reagent_containers/cup/glass/bottle/applejack=5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic=5, /obj/item/reagent_containers/cup/bottle/ethanol=2, /obj/item/reagent_containers/cup/glass/bottle/fernet=2, /obj/item/reagent_containers/cup/glass/bottle/champagne=2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium=2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager=2, /obj/item/reagent_containers/cup/glass/bottle/patron=1, /obj/item/reagent_containers/cup/glass/bottle/kong=1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine=1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka=1, /obj/item/reagent_containers/cup/glass/bottle/trappist=1); spawn_random_offset = 2 }, /turf/open/floor/wood/tile, @@ -2193,9 +2416,9 @@ "ty" = ( /obj/structure/table, /obj/item/clothing/gloves/color/yellow{ - siemens_coefficient = 10; name = "fake stungloves"; - desc = "A crude replica of stungloves. Essentially gloves wrapped with wire. Extremely unsafe." + desc = "A crude replica of stungloves. Essentially gloves wrapped with wire. Extremely unsafe."; + siemens_coefficient = 10 }, /obj/machinery/light/floor, /turf/open/floor/iron, @@ -2293,6 +2516,13 @@ dir = 2 }, /area/awaymission/museum/mothroachvoid) +"um" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/sign/warning/fire/directional/west, +/obj/structure/tank_holder/extinguisher/anti, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "up" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -2302,6 +2532,21 @@ }, /turf/open/floor/iron/showroomfloor, /area/awaymission/museum) +"us" = ( +/obj/machinery/door/airlock{ + name = "Restroom Cabin 2"; + id_tag = "museum_toilet2" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"ut" = ( +/obj/machinery/light/very_dim/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_vent, +/obj/structure/mop_bucket, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "uu" = ( /obj/structure/rack, /obj/effect/spawner/random/engineering/material, @@ -2315,6 +2560,10 @@ }, /turf/open/floor/grass, /area/awaymission/museum) +"uH" = ( +/obj/structure/sign/clock/directional/north, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "uM" = ( /obj/structure/fluff/fake_camera{ dir = 10 @@ -2345,8 +2594,8 @@ "vc" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/painting/large{ - persistence_id = "museumgate_big"; - dir = 1 + dir = 1; + persistence_id = "museumgate_big" }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, @@ -2418,6 +2667,11 @@ /obj/structure/filingcabinet, /turf/open/floor/iron, /area/awaymission/museum) +"vG" = ( +/turf/closed/indestructible/fakedoor{ + name = "Kitchen" + }, +/area/awaymission/museum/cafeteria) "vM" = ( /mob/living/basic/statue/mannequin{ dir = 1; @@ -2448,6 +2702,16 @@ /obj/effect/turf_decal/siding/dark_blue, /turf/open/floor/mineral/titanium/blue, /area/awaymission/museum) +"wg" = ( +/obj/machinery/door/airlock{ + name = "Restroom Cabin 3" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "I'VE WORKED HERE FOR 7 YEARS! JUST TO BE REPLACED BY A VENDING MACHINE?! YOU KNOW WHAT? FUCK YOU, I'VE LOCKED DOWN THE CAFETERIA AND WON'T BE COMING OUT 'TILL YOU GIVE ME MY JOB BACK!" + }, +/turf/open/floor/iron, +/area/awaymission/museum) "wh" = ( /obj/structure/broken_flooring/corner/always_floorplane/directional/west, /obj/structure/lattice, @@ -2456,7 +2720,7 @@ "wi" = ( /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "nothing" + id = "museum_secret" }, /turf/open/floor/iron, /area/awaymission/museum) @@ -2526,8 +2790,8 @@ "wN" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/painting/large{ - persistence_id = "museumgate_big"; - dir = 1 + dir = 1; + persistence_id = "museumgate_big" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -2535,6 +2799,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood/large, /area/awaymission/museum) +"wV" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "wZ" = ( /turf/open/misc/beach/coast{ dir = 1 @@ -2558,8 +2829,8 @@ /obj/structure/table/reinforced, /obj/structure/window/spawner/directional/west, /obj/effect/spawner/random/bureaucracy/paper{ - spawn_random_offset = 7; - spawn_loot_count = 8 + spawn_loot_count = 8; + spawn_random_offset = 7 }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, @@ -2575,8 +2846,8 @@ "xg" = ( /obj/structure/table/reinforced, /obj/item/circuitboard{ - icon_state = "bluespacearray"; - name = "fancy replica tech" + name = "fancy replica tech"; + icon_state = "bluespacearray" }, /turf/open/floor/iron/smooth_large, /area/awaymission/museum) @@ -2599,6 +2870,10 @@ }, /turf/open/misc/beach/sand, /area/awaymission/museum/mothroachvoid) +"xp" = ( +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "xr" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate/freezer/food, @@ -2668,6 +2943,11 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"xO" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/soda_cans/canned_laughter, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "xP" = ( /obj/structure/closet/crate/cardboard, /obj/item/storage/toolbox/artistic, @@ -2704,10 +2984,10 @@ /turf/open/chasm/true/no_smooth, /area/awaymission/museum) "yi" = ( +/mob/living/basic/mothroach, /obj/structure/chair/comfy/beige{ dir = 1 }, -/mob/living/basic/mothroach, /obj/effect/mapping_helpers/mob_buckler, /turf/open/floor/wood/large, /area/awaymission/museum) @@ -2731,9 +3011,9 @@ /turf/open/floor/holofloor/hyperspace/ns, /area/awaymission/museum) "yr" = ( +/mob/living/basic/mothroach, /obj/structure/chair/comfy, /obj/effect/mapping_helpers/mob_buckler, -/mob/living/basic/mothroach, /turf/open/floor/wood/large, /area/awaymission/museum) "yu" = ( @@ -2855,14 +3135,14 @@ /turf/closed/indestructible/rock, /area/awaymission/museum) "zG" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/siding/red, /mob/living/basic/statue/mannequin{ dir = 8; hat = /obj/item/clothing/head/fedora }, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/siding/red, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth_half, /area/awaymission/museum) @@ -2891,13 +3171,13 @@ pixel_y = 12 }, /obj/item/stamp/granted{ - pixel_y = 12; - pixel_x = 8 + pixel_x = 8; + pixel_y = 12 }, /obj/effect/spawner/random/bureaucracy/paper{ - spawn_random_offset = 12; + spawn_loot_count = 8; spawn_scatter_radius = 1; - spawn_loot_count = 8 + spawn_random_offset = 12 }, /turf/open/floor/iron, /area/awaymission/museum) @@ -3043,8 +3323,8 @@ teleport_y_offset = -30 }, /turf/open/mirage{ - target_turf_y = -29; - dir = 1 + dir = 1; + target_turf_y = -29 }, /area/awaymission/museum) "AP" = ( @@ -3054,6 +3334,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/indestructible/plating, /area/awaymission/museum) +"AQ" = ( +/obj/machinery/door/airlock{ + name = "Restroom Cabin 4"; + id_tag = "museum_toilet4" + }, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "AR" = ( /obj/structure/railing{ dir = 8 @@ -3217,9 +3504,9 @@ "Cy" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/booze{ - loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); - spawn_random_offset = 2; - spawn_loot_count = 2 + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer=10, /obj/item/reagent_containers/cup/glass/bottle/ale=10, /obj/item/reagent_containers/cup/glass/bottle/beer/light=5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor=5, /obj/item/reagent_containers/cup/glass/bottle/whiskey=5, /obj/item/reagent_containers/cup/glass/bottle/gin=5, /obj/item/reagent_containers/cup/glass/bottle/vodka=5, /obj/item/reagent_containers/cup/glass/bottle/tequila=5, /obj/item/reagent_containers/cup/glass/bottle/rum=5, /obj/item/reagent_containers/cup/glass/bottle/vermouth=5, /obj/item/reagent_containers/cup/glass/bottle/cognac=5, /obj/item/reagent_containers/cup/glass/bottle/wine=5, /obj/item/reagent_containers/cup/glass/bottle/kahlua=5, /obj/item/reagent_containers/cup/glass/bottle/amaretto=5, /obj/item/reagent_containers/cup/glass/bottle/hcider=5, /obj/item/reagent_containers/cup/glass/bottle/absinthe=5, /obj/item/reagent_containers/cup/glass/bottle/sake=5, /obj/item/reagent_containers/cup/glass/bottle/grappa=5, /obj/item/reagent_containers/cup/glass/bottle/applejack=5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic=5, /obj/item/reagent_containers/cup/bottle/ethanol=2, /obj/item/reagent_containers/cup/glass/bottle/fernet=2, /obj/item/reagent_containers/cup/glass/bottle/champagne=2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium=2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager=2, /obj/item/reagent_containers/cup/glass/bottle/patron=1, /obj/item/reagent_containers/cup/glass/bottle/kong=1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine=1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka=1, /obj/item/reagent_containers/cup/glass/bottle/trappist=1); + spawn_loot_count = 2; + spawn_random_offset = 2 }, /obj/machinery/light/warm/directional/west, /turf/open/floor/wood/large, @@ -3255,6 +3542,11 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"CG" = ( +/obj/structure/mirror/directional/east, +/obj/structure/sink/directional/west, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "CI" = ( /obj/effect/turf_decal/caution, /obj/effect/decal/cleanable/dirt/dust, @@ -3293,6 +3585,18 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"Db" = ( +/obj/item/maneki_neko{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/machinery/status_display/random_message{ + pixel_y = 32; + firstline_to_secondline = list(ACCEPTING="DONATIONS") + }, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron, +/area/awaymission/museum/cafeteria) "De" = ( /obj/effect/oneway{ dir = 8 @@ -3383,6 +3687,11 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/awaymission/museum) +"DX" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "DY" = ( /turf/closed/indestructible/reinforced/titanium, /area/awaymission/museum) @@ -3400,8 +3709,8 @@ /obj/machinery/computer/old{ name = "replica computer"; dir = 4; - icon_keyboard = "rd_key"; - icon_screen = "rdcomp" + icon_screen = "rdcomp"; + icon_keyboard = "rd_key" }, /turf/open/floor/iron/smooth_large, /area/awaymission/museum) @@ -3421,8 +3730,8 @@ dir = 4 }, /obj/structure/fluff/wallsign/directional/south{ - dir = 4; - name = "Oddities" + name = "Oddities"; + dir = 4 }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -3435,12 +3744,17 @@ /turf/open/indestructible/plating, /area/awaymission/museum) "Er" = ( -/obj/structure/chair/comfy/beige, /mob/living/basic/mothroach, +/obj/structure/chair/comfy/beige, /obj/effect/mapping_helpers/mob_buckler, /obj/machinery/light/warm/directional/west, /turf/open/floor/wood/large, /area/awaymission/museum) +"Es" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "EA" = ( /obj/machinery/door/airlock/shuttle/glass, /obj/effect/turf_decal/siding/dark_blue, @@ -3460,9 +3774,9 @@ /area/awaymission/museum) "EG" = ( /obj/item/flashlight/flare{ - start_on = 1; icon_state = "flare-on"; - light_range = 4 + light_range = 4; + start_on = 1 }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/indestructible/plating, @@ -3476,9 +3790,9 @@ "EM" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/booze{ - loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); - spawn_random_offset = 2; - spawn_loot_count = 2 + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer=10, /obj/item/reagent_containers/cup/glass/bottle/ale=10, /obj/item/reagent_containers/cup/glass/bottle/beer/light=5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor=5, /obj/item/reagent_containers/cup/glass/bottle/whiskey=5, /obj/item/reagent_containers/cup/glass/bottle/gin=5, /obj/item/reagent_containers/cup/glass/bottle/vodka=5, /obj/item/reagent_containers/cup/glass/bottle/tequila=5, /obj/item/reagent_containers/cup/glass/bottle/rum=5, /obj/item/reagent_containers/cup/glass/bottle/vermouth=5, /obj/item/reagent_containers/cup/glass/bottle/cognac=5, /obj/item/reagent_containers/cup/glass/bottle/wine=5, /obj/item/reagent_containers/cup/glass/bottle/kahlua=5, /obj/item/reagent_containers/cup/glass/bottle/amaretto=5, /obj/item/reagent_containers/cup/glass/bottle/hcider=5, /obj/item/reagent_containers/cup/glass/bottle/absinthe=5, /obj/item/reagent_containers/cup/glass/bottle/sake=5, /obj/item/reagent_containers/cup/glass/bottle/grappa=5, /obj/item/reagent_containers/cup/glass/bottle/applejack=5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic=5, /obj/item/reagent_containers/cup/bottle/ethanol=2, /obj/item/reagent_containers/cup/glass/bottle/fernet=2, /obj/item/reagent_containers/cup/glass/bottle/champagne=2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium=2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager=2, /obj/item/reagent_containers/cup/glass/bottle/patron=1, /obj/item/reagent_containers/cup/glass/bottle/kong=1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine=1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka=1, /obj/item/reagent_containers/cup/glass/bottle/trappist=1); + spawn_loot_count = 2; + spawn_random_offset = 2 }, /turf/open/floor/wood/large, /area/awaymission/museum) @@ -3502,15 +3816,15 @@ /turf/open/floor/circuit/green, /area/awaymission/museum) "ET" = ( +/mob/living/basic/statue/mannequin{ + dir = 1 + }, /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/tile/green/opposingcorners, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/siding/green{ dir = 1 }, -/mob/living/basic/statue/mannequin{ - dir = 1 - }, /turf/open/floor/iron, /area/awaymission/museum) "EU" = ( @@ -3520,8 +3834,8 @@ dir = 4 }, /obj/structure/fluff/wallsign/directional/north{ - dir = 4; - name = "Oddities" + name = "Oddities"; + dir = 4 }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -3594,8 +3908,8 @@ /area/awaymission/museum) "Fw" = ( /obj/effect/decal/cleanable/blood/tracks{ - should_dry = 0; - name = "replica blood" + name = "replica blood"; + should_dry = 0 }, /obj/effect/mapping_helpers/burnt_floor, /obj/effect/decal/cleanable/dirt/dust, @@ -3604,8 +3918,8 @@ "FA" = ( /obj/structure/table/reinforced, /obj/item/circuitboard{ - icon_state = "printer"; - name = "fancy replica tech" + name = "fancy replica tech"; + icon_state = "printer" }, /turf/open/floor/iron/smooth_large, /area/awaymission/museum) @@ -3642,6 +3956,32 @@ /obj/structure/sign/departments/restroom/directional/south, /turf/open/floor/wood/large, /area/awaymission/museum) +"FO" = ( +/obj/effect/decal/cleanable/crayon/puzzle/pin{ + puzzle_id = "museum_r_wing_puzzle" + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"FU" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/wallsign/directional/south{ + name = "Cafeteria"; + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"FY" = ( +/obj/structure/chair/sofa/bench/left, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) +"Ga" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/airlock/grunge, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "Gh" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/siding/dark_blue{ @@ -3655,16 +3995,15 @@ /obj/structure/closet/crate/miningcar, /turf/open/floor/tram/plate, /area/awaymission/museum) +"Gn" = ( +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "Gv" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "l"; +/obj/effect/decal/cleanable/crayon/l{ pixel_x = -10 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i" - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "e"; +/obj/effect/decal/cleanable/crayon/i, +/obj/effect/decal/cleanable/crayon/e{ pixel_x = 12 }, /obj/effect/decal/cleanable/dirt/dust, @@ -3675,20 +4014,27 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/awaymission/museum) +"GB" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/soda_cans/thirteenloko{ + pixel_y = 7 + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "GE" = ( /obj/structure/plaque/static_plaque/golden/commission/meta, /turf/open/floor/mineral/gold, /area/awaymission/museum) "GG" = ( +/mob/living/basic/statue/mannequin{ + dir = 4 + }, /obj/structure/chair/office{ dir = 4 }, /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/mob/living/basic/statue/mannequin{ - dir = 4 - }, /turf/open/floor/wood/tile, /area/awaymission/museum) "GO" = ( @@ -3762,8 +4108,8 @@ /area/awaymission/museum) "Hn" = ( /mob/living/basic/statue/mannequin{ - hat = /obj/item/clothing/head/costume/kitty; - dir = 8 + dir = 8; + hat = /obj/item/clothing/head/costume/kitty }, /obj/effect/turf_decal/trimline/yellow, /obj/effect/turf_decal/trimline/yellow/corner{ @@ -3797,7 +4143,7 @@ /area/awaymission/museum) "HA" = ( /obj/machinery/status_display/random_message{ - firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS") + firstline_to_secondline = list(NO="LITTERING", "YOU ARE"="BEING WATCHED", "DO NOT TOUCH"="THE EXHIBITS") }, /turf/closed/indestructible/reinforced, /area/awaymission/museum) @@ -3806,7 +4152,7 @@ /obj/effect/turf_decal/siding/dark_blue, /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "nothing" + id = "museum_secret" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -3838,6 +4184,9 @@ "HP" = ( /turf/open/floor/iron/freezer, /area/awaymission/museum) +"HQ" = ( +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "HU" = ( /obj/structure/railing{ dir = 4 @@ -3848,6 +4197,19 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/indestructible/plating, /area/awaymission/museum) +"HW" = ( +/obj/machinery/button/door/directional/north{ + name = "Lock Control"; + id = "museum_toilet1"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/structure/toilet/museum{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "HY" = ( /obj/machinery/light/floor, /obj/effect/decal/cleanable/dirt/dust, @@ -3857,6 +4219,12 @@ /obj/machinery/light/warm/dim/directional/north, /turf/open/floor/carpet, /area/awaymission/museum) +"Id" = ( +/obj/effect/decal/cleanable/crayon/puzzle/pin{ + puzzle_id = "museum_r_wing_puzzle" + }, +/turf/closed/indestructible/wood, +/area/awaymission/museum) "Ij" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/locked, @@ -3871,6 +4239,9 @@ /obj/structure/holosign/barrier/engineering, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) +"Ir" = ( +/turf/closed/indestructible/fakedoor, +/area/awaymission/museum) "Iu" = ( /turf/open/floor/mineral/titanium/blue, /area/awaymission/museum) @@ -3898,6 +4269,12 @@ /obj/item/food/grilled_beef_gyro, /turf/open/floor/wood/tile, /area/awaymission/museum) +"IG" = ( +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "IH" = ( /obj/machinery/portable_atmospherics/canister/water_vapor, /obj/effect/decal/cleanable/dirt/dust, @@ -3914,11 +4291,22 @@ /obj/effect/turf_decal/stripes, /turf/open/floor/iron/smooth_large, /area/awaymission/museum) +"IX" = ( +/mob/living/basic/statue/mannequin{ + name = "cafeteria patron"; + held_item = /obj/item/knife + }, +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "IZ" = ( +/mob/living/basic/mothroach, /obj/structure/chair/comfy/beige{ dir = 4 }, -/mob/living/basic/mothroach, /obj/effect/mapping_helpers/mob_buckler, /turf/open/floor/wood/large, /area/awaymission/museum) @@ -3959,6 +4347,13 @@ /obj/machinery/light/small/dim/directional/west, /turf/open/floor/carpet/executive, /area/awaymission/museum) +"Jl" = ( +/obj/machinery/status_display/random_message{ + pixel_x = 32; + firstline_to_secondline = list(CAFETERIA="YUMMY", CAFETERIA="HOTDOGS", ENJOY="YOUR MEAL") + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "Jn" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/entertainment/toy, @@ -3967,6 +4362,13 @@ /obj/effect/turf_decal/siding/dark_blue, /turf/open/floor/mineral/titanium/blue, /area/awaymission/museum) +"Jp" = ( +/obj/machinery/door/airlock{ + name = "Restroom Cabin 1"; + id_tag = "museum_toilet1" + }, +/turf/open/floor/iron, +/area/awaymission/museum) "Js" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/siding/dark_blue{ @@ -4077,11 +4479,24 @@ /turf/open/floor/catwalk_floor, /area/awaymission/museum) "Kx" = ( -/obj/effect/decal/cleanable/dirt/dust, /mob/living/basic/skeleton, +/obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/maintenance/three, /turf/open/indestructible/plating, /area/awaymission/museum) +"Kz" = ( +/obj/structure/sign/warning/no_smoking/directional/west, +/obj/machinery/computer/terminal/museum{ + name = "extinguisher manual terminal"; + dir = 4; + content = list("Instructions; stand upright; remove safety clip; aim noozle at base of fire... the rest is up to you.") + }, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) +"KB" = ( +/obj/structure/sign/warning/no_smoking/circle/directional/east, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "KI" = ( /turf/open/floor/iron/dark/side{ dir = 10 @@ -4112,7 +4527,7 @@ /area/awaymission/museum) "Lp" = ( /obj/machinery/status_display/random_message{ - firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS") + firstline_to_secondline = list(NO="LITTERING", "YOU ARE"="BEING WATCHED", "DO NOT TOUCH"="THE EXHIBITS") }, /turf/closed/indestructible/reinforced/titanium/nodiagonal, /area/awaymission/museum) @@ -4162,6 +4577,12 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"LK" = ( +/obj/structure/table, +/obj/item/piggy_bank/museum, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron, +/area/awaymission/museum/cafeteria) "LN" = ( /obj/effect/decal/cleanable/glass/titanium, /turf/open/floor/iron/dark/textured_large, @@ -4197,6 +4618,11 @@ "Ma" = ( /turf/open/chasm/true/no_smooth, /area/awaymission/museum) +"Mb" = ( +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "Mg" = ( /obj/structure/plaque/static_plaque/golden/commission/tram, /turf/closed/indestructible/reinforced, @@ -4215,9 +4641,9 @@ /area/awaymission/museum) "Mv" = ( /mob/living/basic/statue/mannequin{ + name = "Michael Trasen"; dir = 4; - held_item = /obj/item/wrench; - name = "Michael Trasen" + held_item = /obj/item/wrench }, /obj/effect/turf_decal/stripes{ dir = 4 @@ -4300,10 +4726,16 @@ /obj/structure/plaque/static_plaque/golden/commission/birdboat, /turf/closed/indestructible/reinforced, /area/awaymission/museum) +"Nn" = ( +/obj/machinery/door/airlock/public{ + name = "Restrooms" + }, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "Ns" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/booze{ - loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer=10, /obj/item/reagent_containers/cup/glass/bottle/ale=10, /obj/item/reagent_containers/cup/glass/bottle/beer/light=5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor=5, /obj/item/reagent_containers/cup/glass/bottle/whiskey=5, /obj/item/reagent_containers/cup/glass/bottle/gin=5, /obj/item/reagent_containers/cup/glass/bottle/vodka=5, /obj/item/reagent_containers/cup/glass/bottle/tequila=5, /obj/item/reagent_containers/cup/glass/bottle/rum=5, /obj/item/reagent_containers/cup/glass/bottle/vermouth=5, /obj/item/reagent_containers/cup/glass/bottle/cognac=5, /obj/item/reagent_containers/cup/glass/bottle/wine=5, /obj/item/reagent_containers/cup/glass/bottle/kahlua=5, /obj/item/reagent_containers/cup/glass/bottle/amaretto=5, /obj/item/reagent_containers/cup/glass/bottle/hcider=5, /obj/item/reagent_containers/cup/glass/bottle/absinthe=5, /obj/item/reagent_containers/cup/glass/bottle/sake=5, /obj/item/reagent_containers/cup/glass/bottle/grappa=5, /obj/item/reagent_containers/cup/glass/bottle/applejack=5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic=5, /obj/item/reagent_containers/cup/bottle/ethanol=2, /obj/item/reagent_containers/cup/glass/bottle/fernet=2, /obj/item/reagent_containers/cup/glass/bottle/champagne=2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium=2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager=2, /obj/item/reagent_containers/cup/glass/bottle/patron=1, /obj/item/reagent_containers/cup/glass/bottle/kong=1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine=1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka=1, /obj/item/reagent_containers/cup/glass/bottle/trappist=1); spawn_random_offset = 2 }, /turf/open/floor/wood/large, @@ -4324,8 +4756,8 @@ /obj/structure/railing, /obj/structure/table, /obj/item/clothing/mask/cigarette/cigar{ - lit = 1; - icon_state = "cigaron" + icon_state = "cigaron"; + lit = 1 }, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) @@ -4431,11 +4863,11 @@ /turf/open/floor/iron, /area/awaymission/museum) "OS" = ( +/mob/living/basic/mothroach, /obj/structure/chair/stool/bar/directional/east{ can_buckle = 1 }, /obj/effect/mapping_helpers/mob_buckler, -/mob/living/basic/mothroach, /turf/open/floor/wood/large, /area/awaymission/museum) "OT" = ( @@ -4481,6 +4913,9 @@ /obj/item/food/kebab/pineapple_skewer, /turf/open/floor/iron/freezer, /area/awaymission/museum) +"Ph" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/museum/cafeteria) "Pi" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/siding/dark_blue/corner{ @@ -4584,8 +5019,8 @@ "PZ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/flashlight/flare{ - start_on = 1; - icon_state = "flare-on" + icon_state = "flare-on"; + start_on = 1 }, /turf/open/indestructible/plating, /area/awaymission/museum) @@ -4756,9 +5191,9 @@ }, /obj/structure/fluff{ name = "replica prototype autolathe"; + desc = "A non-functional replica of a prototype Autolathe."; icon = 'icons/obj/machines/lathes.dmi'; - icon_state = "autolathe"; - desc = "A non-functional replica of a prototype Autolathe." + icon_state = "autolathe" }, /turf/open/floor/iron/smooth_corner{ dir = 4 @@ -4803,6 +5238,18 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, /area/awaymission/museum) +"RQ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/fluff/fake_camera, +/obj/effect/decal/puzzle_dots{ + pixel_y = -32; + id = "museum_r_wing_puzzle" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) "RR" = ( /obj/machinery/suit_storage_unit/open, /obj/effect/turf_decal/box, @@ -4829,8 +5276,8 @@ /turf/open/floor/bluespace, /area/awaymission/museum) "Se" = ( -/obj/structure/chair/comfy/beige, /mob/living/basic/mothroach, +/obj/structure/chair/comfy/beige, /obj/effect/mapping_helpers/mob_buckler, /turf/open/floor/wood/large, /area/awaymission/museum) @@ -4839,6 +5286,11 @@ /obj/structure/railing, /turf/open/floor/holofloor/asteroid, /area/awaymission/museum) +"Sm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "So" = ( /obj/machinery/shower/directional/east, /turf/open/floor/iron/white/textured_large, @@ -4849,7 +5301,7 @@ /area/awaymission/museum) "Sv" = ( /obj/machinery/status_display/random_message{ - firstline_to_secondline = list("SOUVENIR" = "SHOP") + firstline_to_secondline = list(SOUVENIR="SHOP") }, /turf/closed/indestructible/reinforced, /area/awaymission/museum) @@ -4880,7 +5332,11 @@ }, /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "nothing" + id = "museum_secret" + }, +/obj/machinery/puzzle/password/pin/directional/south{ + id = "museum_r_wing_puzzle"; + late_initialize_pop = 1 }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -4889,6 +5345,14 @@ /obj/item/stack/spacecash/c1000, /turf/open/indestructible/plating, /area/awaymission/museum) +"Ta" = ( +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/crayon/puzzle/pin{ + pixel_x = -32; + puzzle_id = "museum_r_wing_puzzle" + }, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "Tr" = ( /obj/structure/plaque/static_plaque/golden/commission/kilo, /obj/machinery/light/floor, @@ -4923,6 +5387,13 @@ }, /turf/open/indestructible/plating, /area/awaymission/museum) +"TC" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Cafeteria"; + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/museum/cafeteria) "TF" = ( /turf/open/floor/iron/stairs/right{ dir = 4 @@ -4998,8 +5469,8 @@ dir = 8 }, /obj/structure/fluff/wallsign/directional/east{ - dir = 2; - name = "Exit" + name = "Exit"; + dir = 2 }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -5037,8 +5508,8 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/structure/table, /obj/item/computer_disk{ - icon_state = "datadisk_hydro"; - name = "plant data disk" + name = "plant data disk"; + icon_state = "datadisk_hydro" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -5066,6 +5537,12 @@ /mob/living/basic/mothroach, /turf/open/misc/beach/sand, /area/awaymission/museum/mothroachvoid) +"UH" = ( +/obj/structure/mirror/broken/directional/east, +/obj/structure/sink/directional/west, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "UI" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/effect/decal/cleanable/dirt/dust, @@ -5106,8 +5583,8 @@ /area/awaymission/museum) "UT" = ( /obj/machinery/status_display/random_message{ - firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS"); - pixel_x = 32 + pixel_x = 32; + firstline_to_secondline = list(NO="LITTERING", "YOU ARE"="BEING WATCHED", "DO NOT TOUCH"="THE EXHIBITS") }, /turf/open/floor/carpet, /area/awaymission/museum) @@ -5129,6 +5606,14 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth_half, /area/awaymission/museum) +"Vb" = ( +/obj/effect/replica_spawner{ + obvious_replica = 0; + pixel_y = 30; + target_path = /obj/structure/sign/painting/eldritch/weeping + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "Vc" = ( /obj/machinery/light/warm/directional/east, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -5380,6 +5865,25 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"WY" = ( +/obj/machinery/button/door/directional/north{ + name = "Lock Control"; + id = "museum_toilet2"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/structure/toilet/museum{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) +"WZ" = ( +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "Xa" = ( /obj/structure/broken_flooring/corner/always_floorplane{ dir = 2 @@ -5402,6 +5906,10 @@ "Xh" = ( /turf/closed/indestructible/fakedoor/maintenance, /area/awaymission/museum) +"Xi" = ( +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "Xo" = ( /obj/structure/lattice/catwalk/mining, /obj/structure/railing, @@ -5502,8 +6010,8 @@ /turf/closed/indestructible/reinforced/titanium/nodiagonal, /area/awaymission/museum) "Yg" = ( -/obj/effect/decal/cleanable/dirt/dust, /mob/living/basic/cockroach, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/indestructible/plating, /area/awaymission/museum) "Yk" = ( @@ -5512,6 +6020,12 @@ }, /turf/open/floor/iron, /area/awaymission/museum) +"Yn" = ( +/obj/machinery/light/warm/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "Yr" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/structure/table/reinforced, @@ -5521,13 +6035,21 @@ /obj/item/reagent_containers/cup/glass/mug/nanotrasen, /turf/open/floor/iron/dark, /area/awaymission/museum) +"Yy" = ( +/obj/machinery/computer/terminal/museum{ + name = "donation info terminal"; + dir = 8; + content = list("We're once again asking for your financial support; We love our job, but love alone can only get us so far. Please consider leaving a donation to help keep the musuem running. Thank you.") + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "Yz" = ( -/obj/effect/turf_decal/siding, /mob/living/basic/statue/mannequin{ dir = 8; held_item = /obj/item/pickaxe; hat = /obj/item/clothing/suit/hooded/explorer }, +/obj/effect/turf_decal/siding, /obj/structure/railing, /turf/open/floor/holofloor/asteroid, /area/awaymission/museum) @@ -5571,8 +6093,15 @@ /obj/item/reagent_containers/cup/glass/coffee/no_lid{ pixel_x = 12 }, +/obj/item/paper/fluff/museum/numbers_on_walls, /turf/open/floor/iron, /area/awaymission/museum) +"Za" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "Zf" = ( /obj/structure/plaque/static_plaque/golden/commission/donut, /turf/closed/indestructible/reinforced, @@ -5589,6 +6118,11 @@ /obj/structure/lattice, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) +"Zo" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/snack, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "Zp" = ( /obj/structure/plaque/static_plaque/golden/commission/icebox, /turf/closed/indestructible/reinforced, @@ -5613,6 +6147,16 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"Zx" = ( +/obj/structure/chair/sofa/bench, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) +"Zz" = ( +/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/cafeteria, +/area/awaymission/museum/cafeteria) "ZB" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/structure/broken_flooring/side/always_floorplane/directional/east, @@ -5644,6 +6188,13 @@ }, /turf/open/floor/iron/dark, /area/awaymission/museum) +"ZO" = ( +/obj/structure/sink/directional/south{ + pixel_y = 6 + }, +/obj/structure/mirror/directional/north, +/turf/open/floor/iron/white/small, +/area/awaymission/museum) "ZP" = ( /obj/structure/statue/gold/ce{ anchored = 1 @@ -26150,7 +26701,7 @@ re re re re -re +Uq re re re @@ -26403,12 +26954,12 @@ re re re re -re -re -re -re -re -re +FK +FK +FK +FK +FK +Uq re re re @@ -26660,11 +27211,11 @@ re re re re -re -re -re -re -re +FK +kZ +FK +oD +FK re re re @@ -26915,13 +27466,13 @@ Wc FK re re -re -re -re -re -re -re -re +FK +FO +FK +ta +FK +AQ +FK re re re @@ -27172,13 +27723,13 @@ fy FK re re -re -re -re -re -re -re -re +FK +jO +ry +Gn +Ta +Gn +FK re re re @@ -27429,13 +27980,13 @@ tD FK re re -re -re -re -re -re -re -re +FK +FK +FO +IG +Gn +ax +FK re re re @@ -27687,12 +28238,12 @@ FK re re re -re -re -re -re -re -re +FK +ZO +Gn +Gn +Gn +FK re re re @@ -27947,7 +28498,7 @@ FK FK FK FK -FK +Nn FK FK Uq @@ -29699,7 +30250,7 @@ aW MF MF MF -MF +Id Re PZ Ma @@ -34375,7 +34926,7 @@ FK FK FK FK -FK +FO FK FK FK @@ -35113,7 +35664,7 @@ re re re re -FK +FO qw XK PP @@ -35916,7 +36467,7 @@ FK FK FK Yd -FK +FO NO dZ mn @@ -35958,6 +36509,9 @@ nu FK FK FK +FK +FK +FK Uq re re @@ -35995,9 +36549,6 @@ re re re re -re -re -re "} (119,1,1) = {" re @@ -36214,10 +36765,10 @@ qQ xI gT Qb -FK -re -re -re +Ga +gg +iJ +FO re re re @@ -36472,9 +37023,9 @@ xI xd ns FK -re -re -re +FK +FK +FK re re re @@ -36731,7 +37282,7 @@ BO FK re re -re +Uq re re re @@ -36986,7 +37537,7 @@ Nc FK FK FK -Uq +re re re re @@ -37461,7 +38012,7 @@ FK FK FK PB -FK +FO Ma Ma Ma @@ -40781,7 +41332,7 @@ FK FK FK FK -lb +eW uY rQ FK @@ -42582,7 +43133,7 @@ FK FK lb uY -qX +RQ FK FK FK @@ -43085,19 +43636,19 @@ re re re re +FK +FK +FK +FK +FK +FK +FK re -re -re -re -re -re -re -re -Uq -re -re -re -Uq +FK +aa +uY +ci +jC re re re @@ -43342,19 +43893,19 @@ re re re re -re -re -re -re -re -re -re -re -re -re -re -re -re +FK +aO +FK +WY +FK +HW +FK +FK +FK +Mb +TM +wV +FK re re re @@ -43599,19 +44150,19 @@ re re re re -re -re -re -re -re -re -re -re -re -re -re -re -re +FK +wg +FK +us +FK +Jp +FK +um +FK +Mb +uY +wV +FK re re re @@ -43856,19 +44407,19 @@ re re re re -re -re -re -re -re -re -re -re -re -re -re -re -re +FK +Gn +Gn +Gn +Sm +Gn +Kz +Gn +FK +ju +uY +ci +Ir re re re @@ -44113,19 +44664,19 @@ re re re re -re -re -re -re -re -re -re -re -re -re -re -re -re +FK +nY +Gn +Gn +Gn +Gn +Gn +Gn +kx +uY +uY +wV +FK re re re @@ -44370,19 +44921,19 @@ re re re re -re -re -re -re -re -re -re -re -re -re -re -re -re +FK +ut +UH +gE +CG +Gn +CG +Yn +FK +RC +TM +FU +FK re re re @@ -44627,20 +45178,20 @@ re re re re -re -re -re -re -re -re -re -re -re -re -re -re -re -re +FK +FK +FK +FK +FK +FK +FK +FK +FK +Mb +uY +wV +FK +Uq re re re @@ -44892,11 +45443,11 @@ re re re re -re -re -re -re -re +FK +pN +uY +hS +oP re re re @@ -45149,11 +45700,11 @@ re re re re -re -re -re -re -re +FK +FK +pz +kL +FK re re re @@ -45403,16 +45954,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +Ph +Ph +Ph +Ph +ms +TC +Ph +Ph +Ph re re re @@ -45660,16 +46211,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +DX +HQ +fl +Zz +HQ +HQ +HQ +ac +Ph re re re @@ -45917,16 +46468,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +qK +HQ +HQ +HQ +HQ +HQ +HQ +HQ +vG re re re @@ -46174,16 +46725,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +uH +HQ +Xi +xp +nZ +Xi +Es +nZ +Ph re re re @@ -46431,17 +46982,17 @@ re re re re -re -re -re -re -re -re -re -re -re -re -re +Ph +Vb +HQ +Zx +hm +WZ +ql +xp +WZ +Ph +Uq re re re @@ -46688,16 +47239,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +HQ +HQ +ql +Zo +WZ +ql +GB +IX +Ph re re re @@ -46945,16 +47496,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +Db +HQ +FY +xO +Za +FY +xp +Za +Ph re re re @@ -47202,16 +47753,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +LK +Yy +HQ +HQ +KB +Jl +HQ +cY +Ph re re re @@ -47459,16 +48010,16 @@ re re re re -re -re -re -re -re -re -re -re -re -re +Ph +Ph +Ph +Ph +Ph +Ph +Ph +Ph +Ph +Ph re re re diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index b5be9a8313b..154522d9c25 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -1134,8 +1134,8 @@ /area/awaymission/research/interior/security) "fw" = ( /obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 + capacity = 1.8e+008; + charge = 2e+005 }, /obj/structure/cable, /turf/open/floor/iron/dark, diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 4f34db636f9..e444510605c 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -3802,7 +3802,7 @@ /area/awaymission/undergroundoutpost45/engineering) "ot" = ( /obj/machinery/power/smes{ - charge = 1.5e+006; + charge = 3e+007; input_level = 10000; inputting = 0; output_level = 7000 @@ -3812,7 +3812,7 @@ /area/awaymission/undergroundoutpost45/engineering) "ou" = ( /obj/machinery/power/smes{ - charge = 1.5e+006; + charge = 3e+007; input_level = 30000; inputting = 0; output_level = 7000 diff --git a/_maps/map_files/Deathmatch/OSHA_Violator.dmm b/_maps/deathmatch/OSHA_Violator.dmm similarity index 100% rename from _maps/map_files/Deathmatch/OSHA_Violator.dmm rename to _maps/deathmatch/OSHA_Violator.dmm diff --git a/_maps/map_files/Deathmatch/starwars.dmm b/_maps/deathmatch/arena_station.dmm similarity index 100% rename from _maps/map_files/Deathmatch/starwars.dmm rename to _maps/deathmatch/arena_station.dmm diff --git a/_maps/map_files/Deathmatch/raidthebase.dmm b/_maps/deathmatch/backalley.dmm similarity index 100% rename from _maps/map_files/Deathmatch/raidthebase.dmm rename to _maps/deathmatch/backalley.dmm diff --git a/_maps/map_files/Deathmatch/instagib.dmm b/_maps/deathmatch/instagib.dmm similarity index 100% rename from _maps/map_files/Deathmatch/instagib.dmm rename to _maps/deathmatch/instagib.dmm diff --git a/_maps/map_files/Deathmatch/Maint_Mania.dmm b/_maps/deathmatch/maint_mania.dmm similarity index 99% rename from _maps/map_files/Deathmatch/Maint_Mania.dmm rename to _maps/deathmatch/maint_mania.dmm index ec04776ae83..8bb2522bc5d 100644 --- a/_maps/map_files/Deathmatch/Maint_Mania.dmm +++ b/_maps/deathmatch/maint_mania.dmm @@ -46,11 +46,6 @@ "hB" = ( /turf/closed/indestructible/fakedoor, /area/deathmatch) -"hN" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/dirt/dust, -/turf/template_noop, -/area/template_noop) "ih" = ( /obj/item/reagent_containers/pill/maintenance, /turf/open/indestructible, @@ -512,7 +507,7 @@ FL FL ur ur -hN +ur ur ur ur diff --git a/_maps/map_files/Deathmatch/meatower.dmm b/_maps/deathmatch/meat_tower.dmm similarity index 99% rename from _maps/map_files/Deathmatch/meatower.dmm rename to _maps/deathmatch/meat_tower.dmm index 47613f89885..fb2359fa288 100644 --- a/_maps/map_files/Deathmatch/meatower.dmm +++ b/_maps/deathmatch/meat_tower.dmm @@ -198,7 +198,7 @@ /obj/machinery/conveyor/auto{ dir = 4 }, -/obj/item/pizzabox/margherita/robo, +/obj/item/pizzabox/margherita, /obj/effect/turf_decal/siding/dark{ dir = 1 }, diff --git a/_maps/map_files/Deathmatch/mech_madness.dmm b/_maps/deathmatch/mech_madness.dmm similarity index 100% rename from _maps/map_files/Deathmatch/mech_madness.dmm rename to _maps/deathmatch/mech_madness.dmm diff --git a/_maps/map_files/Deathmatch/The_Brig.dmm b/_maps/deathmatch/meta_brig.dmm similarity index 100% rename from _maps/map_files/Deathmatch/The_Brig.dmm rename to _maps/deathmatch/meta_brig.dmm diff --git a/_maps/map_files/Deathmatch/ragecage.dmm b/_maps/deathmatch/ragecage.dmm similarity index 100% rename from _maps/map_files/Deathmatch/ragecage.dmm rename to _maps/deathmatch/ragecage.dmm diff --git a/_maps/map_files/Deathmatch/SecuRing.dmm b/_maps/deathmatch/secu_ring.dmm similarity index 100% rename from _maps/map_files/Deathmatch/SecuRing.dmm rename to _maps/deathmatch/secu_ring.dmm diff --git a/_maps/map_files/Deathmatch/shooting_range.dmm b/_maps/deathmatch/shooting_range.dmm similarity index 100% rename from _maps/map_files/Deathmatch/shooting_range.dmm rename to _maps/deathmatch/shooting_range.dmm diff --git a/_maps/map_files/Deathmatch/Sniper_elite.dmm b/_maps/deathmatch/sniper_elite.dmm similarity index 100% rename from _maps/map_files/Deathmatch/Sniper_elite.dmm rename to _maps/deathmatch/sniper_elite.dmm diff --git a/_maps/map_files/Deathmatch/chinatown.dmm b/_maps/deathmatch/sunrise.dmm similarity index 98% rename from _maps/map_files/Deathmatch/chinatown.dmm rename to _maps/deathmatch/sunrise.dmm index 78cb949235d..b4de46385cd 100644 --- a/_maps/map_files/Deathmatch/chinatown.dmm +++ b/_maps/deathmatch/sunrise.dmm @@ -45,7 +45,7 @@ pixel_y = -1; pixel_x = -9 }, -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/deathmatch) "dr" = ( /obj/structure/closet/crate/wooden, @@ -254,7 +254,7 @@ /obj/item/food/grown/wheat{ pixel_x = -10 }, -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/deathmatch) "pG" = ( /turf/open/floor/wood/large, @@ -339,7 +339,7 @@ "uP" = ( /mob/living/basic/cow, /obj/machinery/light, -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/deathmatch) "vC" = ( /obj/structure/mineral_door/paperframe, @@ -590,7 +590,7 @@ /turf/open/misc/grass, /area/deathmatch) "Na" = ( -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/deathmatch) "Nn" = ( /obj/structure/flora/bush/flowers_br/style_random, @@ -614,7 +614,7 @@ /area/deathmatch) "OA" = ( /obj/item/clothing/shoes/cowboy, -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/deathmatch) "OV" = ( /obj/structure/chair/stool/bamboo{ @@ -636,7 +636,7 @@ /area/deathmatch) "PE" = ( /obj/structure/water_source/puddle, -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/deathmatch) "PF" = ( /obj/effect/decal/cleanable/blood/old, @@ -751,7 +751,7 @@ /obj/item/food/grown/wheat{ pixel_x = -10 }, -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/deathmatch) "Vm" = ( /obj/structure/table/wood, diff --git a/_maps/map_files/Deathmatch/arena.dmm b/_maps/deathmatch/underground_arena.dmm similarity index 100% rename from _maps/map_files/Deathmatch/arena.dmm rename to _maps/deathmatch/underground_arena.dmm diff --git a/_maps/gateway_test.json b/_maps/gateway_test.json index 5f4f8eec8a9..0b3923162f6 100644 --- a/_maps/gateway_test.json +++ b/_maps/gateway_test.json @@ -10,6 +10,7 @@ "/datum/unit_test/job_roundstart_spawnpoints", "/datum/unit_test/required_map_items", "/datum/unit_test/space_dragon_expiration", + "/datum/unit_test/spy_bounty", "/datum/unit_test/traitor" ] } diff --git a/_maps/map_files/Basketball/lusty_xenomorphs.dmm b/_maps/map_files/Basketball/lusty_xenomorphs.dmm index b5c8b5a6184..534376d3f56 100644 --- a/_maps/map_files/Basketball/lusty_xenomorphs.dmm +++ b/_maps/map_files/Basketball/lusty_xenomorphs.dmm @@ -217,7 +217,7 @@ /turf/open/floor/engine, /area/centcom/basketball) "pu" = ( -/mob/living/simple_animal/slime/random, +/mob/living/basic/slime/random, /turf/open/floor/engine, /area/centcom/basketball) "qU" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 95b939e5267..d9fb22def8f 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -3,6 +3,11 @@ /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) +"aap" = ( +/obj/structure/sign/warning/pods/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "aav" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -17,6 +22,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) +"aaA" = ( +/obj/structure/table/reinforced, +/obj/structure/spider/stickyweb, +/obj/item/clothing/suit/hazardvest{ + pixel_x = 3; + pixel_y = 21 + }, +/obj/item/hfr_box/corner{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/hfr_box/body/interface, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "abh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26,13 +46,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"abs" = ( -/obj/structure/rack, -/obj/item/stack/sheet/glass/fifty, -/obj/item/storage/toolbox/mechanical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos/project) "abt" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -46,52 +59,35 @@ }, /turf/open/floor/iron, /area/station/security/tram) +"abR" = ( +/obj/machinery/power/emitter{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/no_smoking/circle/directional/south, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"acg" = ( +/obj/machinery/power/smes/engineering, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "ach" = ( /obj/machinery/netpod, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) -"acl" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"acn" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 1 +"aci" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"acu" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/camera/directional/north, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"acF" = ( -/turf/closed/wall/rust, -/area/station/engineering/atmos/project) +/turf/open/space/basic, +/area/space/nearstation) "acJ" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"acN" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"acQ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "acS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -114,15 +110,6 @@ /obj/item/surgery_tray/full/morgue, /turf/open/floor/iron/small, /area/station/medical/morgue) -"adB" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"adF" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "adL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -134,27 +121,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"adO" = ( -/obj/structure/rack, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/mineral/plasma{ - amount = 30 +"adV" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics" }, -/obj/item/pickaxe, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"adR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"aed" = ( -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"aem" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos/project) +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmos_airlock_1" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/hallway) "aen" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -192,22 +170,10 @@ /obj/item/food/sandwich/peanut_butter_jelly, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"aev" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) -"aeA" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, +"aeu" = ( +/obj/structure/grille, /turf/open/floor/plating, -/area/station/engineering/atmos/project) -"aeC" = ( -/obj/structure/cable, -/obj/machinery/power/floodlight, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +/area/station/maintenance/department/engine/atmos) "aeD" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/computer/scan_consolenew{ @@ -220,12 +186,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/science/genetics) -"aeF" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "aeN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -239,17 +199,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) -"afi" = ( +"aeX" = ( +/obj/structure/window/spawner/directional/east, +/obj/item/kirbyplants/random, +/obj/item/wrench, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Air to Distro" - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/lobby) "afl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -287,23 +245,15 @@ dir = 8 }, /area/station/science/lobby) +"afB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "afF" = ( /obj/structure/table, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"afP" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"afX" = ( -/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/engineering/atmos/project) "agb" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -317,12 +267,6 @@ /obj/effect/landmark/start/virologist, /turf/open/floor/iron/white, /area/station/medical/virology) -"agn" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "agy" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/tank/oxygen{ @@ -337,18 +281,13 @@ /obj/structure/sign/departments/vault/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) -"agD" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"agE" = ( -/obj/effect/turf_decal/stripes{ - dir = 10 +"agF" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/sofa/bamboo/right{ + dir = 1 }, -/obj/machinery/atmospherics/components/binary/valve/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +/turf/open/floor/wood/large, +/area/station/service/chapel) "agI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -359,11 +298,14 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"agT" = ( -/obj/effect/turf_decal/stripes, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +"agR" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/shieldgen, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "agV" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/white/warning{ @@ -382,15 +324,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood, /area/station/commons/fitness/recreation) -"agY" = ( -/obj/effect/turf_decal/stripes, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"ahe" = ( -/obj/effect/turf_decal/stripes, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "ahj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -412,17 +345,6 @@ /mob/living/basic/pet/cat/runtime, /turf/open/floor/iron/white/small, /area/station/command/heads_quarters/cmo) -"ahy" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos/project) -"ahz" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/binary/valve/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "ahD" = ( /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, @@ -438,31 +360,21 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) -"ahM" = ( -/obj/structure/chair/office/light{ +"ahW" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/stairs/old{ dir = 4 }, -/mob/living/basic/parrot/poly, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) +/area/station/engineering/break_room) "aid" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) -"ait" = ( -/obj/machinery/atmospherics/components/binary/valve/layer2, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos/project) -"aiA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/rust, -/area/station/engineering/atmos/project) "aiE" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -479,70 +391,46 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/iron, /area/station/commons/storage/art) -"aiJ" = ( -/obj/machinery/door/airlock/external/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"aiN" = ( +"aiK" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, -/obj/machinery/power/port_gen/pacman, -/obj/machinery/power/terminal{ - dir = 4 +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "ceprivacy"; + name = "Chief's Privacy Shutters" }, /turf/open/floor/plating, -/area/station/engineering/atmos/project) -"aiO" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 +/area/station/engineering/lobby) +"aiL" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"ajg" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"ajo" = ( -/obj/machinery/atmospherics/components/tank/plasma{ - dir = 1 +/turf/open/floor/engine/airless, +/area/station/engineering/atmos) +"ako" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/wallframe/apc, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/engineering/atmos/project) -"ajG" = ( -/obj/machinery/atmospherics/components/tank/oxygen{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"ajI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall, -/area/station/engineering/atmos/project) -"ajM" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"ajQ" = ( -/obj/machinery/door/airlock/external/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +/area/station/maintenance/department/electrical) "akt" = ( /obj/structure/table/wood, /obj/item/clothing/mask/gas/owl_mask, /turf/open/floor/wood, /area/station/maintenance/fore/greater) +"aky" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "akF" = ( /obj/effect/landmark/transport/nav_beacon/tram/nav/immovable_rod, /turf/closed/wall, @@ -557,6 +445,23 @@ }, /turf/open/floor/iron, /area/station/security) +"akS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/atmos, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) +"akU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "akY" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -577,6 +482,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"alg" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/carpet/lone, +/area/station/service/chapel/office) "alh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -587,24 +498,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"alx" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +"all" = ( +/obj/structure/table/greyscale, +/obj/item/folder/yellow{ + pixel_x = 9; + pixel_y = 1 }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"alD" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 9 +/obj/item/pen{ + pixel_x = 5 }, -/obj/structure/marker_beacon/jade, -/turf/open/space/basic, -/area/space/nearstation) +/obj/item/reagent_containers/cup/bottle/welding_fuel{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "alF" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -621,38 +529,11 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/maintenance/solars/starboard/aft) -"alR" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing/corner, -/turf/open/space/basic, -/area/space/nearstation) "alV" = ( /obj/structure/cable, /obj/machinery/power/apc/worn_out/directional/west, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) -"amp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"amq" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) "amE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -665,14 +546,18 @@ }, /turf/open/floor/iron/textured_half, /area/station/security/execution/transfer) -"amG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 1 +"amH" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Air to Mix" }, -/obj/structure/railing/corner, -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "amI" = ( /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 @@ -701,21 +586,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"ann" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/marker_beacon/jade, -/turf/open/space/basic, -/area/space/nearstation) -"anv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) "anJ" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -724,45 +594,10 @@ /obj/machinery/chem_heater/withbuffer, /turf/open/floor/iron, /area/station/medical/chemistry) -"anV" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"anZ" = ( -/obj/structure/table/reinforced, -/obj/item/folder{ - pixel_x = -6 - }, -/obj/machinery/door/window/left/directional/east{ - name = "Robotics Desk"; - req_access = list("robotics") - }, -/obj/structure/desk_bell{ - pixel_x = 6 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "roboticshut"; - name = "Robotics Shutters" - }, -/turf/open/floor/iron/textured_large, -/area/station/science/robotics/lab) "aoa" = ( /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit, /area/station/tcommsat/server) -"aoe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "aoj" = ( /obj/structure/railing{ dir = 8 @@ -777,17 +612,6 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"aou" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ - dir = 10 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "aoz" = ( /obj/structure/closet/secure_closet/captains, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -805,6 +629,14 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"apd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) "api" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -814,6 +646,19 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/white/small, /area/station/science/server) +"apj" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "apk" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red{ @@ -835,24 +680,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/lab) -"aqr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ +"apZ" = ( +/turf/open/floor/engine/helium, +/area/station/ai_monitored/turret_protected/ai) +"aqn" = ( +/obj/effect/turf_decal/siding/dark{ dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"aqU" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos/space_catwalk) +"aqo" = ( +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "aqV" = ( /obj/machinery/door/airlock/glass, /obj/machinery/door/firedoor, @@ -883,18 +724,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/storage) -"arA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/station_engineer, -/obj/machinery/meter, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "arB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -907,16 +736,6 @@ dir = 8 }, /area/station/science/xenobiology) -"arJ" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 15 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 8 - }, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "arK" = ( /obj/structure/sign/warning/secure_area{ desc = "A warning sign which reads 'BOMB RANGE"; @@ -924,10 +743,15 @@ }, /turf/closed/wall, /area/station/science/ordnance/bomb) -"arP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +"arN" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/pacman, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/electrical) "asb" = ( /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/small, @@ -940,12 +764,6 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/maintenance/aft) -"asf" = ( -/obj/effect/turf_decal/stripes{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "ask" = ( /obj/structure/cable, /obj/machinery/door/airlock/public/glass{ @@ -964,12 +782,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/station/service/theater) -"asq" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "asN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1022,15 +834,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"atF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "atG" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -1052,30 +855,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"atN" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space/basic, -/area/space/nearstation) "atW" = ( /turf/open/floor/iron/chapel{ dir = 8 }, /area/station/maintenance/starboard/greater) -"aun" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) -"auB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +"auc" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/structure/closet/firecloset, +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine) "auG" = ( /obj/structure/chair{ dir = 1 @@ -1087,12 +882,21 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"auQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "ave" = ( /turf/open/space, /area/space) -"avp" = ( -/turf/closed/wall/r_wall, -/area/station/engineering/engine_smes) "avB" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -1101,15 +905,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"avD" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/misc/asteroid, -/area/station/maintenance/department/engine) -"avL" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "avN" = ( /obj/structure/table/glass, /obj/effect/decal/cleanable/dirt, @@ -1134,13 +929,6 @@ }, /turf/open/floor/tram, /area/station/security/tram) -"awi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/plastic{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "aws" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue/half, @@ -1203,6 +991,16 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"axX" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/obj/machinery/light/cold/dim/directional/south, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "ayf" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -1220,31 +1018,45 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"ayi" = ( -/turf/closed/wall, -/area/station/engineering/atmos/project) -"ayn" = ( -/obj/item/kirbyplants/organic/applebush, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "ayu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /turf/open/floor/iron/white/small, /area/station/science/cubicle) +"ayx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "ayK" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"ayO" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"ayR" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/engineering/main) "ayV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1271,22 +1083,6 @@ }, /turf/open/floor/iron/diagonal, /area/station/command/heads_quarters/hop) -"azq" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/maintenance{ - name = "Engineering Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "azv" = ( /obj/machinery/teleport/station, /obj/effect/turf_decal/stripes/line{ @@ -1304,13 +1100,6 @@ "azz" = ( /turf/open/floor/iron, /area/station/security/prison/workout) -"azB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "azJ" = ( /obj/item/kirbyplants/organic/applebush, /obj/machinery/light/small/directional/south, @@ -1333,28 +1122,21 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) -"aAt" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 +"aAb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/engineering/atmos) "aAD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, /obj/item/book/manual/wiki/tcomms, /turf/open/floor/circuit, /area/station/tcommsat/server) -"aAE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) "aAL" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -1364,6 +1146,16 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"aAQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "aAV" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -1373,14 +1165,27 @@ }, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) -"aBs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"aBb" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) +/obj/item/storage/box/syringes{ + pixel_x = 3; + pixel_y = 14 + }, +/obj/machinery/button/door/directional/south{ + id = "medbreach"; + name = "Breach Shutters Control" + }, +/obj/machinery/light/cold/directional/south, +/obj/item/storage/box/masks{ + pixel_x = -2; + pixel_y = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "aBu" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -1425,10 +1230,6 @@ /obj/structure/sign/departments/science/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"aCf" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/department/engine) "aCi" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -1468,12 +1269,6 @@ /obj/effect/landmark/transport/nav_beacon/tram/platform/birdshot/maint_right, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) -"aCZ" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "aDe" = ( /obj/item/target, /obj/structure/window/reinforced/spawner/directional/east, @@ -1491,8 +1286,8 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/smooth, /area/station/command/bridge) "aEl" = ( @@ -1506,11 +1301,22 @@ /obj/effect/landmark/navigate_destination/teleporter, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"aEA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +"aEq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) +"aEy" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "aEB" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/seed_rare, @@ -1528,10 +1334,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, /turf/open/floor/wood/tile, /area/station/tcommsat/server) -"aFa" = ( -/obj/effect/spawner/xmastree, -/turf/open/floor/grass, -/area/station/service/chapel) +"aEP" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/shower/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine) "aFh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1552,10 +1361,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"aFA" = ( -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron/small, -/area/station/engineering/main) "aFE" = ( /obj/item/target, /obj/structure/window/reinforced/spawner/directional/west, @@ -1567,6 +1372,13 @@ "aFR" = ( /turf/open/floor/plating, /area/station/security/tram) +"aFU" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "aFY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1581,18 +1393,17 @@ /obj/structure/marker_beacon/fuchsia, /turf/open/space/basic, /area/space/nearstation) +"aGc" = ( +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/door/window/right/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "aGv" = ( /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/glass, /area/station/command/heads_quarters/rd) -"aGw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/grass, -/area/station/service/chapel) "aGy" = ( /obj/structure/flora/bush/large/style_random{ pixel_y = -3 @@ -1607,21 +1418,18 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) -"aGF" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space/basic, -/area/space/nearstation) "aGU" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"aHc" = ( -/obj/effect/turf_decal/stripes/line{ +"aHb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "aHq" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -1631,13 +1439,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"aHz" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "aHJ" = ( /obj/structure/window/spawner/directional/north, /obj/machinery/hydroponics/soil, @@ -1654,21 +1455,28 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"aIr" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/tile/red, -/obj/machinery/vending/tool, -/turf/open/floor/iron/dark/side{ - dir = 9 +"aIk" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/station/engineering/atmos) +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "aIu" = ( /obj/structure/bookcase/random/reference, /obj/machinery/camera/autoname/directional/north, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white/small, /area/station/medical/psychology) +"aIE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/generic, +/obj/effect/landmark/blobstart, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "aIH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1678,50 +1486,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/processing) -"aII" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Cooling Loop Bypass" - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 10 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "aIW" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"aJc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter) +"aIY" = ( +/obj/structure/railing/corner, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/small, +/area/station/engineering/main) "aJq" = ( /turf/closed/mineral/random/stationside, /area/space/nearstation) -"aJu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/power/terminal, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) "aJE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -1755,35 +1533,20 @@ dir = 8 }, /area/station/construction/mining/aux_base) -"aKm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/power/terminal, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +"aKb" = ( +/obj/structure/tank_dispenser, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"aKo" = ( +/obj/machinery/computer/atmos_control/plasma_tank, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) +/area/station/engineering/atmos/office) "aKx" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) -"aKG" = ( -/obj/machinery/power/terminal, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) -"aKH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "aKJ" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -1798,12 +1561,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"aKZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"aKU" = ( +/obj/effect/turf_decal/siding/wideplating{ dir = 4 }, -/turf/open/floor/iron/small, -/area/station/engineering/engine_smes) +/obj/machinery/light/small/directional/south, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "aLg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -1837,6 +1602,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"aLu" = ( +/obj/effect/turf_decal/delivery/white, +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber" + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "aLv" = ( /obj/structure/transport/linear/tram, /obj/effect/turf_decal/stripes/white/line{ @@ -1854,18 +1627,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"aLM" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/light/small/directional/east, -/turf/open/floor/carpet/royalblack, -/area/station/commons/dorms) -"aLT" = ( -/obj/structure/rack, -/obj/item/pickaxe, -/obj/effect/spawner/random/maintenance, -/turf/open/misc/asteroid, -/area/station/maintenance/department/engine) "aLU" = ( /obj/structure/chair{ dir = 4 @@ -1888,35 +1649,18 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"aMm" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/vending/tool, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/engineering/break_room) "aMy" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/open/floor/plating, /area/station/science/ordnance/testlab) -"aME" = ( -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" +"aNc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/engineering/supermatter) -"aNe" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/east, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Chamber" - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/turf/open/space/basic, +/area/space/nearstation) "aNk" = ( /obj/machinery/suit_storage_unit/security, /turf/open/floor/iron/small, @@ -1929,6 +1673,21 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/small, /area/station/medical/storage) +"aNJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/north{ + name = "Engineering Desk"; + req_access = list("engineering") + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/break_room) "aNL" = ( /turf/closed/wall, /area/station/science/ordnance/bomb) @@ -1958,12 +1717,12 @@ }, /area/station/hallway/secondary/exit/departure_lounge) "aOb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 }, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/service/chapel) +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "aOx" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, @@ -1978,50 +1737,16 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/science/genetics) -"aOE" = ( -/obj/machinery/modular_computer/preset/engineering{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/small, -/area/station/engineering/engine_smes) -"aOK" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"aOM" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/mineral/plasma, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) -"aOP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, +"aOS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/area/station/engineering/atmos/office) "aOX" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 }, /turf/open/floor/tram, /area/station/security/tram) -"aOZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/pickaxe, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "aPa" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -2031,33 +1756,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"aPb" = ( -/turf/open/floor/plating/rust, -/area/station/engineering/atmos/project) -"aPh" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/passive_vent, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) -"aPm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/greenglow, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/engine) -"aPn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/machinery/light/broken/directional/north, -/obj/item/stack/sheet/mineral/plasma/five, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/engine) "aPx" = ( /obj/structure/chair{ dir = 1 @@ -2073,6 +1771,15 @@ luminosity = 2 }, /area/station/science/ordnance/bomb) +"aPB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "aPD" = ( /obj/structure/chair{ dir = 1 @@ -2089,35 +1796,6 @@ /obj/machinery/incident_display/tram/directional/north, /turf/open/floor/iron, /area/station/security/tram) -"aPO" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/camera/directional/south, -/obj/item/storage/box/syringes{ - pixel_x = 3; - pixel_y = 14 - }, -/obj/machinery/button/door/directional/south{ - id = "medbreach"; - name = "Breach Shutters Control" - }, -/obj/machinery/light/cold/directional/south, -/obj/item/storage/box/masks{ - pixel_x = -2; - pixel_y = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"aPR" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/carpet/purple, -/area/station/commons/dorms) "aPX" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -2135,12 +1813,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"aQy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) "aQF" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -2149,10 +1821,6 @@ /obj/effect/turf_decal/siding/wideplating/dark/corner, /turf/open/floor/iron, /area/station/security) -"aQI" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/maintenance/department/engine) "aRa" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -2187,10 +1855,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) -"aRv" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/station/maintenance/department/engine) "aRw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ @@ -2209,16 +1873,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"aRF" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) "aRI" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 1 @@ -2232,49 +1886,14 @@ /obj/effect/turf_decal/trimline/neutral/end, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"aRR" = ( -/obj/machinery/power/supermatter_crystal/engine, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "aRT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"aRY" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"aSa" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) -"aSd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 5 - }, -/obj/structure/cable, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/smooth, +"aSc" = ( +/obj/structure/reflector/double/anchored, +/turf/open/floor/plating/rust, /area/station/engineering/supermatter/room) "aSy" = ( /turf/closed/wall/r_wall, @@ -2288,11 +1907,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/small, /area/station/hallway/secondary/dock) -"aSP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "aSQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood, @@ -2305,22 +1919,14 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/grimy, /area/station/service/theater) +"aSV" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "aTc" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"aTd" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/obj/item/wallframe/apc, -/turf/open/floor/iron/small, -/area/station/maintenance/department/engine) "aTf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/east{ @@ -2377,23 +1983,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_edge, /area/station/maintenance/starboard/greater) -"aVq" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Radiation-Proof Airlock" +"aUR" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/department/engine) -"aVz" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/department/engine) +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "aVT" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior, /obj/effect/mapping_helpers/airlock/locked, @@ -2442,48 +2045,44 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security/execution/transfer) -"aWC" = ( -/obj/machinery/computer/department_orders/engineering{ +"aWw" = ( +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/flora/bush/sunny/style_random, +/obj/machinery/light/small/directional/west, +/turf/open/floor/grass, +/area/station/service/chapel) +"aWx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"aWA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/small, /area/station/engineering/break_room) +"aWG" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) +"aXy" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "aXI" = ( /turf/closed/wall/r_wall, /area/station/science/lobby) -"aXL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) -"aXR" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"aYd" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) -"aYe" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "aYp" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -2519,13 +2118,25 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/misc/sandy_dirt, /area/station/service/lawoffice) -"aZi" = ( -/obj/effect/turf_decal/stripes/white/line{ +"aZf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/obj/structure/reflector/single/anchored{ + dir = 10 + }, +/turf/open/floor/plating/rust, +/area/station/engineering/supermatter/room) +"aZu" = ( +/obj/machinery/power/emitter{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) +/turf/open/floor/plating/rust, +/area/station/engineering/supermatter/room) "aZw" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/landmark/navigate_destination/dockescpod, @@ -2547,16 +2158,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"aZM" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "aZS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2575,14 +2176,8 @@ }, /area/station/command/heads_quarters/hop) "bat" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/engine) +/turf/open/floor/engine/n2o, +/area/station/ai_monitored/turret_protected/ai) "baE" = ( /obj/structure/table, /obj/item/gps/mining{ @@ -2595,12 +2190,16 @@ /obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) -"baW" = ( -/obj/effect/turf_decal/stripes/line{ +"baP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ dir = 8 }, -/turf/open/floor/iron/small, -/area/station/maintenance/department/engine) +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "bba" = ( /obj/effect/turf_decal/siding/blue{ dir = 8 @@ -2617,6 +2216,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"bbp" = ( +/obj/structure/spider/stickyweb/sealed, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) +"bbF" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "bbK" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -2636,20 +2244,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"bcc" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/navigate_destination/atmos, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "bch" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair/sofa/right{ @@ -2692,24 +2286,49 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/tram) -"bda" = ( -/obj/effect/decal/cleanable/dirt, +"bcZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, /obj/structure/cable, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"bdb" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/item/kirbyplants/random, /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/department/engine) -"bdJ" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/smes, -/obj/item/stack/cable_coil/five, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"bem" = ( -/obj/structure/cable, -/turf/closed/wall, -/area/station/maintenance/department/engine) +/turf/open/floor/iron/textured_half, +/area/station/engineering/atmos) +"bdd" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold/general/visible, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) +"bed" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) +"beg" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/hallway) "ber" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2734,81 +2353,12 @@ "beK" = ( /turf/open/floor/iron/smooth, /area/station/security/evidence) -"beL" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) -"beO" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "Engine Exhaust" - }, -/turf/open/floor/plating/airless, -/area/station/engineering/supermatter/room) "bfe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/autoname/directional/west, /obj/machinery/light/warm/directional/west, /turf/open/floor/iron/white, /area/station/science/cytology) -"bfj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"bfo" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"bft" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) -"bfy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) -"bfF" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"bfG" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/station/engineering/atmospherics_engine) "bfI" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/brown/full, @@ -2822,30 +2372,29 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/smooth_large, /area/station/service/bar) -"bfN" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) -"bfX" = ( -/obj/structure/railing{ - dir = 5 - }, -/turf/open/misc/asteroid/airless, -/area/station/engineering/atmospherics_engine) -"bfZ" = ( -/obj/machinery/power/emitter{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"bgn" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Atmospherics Maintenance" }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, -/area/station/engineering/supermatter/room) +/area/station/maintenance/department/electrical) "bgp" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, /area/station/service/lawoffice) +"bgq" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/stripes/white/end{ + name = "blue"; + color = "#6495ED"; + dir = 1 + }, +/turf/open/floor/iron/dark/small, +/area/station/engineering/lobby) "bgA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/small, @@ -2858,6 +2407,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"bgE" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "bgK" = ( /obj/structure/sink/kitchen/directional/east, /obj/machinery/light_switch/directional/west, @@ -2869,12 +2427,20 @@ }, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) -"bhc" = ( -/obj/structure/reflector/box{ - dir = 1 +"bhb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) "bho" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -2887,24 +2453,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"bhR" = ( -/obj/machinery/door/airlock/engineering{ - name = "Main Engine" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/small, -/area/station/engineering/main) -"bhV" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) "bio" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -2921,24 +2469,16 @@ /obj/machinery/holopad, /turf/open/floor/iron/white/small, /area/station/science/lobby) -"bjf" = ( -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/rods/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/stock_parts/cell/high, -/obj/item/stack/sheet/mineral/plasma{ - amount = 30 +"bja" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 }, -/obj/item/gps, -/obj/structure/closet/crate/engineering, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 +/obj/structure/railing/corner/end{ + dir = 4 }, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/small, +/area/station/engineering/lobby) "bjp" = ( /obj/structure/cable, /obj/structure/rack, @@ -2951,13 +2491,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"bjx" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Garbage Incinerator Access" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "bjL" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table, @@ -3033,14 +2566,20 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/security/office) -"bkz" = ( -/turf/open/misc/asteroid/airless, -/area/station/engineering/atmospherics_engine) -"bkH" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/box, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) +"bkI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"bkO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to Mix" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "bkY" = ( /obj/machinery/requests_console/directional/west{ department = "Chief Medical Officer's Desk"; @@ -3104,13 +2643,6 @@ /obj/structure/closet/crate/miningcar, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"blG" = ( -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/effect/turf_decal/arrows/white, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "blJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3125,20 +2657,17 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"bmk" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bmn" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, +"blZ" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 4 }, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "bmr" = ( /obj/structure/cable, /obj/machinery/telecomms/broadcaster/preset_right, @@ -3169,11 +2698,18 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"bmP" = ( +"bmN" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/obj/item/wrench, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/stairs, +/area/station/maintenance/department/engine/atmos) "bmT" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -3181,19 +2717,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/tram, /area/station/security/tram) -"bnc" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser{ - pixel_x = 10; - pixel_y = 7 - }, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) -"bng" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "bnh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3215,32 +2738,36 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"bnq" = ( +/obj/machinery/door/airlock/engineering{ + name = "Decomissioned Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/iron/textured_half, +/area/station/engineering/engine_smes) "bnr" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"bnu" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/flora/tree/stump, -/turf/open/floor/grass, -/area/station/service/chapel) "bnz" = ( /obj/machinery/light_switch/directional/south, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) -"bnQ" = ( -/obj/effect/landmark/start/assistant, -/obj/effect/landmark/start/assistant, -/obj/structure/chair/sofa/bamboo/left{ - dir = 1 +"bnV" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 }, -/turf/open/floor/wood/large, -/area/station/service/chapel) +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) "bob" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -3272,12 +2799,6 @@ }, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"boL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/small, -/area/station/engineering/main) "boW" = ( /obj/structure/table/glass, /obj/machinery/status_display/ai/directional/south, @@ -3300,13 +2821,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"bpg" = ( -/obj/machinery/power/emitter, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 +"bpe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/directional/west, +/obj/structure/sign/warning/pods/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "bpl" = ( /obj/machinery/flasher/directional/north{ id = "IsolationFlash" @@ -3314,13 +2838,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/small, /area/station/security/execution/education) -"bpm" = ( -/obj/machinery/field/generator, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) "bpo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -3335,13 +2852,20 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"bpG" = ( -/obj/machinery/field/generator, -/obj/effect/turf_decal/stripes/white/line{ +"bpv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) +/obj/machinery/door/airlock/atmos/glass{ + name = "Air Mix" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/cable, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/station/engineering/atmos/pumproom) "bpI" = ( /obj/structure/table, /obj/item/storage/box/donkpockets, @@ -3375,11 +2899,34 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"bqu" = ( +/obj/structure/table, +/obj/item/stack/ore/silver{ + pixel_y = 16 + }, +/obj/item/stack/ore/titanium{ + pixel_y = 10; + pixel_x = -4 + }, +/obj/item/stack/ore/diamond{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/plasma{ + pixel_y = -8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "bqy" = ( /turf/open/floor/engine{ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) +"bqD" = ( +/mob/living/basic/slime, +/turf/open/floor/engine, +/area/station/science/xenobiology) "bqE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3394,15 +2941,17 @@ /obj/structure/closet/crate/mod, /turf/open/floor/iron/white, /area/station/science/robotics/augments) -"bqZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "brb" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/prison/workout) +"bre" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/crossing/horizontal{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "bro" = ( /obj/structure/frame/machine, /turf/open/floor/tram, @@ -3437,6 +2986,19 @@ /obj/vehicle/ridden/scooter/skateboard/hoverboard, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"brC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) "brD" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/neutral{ @@ -3467,15 +3029,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/security/warden) -"bst" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three"; - space_dir = 1 +"bsn" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 }, -/turf/open/floor/iron/small, -/area/station/maintenance/department/engine) +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "bsu" = ( /obj/structure/barricade/wooden/crude, /obj/effect/mapping_helpers/broken_floor, @@ -3497,17 +3059,20 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"bsz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"bsG" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Cold Loop" +/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/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/catwalk_floor, +/area/station/engineering/main) "bsI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3515,18 +3080,15 @@ dir = 4 }, /area/station/maintenance/starboard/greater) +"bsJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "bsP" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"bsQ" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/arrows{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "btf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3539,9 +3101,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/warden) -"btC" = ( -/turf/closed/mineral/random/stationside, -/area/station/engineering/atmos/project) "btG" = ( /obj/structure/rack, /obj/effect/turf_decal/delivery/white, @@ -3549,21 +3108,14 @@ /obj/item/airlock_painter/decal, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) -"btL" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) -"btP" = ( -/obj/machinery/door/airlock/external/glass{ - name = "ATMOS PROJECT Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"btV" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/structure/railing/corner, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/iron/small, -/area/station/engineering/atmospherics_engine) +/turf/open/floor/wood, +/area/station/engineering/main) "buk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3576,9 +3128,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/service/theater) -"buy" = ( -/turf/open/floor/iron/small, -/area/station/engineering/atmospherics_engine) "buA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3592,23 +3141,6 @@ dir = 8 }, /area/station/science/xenobiology) -"buI" = ( -/obj/machinery/door/airlock/external/glass{ - name = "ATMOS PROJECT Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/iron/small, -/area/station/engineering/atmospherics_engine) -"buN" = ( -/obj/effect/turf_decal/arrows{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "buO" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -3617,30 +3149,12 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) -"buS" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "buV" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"buW" = ( -/obj/effect/turf_decal/arrows{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "bvh" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -3650,6 +3164,9 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"bvt" = ( +/turf/closed/mineral/random/stationside, +/area/station/maintenance/department/electrical) "bvK" = ( /obj/effect/turf_decal/siding/red{ dir = 9 @@ -3660,25 +3177,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/security/warden) -"bvT" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/arrows{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bwg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "bwz" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/machinery/light/cold/directional/north, @@ -3691,11 +3189,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/rec) -"bwJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/small, -/area/station/engineering/main) "bwY" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -3707,33 +3200,28 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"bxc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"bxs" = ( +/obj/structure/railing{ + dir = 1 }, -/obj/structure/table/reinforced/titaniumglass, -/obj/structure/sign/poster/official/random/directional/north, -/obj/item/radio/intercom/directional/west, -/obj/effect/decal/cleanable/cobweb, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 +/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible, +/obj/machinery/meter, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) +"bxu" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/turf/open/floor/iron/smooth_corner, -/area/station/maintenance/disposal/incinerator) -"bxq" = ( -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) -"bxx" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 +/obj/machinery/button/door/directional/west{ + id = "Secure Storage"; + name = "Engineering Secure Storage"; + pixel_y = 24; + req_access = list("engine_equip") }, -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) +/turf/open/floor/iron/corner{ + dir = 8 + }, +/area/station/engineering/main) "bxA" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/neutral/end{ @@ -3741,12 +3229,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"bxH" = ( -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "bxI" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -3759,12 +3241,6 @@ dir = 6 }, /area/station/science/lower) -"bxN" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/box/white, -/obj/effect/turf_decal/arrows/white, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "bxT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/navigate_destination/dockescpod, @@ -3774,12 +3250,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"byk" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "byq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3813,43 +3283,6 @@ /obj/effect/gibspawner, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"byV" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bzf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bzn" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/firealarm/directional/east, -/obj/structure/rack, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/signlang_radio, -/obj/item/mod/module/thermal_regulator, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bzs" = ( -/obj/machinery/power/energy_accumulator/tesla_coil/anchored, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"bzv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/power/emitter{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "bzL" = ( /obj/machinery/flasher/portable, /obj/effect/turf_decal/stripes/line{ @@ -3859,28 +3292,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/security/tram) -"bzM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) -"bzT" = ( -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/siding/wideplating/dark/end{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/engineering/atmos) "bzZ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -3891,16 +3302,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"bAi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/smooth_edge{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) "bAo" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 4 @@ -3909,13 +3310,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine, /area/station/science/xenobiology) -"bAq" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "bAs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3928,19 +3322,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"bAK" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/kirbyplants/random, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"bAL" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "bAT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood{ @@ -3948,18 +3329,20 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/entry) -"bBa" = ( -/obj/machinery/door/airlock/external/glass, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating/airless, -/area/station/maintenance/department/engine) -"bBf" = ( -/obj/structure/railing{ - dir = 10 +"bAU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) +"bBd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Turbine" }, -/turf/open/misc/asteroid/airless, -/area/station/engineering/atmospherics_engine) +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/disposal/incinerator) "bBk" = ( /obj/effect/turf_decal/tile/dark_red, /obj/structure/cable, @@ -3974,16 +3357,6 @@ /obj/machinery/door/window/brigdoor/right/directional/north, /turf/open/floor/iron/dark, /area/station/security/processing) -"bBl" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/arrows{ - dir = 4 - }, -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "bBr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4006,6 +3379,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmospherics_engine) +"bBX" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "bCf" = ( /obj/machinery/computer/shuttle/labor{ dir = 8 @@ -4036,21 +3413,6 @@ dir = 1 }, /area/station/cargo/bitrunning/den) -"bCi" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/components/binary/crystallizer{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bCl" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) "bCn" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/extinguisher_cabinet/directional/west, @@ -4062,11 +3424,6 @@ dir = 1 }, /area/station/hallway/secondary/construction) -"bCu" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "bCG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4078,13 +3435,6 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/security/office) -"bCM" = ( -/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, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "bCQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -4110,6 +3460,17 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"bDh" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/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/diagonal, +/area/station/engineering/lobby) "bDj" = ( /obj/effect/landmark/start/medical_doctor, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -4153,17 +3514,12 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"bDP" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 4 +"bDO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 10 }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "bDQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4180,13 +3536,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"bEi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "bEw" = ( /obj/structure/sign/directions/supply{ dir = 1; @@ -4218,16 +3567,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/processing) -"bEG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Engine Coolant Bypass" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "bEN" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -4240,19 +3579,10 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"bFb" = ( -/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/machinery/door/airlock/atmos{ - name = "Atmospherics Project EVA Prep Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/iron/textured_half{ - dir = 1 - }, -/area/station/engineering/atmospherics_engine) +"bEW" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "bFg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4263,34 +3593,31 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/commons/dorms) +"bFr" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "bFw" = ( /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit, /area/station/tcommsat/server) -"bFM" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +"bFR" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/main) +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "bFW" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/rnd_all, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"bGc" = ( -/obj/machinery/modular_computer/preset/civilian{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering - Desk" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) "bGi" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/mug{ @@ -4325,23 +3652,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"bGP" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"bGT" = ( -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/firecloset, -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera/autoname/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/engineering/main) "bGU" = ( /obj/machinery/door/airlock/mining/glass{ name = "Filing Room" @@ -4356,17 +3666,6 @@ /obj/machinery/chem_heater/withbuffer, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"bHd" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Old Engine" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "bHs" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -4390,32 +3689,23 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white/textured_large, /area/station/command/heads_quarters/cmo) -"bHQ" = ( -/obj/structure/reagent_dispensers/plumbed, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "bHU" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) -"bHW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +"bIg" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" }, -/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/hallway/secondary/dock) +"bIi" = ( +/obj/machinery/light/small/directional/east, /obj/structure/cable, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/smooth_large, /area/station/engineering/main) -"bIf" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/station/maintenance/department/engine) "bIp" = ( /obj/structure/flora/bush/large/style_random{ pixel_x = -28; @@ -4426,25 +3716,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/misc/sandy_dirt, /area/station/science/research) -"bIG" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/power/terminal, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/engine) -"bIW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "bJw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/south, @@ -4452,14 +3723,30 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"bJK" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"bJN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/radio/intercom/directional/west, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "bJZ" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, /area/station/security/prison/workout) -"bKu" = ( -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +"bKl" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating, +/turf/open/floor/wood, +/area/station/engineering/main) "bKz" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -4515,6 +3802,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"bLu" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "bLN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/scientist, @@ -4527,14 +3822,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"bMq" = ( -/obj/effect/turf_decal/sand/plating, -/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/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "bMt" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4542,16 +3829,6 @@ }, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"bMN" = ( -/obj/machinery/button/door/directional/west{ - id = "Secure Storage"; - name = "Engineering Secure Storage"; - pixel_y = 24; - req_access = list("engine_equip") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "bMW" = ( /obj/machinery/iv_drip, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -4583,19 +3860,6 @@ "bNq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine/atmos) -"bNG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Old Engine" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"bNJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "bNK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4638,18 +3902,20 @@ }, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/cubicle) -"bOe" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/engineering/atmos) +"bOa" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/frame/machine, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"bOb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"bOl" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "bOp" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/tile/blue{ @@ -4663,25 +3929,10 @@ dir = 4 }, /area/station/hallway/primary/central/fore) -"bOs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/smooth_edge{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) "bOH" = ( /obj/structure/falsewall, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"bOL" = ( -/obj/machinery/door/airlock/external/glass, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "bOR" = ( /obj/machinery/light/small/directional/west, /obj/structure/flora/bush/flowers_yw, @@ -4712,11 +3963,10 @@ dir = 1 }, /area/station/hallway/secondary/dock) -"bQh" = ( -/obj/structure/closet/emcloset, -/obj/item/reagent_containers/pill/maintenance, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) +"bPU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "bQi" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, @@ -4737,13 +3987,16 @@ /obj/machinery/computer/records/security, /turf/open/floor/wood/tile, /area/station/command/bridge) -"bQU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"bRc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/light/small/directional/west, +/obj/structure/sign/warning/doors/directional/west, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"bRf" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/spawner/random/structure/steam_vent, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/engine) "bRg" = ( @@ -4765,16 +4018,6 @@ /obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"bRo" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "bRr" = ( /obj/structure/chair{ dir = 1; @@ -4788,11 +4031,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) -"bRA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "bRN" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -4800,19 +4038,13 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/tram, /area/station/maintenance/port/aft) -"bSj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"bSn" = ( +"bSm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/structure/disposalpipe/segment{ - dir = 10 + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "bSo" = ( /turf/open/space/basic, /area/space/nearstation) @@ -4820,6 +4052,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"bSv" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "bSH" = ( /obj/structure/cable, /obj/machinery/power/solar_control{ @@ -4830,18 +4069,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"bSN" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/machinery/camera/directional/north{ - c_tag = "AI Chamber - SMES"; - network = list("aicore") - }, -/obj/machinery/flasher/directional/north, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "bSX" = ( /obj/machinery/flasher/directional/east{ id = "AI"; @@ -4849,35 +4076,20 @@ }, /turf/closed/wall, /area/station/ai_monitored/turret_protected/ai) -"bTa" = ( -/obj/structure/railing, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) -"bTg" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/hfr_box/core, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/body/waste_output, -/obj/item/hfr_box/body/moderator_input, -/obj/item/hfr_box/body/interface, -/obj/item/hfr_box/body/fuel_input, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bTv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"bTd" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/crossing/horizontal{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bTN" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) +/turf/open/space/basic, +/area/space/nearstation) +"bTJ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "bUf" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -4891,18 +4103,6 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) -"bUk" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) -"bUl" = ( -/obj/effect/landmark/start/station_engineer, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8; - filter_type = list(/datum/gas/nitrogen) - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "bUr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ @@ -4932,16 +4132,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"bUy" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics Project EVA Prep Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/iron/textured_half{ - dir = 1 - }, -/area/station/engineering/atmospherics_engine) "bUz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4982,20 +4172,11 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/tram, /area/station/security/tram) -"bUX" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "bVk" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair/stool/directional/east, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) -"bVs" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "bVv" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5054,6 +4235,21 @@ /obj/item/clothing/suit/hooded/wintercoat/science, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"bWg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/brown/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "bWh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5088,6 +4284,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/genetics) +"bWk" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"bWl" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) "bWs" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -5100,21 +4310,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"bWJ" = ( -/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/rust, -/area/station/maintenance/department/engine) -"bWZ" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/main) +"bXb" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "bXu" = ( /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/south, @@ -5143,13 +4343,17 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"bXV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"bYe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "bYf" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line{ @@ -5161,12 +4365,15 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/white/small, /area/station/science/cubicle) -"bYE" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) +"bYl" = ( +/obj/effect/turf_decal/tile/brown, +/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/side{ + dir = 1 + }, +/area/station/engineering/hallway) "bYS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ @@ -5174,6 +4381,19 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"bYY" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos/glass{ + name = "Air Mix" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/station/engineering/atmos/pumproom) "bZs" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/drinkingglass, @@ -5190,29 +4410,62 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/hidden, /turf/open/floor/wood/tile, /area/station/tcommsat/server) -"bZB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"bZy" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/west{ + freerange = 1; + listening = 0; + name = "Common Channel" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/item/radio/intercom/directional/north{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = -10 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "justice gas pump" +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel"; + pixel_x = -26; + pixel_y = -13 }, -/obj/item/wrench, -/obj/machinery/door/window/right/directional/east{ - name = "Gas Ports" - }, -/turf/open/floor/plating, -/area/station/security/execution/education) +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "bZN" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"bZQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"cam" = ( +/obj/machinery/flasher/directional/east{ + id = "AI"; + pixel_y = 26 + }, +/obj/structure/cable/multilayer/connected, +/obj/effect/turf_decal/box/red, +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Tertiary AI Core Access"; + req_access = list("ai_upload"); + pixel_x = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"caB" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "caI" = ( /obj/structure/cable, /obj/effect/decal/cleanable/glass, @@ -5223,6 +4476,36 @@ /obj/item/storage/fancy/candle_box, /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) +"cbi" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/north{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = 10 + }, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Common Channel" + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel"; + pixel_x = 26; + pixel_y = -13 + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) +"cbj" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/engineering/main) "cbm" = ( /turf/closed/wall/rust, /area/station/ai_monitored/aisat/exterior) @@ -5250,35 +4533,13 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/meeting_room) -"cbu" = ( -/obj/machinery/vending/engivend, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"cbM" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/stack/sheet/iron/fifty{ - pixel_y = 13 - }, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = -3 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"cbN" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) +"cbJ" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/gas, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "cbO" = ( /obj/structure/chair{ dir = 1 @@ -5308,13 +4569,18 @@ /turf/open/floor/plating, /area/station/construction/mining/aux_base) "cca" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/assistant, -/obj/structure/chair/sofa/bamboo/left{ - dir = 1 +/obj/structure/table/reinforced, +/obj/machinery/coffeemaker{ + pixel_y = 2 }, -/turf/open/floor/wood/large, -/area/station/service/chapel) +/obj/item/coffee_cartridge{ + pixel_y = 8; + pixel_x = -4 + }, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "ccs" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -5322,6 +4588,23 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"ccu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"ccx" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "ccD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5340,33 +4623,52 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron_dark, /area/station/tcommsat/server) -"ccK" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"ccN" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engineering Gear Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"ccG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron/textured_half, -/area/station/engineering/main) -"cdf" = ( -/obj/structure/reflector/single{ - dir = 9 +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"ccL" = ( +/obj/structure/closet/firecloset, +/obj/machinery/light_switch/directional/north, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/radio/off{ + pixel_x = 1; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/plating, +/turf/open/floor/plating/rust, /area/station/engineering/supermatter/room) +"ccO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/item/radio/intercom/directional/south, +/obj/item/c_tube{ + pixel_x = 20 + }, +/obj/item/clothing/head/cone{ + pixel_y = 5; + pixel_x = -6 + }, +/obj/item/clothing/head/cone{ + pixel_y = 7; + pixel_x = -6 + }, +/obj/item/pipe_dispenser{ + pixel_y = 9; + pixel_x = 14 + }, +/obj/item/clothing/mask/cigarette{ + pixel_y = 2 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) "cdg" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/grass, @@ -5379,44 +4681,19 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"cdt" = ( -/obj/effect/turf_decal/stripes/red/line, -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/engine/atmos) -"cdB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/corner, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ +"cdz" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light/cold/dim/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/iron/smooth_edge{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "cdW" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/disposal/incinerator) -"cdZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "cea" = ( /obj/structure/window/spawner/directional/south, /turf/open/space/basic, @@ -5430,6 +4707,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"ceA" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "ceE" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5441,11 +4727,20 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"ceK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bed/medical/emergency, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) +"ceP" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/radio/intercom/directional/east, +/obj/machinery/fax{ + fax_name = "Chief Engineer's Office"; + name = "Chief Engineer's Fax Machine"; + pixel_y = 7 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "ceZ" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -5479,6 +4774,25 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/security/tram) +"cgh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste to Starboard Filter"; + dir = 1 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"cgt" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "cgy" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -5486,20 +4800,24 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) +"cgz" = ( +/obj/machinery/door/airlock/atmos{ + name = "DECOMISSIONED" + }, +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/station/engineering/atmospherics_engine) "cgM" = ( /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) -"cgO" = ( -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"cgU" = ( -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "cgY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/east{ @@ -5526,10 +4844,43 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"chb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"chf" = ( +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) +"chj" = ( +/obj/structure/grille, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/atmos/space_catwalk) "chp" = ( /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) +"chr" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "chO" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -5569,6 +4920,7 @@ "ciT" = ( /obj/structure/table/glass, /obj/item/radio/intercom/directional/east, +/obj/machinery/recharger, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) "cjm" = ( @@ -5576,6 +4928,20 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"cjz" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/railing/corner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) +"cjP" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "cjR" = ( /obj/structure/disposalpipe/segment, /obj/structure/plasticflaps/opaque, @@ -5608,6 +4974,15 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/noslip, /area/station/maintenance/department/medical/central) +"ckI" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos/space_catwalk) "ckL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5630,6 +5005,21 @@ }, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) +"cla" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Distribution" + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) "clb" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron/kitchen/small, @@ -5641,13 +5031,6 @@ }, /turf/open/floor/iron/grimy, /area/station/service/theater) -"cld" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/small, -/area/station/engineering/main) "clf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5670,22 +5053,10 @@ /obj/structure/cable, /turf/open/floor/iron/white/small, /area/station/command/heads_quarters/cmo) -"clH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/firealarm/directional/north, -/obj/item/clothing/head/cone{ - pixel_x = 16; - pixel_y = 11 - }, -/turf/open/floor/iron/small, -/area/station/engineering/main) -"clJ" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) +"clX" = ( +/obj/structure/railing/corner, +/turf/open/floor/wood, +/area/station/engineering/atmos/office) "clZ" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -5702,6 +5073,20 @@ "cmf" = ( /turf/closed/wall/rust, /area/station/maintenance/department/engine/atmos) +"cmu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "cmw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5721,12 +5106,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"cmA" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/clothing/mask/cigarette/cigar, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "cmT" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/decal/cleanable/dirt, @@ -5745,77 +5124,39 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/security/tram) -"cmY" = ( -/mob/living/simple_animal/bot/firebot, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/smooth_large, -/area/station/engineering/atmos) "cns" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 5 }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"cnu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/table/glass, +/obj/item/book/codex_gigas, +/obj/item/camera{ + pixel_y = 18 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/grimy, +/area/station/service/library) "cnG" = ( /obj/machinery/suit_storage_unit/rd, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/rd) -"cnL" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 +"cnU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 }, -/obj/structure/closet/crate{ - name = "Materials Crate" - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/plasteel/fifty, -/obj/item/stack/sheet/plastic/five, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/titaniumglass/fifty, -/obj/item/stack/sheet/mineral/titanium/fifty, -/obj/item/stack/rods/fifty, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) -"cnM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ +/obj/structure/railing/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) -"cnS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Power Monitoring" - }, -/obj/structure/sign/poster/random/directional/north, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/pacman, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"cok" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"col" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "cop" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -5827,25 +5168,15 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white/small, /area/station/medical/cryo) -"coA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/engine_access, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cow" = ( +/turf/closed/wall, +/area/station/engineering/lobby) +"coO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/mapping_helpers/airalarm/link{ - chamber_id = "engine" - }, -/obj/effect/mapping_helpers/airalarm/tlv_no_checks, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"coJ" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/engine_smes) +/turf/open/floor/wood, +/area/station/engineering/atmos) "cpc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5855,21 +5186,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, /area/station/service/hydroponics) -"cpq" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) -"cpt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "cpA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5884,6 +5200,15 @@ /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"cpC" = ( +/obj/effect/turf_decal/siding/red{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos/space_catwalk) "cpE" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron, @@ -5916,18 +5241,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) -"cpW" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "cqa" = ( /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron, @@ -5946,11 +5259,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white/side, /area/station/science/xenobiology) -"cqp" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "cqr" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/chapel{ @@ -5967,34 +5275,21 @@ }, /turf/open/floor/plating, /area/station/science/ordnance/storage) -"cqJ" = ( -/obj/machinery/door/airlock/engineering{ - name = "Smoke Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"cqM" = ( +/obj/structure/railing{ dir = 8 }, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/textured_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) -"cqR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/machinery/air_sensor/incinerator_tank, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/catwalk_floor, +/area/station/engineering/main) "cqS" = ( /obj/machinery/conveyor{ dir = 4; @@ -6005,17 +5300,6 @@ }, /turf/open/floor/plating, /area/station/service/janitor) -"crm" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"crq" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "crE" = ( /obj/structure/window/spawner/directional/north, /turf/open/space/basic, @@ -6032,6 +5316,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"csp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "css" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 10 @@ -6058,6 +5349,9 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"csB" = ( +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos) "csE" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -6084,6 +5378,17 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) +"ctb" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 6 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "ctq" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -6099,27 +5404,22 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"ctI" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/portable_atmospherics/canister/air, +"cua" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/structure/crate, +/obj/item/reagent_containers/cup/soda_cans/lemon_lime, +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_y = 4; + pixel_x = 3 + }, +/obj/item/food/cornchips/purple{ + pixel_y = -3; + pixel_x = -6 + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/open/floor/plating, -/area/station/maintenance/department/engine) -"ctJ" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"ctV" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) -"ctZ" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/main) +/area/station/maintenance/department/electrical) "cuh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6132,11 +5432,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/station/commons/vacant_room/commissary) -"cuZ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) "cvy" = ( /obj/structure/bed/medical/emergency, /turf/open/floor/iron/dark, @@ -6177,12 +5472,6 @@ dir = 1 }, /area/station/cargo/bitrunning/den) -"cvR" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron/kitchen/small, -/area/station/security/prison/mess) "cvZ" = ( /obj/structure/closet/secure_closet/evidence, /obj/effect/decal/cleanable/dirt, @@ -6199,10 +5488,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos) -"cwg" = ( -/mob/living/basic/mining/lobstrosity, -/turf/open/misc/asteroid/airless, -/area/station/engineering/supermatter/room) "cwp" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -6222,37 +5507,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/checkpoint/customs) -"cwC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/machinery/door/airlock/maintenance{ - name = "Incinerator Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/disposal/incinerator) -"cwG" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced/titaniumglass, -/obj/item/folder/yellow{ - pixel_x = 4 - }, -/obj/item/pen{ - pixel_x = 5 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/engineering/break_room) "cwL" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -6260,15 +5514,6 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/iron, /area/station/security/tram) -"cwR" = ( -/obj/structure/closet/radiation, -/obj/item/clothing/glasses/meson, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/main) "cwS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -6285,11 +5530,6 @@ /obj/effect/spawner/structure/window/survival_pod, /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/ai) -"cxr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "cxy" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -6309,6 +5549,14 @@ }, /turf/open/floor/plating, /area/station/science/cubicle) +"cxQ" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/door/airlock/atmos{ + name = "Locker Room" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/office) "cxT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table/wood, @@ -6344,11 +5592,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"cyp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "cyx" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -6358,6 +5601,9 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"cyy" = ( +/turf/open/floor/catwalk_floor/titanium, +/area/station/command/heads_quarters/ce) "cyB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6368,6 +5614,32 @@ dir = 8 }, /area/station/hallway/secondary/dock) +"cyG" = ( +/obj/effect/turf_decal/siding/thinplating_new/corner, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 10 + }, +/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/small, +/area/station/command/heads_quarters/ce) +"cyU" = ( +/obj/effect/spawner/random/structure/table, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"cza" = ( +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/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/landmark/event_spawn, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "cze" = ( /obj/machinery/turretid{ icon_state = "control_stun"; @@ -6378,6 +5650,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) +"czf" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "czg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6395,17 +5674,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"czy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/light/directional/north, -/obj/item/analyzer, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) "czV" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/status_display/door_timer{ @@ -6441,10 +5709,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"cAh" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/station/maintenance/department/engine) "cAj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6483,45 +5747,39 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/science/robotics/mechbay) -"cAC" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/decal/cleanable/dirt, +"cBw" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/filingcabinet/chestdrawer, +/obj/item/clothing/glasses/meson{ + pixel_y = 8; + pixel_x = 2 + }, +/obj/machinery/light/small/directional/south, +/obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"cBc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/area/station/command/heads_quarters/ce) +"cBR" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) +"cBV" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"cBn" = ( -/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/engineering/glass{ - name = "Abandoned Power Monitoring" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/department/engine) -"cBz" = ( -/obj/machinery/door/airlock/atmos{ - name = "Central Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) +"cBX" = ( +/obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/smooth_half{ - dir = 1 +/obj/structure/transit_tube/horizontal{ + dir = 4 }, -/area/station/engineering/atmos) +/turf/open/floor/plating/airless, +/area/space/nearstation) "cCb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -6541,14 +5799,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"cCw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cCD" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance/external{ @@ -6580,17 +5830,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) -"cDa" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Fuel Pipe to Incinerator" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cDb" = ( /obj/structure/chair/office{ dir = 4 @@ -6598,21 +5837,6 @@ /obj/effect/landmark/start/head_of_security, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/hos) -"cDh" = ( -/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/mapping_helpers/broken_floor, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/engine) -"cDk" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/turf/open/space/basic, -/area/space/nearstation) "cDt" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/transport/linear/tram, @@ -6625,6 +5849,39 @@ dir = 8 }, /area/station/science/lower) +"cDE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor{ + id = "Secure Storage"; + name = "Secure Storage" + }, +/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/rust, +/area/station/engineering/storage_shared) +"cDH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/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/storage/fancy/donut_box{ + pixel_y = 8 + }, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "wardshut"; + name = "Privacy Shutters" + }, +/turf/open/floor/iron/textured_large, +/area/station/security/warden) "cDI" = ( /obj/structure/table/wood, /obj/item/food/cracker, @@ -6640,12 +5897,6 @@ dir = 1 }, /area/station/maintenance/starboard/greater) -"cEc" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/break_room) "cEn" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -6664,6 +5915,23 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"cED" = ( +/obj/structure/railing/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) +"cEH" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible, +/obj/effect/landmark/start/station_engineer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "cEK" = ( /obj/effect/landmark/start/ai, /obj/item/radio/intercom/directional/south{ @@ -6744,13 +6012,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"cFt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/engine) "cFz" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6765,35 +6026,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"cFC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating/rust, -/area/station/engineering/supermatter) -"cFF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"cFI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "cFR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6814,35 +6046,25 @@ }, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) -"cGd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood/large, -/area/station/service/chapel) +"cGb" = ( +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/rods/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/stock_parts/cell/high, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 + }, +/obj/item/gps, +/obj/structure/closet/crate/engineering, +/obj/machinery/light/cold/directional/east, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "cGj" = ( /turf/closed/wall/r_wall, /area/station/security/execution/education) -"cGx" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/carpet/lone, -/area/station/service/chapel/office) -"cGy" = ( -/obj/machinery/atmospherics/components/tank/nitrous{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"cGG" = ( -/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/plating, -/area/station/maintenance/department/engine) "cGI" = ( /obj/machinery/firealarm/directional/south, /obj/structure/closet/secure_closet/medical3, @@ -6883,16 +6105,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/service/lawoffice) -"cHN" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "cHO" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/full, @@ -6925,34 +6137,17 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) -"cIy" = ( -/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/department/engine) -"cIE" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cIU" = ( /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) -"cIX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cJb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 }, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron/small, -/area/station/maintenance/department/engine) +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "cJz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7008,13 +6203,18 @@ "cKk" = ( /turf/closed/mineral/random/stationside, /area/station/ai_monitored/turret_protected/aisat/maint) -"cKm" = ( -/obj/machinery/shieldgen, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 +"cKv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/sign/warning/electric_shock/directional/south, +/turf/open/floor/iron/stairs/old{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "cKV" = ( /obj/machinery/light/floor, /obj/effect/landmark/event_spawn, @@ -7024,13 +6224,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"cLe" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "cLg" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/indigo, @@ -7043,28 +6236,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/commons/storage/art) -"cLn" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/department/engine) -"cLz" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/obj/structure/table, -/obj/item/folder/yellow, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"cLB" = ( -/turf/closed/wall/rust, -/area/station/engineering/atmos) "cLD" = ( /obj/structure/window/spawner/directional/north, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -7074,11 +6245,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/courtroom) -"cLH" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "cLS" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -7108,38 +6274,12 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"cMB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"cMI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cMS" = ( /obj/structure/cable, /obj/structure/chair/stool/directional/north, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/security/prison/workout) -"cMV" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cMW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -7149,33 +6289,14 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"cNa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/small, -/area/station/engineering/main) -"cNe" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 +"cMZ" = ( +/obj/machinery/power/smes/engineering, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Energy Silos" }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"cNq" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "cNu" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -7185,25 +6306,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/port) -"cNw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"cNy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/main) "cNF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, @@ -7220,17 +6322,6 @@ /obj/machinery/light/very_dim/directional/west, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"cNW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cNZ" = ( /obj/effect/turf_decal/box/red/corners{ dir = 8 @@ -7244,23 +6335,21 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/smooth_large, /area/station/service/bar) -"cOQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 - }, -/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/atmospherics, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "cOW" = ( /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"cPd" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"cPe" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "cPi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -7268,6 +6357,16 @@ /obj/effect/turf_decal/siding/blue/corner, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"cPv" = ( +/obj/effect/turf_decal/siding/red{ + dir = 10 + }, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos/space_catwalk) +"cPB" = ( +/obj/machinery/air_sensor/incinerator_tank, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "cPD" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -7280,33 +6379,10 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white/small, /area/station/service/hydroponics/garden) -"cPM" = ( -/obj/machinery/door/airlock/engineering{ - name = "Main Engine" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron/small, -/area/station/engineering/main) "cPN" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) -"cPP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/right/directional/south{ - layer = 3.1; - name = "Upload Console Window"; - req_access = list("ai_upload") - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "cPQ" = ( /obj/item/kirbyplants/organic/plant21, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -7314,16 +6390,22 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) -"cQb" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"cPR" = ( +/obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /turf/open/floor/iron, -/area/station/engineering/break_room) +/area/station/hallway/primary/fore) +"cPS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/hidden{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/ce) "cQP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -7346,6 +6428,25 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/lobby) +"cRq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/greyscale, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -9 + }, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "cRw" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue, @@ -7415,30 +6516,19 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/shower) -"cSv" = ( -/obj/machinery/atmospherics/components/tank/carbon_dioxide{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos) -"cSz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/engineering/atmos) "cSC" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) +"cSP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "cSR" = ( /obj/structure/chair{ dir = 1 @@ -7446,40 +6536,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"cSX" = ( +"cTu" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) -"cSY" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "CO2 Outlet Pump" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"cTd" = ( -/obj/structure/closet/radiation, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/plating, -/area/station/engineering/main) -"cTr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/smooth, /area/station/engineering/atmos) "cTw" = ( /obj/structure/table/wood, @@ -7505,19 +6564,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"cTD" = ( -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"cUd" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"cTS" = ( +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) +"cUa" = ( +/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/station_engineer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "cUE" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -7529,11 +6587,19 @@ }, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"cUF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"cUH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/firealarm/directional/west, +/obj/machinery/door/window/brigdoor/right/directional/south, +/obj/effect/landmark/start/depsec/engineering, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) "cUK" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -7559,12 +6625,6 @@ dir = 1 }, /area/station/hallway/primary/aft) -"cVc" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "cVx" = ( /obj/effect/turf_decal/siding/dark_red{ dir = 4 @@ -7590,6 +6650,13 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/security/execution/education) +"cVM" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "cVQ" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -7599,19 +6666,20 @@ dir = 1 }, /area/station/science/lower) -"cVV" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 6 +"cVS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/item/pen{ - pixel_x = 5 +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"cVY" = ( +/obj/machinery/atmospherics/components/tank/air{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos/office) "cWh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7641,6 +6709,10 @@ dir = 1 }, /area/station/hallway/primary/aft) +"cWQ" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "cWT" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt, @@ -7664,15 +6736,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"cXe" = ( -/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/fore) "cXm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -7681,13 +6744,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"cXF" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 5 - }, +"cXu" = ( +/obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/open/floor/plating, -/area/station/engineering/supermatter) +/area/station/maintenance/department/electrical) "cXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/wood{ @@ -7695,27 +6755,6 @@ }, /turf/open/floor/iron/small, /area/station/security/prison/shower) -"cXP" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"cXU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "cYc" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/light/small/directional/east, @@ -7728,31 +6767,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"cYm" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) -"cYs" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"cYC" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/break_room) +"cYt" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "cYE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7766,11 +6784,26 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"cYL" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/structure/closet/radiation, +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine) "cYT" = ( /obj/structure/hedge, /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) +"cYU" = ( +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/main) "cYW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, @@ -7819,16 +6852,6 @@ }, /turf/open/floor/iron/white/small, /area/station/service/janitor) -"cZM" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "dah" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -7852,16 +6875,27 @@ dir = 1 }, /area/station/science/lower) +"daC" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 5 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "dba" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"dbh" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +"dbo" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "dbs" = ( /obj/structure/chair/plastic{ dir = 8 @@ -7886,6 +6920,19 @@ "dbF" = ( /turf/open/floor/plating/rust, /area/station/ai_monitored/turret_protected/aisat/maint) +"dbN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "dbR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7912,32 +6959,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"dcg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"dcG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/engineering/atmos) "dcH" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -7959,33 +6980,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/brig/entrance) -"ddd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/engineering/atmos) -"ddh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"ddj" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"ddk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "ddl" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -8013,13 +7007,6 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/hos) -"ddG" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "ddK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8029,22 +7016,6 @@ /obj/effect/landmark/start/chief_medical_officer, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"ddN" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"ddT" = ( -/turf/open/floor/plating/airless, -/area/station/maintenance/department/engine) "deh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -8060,16 +7031,14 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"deB" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ - dir = 4 +"dez" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "deQ" = ( /obj/machinery/door/poddoor/preopen{ id = "Xenolab"; @@ -8095,24 +7064,18 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"dfB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 1 +"dfz" = ( +/obj/structure/barricade/wooden, +/obj/machinery/door/airlock/maintenance{ + name = "Atmospherics Maintenance" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"dfC" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "dfN" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/south, @@ -8125,6 +7088,21 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood/parquet, /area/station/service/library) +"dgm" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/engineering/main) "dgn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -8140,29 +7118,17 @@ /obj/structure/cable, /turf/open/floor/iron/white/corner, /area/station/science/lower) -"dgr" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 +"dgV" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/machinery/shieldgen, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - SECURE STORAGE" }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dgv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) -"dgD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "dhh" = ( /obj/structure/cable, /obj/machinery/status_display/ai/directional/north, @@ -8171,12 +7137,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"dhw" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/structure/cable, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "dhy" = ( /obj/structure/cable, /obj/structure/disposalpipe/trunk{ @@ -8193,6 +7153,18 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) +"dhC" = ( +/obj/structure/table, +/obj/item/stack/ore/gold{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/plasma{ + pixel_y = -6 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "dhK" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -8226,37 +7198,18 @@ /obj/effect/turf_decal/delivery/red, /turf/open/floor/iron/dark/small, /area/station/medical/medbay/lobby) -"diK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"diM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"diO" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"diL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/main) +/obj/machinery/atmospherics/pipe/smart/simple/brown/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "diS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8264,95 +7217,6 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"dja" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"djf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"djj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/meter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"djC" = ( -/obj/machinery/door/airlock/engineering{ - name = "Smoke Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/textured_half{ - dir = 1 - }, -/area/station/engineering/atmospherics_engine) -"djE" = ( -/obj/effect/turf_decal/caution/stand_clear/white{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/engineering/atmospherics_engine) -"djU" = ( -/obj/machinery/power/smes/engineering, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"dkd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) -"dkm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) -"dkq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/wrench, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dks" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/full, @@ -8384,29 +7248,25 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/tram) -"dkC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"dkF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 5 - }, -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmos) "dkI" = ( /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/security/execution/education) +"dkR" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "dkS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -8435,12 +7295,6 @@ dir = 8 }, /area/station/hallway/secondary/entry) -"dkW" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "dlc" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8450,12 +7304,12 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) -"dll" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan{ +"dlk" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ dir = 4 }, -/obj/structure/tank_holder/extinguisher/advanced, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/station/engineering/atmos) "dlx" = ( /obj/structure/flora/bush/flowers_br/style_random, @@ -8480,31 +7334,22 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"dlR" = ( -/obj/effect/turf_decal/caution/stand_clear/white{ +"dmb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ dir = 8 }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ +/obj/structure/railing{ dir = 4 }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "dmk" = ( /obj/machinery/holopad, /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) -"dmw" = ( -/obj/machinery/atmospherics/components/tank/plasma, -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "dmG" = ( /obj/structure/transport/linear/tram, /obj/structure/tram, @@ -8534,35 +7379,6 @@ dir = 1 }, /area/station/security/prison/safe) -"dnj" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Waste to Filter" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) -"dnp" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) -"dnq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) -"dnt" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) "dnJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -8573,16 +7389,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"dnW" = ( -/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 +"dnU" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "dob" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8616,6 +7434,19 @@ }, /turf/open/floor/iron/white/small, /area/station/command/heads_quarters/cmo) +"dor" = ( +/obj/machinery/flasher/directional/west{ + id = "AI"; + pixel_y = 26 + }, +/obj/structure/cable, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Secondary AI Core Access"; + req_access = list("ai_upload"); + pixel_x = -4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "dov" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/spawner/random/trash, @@ -8632,27 +7463,21 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"doQ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "doX" = ( /obj/structure/girder, /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/plating, /area/station/commons/fitness/recreation/entertainment) -"dpe" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/grass, -/area/station/service/chapel) +"dph" = ( +/obj/structure/railing, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine/atmos) +"dpk" = ( +/obj/effect/turf_decal/arrows/white, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "dps" = ( /obj/machinery/camera/directional/south{ c_tag = "AI Chamber - Aft"; @@ -8695,59 +7520,44 @@ dir = 1 }, /area/station/hallway/secondary/dock) -"dpN" = ( -/obj/structure/hedge, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) -"dpO" = ( -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/structure/firelock_frame, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/engine/atmos) "dpR" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 }, /turf/open/floor/tram, /area/station/security/tram) -"dqj" = ( -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/engine/atmos) -"dqG" = ( -/obj/structure/chair/sofa/left{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/diagonal, -/area/station/maintenance/department/engine/atmos) -"dqK" = ( -/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, -/turf/open/floor/iron/diagonal, -/area/station/maintenance/department/engine/atmos) "dqO" = ( /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs/auxiliary) +"dqV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/station/engineering/atmos) "dqX" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/security/office) -"dra" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/lighter, -/obj/effect/decal/cleanable/cobweb/cobweb2, +"dre" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Transit Tube Station" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) +/area/station/maintenance/department/electrical) +"drw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/computer/atmos_control/nocontrol/incinerator{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "dry" = ( /obj/structure/bed/medical{ dir = 4 @@ -8758,6 +7568,43 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) +"drF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"drI" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/engineering/main) +"drO" = ( +/obj/machinery/door/airlock/maintenance{ + name = "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/department/engine) +"dsb" = ( +/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/elevatorshaft, +/area/station/engineering/lobby) "dse" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -8765,15 +7612,17 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"dsq" = ( +"dsh" = ( +/obj/effect/spawner/random/structure/chair_flipped, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"dsp" = ( +/obj/effect/turf_decal/sand/plating, /obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/iron/fifty, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/mask/gas, -/obj/item/airlock_painter, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +/obj/item/pickaxe, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "dst" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -8784,21 +7633,11 @@ }, /turf/open/floor/iron/small, /area/station/medical/morgue) -"dsH" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/reagent_dispensers/fueltank, +"dsE" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/screwdriver, /turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) -"dsL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/area/station/maintenance/department/engine) "dsN" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -8830,6 +7669,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"dty" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/service/chapel) "dtC" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/purple{ @@ -8854,16 +7699,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/genetics) -"dtH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Cold Loop to Gas" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "dua" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -8894,13 +7729,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"duF" = ( -/obj/machinery/atmospherics/components/tank/carbon_dioxide{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos) "duI" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ dir = 10 @@ -8914,19 +7742,14 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"dvb" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ +"duY" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ dir = 5 }, -/obj/machinery/computer/atmos_control/plasma_tank{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) +/turf/open/floor/wood, +/area/station/engineering/atmos/office) "dvl" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/enzyme{ @@ -8949,10 +7772,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) -"dvq" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/station/maintenance/department/engine) "dvs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8962,6 +7781,11 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) +"dvv" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) "dvJ" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/dark_red/fourcorners, @@ -8971,11 +7795,16 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"dvQ" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) +"dvO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "dwa" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/dark_red/half/contrasted, @@ -8997,23 +7826,23 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) -"dwJ" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ - dir = 4 +"dwC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/dark/side{ - dir = 9 +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) +"dwP" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 1 }, -/area/station/engineering/atmos) -"dwL" = ( -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/disposal/incinerator) "dwT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9043,18 +7872,29 @@ "dxf" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical/central) +"dxr" = ( +/obj/effect/turf_decal/stripes/white/box, +/obj/item/hfr_box/core, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"dxu" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - Cold Room" + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "dxz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"dxG" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "dxO" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -9066,16 +7906,6 @@ /obj/item/stack/rods/fifty, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"dxP" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Plasma to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dxZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -9085,13 +7915,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"dye" = ( -/obj/effect/turf_decal/siding/wideplating/dark/end{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) "dyp" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -9108,6 +7931,21 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/port) +"dyt" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "dyF" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ @@ -9121,11 +7959,6 @@ dir = 4 }, /area/station/hallway/primary/central/fore) -"dyG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal/incinerator) "dyO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9174,15 +8007,16 @@ /obj/item/radio/intercom/chapel/directional/east, /turf/open/floor/iron/terracotta/diagonal, /area/station/service/chapel/office) -"dzl" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) +"dzA" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/brown/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) +"dzD" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "dzE" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -9198,44 +8032,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) -"dzQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"dzT" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) -"dAh" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"dAl" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "N2 to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dAn" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -9244,36 +8040,43 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"dAz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"dAF" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 5 + }, +/obj/machinery/light/broken/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/firealarm/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "dAG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"dAS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"dAI" = ( +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"dBa" = ( -/obj/effect/spawner/random/structure/girder, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"dBb" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "dBh" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -9281,21 +8084,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood/tile, /area/station/science/lower) -"dBi" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "O2 to Pure" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dBr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9309,24 +8097,17 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"dBA" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/royalblack, +/area/station/commons/dorms) "dBH" = ( /turf/open/floor/iron/white/corner{ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"dBM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"dBV" = ( -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "dCe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9338,8 +8119,8 @@ /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) "dCj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/passive_vent, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) "dCm" = ( @@ -9422,17 +8203,6 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"dDN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Mix to Filter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "dDO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/box/red/corners{ @@ -9458,76 +8228,28 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) -"dEt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dEu" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron/kitchen/small, /area/station/security/breakroom) +"dEA" = ( +/obj/machinery/modular_computer/preset/engineering, +/obj/structure/cable, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/small, +/area/station/engineering/engine_smes) "dEF" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 }, /turf/open/floor/tram, /area/station/security/tram) -"dER" = ( -/obj/machinery/power/emitter, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 +"dGV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) -"dFn" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) -"dFs" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"dFH" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics - Distro Loop" - }, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"dGt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) -"dGO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/closed/wall, +/area/station/engineering/atmos/storage/gas) "dHi" = ( /obj/machinery/door/firedoor, /obj/effect/landmark/navigate_destination/bar, @@ -9548,17 +8270,6 @@ }, /turf/open/floor/tram, /area/station/security/tram) -"dHC" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "dHE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -9583,40 +8294,14 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"dIe" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) -"dIm" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) -"dIt" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +"dHU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ dir = 8 }, -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/stripes/white/box, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/fore) -"dID" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "dIN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9640,6 +8325,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"dIZ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "dJd" = ( /obj/machinery/computer/records/security, /turf/open/floor/wood/tile, @@ -9662,43 +8361,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) -"dJh" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) -"dJi" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/grass, -/area/station/service/chapel) -"dJn" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) -"dJp" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "dJz" = ( /obj/structure/chair/stool/directional/west, /mob/living/basic/trooper/russian/ranged/lootless, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) -"dJN" = ( -/obj/machinery/griddle, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "dJT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9712,16 +8379,24 @@ dir = 1 }, /area/station/security/execution/transfer) -"dKj" = ( -/obj/structure/closet/secure_closet/freezer/empty/open, -/turf/open/floor/iron/diagonal, -/area/station/maintenance/department/engine/atmos) -"dKk" = ( -/obj/structure/chair/sofa/right{ +"dJU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 10 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/turf/open/floor/iron/diagonal, -/area/station/maintenance/department/engine/atmos) +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) +"dKl" = ( +/obj/effect/spawner/random/engineering/material_cheap, +/obj/effect/spawner/random/engineering/material, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "dKq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9745,13 +8420,6 @@ }, /turf/open/floor/wood/large, /area/station/command/corporate_suite) -"dKy" = ( -/obj/effect/landmark/start/assistant, -/obj/structure/chair/sofa/bamboo/right{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/service/chapel) "dKA" = ( /obj/machinery/door/airlock/external/glass{ name = "Abandoned Dock Airlock" @@ -9761,113 +8429,27 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/dock) -"dKC" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) "dKQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"dKZ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/window/left/directional/east{ - name = "Mass Driver Door"; - req_access = list("ordnance") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/ordnance/testlab) -"dLb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 5 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/smooth_corner{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) -"dLd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "Secure Creature Pen"; - req_access = list("research") - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"dLf" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/table/reinforced/titaniumglass, -/obj/item/stack/sheet/iron/fifty, -/obj/item/crowbar, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, +"dLj" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/bot, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/iron/small, /area/station/engineering/break_room) "dLn" = ( /obj/structure/chair/office, /turf/open/floor/iron/dark/herringbone, /area/station/security/execution/education) -"dLy" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) -"dLC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table/reinforced/titaniumglass, -/obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson{ - pixel_y = 7 - }, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "dLQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"dLU" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) -"dLZ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "dMg" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -9875,25 +8457,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"dMj" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/cone{ - pixel_x = 9; - pixel_y = -4 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/engineering/atmos) "dMm" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/stripes/line{ @@ -9967,6 +8530,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"dNM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/binary/pump/on/layer2{ + dir = 1; + name = "Air to Distro" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "dNU" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -9991,10 +8562,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/tram) -"dOq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal/incinerator) "dOv" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -10022,6 +8589,24 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office) +"dOU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "engsm"; + name = "Radiation Shutters Control" + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"dOY" = ( +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "dPa" = ( /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) @@ -10044,9 +8629,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"dPz" = ( -/turf/open/floor/iron/diagonal, -/area/station/maintenance/department/engine/atmos) "dPH" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -10063,6 +8645,14 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"dQi" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/lobby) "dQP" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/decal/cleanable/dirt, @@ -10076,23 +8666,6 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"dQS" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes/cigars/cohiba{ - pixel_y = 8 - }, -/obj/item/reagent_containers/cup/glass/mug/nanotrasen{ - pixel_x = 5; - pixel_y = 19 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) -"dQY" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "dRf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -10117,14 +8690,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"dRi" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "dRk" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -10134,10 +8699,6 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) -"dRm" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/closed/wall, -/area/station/engineering/atmos) "dRD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -10149,11 +8710,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dRE" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "dSb" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 4 @@ -10166,12 +8722,15 @@ dir = 1 }, /area/station/science/cytology) -"dSd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) +"dSh" = ( +/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/smooth, +/area/station/engineering/break_room) "dSl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/navbeacon{ @@ -10200,18 +8759,16 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) -"dSD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"dSO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"dSM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/station/engineering/atmos) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/end{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "dSV" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -10238,15 +8795,6 @@ }, /turf/open/floor/iron/white/small, /area/station/science/lab) -"dTm" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) -"dTr" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "dTB" = ( /obj/structure/broken_flooring/pile/directional/east, /obj/effect/decal/cleanable/dirt, @@ -10271,29 +8819,13 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) -"dTX" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/flora/bush/flowers_pp/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) -"dUn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/structure/window/spawner/directional/east, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"dUr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"dUw" = ( +/obj/structure/railing{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/line, -/obj/effect/landmark/navigate_destination/incinerator, -/turf/open/floor/iron/smooth_corner{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) +/obj/item/storage/bag/trash, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine/atmos) "dUA" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 6 @@ -10329,45 +8861,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"dUT" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/machinery/computer/atmos_control/nitrogen_tank{ - dir = 1 - }, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) -"dVu" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) -"dVF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/window/spawner/directional/south, -/obj/structure/rack, -/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/side{ - dir = 9 - }, -/area/station/engineering/atmos) -"dVM" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos/storage/gas) "dVW" = ( /obj/structure/chair{ dir = 8 @@ -10387,13 +8880,6 @@ /obj/structure/sign/departments/science/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"dWp" = ( -/obj/machinery/field/generator, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) "dWs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10404,39 +8890,6 @@ }, /turf/open/floor/iron/dark/corner, /area/station/science/xenobiology) -"dWw" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/window/spawner/directional/south, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) -"dWx" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) -"dWI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/computer/atmos_control/oxygen_tank{ - dir = 1 - }, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) "dWK" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/chair/office{ @@ -10445,10 +8898,37 @@ /obj/effect/landmark/start/warden, /turf/open/floor/iron, /area/station/security/warden) +"dWS" = ( +/obj/structure/closet/crate/large, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "dWW" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"dXa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/brown/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "dXb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -10488,48 +8968,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/small, /area/station/security/warden) -"dXE" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/department/engine) -"dXH" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/window/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/atmos_alert{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) -"dXK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/window/spawner/directional/south, -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/utility/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) "dXO" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/structure/disposalpipe/segment{ @@ -10537,20 +8975,6 @@ }, /turf/open/floor/plating, /area/station/service/janitor) -"dXT" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/computer/atmos_control/air_tank{ - dir = 1 - }, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) "dXU" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -10618,6 +9042,15 @@ /obj/structure/mirror/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) +"dYw" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/hallway) "dYD" = ( /obj/machinery/door/window/brigdoor/left/directional/west{ id = "Cell 1"; @@ -10654,6 +9087,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"dYY" = ( +/obj/machinery/light/cold/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "dZa" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/west, @@ -10666,12 +9103,6 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) -"dZd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos) "dZk" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/medical/general, @@ -10727,82 +9158,41 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"dZX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "dZZ" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"eag" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Pure to Mix" - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "eam" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"eat" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/half{ + dir = 8 + }, +/area/station/engineering/main) "eax" = ( /obj/item/shovel, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"eaA" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "flamedra" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/department/engine) -"eaC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"eaE" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/supply/visible, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Air to External Air Ports" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "eaT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/rec) -"ebc" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Distro to Waste" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "ebe" = ( /obj/structure/hoop{ dir = 4; @@ -10815,57 +9205,51 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/station/commons/fitness/recreation) -"ebj" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/engineering/atmos/pumproom) -"ebs" = ( -/obj/machinery/light/floor, -/turf/open/floor/wood/large, -/area/station/service/chapel) -"ebx" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/turf/closed/wall/rust, -/area/station/engineering/atmos/pumproom) "ebU" = ( /obj/structure/table/reinforced, /obj/structure/reagent_dispensers/servingdish, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"ecf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/east, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"ecn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/machinery/cell_charger{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/geiger_counter{ + pixel_x = 16; + pixel_y = 6 + }, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "ecq" = ( /turf/closed/wall/r_wall/rust, /area/station/maintenance/department/engine/atmos) +"ecs" = ( +/obj/effect/spawner/random/structure/crate_loot, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "ect" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) -"ecF" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/department/engine/atmos) "ecL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/transit_tube/horizontal, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ecQ" = ( -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) "ecY" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -10940,9 +9324,6 @@ dir = 8 }, /area/station/cargo/storage) -"eeg" = ( -/turf/open/floor/iron/smooth_large, -/area/station/engineering/atmos) "eem" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10978,17 +9359,10 @@ "eeJ" = ( /turf/closed/wall, /area/station/commons/fitness/locker_room) -"efa" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) -"efe" = ( -/obj/structure/cable, +"eeY" = ( /obj/machinery/door/airlock/maintenance{ - name = "Atmospherics Maintenance" + name = "Transit Tube Workshop" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "efj" = ( @@ -10998,14 +9372,13 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) -"efp" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 +"efl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/smooth, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "efr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -11065,13 +9438,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/prison/rec) -"egk" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 6 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) "egr" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -11088,19 +9454,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) +"egR" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "ehj" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"ehB" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +"ehw" = ( +/obj/machinery/computer/atmos_control/carbon_tank, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "ehV" = ( /obj/structure/cable, /obj/structure/chair/sofa/right{ @@ -11121,6 +9490,16 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"ein" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/purple, +/area/station/commons/dorms) "eip" = ( /obj/machinery/power/port_gen/pacman, /obj/machinery/power/terminal{ @@ -11144,18 +9523,30 @@ /obj/effect/turf_decal/box/red, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/equipment) -"eiK" = ( -/obj/machinery/field/generator, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 +"eiD" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"eiN" = ( +/obj/machinery/light/cold/dim/directional/east, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/directions/evac/directional/east{ + dir = 2 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) -"eiM" = ( -/obj/structure/table/wood, -/obj/item/knife/plastic, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) +/obj/structure/sign/directions/command/directional/east{ + pixel_y = 8; + dir = 2 + }, +/obj/structure/sign/directions/medical/directional/east{ + pixel_y = -8; + dir = 2 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "eiU" = ( /turf/open/floor/plating/rust, /area/station/maintenance/department/engine/atmos) @@ -11180,34 +9571,66 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/bitrunning/den) -"ejt" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "ejx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/ordnance/testlab) -"ejH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"ejL" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/layer_manifold/orange/visible, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/area/station/engineering/main) +"ejM" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/pen{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/structure/table, +/obj/effect/landmark/start/hangover, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/small, +/area/station/engineering/lobby) +"ejN" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "engine_airlock_1" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/main) "ejV" = ( /mob/living/basic/mining/basilisk, /turf/open/misc/asteroid, /area/space/nearstation) -"eki" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" +"ekf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "ekr" = ( /obj/effect/turf_decal/siding/dark_red{ dir = 1 @@ -11249,6 +9672,18 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"ekV" = ( +/obj/machinery/light/floor, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "ekZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/navigate_destination, @@ -11259,17 +9694,31 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/security) +"eld" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Decontamination A" + }, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/main) "elh" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible/layer2, /obj/structure/sign/warning/cold_temp/directional/west, /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"elm" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) +"elv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) "elw" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -11320,11 +9769,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"elO" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) "elQ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -11342,28 +9786,9 @@ /obj/effect/turf_decal/tile/dark_red/anticorner/contrasted, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"elY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "emd" = ( /turf/open/floor/iron, /area/station/medical/chemistry) -"emf" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/window/spawner/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "emw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11381,6 +9806,13 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"emC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/end, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "emD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -11390,6 +9822,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ena" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/plumbed{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/department/medical/central) "enb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11405,19 +9844,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/cargo/office) -"enq" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) -"enB" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "enD" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -11452,14 +9878,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"eop" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 6 - }, -/turf/open/floor/plating/rust{ - initial_gas_mix = "TEMP=2.7" - }, -/area/space/nearstation) "eoz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11475,27 +9893,6 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"eoG" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron/smooth_edge{ - dir = 4 - }, -/area/station/maintenance/disposal/incinerator) -"eoK" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "eoU" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -11503,24 +9900,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"eoY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"eoZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release" - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/engineering/atmos) "epa" = ( /obj/machinery/telecomms/bus/preset_four, /obj/effect/decal/cleanable/dirt, @@ -11549,32 +9928,11 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/lobby) -"epq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) -"ept" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) +"epr" = ( +/obj/structure/closet/emcloset, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "epu" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -11616,48 +9974,19 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"eqL" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ +"eqB" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "O2 Outlet Pump" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) -"eqM" = ( -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor, +/obj/structure/window/reinforced/plasma/spawner/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/catwalk_floor/iron_smooth, -/area/station/engineering/atmos/storage/gas) +/obj/machinery/power/energy_accumulator/tesla_coil/anchored, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "eqS" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) -"eqX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "erg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -11666,18 +9995,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"erk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "erA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11690,21 +10007,32 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, /area/station/science/lower) +"erJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/greyscale, +/obj/item/folder/yellow{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/clothing/glasses/meson, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "erK" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/thinplating_new, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) -"erW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) "erZ" = ( /obj/machinery/computer/records/security, /turf/open/floor/iron/small, /area/station/security/office) +"ess" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "esv" = ( /obj/docking_port/stationary{ dwidth = 4; @@ -11716,33 +10044,6 @@ }, /turf/open/space/basic, /area/space) -"esw" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"esC" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"esE" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/corner{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "esF" = ( /obj/structure/cable, /obj/item/kirbyplants/organic/applebush, @@ -11779,6 +10080,12 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"etl" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/ce) "eto" = ( /obj/structure/table/wood, /obj/item/statuebust, @@ -11807,6 +10114,10 @@ }, /turf/open/floor/iron/stairs, /area/station/ai_monitored/turret_protected/ai) +"etX" = ( +/obj/structure/sign/warning/hot_temp/directional/east, +/turf/open/floor/iron/stairs/right, +/area/station/engineering/atmos) "etZ" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted, /obj/effect/turf_decal/siding/wideplating/dark/corner{ @@ -11819,15 +10130,6 @@ /obj/machinery/seed_extractor, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"euj" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/supply/visible, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Air to Distro" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "euq" = ( /obj/structure/cable, /obj/item/kirbyplants/random/fullysynthetic, @@ -11864,28 +10166,17 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"euQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) +"euP" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "euR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/science/lobby) -"euX" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ - dir = 8 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) "eva" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -11900,10 +10191,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"evg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) +"evm" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Engine Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "engine_airlock_2" + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine) "evq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11911,42 +10209,11 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"evs" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"evM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) -"evE" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) -"evP" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/railing{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/box, -/obj/effect/turf_decal/siding/white{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/break_room) +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine) "ewi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/cold/directional/west, @@ -11968,16 +10235,6 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"ewy" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/break_room) "ewz" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -11987,43 +10244,40 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"ewU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "ewW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"exi" = ( +"exr" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/machinery/air_sensor/oxygen_tank, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos/space_catwalk) +"exA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/structure/cable, -/obj/machinery/door/window/right/directional/east{ - name = "Access Shutter"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/depsec/engineering, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/engineering/break_room) -"exJ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/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/iron/dark, /area/station/engineering/atmos) +"exE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to North Ports" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"exQ" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/siding/yellow, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/wood, +/area/station/engineering/break_room) "exR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12039,20 +10293,6 @@ /obj/structure/sink/directional/east, /turf/open/floor/iron/white, /area/station/medical/virology) -"eyi" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal/incinerator) -"eyv" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/computer/security{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "eyz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/chair/stool/directional/west, @@ -12122,6 +10362,18 @@ /obj/vehicle/ridden/secway, /turf/open/floor/plating, /area/station/security/tram) +"ezG" = ( +/obj/structure/railing, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/engine_access, +/obj/effect/mapping_helpers/airalarm/link{ + chamber_id = "engine" + }, +/obj/effect/mapping_helpers/airalarm/tlv_no_checks, +/turf/open/floor/iron/stairs/old{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "ezM" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -12130,6 +10382,11 @@ /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron, /area/station/security/brig/entrance) +"ezQ" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/break_room) "ezS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/showcase/cyborg/old{ @@ -12187,6 +10444,14 @@ /obj/machinery/light/floor, /turf/open/floor/noslip, /area/station/medical/medbay/central) +"eAC" = ( +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) +"eAI" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1, +/turf/open/space/basic, +/area/space/nearstation) "eAK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -12258,29 +10523,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) -"eBO" = ( -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = 5; - pixel_y = 1 - }, -/obj/item/clothing/head/cone{ - pixel_x = -5; - pixel_y = -3 - }, -/obj/item/clothing/head/cone{ - pixel_x = 5; - pixel_y = -7 - }, -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = -13 - }, -/turf/open/floor/iron/smooth_large, -/area/station/engineering/atmos) "eBQ" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/barricade/wooden/crude, @@ -12311,6 +10553,28 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"eCJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/small, +/area/station/engineering/main) +"eDe" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Atmospherics Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "eDh" = ( /obj/effect/spawner/structure/window/survival_pod, /turf/open/floor/engine, @@ -12324,6 +10588,17 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"eDo" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Foyer" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "eDt" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -12408,6 +10683,16 @@ /obj/machinery/camera/directional/west, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) +"eEL" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"eEX" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "eFc" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/firealarm/directional/west, @@ -12450,15 +10735,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"eFv" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) "eFy" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -12467,11 +10743,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/security/prison) -"eFN" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "eFO" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12482,10 +10753,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"eFP" = ( -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "eFQ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12548,16 +10815,25 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/science/lower) -"eGt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"eGJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos) +"eGw" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Public Desk" + }, +/obj/machinery/requests_console/directional/west{ + department = "Engineering"; + name = "Engineering Requests Console"; + pixel_x = 0; + pixel_y = -30 + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/modular_computer/preset/cargochat/engineering{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "eGL" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -12629,30 +10905,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/maintenance/port/lesser) -"eHR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"eHS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"eIk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "eIp" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12661,6 +10913,19 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) +"eIv" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/tank, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) +"eIx" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "eIM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -12670,6 +10935,24 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"eIT" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/cold/dim/directional/west, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) +"eIX" = ( +/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "eJe" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron/smooth, @@ -12680,20 +10963,6 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"eJk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "eJm" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, @@ -12726,35 +10995,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"eJZ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"eKd" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos{ - name = "Central Atmospherics" - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/engineering/atmos) "eKf" = ( /obj/structure/table, /obj/item/storage/box/donkpockets/donkpocketpizza, @@ -12811,48 +11051,19 @@ dir = 1 }, /area/station/ai_monitored/command/storage/eva) -"eLE" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"eLJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/computer/atmos_control/mix_tank{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"eLL" = ( -/obj/effect/turf_decal/stripes/white/line, +"eLZ" = ( +/obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix Outlet Pump" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"eLO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Foyer" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, -/obj/effect/mapping_helpers/airlock/access/any/engineering/general, -/turf/open/floor/iron/stairs{ + name = "Gas Port"; dir = 8 }, -/area/station/engineering/break_room) +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "eMl" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/camera/autoname/directional/west, @@ -12866,46 +11077,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/rd) -"eMI" = ( -/obj/machinery/computer/atmos_control/nitrous_tank{ - dir = 4; - name = "Neurotoxin Supply Control" - }, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "eMU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"eMV" = ( -/obj/structure/table, -/obj/item/folder/yellow{ - pixel_x = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/stack/sheet/mineral/plasma/thirty, -/turf/open/floor/iron/small, -/area/station/engineering/engine_smes) -"eMX" = ( -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/service/chapel) -"eNb" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 1; - initialize_directions = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "eNl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12914,6 +11089,19 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"eNm" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/curved, +/turf/open/space/basic, +/area/space/nearstation) +"eNn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/transit_tube/horizontal, +/turf/open/floor/plating/airless, +/area/space/nearstation) "eNo" = ( /obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ pixel_x = -6 @@ -12934,13 +11122,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) -"eNG" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "eNU" = ( /obj/structure/table/reinforced, /obj/item/phone{ @@ -12954,29 +11135,11 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"eNV" = ( -/obj/machinery/modular_computer/preset/cargochat/engineering{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/break_room) -"eOo" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"eOp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) +"eOh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "eOt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12989,6 +11152,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"eOP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "eOZ" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/airalarm/directional/north, @@ -13009,29 +11181,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningfoundry) -"ePu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"ePw" = ( -/obj/machinery/photocopier, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) -"ePA" = ( -/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/smooth, -/area/station/engineering/break_room) "ePV" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/west, @@ -13054,18 +11203,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"eQe" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"eQi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "eQk" = ( /obj/machinery/door/airlock/security{ name = "Isolation" @@ -13091,36 +11228,11 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/carpet/lone, /area/station/service/theater) -"eQz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "eQC" = ( /obj/effect/spawner/random/maintenance, /obj/effect/spawner/random/structure/girder, /turf/open/floor/tram, /area/station/security/tram) -"eQJ" = ( -/obj/structure/cable, -/turf/open/floor/iron/stairs{ - dir = 8 - }, -/area/station/engineering/break_room) -"eQO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron, -/area/station/engineering/break_room) "eQQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13133,6 +11245,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"eQY" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "eRX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13156,61 +11275,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron, /area/station/science/lower) -"eSh" = ( -/obj/structure/cable, -/obj/machinery/door/window/right/directional/east{ - name = "Access Shutter"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/landmark/start/depsec/engineering, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/engineering/break_room) -"eSo" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/security/engine, -/obj/item/radio/off{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/item/geiger_counter{ - pixel_x = 7; - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"eSB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "West Ports to Filter" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"eSF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eSU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Pure to West Ports" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "eSV" = ( /obj/structure/bed/maint, /turf/open/floor/iron/small, @@ -13260,6 +11324,12 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"eTj" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) "eTr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13279,25 +11349,6 @@ /obj/effect/landmark/navigate_destination/hydro, /turf/open/floor/iron, /area/station/hallway/primary/port) -"eTu" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"eTL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmos) "eTT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13317,13 +11368,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, /area/station/security/brig/entrance) -"eUi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "eUn" = ( /obj/structure/cable, /obj/structure/chair/office{ @@ -13361,14 +11405,31 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"eUR" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Gas to Cold Loop" + }, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "eUW" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/wood/parquet, /area/station/service/library) -"eVb" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +"eUZ" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig/entrance) "eVc" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, @@ -13390,6 +11451,30 @@ /obj/machinery/light/warm/directional/east, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/port/aft) +"eVk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 5 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"eVm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/brown/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "eVu" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair/sofa/bench{ @@ -13422,6 +11507,30 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"eVY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"eWf" = ( +/obj/structure/closet/cardboard, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) +"eWj" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 4; + initialize_directions = 8 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) "eWB" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -13445,16 +11554,6 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"eXa" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/decal/cleanable/dirt, -/obj/item/phone{ - pixel_x = -2; - pixel_y = 10 - }, -/obj/item/food/bonbon/chocolate_truffle, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) "eXf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -13500,17 +11599,6 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/equipment) -"eYm" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "eYn" = ( /obj/machinery/computer/monitor{ dir = 1 @@ -13529,15 +11617,23 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/equipment) -"eYM" = ( -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) -"eYV" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) +"eYD" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) +"eYF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/start/depsec/engineering, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) "eYY" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/east, @@ -13547,6 +11643,10 @@ }, /turf/open/misc/sandy_dirt, /area/station/maintenance/port/lesser) +"eZt" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "eZJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -13560,24 +11660,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) -"eZO" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) -"faj" = ( -/obj/machinery/door/airlock/public, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "fav" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/computer/security/telescreen/entertainment/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"faw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "faB" = ( /obj/structure/table/wood, /obj/item/book/bible, @@ -13587,31 +11674,23 @@ dir = 4 }, /area/station/maintenance/starboard/greater) +"faQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/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/smooth, +/area/station/engineering/main) "faR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"faX" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/rack, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 9 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = 1; - pixel_y = -2 - }, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "fbe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13631,19 +11710,10 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"fbo" = ( -/obj/structure/toilet{ - dir = 8 - }, +"fbs" = ( +/obj/effect/spawner/random/trash, /turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) -"fbq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/area/station/maintenance/department/electrical) "fbt" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -13702,11 +11772,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"fch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "fcn" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -13735,15 +11800,18 @@ }, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"fcD" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 9 +"fcI" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ - dir = 1 +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Airlock" }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) +/obj/structure/cable, +/obj/structure/sign/warning/vacuum/external/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) "fdi" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/neutral/line{ @@ -13764,15 +11832,25 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"fdF" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ +"fdy" = ( +/obj/structure/railing{ dir = 1 }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) +"fdE" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Bedroom" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured_half, +/area/station/command/heads_quarters/ce) "fdG" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -13781,14 +11859,6 @@ dir = 1 }, /area/station/science/lower) -"fdK" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4 - }, -/turf/open/floor/plating/rust{ - initial_gas_mix = "TEMP=2.7" - }, -/area/space/nearstation) "fdM" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -13798,21 +11868,18 @@ }, /turf/open/floor/plating, /area/station/science/robotics/lab) -"fel" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"feq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall/rust, -/area/station/hallway/primary/fore) -"ffs" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) +"feo" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"ffp" = ( +/obj/structure/closet/firecloset, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "ffD" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -13820,10 +11887,14 @@ }, /turf/open/floor/plating, /area/station/service/janitor) -"ffO" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/plating/airless, -/area/space/nearstation) +"ffE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "ffX" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters/preopen{ @@ -13860,14 +11931,19 @@ dir = 1 }, /area/station/commons/storage/tools) -"fgL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 +"fgG" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/break_room) +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/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 + }, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "fgW" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/vending/drugs, @@ -13877,10 +11953,6 @@ /obj/machinery/camera/directional/north, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"fhj" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) "fho" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/implanter{ @@ -13927,13 +11999,26 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) -"fhS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 +"fhX" = ( +/obj/structure/table/greyscale, +/obj/item/folder/yellow{ + pixel_x = 2; + pixel_y = 4 }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/obj/item/pen{ + pixel_x = -4 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) +"fib" = ( +/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/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "fii" = ( /obj/effect/spawner/random/trash/graffiti{ pixel_x = -32; @@ -13943,35 +12028,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"fik" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"fiA" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/landmark/atmospheric_sanity/ignore_area, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) +"fiq" = ( +/obj/machinery/computer/atmos_control/nitrous_tank, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) +"fiw" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/table, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "fiD" = ( /obj/structure/table, /obj/item/plate, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"fiF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) +"fiI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "fiW" = ( /obj/effect/turf_decal/siding/dark_red/corner{ dir = 8 @@ -14014,14 +12090,6 @@ /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"fjK" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) "fjL" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -14032,22 +12100,12 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/wood/tile, /area/station/science/lower) -"fjR" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plating/rust{ - initial_gas_mix = "TEMP=2.7" - }, -/area/space/nearstation) -"fjS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) +"fjN" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/window/survival_pod/left/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/fore/greater) "fjV" = ( /obj/item/radio/intercom/directional/south{ broadcasting = 1; @@ -14077,12 +12135,6 @@ /obj/item/mod/module/signlang_radio, /turf/open/floor/iron/small, /area/station/medical/storage) -"fkt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "fky" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 5 @@ -14095,13 +12147,6 @@ /obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"flg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) "flo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -14115,6 +12160,22 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"fls" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) +"flE" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Canister Storage" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) "flM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14122,11 +12183,6 @@ /obj/item/kirbyplants/organic/applebush, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) -"flQ" = ( -/turf/open/floor/plating/rust{ - initial_gas_mix = "TEMP=2.7" - }, -/area/space/nearstation) "flX" = ( /obj/item/flashlight/lantern, /turf/open/floor/plating/rust, @@ -14136,15 +12192,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"fmj" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "fmq" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/maintenance/three, @@ -14183,20 +12230,10 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"fnp" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"fnr" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) +"fnm" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "fnw" = ( /obj/structure/chair{ pixel_y = -2 @@ -14241,12 +12278,6 @@ /obj/item/storage/fancy/donut_box, /turf/open/floor/iron/textured_large, /area/station/security/brig/entrance) -"fnZ" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "foe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -14261,32 +12292,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"foi" = ( -/obj/machinery/door/airlock/external/glass, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos/pumproom) -"for" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "fov" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/vending/security, /turf/open/floor/iron, /area/station/security/lockers) -"foF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/bush/flowers_pp/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "foI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14303,37 +12313,26 @@ dir = 8 }, /area/station/science/xenobiology) -"foJ" = ( -/turf/closed/wall/r_wall/rust, -/area/station/command/heads_quarters/ce) "foL" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"fpb" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ +"fpg" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=20.0-CentralPort-Bar"; + location = "19.0-Engineering-CentralPort" + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"fpk" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Air to East Ports" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "fpl" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/dark_red{ @@ -14363,6 +12362,19 @@ /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"fpF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Turbine Interior Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/disposal/incinerator) "fpO" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/ce) @@ -14374,15 +12386,6 @@ "fpY" = ( /turf/closed/mineral/random/stationside, /area/station/ai_monitored/aisat/exterior) -"fqf" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Privacy Shutter" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/ce) "fqG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14401,6 +12404,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"fqQ" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "frf" = ( /obj/structure/table/glass, /obj/item/defibrillator/loaded{ @@ -14416,34 +12424,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"frj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"frq" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/main) -"frs" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/command{ - name = "Chief Engineer's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/command/heads_quarters/ce) "frI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -14457,22 +12437,6 @@ /obj/machinery/door/window/brigdoor/right/directional/north, /turf/open/floor/iron/textured_large, /area/station/security/checkpoint/customs) -"fsf" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/structure/railing{ - dir = 10 - }, -/obj/effect/turf_decal/siding/white{ - dir = 10 - }, -/obj/machinery/fax{ - fax_name = "Engineering Lobby"; - name = "Engineering Lobby Fax Machine"; - pixel_x = 8; - pixel_y = 9 - }, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) "fst" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /obj/effect/mapping_helpers/broken_floor, @@ -14484,30 +12448,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/medical/chemistry) -"fsz" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = 2; - pixel_y = 1 - }, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) -"fsD" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/engineering/break_room) "fsL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14520,17 +12460,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit, /area/station/tcommsat/server) -"fsV" = ( -/obj/structure/cable, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/engineering/break_room) "fsW" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -14540,19 +12469,19 @@ }, /turf/open/floor/wood/tile, /area/station/maintenance/aft) -"fta" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 10 - }, -/obj/machinery/air_sensor/plasma_tank, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"ftb" = ( -/obj/machinery/power/turbine/inlet_compressor{ +"ftc" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating{ dir = 1 }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) +/obj/structure/closet/emcloset, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Lockers" + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ftm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -14601,35 +12530,10 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"ftF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) -"ftO" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics CO2 Chamber"; - dir = 5; - network = list("ss13","engineering") - }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) "ftX" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) -"ftZ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos) "fuj" = ( /obj/structure/table/glass, /obj/effect/turf_decal/siding/dark_red, @@ -14656,11 +12560,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"fuo" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) "fuz" = ( /obj/machinery/light/small/directional/east, /obj/machinery/power/shieldwallgen/xenobiologyaccess, @@ -14668,6 +12567,23 @@ /obj/structure/cable/multilayer, /turf/open/floor/plating, /area/station/science/xenobiology) +"fuB" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "fuC" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, /turf/open/floor/engine/airless, @@ -14678,10 +12594,16 @@ }, /turf/open/space/basic, /area/space) -"fuR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos/pumproom) +"fuT" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "fvh" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/disposaloutlet{ @@ -14690,20 +12612,17 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/station/hallway/primary/port) +"fvs" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, +/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/command/heads_quarters/ce) "fvz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"fvC" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "fvF" = ( /obj/effect/turf_decal/siding/dark_red, /obj/machinery/modular_computer/preset/id{ @@ -14719,21 +12638,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) -"fvJ" = ( -/obj/structure/cable, -/obj/machinery/computer/apc_control{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/requests_console/directional/north{ - department = "Chief Engineer's Desk"; - name = "Chief Engineer's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fvL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -14742,11 +12646,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/processing) -"fvT" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fwc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -14784,21 +12683,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/security/medical) -"fwO" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/turf_decal/siding/wideplating_new/light{ - dir = 4 - }, -/obj/machinery/fax{ - fax_name = "Chief Engineer's Office"; - name = "Chief Engineer's Fax Machine"; - pixel_y = 7 - }, -/obj/item/stock_parts/cell/high{ - pixel_y = -9 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fwS" = ( /turf/open/floor/circuit, /area/station/maintenance/port/aft) @@ -14824,29 +12708,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/hallway/secondary/entry) -"fxt" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"fxw" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/box, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/security/telescreen/ce{ - dir = 8; - pixel_x = 30 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/station/command/heads_quarters/ce) "fxF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14862,6 +12723,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) +"fxV" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Pure to Waste" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "fyo" = ( /obj/structure/table, /obj/machinery/light/small/directional/east, @@ -14870,9 +12739,6 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/breakroom) -"fyr" = ( -/turf/closed/wall/rust, -/area/station/command/heads_quarters/ce) "fyt" = ( /obj/structure/chair/sofa/corp{ dir = 1 @@ -14908,17 +12774,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"fyQ" = ( -/obj/machinery/suit_storage_unit/ce, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/ce) -"fyT" = ( -/obj/structure/dresser, -/obj/machinery/light/small/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/ce) "fyZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -14926,18 +12781,6 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"fza" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/survival_pod/left/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/fore/greater) -"fzc" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "fzd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -14946,26 +12789,11 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"fze" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) "fzf" = ( /obj/machinery/vending/boozeomat, /obj/machinery/light/cold/directional/east, /turf/closed/wall, /area/station/service/bar) -"fzl" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "fzq" = ( /obj/structure/closet/crate/trashcart/filled, /turf/open/floor/plating, @@ -14990,14 +12818,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating/rust, /area/station/ai_monitored/turret_protected/aisat/maint) -"fAe" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "fAr" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/barricade/wooden/crude, @@ -15029,38 +12849,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"fAM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/suit/hazardvest{ - pixel_x = -4; - pixel_y = -2 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_x = -2 - }, -/obj/item/electronics/airalarm{ - pixel_x = 15; - pixel_y = -5 - }, -/obj/item/electronics/airalarm{ - pixel_x = 18; - pixel_y = -3 - }, -/obj/item/multitool{ - pixel_x = 11; - pixel_y = 5 - }, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) -"fAN" = ( -/turf/closed/wall/r_wall/rust, -/area/station/maintenance/department/engine) "fAP" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -15070,35 +12858,11 @@ /obj/effect/mapping_helpers/mail_sorting/science/experimentor_lab, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fAR" = ( -/obj/effect/turf_decal/caution/stand_clear/white{ - 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/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) "fAS" = ( /obj/structure/chair/stool/directional/south, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/workout) -"fAX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/window/spawner/directional/south, -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/bag/construction, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) "fAY" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/full, @@ -15117,31 +12881,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/medical/storage) -"fAZ" = ( -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/item/circuitboard/machine/thermomachine, -/obj/item/stack/rods/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/brown/visible, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) -"fBe" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Mix" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "fBf" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -15172,14 +12911,17 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"fBz" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, +"fBy" = ( +/obj/structure/table, +/obj/item/folder, +/obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"fBO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "fBX" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/turf_decal/siding/white{ @@ -15187,6 +12929,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"fBZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Emitters" + }, +/obj/machinery/power/energy_accumulator/tesla_coil, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "fCd" = ( /turf/open/floor/wood, /area/station/cargo/miningfoundry) @@ -15197,13 +12949,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/small, /area/station/hallway/secondary/exit/departure_lounge) -"fCg" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "fCp" = ( /obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ pixel_x = 30 @@ -15237,6 +12982,15 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark/small, /area/station/security/brig) +"fCW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) "fDd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -15271,46 +13025,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/service) -"fDs" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) -"fDw" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 3 - }, -/obj/item/pen{ - pixel_y = 5 - }, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) -"fDC" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"fDF" = ( -/obj/structure/cable, -/obj/machinery/door/window/left/directional/east{ - name = "Access Shutter"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/depsec/engineering, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/engineering/break_room) "fDI" = ( /turf/open/floor/iron, /area/station/hallway/primary/aft) @@ -15327,6 +13041,12 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) +"fDO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/closed/wall, +/area/station/engineering/atmos/storage/gas) "fDQ" = ( /obj/machinery/flasher/directional/north, /turf/open/floor/iron/dark/smooth_large, @@ -15348,40 +13068,87 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) +"fDW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "fDY" = ( /obj/structure/cable, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/science/xenobiology) -"fEb" = ( -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) "fEd" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"fEe" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"fEi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/structure/sign/poster/official/plasma_effects/directional/west, +/obj/effect/mapping_helpers/apc/cell_10k, +/turf/open/floor/iron/smooth_corner{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "fEq" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"fEr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "fEC" = ( /turf/closed/wall, /area/station/maintenance/port/lesser) -"fEF" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" +"fEU" = ( +/obj/structure/table, +/obj/item/multitool{ + pixel_x = -7; + pixel_y = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 +/obj/item/wirecutters{ + pixel_y = -1; + pixel_x = 10 }, -/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "fEV" = ( /obj/machinery/porta_turret/ai, /obj/machinery/computer/security/telescreen/minisat{ @@ -15392,6 +13159,17 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) +"fFe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "fFt" = ( /obj/structure/chair/wood{ dir = 8 @@ -15399,6 +13177,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/chapel/funeral) +"fFu" = ( +/turf/open/floor/iron/stairs/medium, +/area/station/engineering/atmos) "fFD" = ( /obj/effect/turf_decal/siding/blue, /obj/effect/landmark/start/paramedic, @@ -15415,6 +13196,17 @@ }, /turf/open/floor/plating, /area/station/security/warden) +"fFO" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod Three"; + space_dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/iron/small, +/area/station/maintenance/department/electrical) "fFT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -15468,30 +13260,16 @@ }, /turf/open/floor/plating/rust, /area/station/ai_monitored/turret_protected/aisat/maint) -"fGE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/corner{ +"fGU" = ( +/obj/effect/turf_decal/stripes/red/line{ dir = 1 }, -/area/station/engineering/atmos) -"fHa" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/pods/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/hallway) "fHb" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, @@ -15504,27 +13282,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"fHh" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) -"fHn" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "fHv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -15534,6 +13291,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"fHD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) "fHN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15549,15 +13314,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"fHQ" = ( -/obj/effect/turf_decal/siding/red{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output{ - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) "fHT" = ( /obj/machinery/newscaster/directional/south, /obj/machinery/vending/wardrobe/science_wardrobe, @@ -15568,39 +13324,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"fIg" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) -"fIr" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/small, -/area/station/engineering/main) -"fIE" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/mail_sorting/engineering/ce_office, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"fIK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "fJl" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -15622,6 +13345,12 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) +"fJt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "fJK" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -15635,16 +13364,24 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"fJO" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "flamedra"; - name = "Incinerator Conveyor"; - pixel_x = -13; - pixel_y = -4 +"fJP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 }, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"fJX" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/transit_tube/crossing/horizontal{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "fJZ" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/yellow{ @@ -15677,6 +13414,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space/basic, /area/space/nearstation) +"fKA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "fKO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15684,6 +13431,15 @@ /obj/structure/sign/departments/court/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"fKR" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/disposal/bin, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron, +/area/station/engineering/hallway) "fLf" = ( /obj/structure/cable/layer3, /obj/structure/cable, @@ -15702,6 +13458,20 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/stone, /area/station/service/bar/backroom) +"fLj" = ( +/obj/item/clothing/head/cone{ + pixel_x = -12; + pixel_y = 5 + }, +/obj/effect/decal/cleanable/insectguts, +/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/plating/elevatorshaft, +/area/station/engineering/atmos) "fLk" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -15739,20 +13509,49 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) -"fLz" = ( -/obj/item/kirbyplants/random, +"fLy" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/reagent_containers/condiment/pack/sugar{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/coffee/no_lid{ + pixel_y = 13; + pixel_x = 6 + }, +/obj/item/plate/small{ + pixel_y = 1; + pixel_x = -4 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/item/food/butterbiscuit{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, /turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +/area/station/engineering/hallway) "fLC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/barricade/wooden, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"fLE" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "fLK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -15765,15 +13564,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) -"fLX" = ( -/obj/effect/turf_decal/siding/red{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) "fMj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15809,18 +13599,46 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"fMA" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light/cold/dim/directional/north, +/obj/structure/disposalpipe/trunk, +/obj/machinery/button/door/directional/west{ + id = "Engineering"; + name = "Engineering Lockdown"; + pixel_x = -2; + pixel_y = 24; + req_access = list("engineering") + }, +/obj/machinery/button/door/directional/west{ + id = "Secure Storage"; + name = "Engineering Secure Storage"; + pixel_y = 24; + req_access = list("engine_equip"); + pixel_x = 9 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "fMD" = ( /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"fMN" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 +"fMP" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/binoculars{ + pixel_x = -7; + pixel_y = 13 }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ - dir = 1 +/obj/item/phone{ + pixel_x = -3; + pixel_y = -3 }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "fMQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15839,29 +13657,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/small, /area/station/hallway/secondary/exit/departure_lounge) -"fNh" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"fNk" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"fNr" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ - dir = 1 - }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) "fNu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -15882,15 +13677,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"fNA" = ( -/obj/effect/turf_decal/siding/white{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ - dir = 1 - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) "fNF" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -15903,12 +13689,14 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/catwalk_floor, /area/station/ai_monitored/turret_protected/ai) -"fNH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +"fNQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/railing/corner, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "fNR" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/north{ @@ -15929,29 +13717,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"fOj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "fOk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) -"fOn" = ( -/obj/effect/turf_decal/siding/white{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input{ - dir = 1 - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) "fOQ" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -15961,30 +13732,12 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"fPt" = ( -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/obj/machinery/light/small/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/plating/rust, -/area/station/maintenance/disposal/incinerator) "fPu" = ( /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/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) -"fPv" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "fPA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16008,6 +13761,20 @@ /obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"fPY" = ( +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/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/atmospherics, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "fQi" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -16031,21 +13798,40 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"fQL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "fQY" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) -"fRd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ +"fRm" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "fRq" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 @@ -16066,16 +13852,28 @@ /obj/item/plunger, /turf/open/floor/iron, /area/station/medical/chemistry) -"fRB" = ( -/obj/effect/spawner/random/structure/girder, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, +"fRv" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 5 + }, +/obj/effect/spawner/random/maintenance{ + pixel_x = -17; + pixel_y = 7 + }, +/turf/open/floor/iron/dark/small, /area/station/maintenance/department/engine/atmos) "fRJ" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"fRZ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "fSe" = ( /turf/closed/wall/rust, /area/station/cargo/miningfoundry) @@ -16092,28 +13890,6 @@ /obj/machinery/light/small/broken/directional/west, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"fSr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"fSv" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/command{ - name = "Chief Engineer's Bedroom" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/command/heads_quarters/ce) "fSx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16145,16 +13921,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/white/small, /area/station/medical/psychology) -"fSL" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"fSW" = ( -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/ce) "fSX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16178,6 +13944,13 @@ "fTe" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat_interior) +"fTf" = ( +/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/maintenance/department/engine/atmos) "fTh" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -16235,11 +14008,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fUp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor, -/turf/open/floor/wood/large, -/area/station/service/chapel) "fUI" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -16247,14 +14015,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"fUL" = ( -/obj/machinery/door/poddoor{ - id = "Secure Storage"; - name = "Secure Storage" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos) "fUO" = ( /obj/machinery/turretid{ control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; @@ -16310,6 +14070,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) +"fVA" = ( +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/small, +/area/station/security/checkpoint/engineering) "fVG" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -16330,6 +14094,20 @@ /obj/machinery/camera/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) +"fWe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - West" + }, +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "fWr" = ( /obj/structure/closet/crate, /obj/structure/barricade/wooden/crude, @@ -16368,6 +14146,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"fXe" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos/glass{ + name = "Locker Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "fXg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16376,11 +14166,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"fXi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "fXj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16403,6 +14188,21 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) +"fXo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall, +/area/station/maintenance/department/engine) +"fXB" = ( +/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/machinery/door/airlock/security/glass{ + name = "Engineering Security Post" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/catwalk_floor, +/area/station/security/checkpoint/engineering) "fXD" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -16426,15 +14226,34 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"fYo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "fYp" = ( /obj/effect/landmark/navigate_destination/vault, /turf/open/floor/glass, /area/station/hallway/secondary/spacebridge) -"fYQ" = ( -/obj/structure/table/wood, -/obj/item/book/bible, -/turf/open/floor/wood/large, -/area/station/service/chapel) +"fYr" = ( +/obj/structure/table, +/obj/item/extinguisher/empty, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) +"fYU" = ( +/obj/effect/spawner/random/structure/crate_loot, +/obj/item/pickaxe, +/obj/effect/spawner/random/maintenance, +/turf/open/misc/asteroid, +/area/station/maintenance/department/engine/atmos) "fYX" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16451,13 +14270,6 @@ dir = 8 }, /area/station/security/warden) -"fZd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/plumbed{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "fZp" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -16469,11 +14281,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/grimy, /area/station/tcommsat/server) -"fZq" = ( -/obj/machinery/door/window/left/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "fZu" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/decal/cleanable/dirt, @@ -16484,6 +14291,23 @@ dir = 8 }, /area/station/hallway/secondary/dock) +"fZL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) +"fZV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "gad" = ( /obj/structure/table/bronze, /obj/item/food/grown/cannabis{ @@ -16596,6 +14420,13 @@ /obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) +"gbE" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/space_catwalk) "gbH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16612,19 +14443,6 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"gcf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"gcm" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) "gcs" = ( /turf/closed/wall, /area/space/nearstation) @@ -16636,6 +14454,28 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"gcM" = ( +/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, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/hallway) +"gcR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "gdn" = ( /obj/item/kirbyplants/organic/applebush, /obj/effect/turf_decal/tile/red{ @@ -16651,6 +14491,15 @@ "gdr" = ( /turf/closed/wall/rust, /area/station/maintenance/fore/lesser) +"gdA" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "gdB" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -16712,43 +14561,12 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) -"geG" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/button/door/directional/west{ - id = "atmosbridge"; - name = "Space Bridge" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) -"geI" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "geJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/education) -"geQ" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "geS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16775,14 +14593,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) -"gfc" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "gfs" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/command) @@ -16796,39 +14606,17 @@ /obj/effect/mapping_helpers/airalarm/tlv_no_checks, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"gfB" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/north{ - name = "Genetics Desk"; - req_access = list("genetics") +"gfA" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 }, -/obj/item/folder, -/obj/item/pen{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_large, -/area/station/science/research) -"gfE" = ( -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/machinery/air_sensor/nitrogen_tank, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "gfJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"gfL" = ( -/obj/effect/turf_decal/siding/red{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) "gfM" = ( /obj/effect/landmark/event_spawn, /obj/effect/landmark/start/paramedic, @@ -16890,25 +14678,16 @@ }, /turf/open/floor/engine, /area/station/science/explab) -"ggW" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ +"ggX" = ( +/obj/effect/turf_decal/siding/yellow{ dir = 1 }, -/obj/effect/landmark/start/hangover, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=13.2-Tcommstore"; - location = "13.1-Engineering-Enter" - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/line{ +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "ghc" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16920,15 +14699,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"ghd" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "ghs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16991,20 +14761,6 @@ }, /turf/open/floor/plating, /area/station/service/janitor) -"gic" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/machinery/air_sensor/oxygen_tank, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"gig" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) "gih" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -17015,13 +14771,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"gij" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/air_sensor/air_tank, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) +"giq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "gir" = ( /obj/machinery/shower/directional/south, /obj/structure/curtain, @@ -17029,19 +14782,6 @@ /obj/machinery/nuclearbomb/beer, /turf/open/floor/iron/freezer, /area/station/command/corporate_suite) -"giy" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"giO" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) "giU" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 1 @@ -17076,6 +14816,48 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/tcommsat/server) +"gjP" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -2; + pixel_y = 9 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_x = -3; + pixel_y = -7 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = 6; + pixel_y = -8 + }, +/obj/item/clothing/head/cone{ + pixel_x = -3; + pixel_y = -14 + }, +/obj/item/clothing/head/cone{ + pixel_x = 6; + pixel_y = -8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "gjS" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 1 @@ -17086,12 +14868,6 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) -"gjT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) "gkq" = ( /obj/structure/transport/linear/tram, /obj/effect/turf_decal/stripes/white/corner, @@ -17119,18 +14895,15 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/medical/virology) -"gkN" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/tile/neutral{ +"gkW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/engineering/main) "glb" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/full, @@ -17139,18 +14912,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/smooth_large, /area/station/service/bar) -"gli" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "glv" = ( /obj/structure/reagent_dispensers/beerkeg, /obj/structure/sign/picture_frame/portrait/bar{ @@ -17159,17 +14920,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/service/bar/backroom) -"glz" = ( -/obj/structure/disposalpipe/segment, +"glJ" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating, +/obj/structure/closet/firecloset, +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/tile/neutral, +/obj/item/radio/off{ + pixel_x = 1; + pixel_y = 3 + }, /turf/open/floor/iron, -/area/station/hallway/primary/fore) -"glB" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +/area/station/engineering/atmos) "glM" = ( /obj/effect/turf_decal/trimline/neutral/line, /obj/effect/turf_decal/trimline/neutral/line{ @@ -17177,6 +14941,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"glO" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "glP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/holopad, @@ -17195,15 +14969,6 @@ /obj/item/wrench/medical, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"gmi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "gmm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17222,44 +14987,9 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/cryo) -"gmp" = ( -/obj/machinery/pdapainter/engineering, -/obj/machinery/firealarm/directional/south{ - pixel_x = -11 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"gnf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/west{ - id = "Secure Storage"; - name = "Engineering Secure Storage"; - pixel_y = -24; - req_access = list("engine_equip") - }, -/obj/machinery/button/door/directional/west{ - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_x = -6; - pixel_y = -24; - req_access = list("engineering") - }, -/obj/machinery/button/door/directional/west{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_x = 6; - pixel_y = -24; - req_access = list("atmospherics") - }, -/obj/machinery/button/door/directional/south{ - id = "ceprivacy"; - name = "Privacy Shutters Control"; - pixel_x = 24 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/landmark/start/chief_engineer, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) +"gnd" = ( +/turf/closed/wall, +/area/station/engineering/atmos/office) "gni" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -17269,32 +14999,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) -"gnw" = ( -/obj/effect/turf_decal/siding/wideplating_new/light{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "gnA" = ( /obj/structure/cable, /obj/machinery/light/small/directional/north, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"gnL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "gnQ" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/cryo) +"gnS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "gnY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -17305,11 +15027,13 @@ }, /turf/open/floor/light/colour_cycle/dancefloor_b, /area/station/maintenance/starboard/central) -"gof" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/keycard_auth/directional/south, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) +"gom" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/field/generator, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "gow" = ( /turf/open/floor/tram, /area/station/maintenance/department/medical/central) @@ -17356,14 +15080,6 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"gph" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/newscaster/directional/east, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) "gpu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17392,16 +15108,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/small, /area/station/medical/virology) -"gpS" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/textured_half, -/area/station/engineering/atmos) "gqb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -17425,12 +15131,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"gqw" = ( -/obj/effect/turf_decal/siding/red{ - dir = 10 - }, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) +"gqt" = ( +/obj/machinery/pipedispenser, +/obj/structure/spider/stickyweb, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "gqK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, @@ -17446,6 +15151,14 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/education) +"gro" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to South Ports" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "grx" = ( /obj/machinery/vending/wardrobe/medi_wardrobe, /obj/structure/window/reinforced/spawner/directional/west, @@ -17459,34 +15172,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"grM" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Corridor" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/cable, +"grF" = ( +/obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/textured_half, -/area/station/engineering/atmos) -"grW" = ( -/obj/effect/turf_decal/siding/red{ - dir = 6 - }, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics CO2 Chamber"; - dir = 5; - network = list("ss13","engineering") - }, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"gsf" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 10 - }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine/atmos) "gsh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -17506,6 +15197,9 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white/small, /area/station/science/lab) +"gsY" = ( +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "gtl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17531,17 +15225,15 @@ /obj/machinery/camera/directional/east, /turf/open/floor/iron/textured_large, /area/station/hallway/primary/central/fore) -"gtG" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 6 +"gtu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics CO2 Chamber"; - dir = 5; - network = list("ss13","engineering") - }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) +/obj/structure/chair/stool/directional/east, +/obj/effect/landmark/start/depsec/engineering, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) "gtJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -17551,29 +15243,27 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"gtT" = ( -/obj/effect/turf_decal/siding/white{ +"gtU" = ( +/obj/effect/turf_decal/stripes/white/line{ dir = 10 }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"gtW" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) +"gub" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Distro to Waste" }, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics CO2 Chamber"; - dir = 5; - network = list("ss13","engineering") +/obj/effect/turf_decal/tile/brown{ + dir = 4 }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"gtZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "gun" = ( /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/red{ @@ -17581,10 +15271,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) -"gux" = ( -/obj/machinery/air_sensor/mix_tank, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) "guz" = ( /obj/structure/cable, /obj/item/kirbyplants/random, @@ -17597,15 +15283,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/virology) -"guD" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "guF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/holopad, @@ -17616,35 +15293,12 @@ }, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"guI" = ( -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "guR" = ( /obj/machinery/modular_computer/preset/curator, /obj/effect/mapping_helpers/broken_floor, /obj/machinery/firealarm/directional/north, /turf/open/floor/wood/parquet, /area/station/service/library) -"guT" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics CO2 Chamber"; - dir = 5; - network = list("ss13","engineering") - }, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"guV" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Doors" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "guY" = ( /turf/closed/wall, /area/station/service/chapel/storage) @@ -17659,16 +15313,16 @@ }, /turf/open/floor/iron/textured_half, /area/station/security/brig/entrance) -"gvp" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Doors" +"gvB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/obj/machinery/computer/turbine_computer{ + dir = 4 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "gvQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -17686,24 +15340,19 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/security/brig/entrance) -"gvX" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Doors" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "gvY" = ( /turf/closed/wall/r_wall, /area/space) -"gwf" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +"gwl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) "gwo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -17714,17 +15363,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) -"gwD" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "gwQ" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east, @@ -17839,6 +15477,11 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"gxK" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/turf/open/floor/catwalk_floor, +/area/station/engineering/supermatter/room) "gxL" = ( /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, @@ -17870,6 +15513,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"gxZ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "gyd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/window/spawner/directional/east, @@ -17892,6 +15544,17 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"gyt" = ( +/obj/machinery/door/airlock/external/glass{ + name = "ATMOS PROJECT Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "gyE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -17921,6 +15584,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics) +"gzs" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/machinery/field/generator, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "gzu" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 1 @@ -17955,18 +15625,19 @@ "gzF" = ( /turf/closed/wall/r_wall, /area/station/security/prison/rec) +"gzL" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "gzY" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"gAi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "gAn" = ( /obj/structure/railing/corner{ dir = 8 @@ -17995,6 +15666,16 @@ }, /turf/open/floor/iron, /area/station/security/warden) +"gBe" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "gBh" = ( /turf/closed/mineral/random/stationside, /area/station/maintenance/department/engine/atmos) @@ -18043,19 +15724,26 @@ /obj/machinery/computer/communications, /turf/open/floor/glass/reinforced, /area/station/command/bridge) -"gBD" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +"gBA" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Airlock" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "engine_airlock_3" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) +"gBG" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "gBT" = ( /obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/secure_safe/caps_spare, /obj/structure/table/glass, -/obj/item/folder/blue{ - pixel_y = 2 - }, /turf/open/floor/glass/reinforced, /area/station/command/bridge) "gCe" = ( @@ -18081,6 +15769,10 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/tcommsat/server) +"gCp" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "gCq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, @@ -18103,20 +15795,34 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"gCJ" = ( -/obj/structure/table/reinforced/titaniumglass, +"gCP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"gCR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/plasteel/fifty, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) -"gCS" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "gCT" = ( /turf/closed/wall, /area/station/hallway/secondary/command) +"gDe" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/railing, +/obj/structure/sign/warning/electric_shock/directional/north, +/turf/open/floor/iron/stairs/old{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "gDk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18134,6 +15840,19 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"gDq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/smooth_edge{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "gDs" = ( /obj/structure/lattice, /obj/structure/window/spawner/directional/south, @@ -18158,13 +15877,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"gDL" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 10 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) "gEc" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -18174,6 +15886,23 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"gEy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 10 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "gEH" = ( /turf/closed/wall/r_wall, /area/station/security/evidence) @@ -18199,13 +15928,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) -"gET" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/structure/flora/bush/sunny/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "gFg" = ( /obj/machinery/computer/cargo/request, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -18238,6 +15960,19 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"gFF" = ( +/obj/machinery/computer/apc_control{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "gFH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18368,6 +16103,14 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/command/gateway) +"gIr" = ( +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos) "gIs" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -18385,6 +16128,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"gIz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass{ + name = "North Tanks Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "gIF" = ( /obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/small, @@ -18409,6 +16169,20 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) +"gIM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "gIS" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/bottle/holywater, @@ -18435,14 +16209,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) -"gJe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "gJo" = ( /turf/open/floor/iron/stairs{ dir = 8 @@ -18454,24 +16220,23 @@ }, /turf/open/floor/iron/freezer, /area/station/command/corporate_suite) +"gJs" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating, +/obj/structure/closet/secure_closet/atmospherics, +/obj/item/clothing/head/utility/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "gJu" = ( /obj/structure/closet, /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/small/directional/north, /turf/open/floor/carpet/royalblue, /area/station/command/corporate_suite) -"gJA" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"gJN" = ( -/obj/effect/turf_decal/stripes/box, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Turbine Entrance" - }, -/obj/machinery/pipedispenser, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "gJQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -18505,6 +16270,10 @@ "gKs" = ( /turf/closed/wall, /area/station/maintenance/disposal/incinerator) +"gKz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/hallway) "gKC" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/decal/cleanable/dirt, @@ -18517,6 +16286,22 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"gKF" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"gKK" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "gKL" = ( /turf/closed/wall/r_wall, /area/station/engineering/break_room) @@ -18551,25 +16336,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) -"gLx" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/clothing/suit/hazardvest{ - pixel_y = 8 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_y = 5 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_y = 2 - }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_y = 7 - }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_y = 4 - }, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "gLy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18582,20 +16348,6 @@ /obj/effect/turf_decal/siding/wideplating/dark, /turf/open/floor/iron, /area/station/security) -"gLA" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Engineering Deliveries"; - req_access = list("engineering") - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"gLK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/recharge_station, -/turf/open/floor/plating, -/area/station/engineering/break_room) "gLM" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -18683,31 +16435,18 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/science/xenobiology) -"gNh" = ( -/obj/structure/table/reinforced/titaniumglass, +"gNb" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = 5; - pixel_y = 17 +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"gNt" = ( +/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/item/t_scanner{ - pixel_x = -6; - pixel_y = 18 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_y = 4 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "gNC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18721,6 +16460,22 @@ }, /turf/open/floor/plating, /area/station/cargo/miningoffice) +"gNI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/engineering/atmos) +"gNS" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) "gNU" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -18782,6 +16537,19 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) +"gPb" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/structure/sign/poster/official/random/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/small, +/area/station/security/checkpoint/engineering) +"gPf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/station/engineering/atmos) "gPo" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -18823,13 +16591,6 @@ /obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) -"gQs" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) "gQG" = ( /obj/structure/window/spawner/directional/east, /obj/structure/closet/crate, @@ -18846,6 +16607,23 @@ }, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) +"gQI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal{ + dir = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"gQK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "gQR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, @@ -18861,15 +16639,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/commons/storage/tools) -"gRc" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering/glass{ - name = "Power Monitoring" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/engineering/supermatter/room) "gRe" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -18935,6 +16704,20 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"gSh" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/item/clothing/head/utility/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos) "gSi" = ( /obj/structure/chair{ dir = 4 @@ -18950,6 +16733,19 @@ /obj/effect/gibspawner/human, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"gSr" = ( +/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/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "gSs" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 10 @@ -18979,13 +16775,6 @@ }, /turf/open/floor/carpet/executive, /area/station/command/meeting_room) -"gSV" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "gSX" = ( /obj/machinery/computer/piratepad_control/civilian{ dir = 1 @@ -19083,15 +16872,6 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"gUc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "gUe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19104,15 +16884,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"gUl" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 10 - }, -/obj/structure/sink/directional/south, -/obj/structure/mirror/directional/north, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/smooth_half, -/area/station/engineering/atmos) "gUm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -19137,6 +16908,16 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"gUo" = ( +/obj/structure/table/greyscale, +/obj/item/clothing/gloves/color/yellow, +/obj/item/wrench, +/obj/item/multitool{ + pixel_x = 4; + pixel_y = 5 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "gUx" = ( /obj/effect/decal/cleanable/dirt, /obj/item/chair/stool/bamboo{ @@ -19158,26 +16939,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/security/medical) -"gUS" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/stripes/full, -/obj/structure/disposaloutlet{ - dir = 8; - name = "Cargo Deliveries" - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"gUT" = ( -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "gUV" = ( /obj/structure/cable, /obj/structure/chair/stool/directional/south{ @@ -19224,10 +16985,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"gVV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/break_room) "gVW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/east, @@ -19246,6 +17003,19 @@ }, /turf/open/floor/iron/dark/textured_half, /area/station/command/corporate_suite) +"gWl" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Airlock" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "engine_airlock_2" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "gWB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19254,6 +17024,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/processing) +"gWJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/wrench, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "gWN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19270,6 +17047,12 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) +"gXn" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/break_room) "gXq" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19481,6 +17264,29 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"hbG" = ( +/obj/machinery/light_switch/directional/west, +/obj/machinery/camera/autoname/directional/north, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/computer/records/security/laptop{ + pixel_x = 13; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_y = 1; + pixel_x = -3 + }, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) "hbI" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -19608,16 +17414,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/smooth, /area/station/command/bridge) -"hdk" = ( -/obj/structure/closet/radiation, -/obj/item/clothing/glasses/meson, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/engineering/main) "hdo" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -19665,6 +17461,15 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"hee" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/storage/fancy/candle_box, +/obj/machinery/light_switch/directional/west, +/obj/structure/rack/skeletal, +/turf/open/floor/iron/grimy, +/area/station/service/library) "hei" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -19793,13 +17598,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"hfh" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "hfC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -19887,6 +17685,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"hgv" = ( +/obj/effect/turf_decal/delivery/white, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "hgE" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral, @@ -19905,14 +17709,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"hgQ" = ( +"hgV" = ( /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 = 9 +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/grass, -/area/station/service/chapel) +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "hgX" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, @@ -19974,25 +17779,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"hhR" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/components/binary/pump{ - name = "N2O Outlet Pump" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) "hhZ" = ( /obj/structure/railing{ dir = 8 }, /turf/open/space/basic, /area/space) +"hia" = ( +/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/transport/power_rectifier{ + configured_transport_id = "bird_2" + }, +/turf/open/floor/iron, +/area/station/maintenance/department/medical/central) "hic" = ( /obj/machinery/holopad, /turf/open/floor/wood/large, @@ -20003,6 +17804,13 @@ }, /turf/open/floor/iron/smooth, /area/station/security/evidence) +"hir" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/engineering/atmos/office) "his" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/mod/module/plasma_stabilizer{ @@ -20035,17 +17843,21 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/small, /area/station/security/brig) -"hju" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 +"hjj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/curved, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"hjk" = ( +/obj/structure/railing{ + dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/stairs{ + dir = 1 }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/engineering/atmos) +/area/station/engineering/lobby) "hjx" = ( /obj/structure/bed/medical/emergency, /obj/effect/turf_decal/stripes/line{ @@ -20062,15 +17874,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/small, /area/station/medical/morgue) -"hjT" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/cone{ - pixel_x = 6; - pixel_y = 17 +"hjQ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/open/floor/iron, +/area/station/engineering/lobby) "hkk" = ( /obj/machinery/computer/records/medical{ dir = 4 @@ -20132,6 +17942,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"hkG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "hkL" = ( /obj/structure/cable, /turf/open/floor/wood/large, @@ -20147,6 +17964,13 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark, /area/station/science/lab) +"hkT" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/structure/sink/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/engineering/break_room) "hkW" = ( /obj/structure/closet/crate/goldcrate, /obj/effect/turf_decal/bot_white/right, @@ -20159,31 +17983,12 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"hln" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/table, -/obj/machinery/microwave/engineering/cell_included, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "hlo" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/camera/autoname/directional/north, /obj/machinery/light/cold/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"hlw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/meter, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "hlJ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -20195,6 +18000,19 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"hlM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/smooth_corner{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "hmb" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -20249,6 +18067,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"hmB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "hmQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, @@ -20310,6 +18134,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"hnG" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8; + initialize_directions = 8 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "hnO" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -20328,6 +18163,10 @@ /obj/structure/tank_holder/anesthetic, /turf/open/floor/iron, /area/station/science/robotics/augments) +"hnS" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "hnV" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -20359,29 +18198,20 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/science/ordnance/storage) -"hoo" = ( -/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) "hop" = ( /turf/closed/wall, /area/station/service/chapel/funeral) +"hox" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "hoG" = ( /obj/structure/cable, /obj/effect/landmark/start/scientist, /turf/open/floor/iron, /area/station/science/research) -"hoL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/atmospheric_technician, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "hoN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20404,13 +18234,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/cargo/miningfoundry) -"hpc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"hpe" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) +"hpi" = ( +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/disposal/incinerator) +"hpj" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 5 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "hpl" = ( /obj/structure/water_source/puddle, /obj/structure/flora/bush/large/style_random{ @@ -20427,6 +18273,13 @@ /obj/effect/turf_decal/siding, /turf/open/floor/iron/white, /area/station/science/cytology) +"hpP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "hpQ" = ( /obj/structure/closet/crate/coffin, /obj/structure/window/spawner/directional/south, @@ -20451,10 +18304,20 @@ dir = 8 }, /area/station/science/lobby) -"hqB" = ( -/obj/effect/decal/cleanable/dirt, +"hqm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"hqr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "hqH" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/cup/watering_can/wood, @@ -20480,6 +18343,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"hrx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "hrz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20550,6 +18420,23 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/small, /area/station/hallway/primary/fore) +"hss" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) +"hsy" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/engineering/atmos/office) "hsC" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -20567,6 +18454,19 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/cargo/miningoffice) +"hsL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 6 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "hsO" = ( /obj/structure/cable, /obj/effect/spawner/structure/window, @@ -20612,6 +18512,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/processing) +"htQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "htV" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 1 @@ -20643,14 +18557,6 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) -"hui" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "hur" = ( /obj/structure/table/glass, /obj/item/storage/briefcase/secure, @@ -20706,19 +18612,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/maint) -"hvh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "hvk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20728,6 +18621,12 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron, /area/station/commons/storage/tools) +"hvo" = ( +/obj/structure/sign/warning/hot_temp/directional/east, +/turf/open/floor/iron/stairs/right{ + dir = 1 + }, +/area/station/engineering/atmos) "hvx" = ( /obj/structure/flora/rock/pile/jungle/style_random, /obj/machinery/light/small/directional/north, @@ -20749,29 +18648,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"hvJ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - 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/department/engine) "hvM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"hvT" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/small, +/area/station/engineering/lobby) "hvV" = ( /obj/structure/table, /obj/item/book/manual/wiki/security_space_law{ @@ -20789,6 +18679,12 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/security/tram) +"hvZ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "hwe" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue/half, @@ -20833,6 +18729,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/small, /area/station/ai_monitored/command/storage/eva) +"hwr" = ( +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "hwx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20854,6 +18754,12 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"hwG" = ( +/obj/machinery/door/window/left/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "hwJ" = ( /turf/closed/wall/rust, /area/space/nearstation) @@ -20893,6 +18799,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"hxG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "hxJ" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -20909,6 +18827,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"hxY" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/machinery/light/small/directional/west, +/obj/structure/cable, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "hyb" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -20961,14 +18889,24 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"hyx" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/west{ + id = "Secure Storage"; + name = "Engineering Secure Storage"; + pixel_y = -24; + req_access = list("engine_equip"); + pixel_x = 24 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "hyA" = ( /obj/machinery/light/dim/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/construction) -"hyD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/small, -/area/station/maintenance/department/engine) "hyE" = ( /turf/closed/wall, /area/station/maintenance/starboard/aft) @@ -20993,13 +18931,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"hzi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "hzk" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/parquet, @@ -21029,21 +18960,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood/parquet, /area/station/service/library) -"hAc" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/mail_sorting/engineering/general, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/landmark/navigate_destination/engineering, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "hAd" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -21086,6 +19002,12 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"hAN" = ( +/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/dark, +/area/station/maintenance/department/engine/atmos) "hAQ" = ( /obj/structure/table, /obj/effect/mapping_helpers/broken_floor, @@ -21180,6 +19102,12 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"hCq" = ( +/obj/effect/decal/cleanable/glass/titanium, +/obj/structure/closet/crate, +/obj/item/reagent_containers/cup/bottle/welding_fuel, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "hCr" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/storage/eva) @@ -21215,14 +19143,25 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"hDn" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"hDg" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, /obj/machinery/light/small/directional/north, -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) +/turf/open/floor/iron/small, +/area/station/maintenance/department/electrical) +"hDh" = ( +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/yellow/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "hDt" = ( /obj/structure/toilet{ pixel_y = 8 @@ -21254,36 +19193,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) -"hDX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) -"hDZ" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Equipment Storage"; - pixel_x = -1; - req_access = list("eva") - }, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/shoes/magboots{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/machinery/camera/directional/south, -/turf/open/floor/iron/large, -/area/station/ai_monitored/command/storage/eva) "hEi" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -21295,6 +19204,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/cargo/sorting) +"hEl" = ( +/obj/structure/table/rolling, +/obj/effect/turf_decal/siding/yellow, +/obj/item/pizzabox{ + pixel_y = 14 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) "hEm" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/stripes/line{ @@ -21302,6 +19219,23 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/command/storage/eva) +"hEt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) "hED" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -21309,11 +19243,34 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"hFb" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"hFp" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "hFx" = ( /turf/open/floor/iron/chapel{ dir = 1 }, /area/station/maintenance/starboard/greater) +"hFA" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/iron/corner, +/area/station/engineering/main) "hFC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21327,11 +19284,29 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"hFK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/computer/atmos_control/mix_tank{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "hFO" = ( /obj/structure/broken_flooring/corner/directional/south, /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"hFR" = ( +/obj/effect/turf_decal/siding/red{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos/space_catwalk) "hGb" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) @@ -21339,6 +19314,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, /area/station/ai_monitored/turret_protected/aisat/maint) +"hGp" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/wideplating, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/engineering/main) "hGt" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -21359,18 +19342,9 @@ pixel_x = -2; pixel_y = 6 }, +/obj/structure/sign/departments/telecomms/directional/south, /turf/open/floor/iron, /area/station/science/lobby) -"hHy" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/neutral/end{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "hHE" = ( /obj/effect/turf_decal/bot_white, /turf/open/floor/engine, @@ -21389,6 +19363,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"hHV" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "hIe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21400,29 +19382,6 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron/dark, /area/station/cargo/office) -"hIj" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/glass/plastitanium, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) -"hIq" = ( -/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/table/reinforced/titaniumglass, -/obj/effect/landmark/event_spawn, -/obj/item/reagent_containers/cup/glass/mug/coco{ - pixel_x = 5; - pixel_y = 14 - }, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) "hIE" = ( /obj/structure/table/glass, /obj/machinery/light/small/directional/east, @@ -21437,14 +19396,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/security/tram) -"hIR" = ( -/obj/structure/cable, -/obj/machinery/power/turbine/core_rotor{ - dir = 1; - mapping_id = "main_turbine" +"hIU" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 10 }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/space_catwalk) "hJd" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -21453,17 +19411,13 @@ }, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"hJo" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/table/reinforced/titaniumglass, -/obj/item/stack/sheet/rglass{ - pixel_y = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "hJp" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/ai) +"hJs" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "hJC" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -21545,6 +19499,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"hKX" = ( +/turf/closed/mineral/random/stationside, +/area/station/hallway/primary/fore) "hLa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21597,6 +19554,11 @@ dir = 8 }, /area/station/hallway/secondary/dock) +"hLW" = ( +/obj/structure/railing, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine/atmos) "hLY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -21606,6 +19568,14 @@ }, /turf/open/floor/plating, /area/station/security) +"hMb" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "hMh" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/stool/bamboo{ @@ -21705,6 +19675,21 @@ /obj/item/clothing/head/utility/welding, /turf/open/floor/iron, /area/station/medical/chemistry) +"hNT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"hNU" = ( +/obj/structure/table/reinforced, +/obj/structure/spider/stickyweb, +/obj/item/mod/module/plasma_stabilizer{ + pixel_y = 11 + }, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) "hNY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -21762,6 +19747,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"hOX" = ( +/obj/item/chair, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "hPd" = ( /obj/structure/hedge, /obj/effect/turf_decal/tile/brown{ @@ -21863,18 +19853,6 @@ /obj/item/binoculars, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"hRv" = ( -/obj/machinery/transport/power_rectifier{ - configured_transport_id = "bird_1" - }, -/turf/open/floor/plating, -/area/station/security/tram) -"hRz" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "hRA" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ dir = 4 @@ -21882,6 +19860,20 @@ /obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"hRF" = ( +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"hRO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "hRX" = ( /obj/structure/flora/bush/large/style_random{ pixel_x = -20; @@ -21895,29 +19887,20 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) -"hSx" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"hSA" = ( +"hSG" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 9 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Waste to Filter" +/obj/structure/table/reinforced/titaniumglass, +/obj/item/stack/cable_coil{ + pixel_x = 9; + pixel_y = -1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics - Starboard" +/obj/item/analyzer{ + pixel_y = 9 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "hSK" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/white{ @@ -21930,17 +19913,17 @@ dir = 8 }, /area/station/command/corporate_showroom) -"hSM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ +"hSP" = ( +/obj/effect/turf_decal/siding/yellow{ dir = 1 }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"hTk" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/grass, -/area/station/service/chapel) +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/effect/mapping_helpers/mail_sorting/engineering/general, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8 + }, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "hTr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance{ @@ -21951,6 +19934,16 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hTC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "hTD" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 6 @@ -21959,20 +19952,12 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"hTR" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +"hTL" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/spawner/random/structure/crate_loot, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "hTW" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/vehicle/ridden/janicart, @@ -21987,6 +19972,11 @@ }, /turf/open/floor/iron/dark/side, /area/station/security/execution/transfer) +"hUh" = ( +/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/engineering/main) "hUk" = ( /obj/structure/disposalpipe/segment, /obj/structure/broken_flooring/plating/directional/south, @@ -22031,6 +20021,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"hVq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "hVr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22059,16 +20054,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"hVO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Pure to Turbine" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "hVX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ @@ -22119,13 +20104,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"hWY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/obj/machinery/space_heater, -/turf/open/floor/iron, -/area/station/engineering/atmos) "hXf" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Hull Breach Emergency Storage" @@ -22155,6 +20133,15 @@ "hXt" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"hXB" = ( +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/station/engineering/atmos/space_catwalk) "hXP" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -22163,12 +20150,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"hXQ" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/chief_engineer, -/turf/open/floor/iron, -/area/station/engineering/break_room) "hXU" = ( /turf/closed/wall, /area/station/security/execution/education) @@ -22227,13 +20208,18 @@ dir = 8 }, /area/station/science/lab) -"hYN" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 5 +"hYS" = ( +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/railing, +/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=20.0-CentralPort-Bar"; + location = "19.0-Engineering-CentralPort" }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "hYW" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/flip{ @@ -22262,6 +20248,37 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/meeting_room) +"hZb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"hZe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/conveyor{ + id = "mining" + }, +/obj/machinery/brm, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) +"hZf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "hZP" = ( /obj/structure/cable, /obj/structure/sign/poster/official/random/directional/north, @@ -22357,6 +20374,11 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"iaW" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass/plasma, +/turf/open/floor/engine, +/area/station/engineering/atmos) "ibe" = ( /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/freezer, @@ -22379,27 +20401,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"ibq" = ( -/obj/structure/table/wood, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/machinery/bluespace_vendor/directional/north, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/textured_large, -/area/station/hallway/primary/central/fore) "ibv" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"ibB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "ibD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -22446,27 +20456,6 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/entry) -"icS" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/power/terminal, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/machinery/electrolyzer, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the turbine vent."; - dir = 4; - name = "turbine vent monitor"; - network = list("turbine"); - pixel_x = -29 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 4 - }, -/area/station/maintenance/disposal/incinerator) "icT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22480,20 +20469,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"icY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "ide" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/paramedic) -"idi" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "idj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22548,6 +20534,11 @@ }, /turf/open/floor/sepia, /area/station/maintenance/aft) +"idH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine) "idJ" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, @@ -22579,21 +20570,11 @@ /obj/machinery/telecomms/message_server/preset, /turf/open/floor/circuit, /area/station/tcommsat/server) -"ieu" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ +"ieM" = ( +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"iey" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 5 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, +/turf/open/floor/engine, /area/station/engineering/supermatter) "ieY" = ( /obj/structure/disposalpipe/segment, @@ -22628,6 +20609,13 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/plating, /area/station/maintenance/department/bridge) +"ifN" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "ifU" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -22687,6 +20675,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"ihj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Turbine to Wastes" + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "ihl" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -22733,6 +20731,13 @@ "iht" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_dock) +"ihA" = ( +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "ihC" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -22799,6 +20804,13 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) +"ijn" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/space_catwalk) "ijB" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped{ dir = 8 @@ -22824,6 +20836,24 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"ijN" = ( +/obj/machinery/bluespace_vendor/directional/north, +/obj/machinery/light/small/directional/west, +/obj/machinery/photobooth, +/turf/open/floor/iron/textured_large, +/area/station/hallway/primary/central/fore) +"ijP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ijV" = ( +/turf/open/misc/asteroid, +/area/station/maintenance/department/engine) "ijY" = ( /obj/structure/closet/secure_closet/chief_medical, /obj/item/storage/briefcase/secure{ @@ -22839,6 +20869,15 @@ "ikc" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"ikf" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/engineering/atmos) "ikk" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -22910,12 +20949,16 @@ }, /turf/open/floor/plating, /area/station/cargo/miningoffice) -"ikZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/kitchen/small, -/area/station/security/prison/mess) +"ilb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "ild" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -22944,12 +20987,31 @@ dir = 4 }, /area/station/science/research) +"ilz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) +"ilB" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - Engine Bay North" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "ilD" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 8 }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"ilN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "ilW" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -22993,11 +21055,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"inH" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/break_room) "inR" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23041,6 +21098,11 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/iron, /area/station/security/prison/rec) +"iok" = ( +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "ioo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23054,16 +21116,16 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"ioQ" = ( -/obj/effect/turf_decal/stripes/white/line{ +"ioN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ - dir = 8 - }, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "ioR" = ( /obj/structure/disposalpipe/segment, /obj/machinery/airalarm/directional/west, @@ -23080,6 +21142,20 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/security/execution/transfer) +"ioX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_corner{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "ipb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/brown/opposingcorners, @@ -23178,6 +21254,13 @@ dir = 1 }, /area/station/maintenance/port/fore) +"iql" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 1; + name = "Air to Public Ports" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "iqp" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -23191,6 +21274,15 @@ /obj/structure/closet, /turf/open/floor/iron/smooth, /area/station/cargo/office) +"iqB" = ( +/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/plating/elevatorshaft, +/area/station/engineering/break_room) "iqD" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/siding/green{ @@ -23213,15 +21305,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"iqH" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "iqN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23232,6 +21315,23 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"iqY" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix Outlet Pump" + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics - Distribution 2" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "ira" = ( /obj/structure/tank_dispenser/oxygen, /obj/machinery/light/small/directional/south, @@ -23283,6 +21383,19 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/hop) +"irZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_edge{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "isi" = ( /obj/structure/table, /obj/effect/turf_decal/siding/thinplating_new{ @@ -23300,6 +21413,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"isv" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Aux Cooling to Gas" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "isI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23346,6 +21471,12 @@ "itb" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/aisat/maint) +"itv" = ( +/obj/structure/transit_tube/horizontal{ + dir = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "itw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -23440,13 +21571,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"iuu" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/station/engineering/supermatter) "iux" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23497,21 +21621,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) -"ivx" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/window/spawner/directional/south, -/obj/structure/closet/secure_closet/atmospherics, -/obj/item/clothing/head/utility/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) "ivz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line{ @@ -23538,19 +21647,21 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"ivE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "ivO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder, /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"ivT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ivX" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -23580,22 +21691,38 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/service/hydroponics) -"iwe" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"iwM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ +"iwi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ dir = 1 }, -/obj/effect/landmark/start/atmospheric_technician, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"iwz" = ( +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) +/area/station/engineering/break_room) +"iwJ" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/obj/machinery/computer/security/telescreen{ + desc = "Used for monitoring the engine."; + dir = 4; + name = "Engine Monitor"; + network = list("engine"); + pixel_x = -32 + }, +/obj/machinery/status_display/evac/directional/south, +/obj/item/radio/off{ + pixel_x = 1; + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/ce) "iwZ" = ( /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -23664,8 +21791,32 @@ }, /turf/open/floor/plating, /area/station/security/brig/entrance) +"iyl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) +"iyn" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/small, +/area/station/engineering/main) "iyq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 9 }, /turf/open/floor/iron/dark, @@ -23681,24 +21832,12 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, /area/station/science/genetics) -"iyK" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/survival_pod/left/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) -"iyO" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 10 +"izm" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) -"izq" = ( -/obj/structure/filingcabinet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) +/turf/open/floor/engine/co2, +/area/station/engineering/atmos/space_catwalk) "izB" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/painting/library{ @@ -23712,14 +21851,38 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/bridge) +"izE" = ( +/obj/machinery/door/airlock/atmos{ + name = "Locker Room" + }, +/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, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/storage/gas) "izL" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/bridge) -"iAn" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) +"izT" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"iAk" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/machinery/field/generator, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "iAy" = ( /obj/structure/table, /obj/item/clothing/shoes/sneakers/orange{ @@ -23765,6 +21928,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/brig/entrance) +"iAS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron/small, +/area/station/engineering/engine_smes) "iAZ" = ( /obj/structure/bed/medical/anchored{ dir = 4 @@ -23840,6 +22011,19 @@ }, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain) +"iCp" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/engineering/atmos/office) +"iCr" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/break_room) "iCw" = ( /obj/structure/hedge, /obj/effect/turf_decal/tile/yellow{ @@ -23853,6 +22037,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"iCF" = ( +/obj/structure/railing, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/engineering/main) +"iCL" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/textured_half, +/area/station/engineering/atmos) "iDk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23886,6 +22085,20 @@ /obj/effect/landmark/start/psychologist, /turf/open/floor/iron/white/small, /area/station/medical/psychology) +"iDO" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "iEk" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -23964,13 +22177,6 @@ /obj/structure/window/spawner/directional/east, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) -"iFB" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) "iFE" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair/office{ @@ -23982,21 +22188,14 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/plating/rust, /area/station/maintenance/hallway/abandoned_command) -"iGh" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 4 +"iGc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "N2 Outlet Pump" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) +/obj/structure/sign/warning/no_smoking/circle/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth_corner, +/area/station/engineering/supermatter/room) "iGl" = ( /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) @@ -24011,19 +22210,12 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/solars/port/aft) -"iGu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ +"iGA" = ( +/obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Air Outlet Pump" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "iGE" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/cafeteria, @@ -24047,19 +22239,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) -"iHy" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/computer/turbine_computer{ - dir = 8; - mapping_id = "main_turbine" - }, -/turf/open/floor/iron/smooth_edge{ - dir = 4 - }, -/area/station/maintenance/disposal/incinerator) +"iHw" = ( +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "iHH" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /obj/effect/mapping_helpers/broken_floor, @@ -24089,18 +22272,6 @@ /obj/item/flashlight/lantern, /turf/open/floor/plating, /area/station/service/library/abandoned) -"iIr" = ( -/obj/machinery/door/airlock/engineering{ - name = "Main Engine" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/small, -/area/station/engineering/main) "iIv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -24141,6 +22312,21 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) +"iIW" = ( +/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/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "iJb" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -24183,11 +22369,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"iJx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "iJz" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/multiver{ @@ -24227,6 +22408,14 @@ /obj/item/stamp/head/captain, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) +"iJJ" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) "iJL" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 @@ -24234,6 +22423,28 @@ /obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"iJO" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/obj/machinery/light/cold/dim/directional/north, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) +"iJS" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/small, +/area/station/engineering/lobby) "iKe" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ @@ -24262,6 +22473,12 @@ /obj/effect/spawner/random/trash/food_packaging, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"iKK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, +/obj/machinery/meter, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "iKN" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/window/reinforced/spawner/directional/north, @@ -24371,6 +22588,13 @@ /obj/machinery/flasher/portable, /turf/open/floor/plating, /area/station/security/tram) +"iME" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/mask/gas, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "iMI" = ( /obj/structure/cable, /obj/structure/sign/warning/no_smoking/circle/directional/north, @@ -24427,6 +22651,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"iNC" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/rack, +/obj/item/binoculars, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "iNE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/vending/snackvend, @@ -24502,6 +22735,11 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"iOx" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "iOE" = ( /obj/structure/table/wood/fancy/royalblue, /obj/effect/turf_decal/siding/wood{ @@ -24540,15 +22778,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/work) -"iPf" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - name = "Hydroponics Desk"; - req_access = list("hydroponics") +"iPg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_large, -/area/station/hallway/primary/central/fore) +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Waste to Exhaust" + }, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "iPj" = ( /obj/structure/cable, /turf/open/floor/circuit/green, @@ -24580,19 +22821,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"iQv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 +"iQr" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 }, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/obj/structure/disposalpipe/segment, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark/side, +/area/station/engineering/hallway) "iQK" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -24612,6 +22852,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) +"iRp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "iRv" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -24663,6 +22910,11 @@ "iSr" = ( /turf/open/floor/iron, /area/station/security/execution/transfer) +"iSE" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "iSK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -24671,6 +22923,14 @@ /obj/structure/sign/warning/pods/directional/west, /turf/open/floor/iron/checker, /area/station/security/breakroom) +"iSW" = ( +/obj/structure/rack, +/obj/item/clothing/gloves/boxing/yellow, +/obj/item/clothing/gloves/boxing/green{ + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "iTn" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -24702,11 +22962,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"iTG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "iTP" = ( /obj/structure/cable, /obj/machinery/door/airlock/external{ @@ -24727,20 +22982,26 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"iTZ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Pure to Waste" + }, +/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/smooth, +/area/station/engineering/atmos) "iUb" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, /obj/item/crowbar/large/old, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) -"iUq" = ( -/obj/machinery/atmospherics/components/tank/nitrous{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, +"iUy" = ( +/obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, -/area/station/engineering/atmos) +/area/station/maintenance/fore/greater) "iUz" = ( /obj/structure/falsewall, /turf/open/floor/iron, @@ -24767,27 +23028,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"iUH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/turf_decal/siding/wideplating_new/light{ - dir = 4 - }, -/obj/machinery/cell_charger{ - pixel_y = 22 - }, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/clothing/glasses/meson{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/stamp/head/ce{ - pixel_x = 7; - pixel_y = 15 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "iUK" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -24796,9 +23036,9 @@ /area/station/construction/mining/aux_base) "iUN" = ( /obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/machinery/airalarm/directional/north, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/cargo/storage) "iVq" = ( @@ -24949,6 +23189,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/fore) +"iWV" = ( +/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/frame/computer{ + dir = 4 + }, +/obj/item/circuitboard/computer/atmos_control/helium_tank, +/obj/item/stack/cable_coil/cut, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "iWW" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -24974,6 +23223,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"iXg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "iXi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24992,6 +23253,16 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"iXn" = ( +/obj/structure/table/reinforced, +/obj/item/mod/module/signlang_radio, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"iXx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/r_wall, +/area/station/maintenance/department/electrical) "iXB" = ( /obj/effect/turf_decal/siding/dark_red{ dir = 4 @@ -25036,22 +23307,6 @@ }, /turf/open/floor/iron/small, /area/station/command/teleporter) -"iYJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/outlet_injector/layer2{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"iYM" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "iYY" = ( /obj/structure/cable, /turf/open/floor/iron/small, @@ -25128,6 +23383,14 @@ /obj/machinery/light/directional/east, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) +"jad" = ( +/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/iron/grimy, +/area/station/engineering/main) "jar" = ( /obj/machinery/drone_dispenser, /turf/open/misc/asteroid, @@ -25234,6 +23497,12 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/plating, /area/station/commons/fitness/recreation/entertainment) +"jbo" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 9 + }, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/space_catwalk) "jbr" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -25248,21 +23517,6 @@ }, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) -"jbO" = ( -/obj/structure/cable, -/obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ - id = "engicell"; - name = "Cell Door"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/engineering/break_room) "jbV" = ( /obj/machinery/photocopier, /turf/open/floor/iron/dark, @@ -25282,19 +23536,6 @@ /obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"jco" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/rnd/production/circuit_imprinter, -/obj/machinery/camera{ - c_tag = "Engineering - Foyer - Starboard"; - dir = 9 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/plating, -/area/station/engineering/break_room) "jct" = ( /obj/structure/cable, /obj/machinery/door/airlock/external{ @@ -25313,6 +23554,13 @@ /obj/machinery/door/window/right/directional/south, /turf/open/floor/plating, /area/station/service/chapel/funeral) +"jcx" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/stock_parts/cell/emproof{ + pixel_y = 9 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "jcE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25320,12 +23568,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"jcF" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/arrow_cw, -/obj/machinery/atmospherics/components/trinary/filter/flipped/layer2, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal/incinerator) "jcU" = ( /obj/structure/chair/wood/wings{ dir = 1 @@ -25349,6 +23591,20 @@ /obj/effect/landmark/start/captain, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) +"jdU" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Turbine to Chamber" + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "jeg" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -25428,6 +23684,15 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) +"jfA" = ( +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "jfP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock{ @@ -25459,10 +23724,14 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"jgZ" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +"jhk" = ( +/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/sign/warning/pods/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "jhm" = ( /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) @@ -25473,6 +23742,16 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"jhz" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "jhA" = ( /obj/machinery/vending/boozeomat, /obj/effect/mapping_helpers/broken_floor, @@ -25482,6 +23761,14 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/cargo/miningoffice) +"jhJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "jhU" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/mapping_helpers/broken_floor, @@ -25505,6 +23792,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/aft) +"jia" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) "jig" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -25539,6 +23836,12 @@ /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"jiC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "jiN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25651,6 +23954,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) +"jkV" = ( +/obj/machinery/door/airlock/external/glass{ + name = "ATMOS PROJECT Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/station/engineering/supermatter/room) "jlt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25670,6 +23982,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) +"jlL" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/obj/item/storage/briefcase/secure, +/obj/item/lighter, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/ce) "jlN" = ( /turf/open/floor/iron/white/side{ dir = 6 @@ -25729,27 +24049,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron_dark, /area/station/security/processing) -"jmm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/meter, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "jmo" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"jmI" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "jmK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -25772,6 +24076,13 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) +"jmZ" = ( +/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/small/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "jnh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25814,6 +24125,17 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/sorting) +"jnB" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) "jnN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -25859,6 +24181,19 @@ /obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"jph" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + 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/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) "jpm" = ( /obj/structure/chair{ dir = 4; @@ -25880,13 +24215,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"jpJ" = ( -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/stripes/box, -/obj/structure/sign/warning/pods/directional/north, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "jpK" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -25905,6 +24233,16 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"jqd" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"jqh" = ( +/obj/item/stack/cable_coil/five, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "jqu" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -25938,13 +24276,16 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, /area/station/cargo/sorting) -"jqF" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +"jqD" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/chair/sofa/bench/right{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/airalarm/directional/south, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "jqQ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -25958,6 +24299,19 @@ }, /turf/open/floor/iron, /area/station/security/prison/rec) +"jrb" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"jrj" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4; + name = "Refuse Exhaust" + }, +/turf/open/space/basic, +/area/space/nearstation) "jrk" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -25987,6 +24341,13 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) +"jrS" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/tank, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "jrT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26006,6 +24367,13 @@ dir = 1 }, /area/station/cargo/office) +"jrZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "jsc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/red/line{ @@ -26111,6 +24479,28 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/catwalk_floor/iron_dark, /area/station/commons/storage/tools) +"jul" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"juF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 6 + }, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "juJ" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -26205,6 +24595,29 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"jwC" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) +"jwM" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "jwU" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/sign/poster/random/directional/south, @@ -26227,6 +24640,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"jxh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "jxk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26239,15 +24659,6 @@ "jxp" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/foyer) -"jxu" = ( -/obj/machinery/power/energy_accumulator/grounding_rod/anchored, -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "jxy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26299,34 +24710,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"jxV" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/modular_computer/preset/id, -/obj/machinery/button/ticket_machine{ - pixel_x = 9; - pixel_y = 23 - }, -/obj/machinery/button/door/directional/south{ - id = "hop"; - name = "Privacy Shutters Control"; - pixel_x = -2; - pixel_y = 23; - req_access = list("hop") - }, -/obj/machinery/button/door/directional/south{ - id = "hopqueue"; - name = "Queue Shutters Control"; - pixel_x = -13; - pixel_y = 23; - req_access = list("hop") - }, -/obj/machinery/button/flasher{ - id = "hopflash"; - pixel_x = -23; - pixel_y = 11 - }, -/turf/open/floor/iron/dark/textured_corner, -/area/station/command/heads_quarters/hop) "jxZ" = ( /obj/effect/turf_decal/siding/blue{ dir = 6 @@ -26350,6 +24733,22 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/breakroom) +"jyl" = ( +/obj/structure/table/greyscale, +/obj/item/folder/yellow{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/newspaper{ + pixel_y = 4; + pixel_x = -4 + }, +/obj/item/geiger_counter{ + pixel_x = 13; + pixel_y = 6 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "jyu" = ( /obj/structure/chair/bronze{ dir = 4 @@ -26363,6 +24762,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"jyC" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "jyG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26447,6 +24856,14 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"jzJ" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/engineering/hallway) "jAb" = ( /obj/structure/cable, /turf/open/floor/iron/stairs{ @@ -26478,19 +24895,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"jAw" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"jAB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) +"jAz" = ( +/obj/effect/turf_decal/stripes/end, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "jAF" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -26520,6 +24930,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"jBo" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 6 + }, +/obj/structure/hedge, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "jBr" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/dark_red{ @@ -26527,29 +24944,22 @@ }, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) -"jBx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"jBA" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/obj/machinery/camera/directional/north{ + c_tag = "AI Chamber - SMES"; + network = list("aicore") }, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/structure/tank_holder/extinguisher, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) +/obj/machinery/flasher/directional/north, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "jBD" = ( /obj/structure/table/wood, /obj/effect/mapping_helpers/broken_floor, /obj/item/paper/crumpled/bloody, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"jBE" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "jBQ" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -26557,6 +24967,13 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"jBW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "jCi" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance, @@ -26583,6 +25000,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"jCY" = ( +/obj/structure/table/greyscale, +/obj/item/screwdriver, +/obj/item/stack/cable_coil/cut{ + pixel_x = 11; + pixel_y = 7 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Office" + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -6; + pixel_y = 9 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "jDa" = ( /obj/machinery/holopad, /turf/open/floor/wood/tile, @@ -26618,10 +25051,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/tram) -"jDw" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "jDy" = ( /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/stairs{ @@ -26749,6 +25178,13 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"jEU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/landmark/start/chaplain, +/turf/open/floor/wood/large, +/area/station/service/chapel) "jEZ" = ( /obj/structure/hedge, /obj/effect/decal/cleanable/dirt, @@ -26773,6 +25209,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"jFk" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "jFs" = ( /obj/machinery/light/small/broken/directional/east, /turf/open/floor/wood, @@ -26805,12 +25248,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"jFD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "jFF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26847,6 +25284,15 @@ }, /turf/open/floor/iron, /area/station/security) +"jGk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "jGA" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -26960,6 +25406,22 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/science/lobby) +"jIa" = ( +/obj/machinery/door/airlock/atmos{ + name = "Locker Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmos_airlock_1" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/hallway) "jIb" = ( /turf/open/floor/plating/rust, /area/station/service/library/abandoned) @@ -27074,12 +25536,26 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"jJg" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/engineering/main) "jJl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"jJu" = ( +/obj/structure/chair, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "jJy" = ( /turf/open/misc/asteroid, /area/station/service/library/abandoned) @@ -27091,6 +25567,19 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"jJW" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/item/stack/sheet/cardboard, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) +"jKa" = ( +/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/plating, +/area/station/maintenance/department/engine) "jKf" = ( /turf/closed/wall/rust, /area/station/service/library/abandoned) @@ -27158,17 +25647,6 @@ dir = 4 }, /area/station/cargo/office) -"jKG" = ( -/obj/machinery/incident_display/delam/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "jKJ" = ( /obj/machinery/door/window/right/directional/north, /turf/open/floor/iron, @@ -27181,6 +25659,9 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"jKU" = ( +/turf/closed/wall, +/area/station/engineering/atmos/storage/gas) "jLi" = ( /obj/effect/landmark/start/virologist, /turf/open/floor/iron/showroomfloor, @@ -27248,30 +25729,20 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"jMk" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +"jMy" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Waste Outlet" }, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/arrows{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/end{ +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"jMo" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Waste to Exhaust" +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) "jMC" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 8 @@ -27286,6 +25757,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lower) +"jMM" = ( +/obj/structure/spider/stickyweb/sealed, +/obj/structure/spider/stickyweb, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "jMQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27331,6 +25807,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"jNr" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 9 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/disposal/incinerator) "jNw" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -27347,6 +25834,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) +"jNL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/filter/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "jNO" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/flora/bush/leavy/style_3{ @@ -27359,22 +25859,24 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) -"jOb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "jOh" = ( /obj/structure/cable, /obj/machinery/door/firedoor, /turf/open/floor/iron/small, /area/station/hallway/primary/aft) +"jOi" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "jOk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27433,6 +25935,14 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"jPr" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "jQo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/research/glass{ @@ -27517,6 +26027,23 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) +"jRR" = ( +/obj/machinery/atmospherics/components/binary/crystallizer{ + dir = 4 + }, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"jRU" = ( +/obj/structure/railing, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/stairs/old{ + dir = 4 + }, +/area/station/engineering/break_room) "jSl" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/light_switch/directional/east, @@ -27629,13 +26156,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/dock) -"jUm" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/pen{ - pixel_x = 5 - }, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) "jUo" = ( /obj/docking_port/stationary{ dir = 2; @@ -27653,6 +26173,10 @@ /obj/item/instrument/harmonica, /turf/open/floor/iron, /area/station/security/prison/rec) +"jUx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "jVe" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -27667,6 +26191,14 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"jVI" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "jVM" = ( /turf/closed/wall, /area/station/maintenance/central/greater) @@ -27683,6 +26215,21 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/prison/garden) +"jWe" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 10 + }, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine/atmos) +"jWk" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/cable, +/obj/machinery/door/airlock/atmos{ + name = "Locker Room" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/office) "jWl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -27932,34 +26479,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"jZR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external/glass, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"jZV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Head of Personnel's Desk"; - req_access = list("hop") - }, -/obj/machinery/door/window/left/directional/west{ - name = "Reception Window" - }, -/turf/open/floor/iron/textured_large, -/area/station/command/heads_quarters/hop) "kam" = ( /obj/effect/decal/cleanable/cobweb, /obj/machinery/disposal/delivery_chute{ @@ -28030,6 +26549,11 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"kaP" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "kaW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28109,6 +26633,12 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"kcW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/smes/full, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/tcommsat/server) "kdl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -28198,6 +26728,22 @@ "kev" = ( /turf/closed/wall, /area/station/hallway/secondary/spacebridge) +"keS" = ( +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/station/engineering/atmos/space_catwalk) +"keY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/power/energy_accumulator/tesla_coil, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "keZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -28217,6 +26763,15 @@ }, /turf/open/floor/iron/dark/side, /area/station/cargo/office) +"kfv" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/engineering/hallway) "kfw" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28234,15 +26789,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"kfK" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "kfM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28250,6 +26796,17 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kfW" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "kgh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28292,6 +26849,22 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kgG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "kgN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, @@ -28303,6 +26876,16 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"kgW" = ( +/obj/structure/table/reinforced, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/body/waste_output{ + pixel_x = 7; + pixel_y = -11 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "kgZ" = ( /obj/structure/cable, /obj/machinery/newscaster/directional/east, @@ -28320,6 +26903,16 @@ /obj/structure/tram, /turf/open/floor/tram, /area/station/security/tram) +"khr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "khD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank, @@ -28420,6 +27013,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kiQ" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/smooth, +/area/station/ai_monitored/turret_protected/aisat/equipment) "kjg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28480,11 +27079,17 @@ /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, /area/station/maintenance/department/bridge) -"kka" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/plating, -/area/station/engineering/atmos) +"kkd" = ( +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Creature Pen"; + req_access = list("research") + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/science/xenobiology) "kke" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -28512,6 +27117,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"kkK" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "kkL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28547,6 +27157,12 @@ /obj/item/storage/backpack/duffelbag, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"kld" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/kitchen/small, +/area/station/security/prison/mess) "klf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair{ @@ -28576,6 +27192,24 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/catwalk_floor/iron_dark, /area/station/security/processing) +"klL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 6 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "klR" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -28659,14 +27293,19 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark, /area/station/command/corporate_dock) -"kmR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"kmD" = ( +/obj/structure/chair/office/light{ + name = "blue"; + color = "#6495ED"; + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) +"kmH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "kmS" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 1 @@ -28708,10 +27347,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"knK" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine/atmos) "knL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28754,25 +27389,53 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"kpk" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/flora/bush/flowers_yw/style_random, +"koV" = ( +/obj/effect/turf_decal/delivery, /obj/machinery/light/small/directional/east, -/turf/open/floor/grass, -/area/station/service/chapel) -"kpz" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three"; - space_dir = 1 +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"kpe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 6 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/structure/railing/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 9 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"kph" = ( +/obj/structure/railing, +/obj/machinery/light/cold/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/engineering/atmos/office) +"kpq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/vacuum/external/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/north, /turf/open/floor/iron/small, -/area/station/maintenance/department/engine) +/area/station/engineering/supermatter/room) "kpF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/hangover, @@ -28794,12 +27457,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"kqa" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "kqb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28813,6 +27470,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/hallway/secondary/spacebridge) +"kqr" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/folder/yellow{ + pixel_y = 1 + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = -11 + }, +/obj/structure/sign/poster/official/random/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) "kqK" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -28904,6 +27582,10 @@ dir = 4 }, /area/station/science/lab) +"krk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "kro" = ( /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/iron, @@ -28943,6 +27625,17 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/solars/starboard/aft) +"krW" = ( +/obj/structure/bed, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/item/bedsheet/ce, +/obj/effect/landmark/start/chief_engineer, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/ce) "krY" = ( /obj/structure/table/glass, /obj/item/clothing/glasses/hud/health, @@ -29077,6 +27770,21 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"ktL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "ktM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29141,6 +27849,9 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kvb" = ( +/turf/closed/wall/r_wall/rust, +/area/station/engineering/atmos) "kvf" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -29195,6 +27906,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kwr" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/item/chair, +/turf/open/floor/iron, +/area/station/engineering/hallway) "kws" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/firealarm/directional/west, @@ -29206,15 +27922,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"kwz" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) "kwA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -29222,6 +27929,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/robotics/augments) +"kwH" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "kwW" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth, @@ -29235,6 +27949,24 @@ /obj/structure/window/spawner/directional/north, /turf/open/space/basic, /area/space/nearstation) +"kxb" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/turf_decal/bot, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 14 + }, +/obj/item/flashlight/lamp{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/event_spawn, +/obj/item/stamp/head/ce{ + pixel_x = 9; + pixel_y = -1 + }, +/turf/open/floor/catwalk_floor/titanium, +/area/station/command/heads_quarters/ce) "kxm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/comfy/beige{ @@ -29248,23 +27980,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"kxD" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"kxK" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "kxL" = ( /turf/open/floor/iron/dark/small, /area/station/hallway/secondary/entry) @@ -29279,6 +27994,28 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) +"kya" = ( +/obj/structure/table/greyscale, +/obj/item/paper{ + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_y = 8; + pixel_x = -7 + }, +/obj/item/pen{ + pixel_x = 4 + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) +"kyg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/light/small/directional/west, +/obj/structure/sign/warning/no_smoking/circle/directional/west, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "kyr" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/airalarm/directional/west, @@ -29315,15 +28052,6 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kyT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "kyZ" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -29337,16 +28065,6 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kzo" = ( -/obj/machinery/vending/wardrobe/engi_wardrobe, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/west, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/engineering/break_room) "kzu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29419,6 +28137,24 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"kAp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/small, +/area/station/hallway/primary/fore) +"kAG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/railing/corner, +/obj/machinery/power/emitter{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "kAR" = ( /obj/structure/fireplace, /obj/effect/turf_decal/siding/wood, @@ -29442,15 +28178,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"kBq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/west, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) "kBA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29458,6 +28185,22 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"kBC" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/small, +/area/station/engineering/main) "kBD" = ( /obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -29465,6 +28208,14 @@ "kBH" = ( /turf/open/floor/iron/white/small, /area/station/service/janitor) +"kBZ" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) "kCb" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, @@ -29543,30 +28294,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"kDj" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/tank, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "kDq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons) -"kDx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/grass, -/area/station/service/chapel) -"kDS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "kDV" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, @@ -29575,6 +28315,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"kDY" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/door/airlock/public/glass{ + name = "Atmospherics Project Bay" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "kEe" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29604,6 +28351,13 @@ dir = 1 }, /area/station/cargo/storage) +"kEx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "kEA" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ @@ -29665,6 +28419,10 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) +"kFH" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "kFI" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -29685,18 +28443,9 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/cargo/sorting) -"kFP" = ( -/obj/machinery/door/airlock/maintenance{ - name = "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, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +"kFS" = ( +/turf/closed/mineral/random/stationside, +/area/station/engineering/atmos) "kFU" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -29704,14 +28453,26 @@ "kFY" = ( /turf/closed/wall/r_wall, /area/station/medical/morgue) -"kGd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth_half{ +"kGm" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/power/supermatter_crystal/engine, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"kGn" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"kGq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/radio/intercom/directional/south, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 1 }, -/area/station/maintenance/department/engine/atmos) +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "kGz" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -29749,6 +28510,15 @@ "kGS" = ( /turf/open/floor/iron/white, /area/station/maintenance/central/greater) +"kGY" = ( +/obj/structure/plasticflaps/opaque, +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Engineering" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "kHi" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -29786,6 +28556,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"kHI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "kHL" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -29803,6 +28587,20 @@ }, /turf/open/floor/iron, /area/station/security) +"kHQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 6 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "kHT" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, @@ -29833,6 +28631,15 @@ }, /turf/open/floor/circuit, /area/station/maintenance/port/aft) +"kIp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) "kIv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29895,12 +28702,6 @@ }, /turf/open/floor/iron/small, /area/station/medical/medbay/lobby) -"kIU" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/flora/bush/sunny/style_random, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/grass, -/area/station/service/chapel) "kIY" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/effect/decal/cleanable/dirt, @@ -29941,6 +28742,10 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/ai_monitored/security/armory) +"kJs" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "kJJ" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -30027,17 +28832,19 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"kLk" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "kLo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/chapel/funeral) -"kLq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "kLu" = ( /obj/machinery/shower/directional/south, /obj/effect/turf_decal/box, @@ -30046,6 +28853,15 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"kLv" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Supplies" + }, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) "kLB" = ( /obj/machinery/shower/directional/south, /obj/effect/turf_decal/box, @@ -30093,6 +28909,12 @@ /obj/effect/turf_decal/trimline/blue/warning, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"kNn" = ( +/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/department/electrical) "kNu" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -30101,9 +28923,28 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/small, /area/station/maintenance/department/medical/central) +"kNC" = ( +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "kND" = ( /turf/closed/wall/r_wall, /area/station/security/prison) +"kNG" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/bridge_pipe/orange/hidden{ + 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 = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "kNI" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -30272,6 +29113,23 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"kQo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"kQr" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "kQt" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) @@ -30298,6 +29156,18 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"kRu" = ( +/obj/effect/turf_decal/siding/white{ + dir = 10 + }, +/obj/machinery/air_sensor/air_tank, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Atmospherics CO2 Chamber"; + dir = 5; + network = list("ss13","engineering") + }, +/turf/open/floor/engine/air, +/area/station/engineering/atmos/space_catwalk) "kRE" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -30330,9 +29200,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"kRW" = ( +/obj/machinery/computer/atmos_control/nitrogen_tank{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "kSb" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"kSc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/end, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "kSd" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/north, @@ -30343,6 +29227,12 @@ /obj/machinery/holopad, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"kSj" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "kSr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30370,12 +29260,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"kSL" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "kSN" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/open/floor/eighties/red, @@ -30426,6 +29310,12 @@ dir = 1 }, /area/station/command/heads_quarters/hop) +"kTu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) "kTw" = ( /turf/closed/wall, /area/station/construction/mining/aux_base) @@ -30457,12 +29347,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/chapel/funeral) -"kUl" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall, -/area/station/engineering/atmos) "kUt" = ( /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; @@ -30474,27 +29358,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/office) -"kUy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "kUF" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"kUI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "kUM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30538,6 +29407,18 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"kVK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/reflector/double/anchored, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "kWd" = ( /obj/machinery/door/airlock{ name = "Room 2" @@ -30545,6 +29426,18 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"kWg" = ( +/obj/structure/table/greyscale, +/obj/item/pen{ + pixel_x = 13; + pixel_y = 4 + }, +/obj/machinery/light/small/directional/south, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_y = 4 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "kWk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30575,6 +29468,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"kWK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/small, +/area/station/engineering/engine_smes) +"kXf" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"kXj" = ( +/obj/machinery/suit_storage_unit/engine, +/turf/open/floor/plating/rust, +/area/station/engineering/supermatter/room) "kXl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -30633,6 +29545,11 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"kYo" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "kYs" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 @@ -30652,6 +29569,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"kYI" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "kYQ" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -30691,6 +29616,16 @@ /obj/item/modular_computer/laptop, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"kZo" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "kZx" = ( /obj/machinery/button/door/directional/north{ id = "main_surgery"; @@ -30722,6 +29657,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/science/ordnance/testlab) +"lae" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Cold Loop to Gas" + }, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "lao" = ( /obj/effect/mob_spawn/corpse/human, /turf/open/floor/wood, @@ -30729,6 +29672,21 @@ "laD" = ( /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) +"laF" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 6 + }, +/obj/machinery/light/small/directional/east, +/obj/item/stack/sheet/iron/five{ + pixel_y = 22 + }, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 11; + pixel_x = 7 + }, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine/atmos) "laL" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -30796,19 +29754,6 @@ /obj/structure/tram, /turf/open/floor/tram, /area/station/maintenance/port/aft) -"lbM" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/obj/machinery/camera/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/primary/central/fore) "lbO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30909,12 +29854,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics/garden) -"lcU" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/incident_display/dual/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "lcW" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 1 @@ -30924,6 +29863,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/service/janitor) +"lda" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/hallway) +"ldb" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "lde" = ( /obj/item/radio/intercom/directional/south, /obj/structure/disposalpipe/trunk{ @@ -31005,14 +29954,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons) -"ldW" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/construction) "ldZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -31022,16 +29963,6 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) -"leh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "lej" = ( /obj/structure/kitchenspike, /obj/effect/turf_decal/bot_red, @@ -31099,15 +30030,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"leF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 6 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "leH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31193,22 +30115,48 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/prison) +"lfI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"lfQ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/machinery/shower/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) "lfU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"lgc" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Aux Cooling"; + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "lgf" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"lgg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/turf/open/space/basic, -/area/space/nearstation) "lgh" = ( /obj/structure/table, /obj/machinery/light_switch/directional/north, @@ -31239,13 +30187,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) -"lgk" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/flora/bush/sunny/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "lgo" = ( /obj/effect/turf_decal/siding/blue{ dir = 5 @@ -31293,6 +30234,10 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/tile, /area/station/commons) +"lgr" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/small, +/area/station/maintenance/department/electrical) "lgx" = ( /obj/structure/disposalpipe/junction/flip, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31359,6 +30304,11 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"lhq" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "lhv" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -31393,6 +30343,25 @@ /obj/item/pickaxe, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) +"lhZ" = ( +/obj/machinery/suit_storage_unit/engine, +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"lix" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = 8; + pixel_y = 13 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -2; + pixel_y = 9 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) "liG" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -31428,18 +30397,14 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/maintenance/fore/greater) -"ljk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"liX" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, +/area/station/maintenance/department/engine/atmos) "ljl" = ( /obj/structure/lattice, /obj/structure/railing/corner{ @@ -31571,6 +30536,22 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"lkQ" = ( +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/stack/sheet/plasteel/fifty, +/obj/item/stack/sheet/plastic/five, +/obj/item/stack/sheet/rglass/fifty, +/obj/item/storage/medkit/fire{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/item/stock_parts/cell/emproof{ + pixel_y = 9 + }, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "lkR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31579,14 +30560,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/security/prison) -"lkU" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "lkV" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance) @@ -31681,12 +30654,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) -"lmG" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold/general/visible, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "lmR" = ( /obj/structure/dresser, /obj/structure/sign/poster/contraband/random/directional/east, @@ -31751,20 +30718,22 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/tcommsat/server) +"lon" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "loo" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"los" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +"loq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "loL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31788,6 +30757,11 @@ "lpC" = ( /turf/open/floor/plating, /area/station/service/chapel/funeral) +"lpJ" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "lpR" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -31800,6 +30774,22 @@ }, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) +"lpT" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/stack/sheet/iron/fifty{ + pixel_y = -9; + pixel_x = -4 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/cable_coil{ + pixel_x = -1; + pixel_y = -7 + }, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "lpV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/green{ @@ -31814,15 +30804,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"lpZ" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #1" - }, -/obj/effect/turf_decal/delivery, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/storage) "lqd" = ( /obj/effect/turf_decal/siding/red{ dir = 10 @@ -31836,6 +30817,19 @@ }, /turf/open/floor/iron/small, /area/station/security/brig) +"lqg" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white/side, +/area/station/hallway/primary/starboard) "lql" = ( /turf/open/floor/wood/parquet, /area/station/service/library) @@ -31873,6 +30867,15 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/aft) +"lrD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "lrE" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -31885,12 +30888,34 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"lrL" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/multitool{ + pixel_x = 7; + pixel_y = 18 + }, +/obj/item/storage/bag/construction, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - North" + }, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "lrP" = ( /obj/machinery/computer/security{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/security/office) +"lsd" = ( +/obj/machinery/photocopier, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "lsJ" = ( /obj/structure/window/spawner/directional/north, /obj/effect/turf_decal/stripes/end{ @@ -31899,6 +30924,11 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"lsK" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/brown/visible, +/turf/open/space/basic, +/area/space/nearstation) "lsO" = ( /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/white/side{ @@ -31946,6 +30976,13 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/service/library) +"ltz" = ( +/obj/effect/turf_decal/siding/red{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos/space_catwalk) "ltP" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/siding/wood{ @@ -32001,11 +31038,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) -"lur" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/camera/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "lus" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32027,6 +31059,13 @@ }, /turf/open/floor/wood/parquet, /area/station/service/greenroom) +"luC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "luU" = ( /obj/machinery/smartfridge/food, /obj/machinery/door/firedoor, @@ -32076,6 +31115,18 @@ }, /turf/open/floor/wood/parquet, /area/station/service/greenroom) +"lvG" = ( +/obj/machinery/atmospherics/components/trinary/filter/critical, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/supermatter/room) +"lvK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "lvS" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -32169,6 +31220,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/service/hydroponics/garden) +"lwW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/main) "lwY" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -32218,6 +31274,25 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"lxO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/emitter{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"lxP" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "lxT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32268,11 +31343,31 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/service/janitor) +"lyt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "lyQ" = ( /obj/structure/table, /obj/item/storage/photo_album/prison, /turf/open/floor/iron, /area/station/security/prison/workout) +"lyR" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"lyX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "lyY" = ( /obj/structure/bed, /obj/item/bedsheet/red, @@ -32290,6 +31385,18 @@ /obj/item/wrench, /turf/open/floor/iron, /area/station/security/tram) +"lzn" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + id = "atmosbridge" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "lzp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32400,14 +31507,6 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"lAF" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/stack/sheet/titaniumglass, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light/directional/north, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "lAO" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -32449,6 +31548,14 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"lBm" = ( +/obj/effect/turf_decal/stripes/box, +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet{ + name = "Cargo Deliveries" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "lBn" = ( /obj/effect/turf_decal/siding/white{ dir = 5 @@ -32474,6 +31581,22 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"lBp" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"lBw" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/textured_half, +/area/station/engineering/atmos) "lBy" = ( /obj/structure/railing, /obj/structure/lattice, @@ -32526,17 +31649,17 @@ }, /turf/open/floor/iron/white/small, /area/station/security/warden) +"lCw" = ( +/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/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/lobby) "lCD" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons) -"lCH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "lCN" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -32589,11 +31712,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"lDE" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "lDH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -32656,6 +31774,9 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/stone, /area/station/command/heads_quarters/captain/private) +"lER" = ( +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "lEZ" = ( /obj/effect/turf_decal/trimline/white/line, /obj/effect/turf_decal/trimline/white/mid_joiner, @@ -32668,6 +31789,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"lFE" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "lFG" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/red, @@ -32675,6 +31805,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"lFH" = ( +/obj/machinery/light/cold/dim/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning/engine_safety/directional/north, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) +"lFT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/storage/belt/utility, +/obj/item/pipe_dispenser, +/obj/item/clothing/head/utility/welding{ + pixel_y = 6 + }, +/obj/item/clothing/head/utility/welding{ + pixel_y = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "lGe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32694,6 +31846,13 @@ }, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) +"lGq" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/structure/fluff/broken_canister_frame, +/turf/open/floor/iron, +/area/station/engineering/atmos) "lGr" = ( /obj/effect/turf_decal/siding/brown{ dir = 6 @@ -32744,6 +31903,18 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/carpet/donk, /area/station/command/heads_quarters/qm) +"lHh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"lHi" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron/kitchen/small, +/area/station/security/prison/mess) "lHk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32868,12 +32039,31 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) +"lIt" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 6 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine/atmos) "lIw" = ( /obj/structure/chair/stool/directional/west, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) +"lIL" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/window/left/directional/east{ + name = "Maximum Security Test Chamber"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/science/xenobiology) "lJc" = ( /obj/machinery/door/firedoor, /obj/effect/landmark/navigate_destination, @@ -32884,20 +32074,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) -"lJh" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ +"lJF" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ dir = 4 }, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/grass, -/area/station/service/chapel) -"lJA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "lJV" = ( /obj/structure/bed, /obj/effect/decal/cleanable/dirt, @@ -33000,6 +32183,15 @@ /obj/effect/mapping_helpers/airlock/access/any/security/general, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"lLe" = ( +/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 = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "lLq" = ( /obj/machinery/firealarm/directional/east, /obj/effect/decal/cleanable/oil, @@ -33017,6 +32209,29 @@ "lLv" = ( /turf/open/floor/wood, /area/station/maintenance/fore/greater) +"lLA" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"lLE" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "lLH" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -33051,11 +32266,59 @@ "lLX" = ( /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) +"lMg" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - South 2" + }, +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"lMl" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/main) "lMp" = ( /obj/structure/disposalpipe/segment, /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"lMr" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "Engineering Security Doors" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"lMy" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/storage/photo_album/library, +/turf/open/floor/iron/grimy, +/area/station/service/library) "lMz" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -33178,6 +32441,20 @@ }, /turf/open/floor/stone, /area/station/command/heads_quarters/hos) +"lNC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = 6; + pixel_y = 17 + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "lNF" = ( /obj/effect/spawner/random/entertainment/lighter, /obj/item/clothing/mask/cigarette/rollie/mindbreaker{ @@ -33191,6 +32468,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"lNJ" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 6 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/item/kirbyplants/random, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "lNQ" = ( /obj/effect/turf_decal/bot_white/right, /obj/machinery/firealarm/directional/north, @@ -33226,6 +32512,10 @@ "lOj" = ( /turf/closed/wall, /area/station/cargo/miningoffice) +"lOk" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "lOt" = ( /obj/structure/closet/l3closet/janitor, /obj/effect/mapping_helpers/broken_floor, @@ -33239,6 +32529,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/office) +"lOC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/space/basic, +/area/space/nearstation) "lOG" = ( /obj/structure/table, /obj/item/stack/spacecash/c1{ @@ -33257,6 +32552,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/dorms) +"lOM" = ( +/obj/structure/table, +/obj/item/folder, +/turf/open/misc/asteroid, +/area/station/maintenance/department/electrical) "lOO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding{ @@ -33293,6 +32593,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"lPw" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "lPC" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -33326,6 +32632,21 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) +"lPW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Atmos to Loop" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "lQh" = ( /turf/open/floor/iron/small, /area/station/maintenance/port/aft) @@ -33399,6 +32720,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"lRz" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste to Filter" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "lRC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/south, @@ -33430,19 +32763,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) -"lSh" = ( -/obj/effect/turf_decal/caution/stand_clear/white{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/engineering/atmospherics_engine) "lSu" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -33462,6 +32782,12 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"lSF" = ( +/obj/effect/decal/cleanable/generic, +/obj/machinery/light/cold/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "lSI" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33522,6 +32848,18 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"lTC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/railing/corner, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Release" + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "lTF" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -33548,6 +32886,15 @@ "lUo" = ( /turf/open/floor/iron, /area/station/science/lobby) +"lUu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/space/basic, +/area/space/nearstation) "lUz" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -33610,6 +32957,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"lVv" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/wood, +/area/station/engineering/break_room) "lVy" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 8 @@ -33667,12 +33022,14 @@ }, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"lVZ" = ( -/obj/machinery/modular_computer/preset/id{ - dir = 4 +"lVW" = ( +/obj/machinery/power/turbine/core_rotor{ + dir = 8; + mapping_id = "main_turbine" }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "lWb" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/warning/no_smoking/circle/directional/north, @@ -33682,16 +33039,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/large, /area/station/hallway/primary/central/fore) -"lWv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/engineering/atmos) "lWF" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33857,6 +33204,24 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) +"lYF" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) +"lYH" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Atmospherics 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, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmos_airlock_1" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "lYT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/atmospherics_portable, @@ -34067,19 +33432,16 @@ /obj/machinery/pdapainter/medbay, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) +"mbG" = ( +/obj/structure/fluff/broken_canister_frame, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "mbK" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, /turf/open/floor/iron/grimy, /area/station/service/library) -"mbN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) "mbV" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/eighties/red, @@ -34121,13 +33483,6 @@ /obj/item/phone, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"mcx" = ( -/obj/machinery/shieldgen, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos) "mcP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34136,6 +33491,16 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) +"mcT" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "mda" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -34179,6 +33544,12 @@ }, /turf/open/floor/wood, /area/station/cargo/miningfoundry) +"meh" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine/atmos) "meu" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain) @@ -34234,6 +33605,12 @@ dir = 8 }, /area/station/science/research) +"mfn" = ( +/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/wood, +/area/station/command/heads_quarters/ce) "mfo" = ( /obj/item/kirbyplants/random, /obj/machinery/newscaster/directional/west, @@ -34263,24 +33640,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/smooth_edge, /area/station/maintenance/starboard/greater) -"mfK" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/table/reinforced/titaniumglass, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering Turbine" - }, -/obj/machinery/button/ignition/incinerator/atmos{ - pixel_x = 3; - pixel_y = 5 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) "mfP" = ( /obj/structure/hedge, /obj/machinery/light_switch/directional/west, @@ -34301,11 +33660,30 @@ /obj/machinery/recharger, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) +"mfU" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/electrical) +"mfV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/space_heater, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mgt" = ( /obj/machinery/vending/boozeomat, /obj/machinery/firealarm/directional/south, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"mgz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/barricade/wooden, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "mhf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -34370,6 +33748,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) +"mid" = ( +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "mie" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -34424,6 +33806,24 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) +"miN" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Gas to Chamber" + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"miR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "mjf" = ( /obj/structure/table/reinforced/rglass, /obj/machinery/door/window/left/directional/west{ @@ -34567,6 +33967,13 @@ /obj/effect/landmark/start/quartermaster, /turf/open/floor/carpet/donk, /area/station/command/heads_quarters/qm) +"mls" = ( +/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/smooth, +/area/station/engineering/break_room) "mlx" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/south, @@ -34656,6 +34063,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/execution/transfer) +"mmT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/electrical) "mnb" = ( /obj/effect/turf_decal/stripes/white/corner{ dir = 4 @@ -34710,6 +34129,22 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"mnx" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/machinery/button/ignition/incinerator/atmos{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "mny" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34717,6 +34152,13 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) +"mnA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "mnI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -34741,6 +34183,16 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"mom" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Waste Hookup" + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "mos" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, @@ -34757,17 +34209,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) -"mpr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/engineering{ - name = "Main Engine" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/small, -/area/station/engineering/main) "mpC" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -34780,6 +34221,14 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) +"mpE" = ( +/obj/machinery/light/cold/dim/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/sign/poster/official/moth_piping/directional/north, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "mpG" = ( /turf/open/floor/plating, /area/station/commons/storage/tools) @@ -34878,6 +34327,13 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) +"mrW" = ( +/obj/machinery/light/cold/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "msg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34967,6 +34423,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"muy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "muz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34985,6 +34446,12 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"muM" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/small, +/area/station/hallway/primary/fore) "muS" = ( /turf/open/floor/iron/dark, /area/station/security/prison/workout) @@ -34998,6 +34465,19 @@ /obj/machinery/holopad, /turf/open/floor/glass/reinforced, /area/station/command/bridge) +"mvj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/engineering/atmos) +"mvn" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/engineering/hallway) "mvo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/telecomms/bus/preset_three, @@ -35045,14 +34525,6 @@ dir = 1 }, /area/station/hallway/primary/central/fore) -"mwb" = ( -/obj/machinery/door/airlock/hatch{ - name = "Centcom Dock" - }, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) "mwn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -35101,15 +34573,6 @@ dir = 1 }, /area/station/science/xenobiology) -"mwI" = ( -/obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber" - }, -/obj/effect/turf_decal/bot, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "mwJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -35142,17 +34605,16 @@ /area/station/maintenance/central/lesser) "mxa" = ( /obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/pen{ - pixel_x = -1; - pixel_y = 8 - }, /turf/open/floor/glass/reinforced, /area/station/command/bridge) +"mxc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/engineering/atmos) "mxe" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta, /obj/effect/turf_decal/siding/blue/corner{ @@ -35196,6 +34658,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) +"mxX" = ( +/obj/structure/transit_tube/curved/flipped, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "mya" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -35206,6 +34673,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"myi" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ + dir = 6 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"mys" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/diagonal, +/turf/open/space/basic, +/area/space/nearstation) "myt" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/item/kirbyplants/random/fullysynthetic, @@ -35285,14 +34764,6 @@ /obj/item/stock_parts/subspace/amplifier, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) -"mzp" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/flora/tree/jungle/small/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "mzz" = ( /obj/structure/hedge, /obj/machinery/camera/directional/east, @@ -35370,6 +34841,13 @@ /obj/item/instrument/eguitar, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"mBq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "mBC" = ( /obj/structure/sign/poster/official/soft_cap_pop_art/directional/north, /turf/open/floor/iron/grimy, @@ -35455,6 +34933,11 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) +"mCL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "mCW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35469,6 +34952,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/execution/transfer) +"mDb" = ( +/obj/effect/turf_decal/sand/plating, +/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/department/electrical) "mDh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35501,15 +34991,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) -"mDU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "mDW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35592,23 +35073,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/shower) -"mFc" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/structure/table/glass, -/obj/item/book/codex_gigas{ - pixel_x = -7 - }, -/obj/item/camera{ - pixel_y = 18 - }, -/obj/item/radio/intercom/directional/south, -/obj/item/storage/photo_album/library{ - pixel_x = 7 - }, -/turf/open/floor/iron/grimy, -/area/station/service/library) "mFh" = ( /obj/effect/decal/cleanable/glass, /obj/structure/table/reinforced/rglass, @@ -35649,15 +35113,44 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mFD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/head/cone{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/clothing/head/cone{ + pixel_x = -7; + pixel_y = 11 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mFG" = ( /obj/machinery/telecomms/processor/preset_four, /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit, /area/station/tcommsat/server) +"mFL" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 1 + }, +/obj/item/wrench, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine/atmos) "mFP" = ( /obj/structure/cable, /turf/open/floor/eighties, /area/station/service/abandoned_gambling_den/gaming) +"mFZ" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Turbine Entrance" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "mGg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35681,12 +35174,41 @@ }, /turf/open/floor/carpet, /area/station/medical/psychology) +"mGn" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/clothing/gloves/color/fyellow{ + pixel_y = 2 + }, +/obj/item/wrench, +/obj/item/clothing/mask/cigarette/xeno{ + pixel_x = -3; + pixel_y = -9 + }, +/obj/item/clothing/head/utility/welding, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "mGp" = ( /obj/structure/table/glass, /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted, /obj/machinery/light/small/directional/east, /turf/open/floor/eighties, /area/station/service/abandoned_gambling_den/gaming) +"mGr" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "mGu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35903,15 +35425,15 @@ dir = 1 }, /area/station/hallway/primary/aft) -"mKy" = ( -/obj/machinery/requests_console/directional/west{ - department = "Engineering"; - name = "Engineering Requests Console" +"mKB" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #1" }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/stairs, -/area/station/engineering/break_room) +/obj/effect/turf_decal/delivery, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/iron, +/area/station/cargo/storage) "mKD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red{ @@ -35919,9 +35441,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"mKG" = ( -/turf/open/floor/plating/airless, -/area/station/engineering/supermatter/room) "mKH" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -35933,6 +35452,28 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"mKK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"mKV" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos/space_catwalk) "mKY" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -35991,6 +35532,10 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/science/xenobiology) +"mLD" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/station/engineering/engine_smes) "mLF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/broken_flooring/singular/directional/east, @@ -36026,12 +35571,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood/parquet, /area/station/service/greenroom) -"mMl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/service/chapel) "mMp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36063,6 +35602,13 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mMF" = ( +/obj/structure/sign/warning/pods/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"mMH" = ( +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "mMK" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 9 @@ -36087,20 +35633,6 @@ }, /turf/open/floor/iron, /area/station/security) -"mNa" = ( -/obj/machinery/flasher/directional/east{ - id = "AI"; - pixel_y = 26 - }, -/obj/structure/cable/multilayer/connected, -/obj/effect/turf_decal/box/red, -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Tertiary AI Core Access"; - req_access = list("ai_upload"); - pixel_x = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "mNu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line, @@ -36159,24 +35691,6 @@ }, /turf/open/floor/wood/tile, /area/station/command/meeting_room) -"mOa" = ( -/obj/machinery/door/airlock/command{ - name = "Centcom Dock" - }, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron/textured_half, -/area/station/command/corporate_dock) -"mOc" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/window/right/directional/north{ - name = "Medical Deliveries"; - req_access = list("medical") - }, -/obj/effect/turf_decal/delivery/white, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "mOk" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -36221,6 +35735,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"mPe" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "mPq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36278,12 +35798,6 @@ }, /turf/open/floor/iron/smooth, /area/station/command/bridge) -"mQB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall, -/area/station/maintenance/department/engine) "mQF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36300,22 +35814,6 @@ dir = 8 }, /area/station/command/heads_quarters/hos) -"mRl" = ( -/obj/machinery/door/airlock/engineering{ - name = "Smoke Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/textured_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) "mRp" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -36324,6 +35822,10 @@ /obj/structure/hedge, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"mRA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/iron/stairs/left, +/area/station/engineering/atmos) "mRD" = ( /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/maintenance, @@ -36338,35 +35840,55 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"mRT" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ +"mRY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"mSc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ dir = 10 }, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "mSi" = ( /obj/structure/mannequin/plastic, /turf/open/floor/plating, /area/station/cargo/boutique) -"mSq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"mSs" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/rack, -/obj/item/binoculars, -/obj/machinery/camera/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "mSH" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"mSS" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "mTd" = ( /obj/structure/closet/crate{ name = "Starups Clothing Crate" @@ -36384,6 +35906,15 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, /area/station/cargo/sorting) +"mTi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas Port"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "mTl" = ( /turf/closed/wall, /area/station/cargo/sorting) @@ -36405,6 +35936,10 @@ "mTs" = ( /turf/closed/wall/r_wall, /area/station/security/prison/work) +"mTt" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/engine, +/area/station/engineering/atmos) "mTy" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/full, @@ -36426,6 +35961,17 @@ "mTB" = ( /turf/closed/wall, /area/station/command/gateway) +"mTC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "mTM" = ( /obj/structure/cable, /turf/open/floor/circuit, @@ -36492,6 +36038,17 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) +"mUI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - North Corridor" + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "mUO" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -36573,15 +36130,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/security/prison/safe) -"mWN" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter/critical, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +"mWs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine) "mWY" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/chair/sofa/bench/left{ @@ -36599,12 +36153,37 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mXm" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2O to Pure" + }, +/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ + dir = 4; + name = "Plasma to Pure"; + color = "#BF40BF" + }, +/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer5{ + dir = 4; + name = "CO2 to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "mXt" = ( /obj/machinery/rnd/production/techfab/department/medical, /obj/effect/turf_decal/stripes/box, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark/small, /area/station/medical/storage) +"mXx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mXD" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -36663,6 +36242,15 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"mYS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/grass, +/area/station/service/chapel) "mYT" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -36693,6 +36281,13 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/grass, /area/station/science/xenobiology) +"mZb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "mZc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36724,15 +36319,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"mZw" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - location = "Engineering" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/department/engine) "mZA" = ( /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/door/airlock/public/glass{ @@ -36765,14 +36351,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"naw" = ( -/obj/effect/turf_decal/siding/wideplating/dark/end{ - dir = 8 - }, -/obj/machinery/shower/directional/west, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "nay" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/public/glass{ @@ -36826,6 +36404,16 @@ }, /turf/open/floor/iron/smooth, /area/station/service/library) +"nbj" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Cooling Loop Bypass"; + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "nbu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/holopad, @@ -36872,6 +36460,19 @@ }, /turf/open/floor/plating, /area/station/service/janitor) +"nck" = ( +/obj/machinery/fax{ + fax_name = "Engineering Lobby"; + name = "Engineering Lobby Fax Machine"; + pixel_x = 2; + pixel_y = 3 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "ncl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36892,6 +36493,12 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"ncQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "nde" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, @@ -36931,6 +36538,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"neg" = ( +/obj/effect/spawner/random/structure/crate_loot, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 9 + }, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine/atmos) "nei" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -36945,6 +36559,27 @@ }, /turf/open/floor/wood/tile, /area/station/commons/vacant_room/commissary) +"neL" = ( +/obj/structure/closet/crate{ + name = "Materials Crate" + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/plasteel/fifty, +/obj/item/stack/sheet/plastic/five, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/titaniumglass/fifty, +/obj/item/stack/sheet/mineral/titanium/fifty, +/obj/item/stack/rods/fifty, +/obj/machinery/light/cold/dim/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) +"neM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "neZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37076,6 +36711,40 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"nha" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + name = "isolation room monitor"; + network = list("isolation"); + pixel_x = 30 + }, +/obj/machinery/photobooth/security, +/turf/open/floor/iron, +/area/station/security/execution/transfer) +"nhe" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/landmark/navigate_destination, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "nhs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -37103,6 +36772,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"nhC" = ( +/obj/structure/cable, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Creature Pen"; + req_access = list("research") + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/science/xenobiology) +"nhE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "nhP" = ( /obj/item/storage/backpack/duffelbag/sec{ pixel_x = -15; @@ -37148,6 +36835,10 @@ /obj/machinery/vending/wardrobe/chem_wardrobe, /turf/open/floor/iron, /area/station/medical/chemistry) +"niv" = ( +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "niw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -37170,15 +36861,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"niJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/department/engine/atmos) "niR" = ( /obj/structure/chair, /obj/machinery/light/small/directional/north, @@ -37207,6 +36889,21 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/aft) +"nje" = ( +/obj/structure/railing{ + 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 = 6 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "njm" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -37220,6 +36917,21 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) +"njH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "njL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -37247,6 +36959,31 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security) +"nki" = ( +/obj/structure/rack, +/obj/item/airlock_painter, +/obj/item/lightreplacer{ + pixel_y = 7 + }, +/obj/item/clothing/head/utility/hardhat/welding{ + pixel_x = -4; + pixel_y = -3 + }, +/obj/item/clothing/head/utility/hardhat/welding{ + pixel_x = -4 + }, +/obj/item/clothing/head/utility/hardhat/welding{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/cold/dim/directional/west, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 9; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "nkl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -37262,6 +36999,17 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"nkp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/light/broken/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"nks" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/space_catwalk) "nkw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -37280,16 +37028,6 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"nkX" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/carpet/orange, -/area/station/commons/dorms) "nkY" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -37346,6 +37084,12 @@ dir = 4 }, /area/station/science/xenobiology) +"nlI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "nlQ" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, @@ -37361,11 +37105,21 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"nlZ" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/lobby) "nmh" = ( /obj/effect/turf_decal/siding/green, /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) +"nmi" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - Meeting Room" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "nmy" = ( /obj/item/stack/sheet/cardboard{ pixel_x = -6; @@ -37377,12 +37131,22 @@ }, /turf/open/floor/iron, /area/station/commons) +"nmH" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/wideplating, +/turf/open/floor/wood, +/area/station/engineering/main) "nmL" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"nmX" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "nnc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37509,26 +37273,19 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"noU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor{ + id = "Secure Storage"; + name = "Secure Storage" + }, +/turf/open/floor/plating/rust, +/area/station/engineering/main) "npp" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"npr" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"npy" = ( -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "npA" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -37540,6 +37297,13 @@ /obj/effect/spawner/random/trash, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"npL" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Engine Coolant Bypass"; + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "npS" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -37577,6 +37341,26 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white/small, /area/station/medical/virology) +"nqi" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"nqx" = ( +/obj/machinery/power/turbine/turbine_outlet{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "nqJ" = ( /obj/structure/sink/directional/south, /obj/effect/turf_decal/siding/wood, @@ -37595,6 +37379,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"nra" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/window/spawner/directional/south, +/obj/machinery/rnd/production/protolathe/department/engineering, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/main) "nry" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 @@ -37609,11 +37400,9 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/supply) -"nrK" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/grass, -/area/station/service/chapel) +"nsa" = ( +/turf/closed/wall, +/area/station/engineering/atmospherics_engine) "nsc" = ( /obj/structure/cable, /obj/item/kirbyplants/organic/applebush, @@ -37643,6 +37432,9 @@ }, /turf/open/floor/iron/small, /area/station/security/brig) +"nsy" = ( +/turf/closed/wall/r_wall/rust, +/area/station/engineering/hallway) "nsL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -37723,10 +37515,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ntH" = ( -/obj/effect/spawner/random/trash, -/turf/open/floor/iron/small, -/area/station/maintenance/department/engine) "ntJ" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -37801,6 +37589,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"nuu" = ( +/obj/machinery/incident_display/delam/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "nuv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -37902,15 +37697,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"nwg" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/camera/directional/south, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron, -/area/station/commons/dorms) "nwj" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -37967,6 +37753,11 @@ /obj/machinery/keycard_auth/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"nxO" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) "nxR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -38029,21 +37820,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"nyt" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=20.0-CentralPort-Bar"; - location = "19.0-Engineering-CentralPort" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "nyx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38206,19 +37982,17 @@ }, /turf/open/floor/iron/white, /area/station/commons/dorms) -"nAS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "nAW" = ( /obj/machinery/washing_machine, /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/commons/dorms) +"nBd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "nBq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38258,14 +38032,13 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"nBP" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ +"nBM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "nCo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/office{ @@ -38273,9 +38046,25 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"nCC" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/siding/yellow{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/wood, +/area/station/engineering/break_room) "nCH" = ( /turf/closed/wall/r_wall, /area/station/security) +"nCL" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/transport/power_rectifier{ + configured_transport_id = "bird_2" + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "nCR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -38310,19 +38099,6 @@ }, /turf/open/floor/iron, /area/station/security) -"nDm" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/window/right/directional/east{ - name = "Research Delivery"; - req_access = list("science") - }, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/station/science/research) "nDx" = ( /obj/effect/turf_decal/siding/red{ dir = 5 @@ -38360,6 +38136,11 @@ /obj/item/screwdriver, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"nEa" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "nEd" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -38394,13 +38175,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) -"nEw" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair/sofa/bamboo/right{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/service/chapel) "nEx" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -38409,6 +38183,9 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"nEz" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/maintenance/department/engine/atmos) "nEA" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -38423,6 +38200,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/cytology) +"nEL" = ( +/obj/structure/transit_tube/station/dispenser/reverse/flipped{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"nEN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "nEY" = ( /obj/structure/closet/firecloset, /obj/effect/decal/cleanable/dirt, @@ -38574,6 +38371,22 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/grass, /area/station/medical/virology) +"nGm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"nGt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/cable, +/obj/machinery/power/energy_accumulator/grounding_rod/anchored, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "nGu" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -38604,6 +38417,38 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"nGP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"nHd" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"nHq" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow{ + pixel_x = 13; + pixel_y = 1 + }, +/obj/item/flashlight/lamp{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = 15; + pixel_y = 7 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) "nHt" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -38640,6 +38485,25 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/commons/storage/art) +"nHP" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"nHR" = ( +/obj/machinery/atmospherics/components/tank/plasma, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering Turbine" + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "nId" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) @@ -38685,6 +38549,27 @@ }, /turf/open/floor/iron/dark/small, /area/station/medical/virology) +"nIK" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"nIL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = 24; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "nIS" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock{ @@ -38841,9 +38726,14 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"nMU" = ( -/turf/closed/wall/r_wall/rust, -/area/station/maintenance/disposal/incinerator) +"nMQ" = ( +/obj/machinery/computer/atmos_control/oxygen_tank{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "nMW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, @@ -38940,13 +38830,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/commons/dorms) -"nOI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "nPc" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -38983,13 +38866,6 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"nPv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "nPx" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -39000,11 +38876,28 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"nPF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "nPH" = ( /obj/structure/closet/secure_closet/brig, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/security/execution/transfer) +"nPM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "nPO" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 1 @@ -39042,6 +38935,13 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/dark, /area/station/security/prison/safe) +"nQk" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/maintenance{ + name = "Transit Tube Station" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "nQo" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -39052,10 +38952,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) -"nQr" = ( -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) +"nQs" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "nQx" = ( /obj/structure/table, /obj/item/stack/cable_coil, @@ -39069,6 +38974,42 @@ /obj/structure/barricade/wooden, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"nQB" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) +"nQC" = ( +/obj/item/toy/plush/shark{ + name = "Sir Vesk"; + desc = "This radical looking plushie has some radical air-sufing fins. He loves to turn vents on and ride the pressure-wave. Duuuuuuuude. Way cool.." + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos/office) +"nQE" = ( +/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/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/holopad, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "nQP" = ( /obj/machinery/computer/security{ dir = 8 @@ -39109,12 +39050,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/tcommsat/server) +"nRA" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/engineering/break_room) "nRP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) +"nSd" = ( +/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, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "nSo" = ( /obj/machinery/igniter/incinerator_atmos, /turf/open/floor/engine, @@ -39129,11 +39084,6 @@ /obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"nSz" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "nSA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -39227,6 +39177,12 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"nTy" = ( +/obj/machinery/transport/power_rectifier{ + configured_transport_id = "bird_1" + }, +/turf/open/floor/plating, +/area/station/security/tram) "nTz" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /obj/machinery/chem_dispenser{ @@ -39247,6 +39203,10 @@ }, /turf/open/floor/iron/small, /area/station/medical/morgue) +"nTK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "nUi" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39278,6 +39238,27 @@ }, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"nUB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/brown/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "nUG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -39295,13 +39276,12 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs) -"nUZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/landmark/start/chaplain, -/turf/open/floor/wood/large, -/area/station/service/chapel) +"nVe" = ( +/obj/machinery/door/window/right/directional/north, +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "nVg" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -39392,6 +39372,25 @@ /obj/structure/hedge, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"nWE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 9 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "nWO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39428,6 +39427,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"nXC" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "nXP" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -39473,19 +39480,35 @@ /obj/structure/bed/maint, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"nYD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"nYP" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "nYQ" = ( /obj/machinery/vending/wardrobe/cargo_wardrobe, /obj/machinery/camera/autoname/directional/south, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/cargo/office) -"nZg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/half, -/area/station/hallway/primary/central/fore) "nZh" = ( /obj/structure/table, /obj/item/stock_parts/scanning_module{ @@ -39574,6 +39597,21 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"oaB" = ( +/obj/machinery/holopad, +/obj/effect/landmark/start/station_engineer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) +"oaJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "oaV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39585,6 +39623,21 @@ dir = 1 }, /area/station/hallway/primary/central/fore) +"obd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"obe" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "obm" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39626,6 +39679,10 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"obW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "ocb" = ( /turf/open/floor/iron/white/small, /area/station/science/cubicle) @@ -39659,6 +39716,10 @@ /obj/effect/landmark/navigate_destination/disposals, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"odh" = ( +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "odk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -39673,6 +39734,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"odE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/power/emitter{ + dir = 1 + }, +/obj/effect/decal/cleanable/leaper_sludge, +/turf/open/floor/plating/rust, +/area/station/engineering/supermatter/room) "odK" = ( /obj/structure/cable, /obj/structure/steam_vent, @@ -39694,11 +39765,11 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/storage) -"oer" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space/basic, -/area/space/nearstation) +"oet" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/main) "oev" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39775,24 +39846,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical/central) -"ofS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"ofV" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair/sofa/bamboo/left{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/service/chapel) "ofZ" = ( /turf/closed/mineral/random/stationside, /area/station/maintenance/port/lesser) @@ -39824,16 +39877,6 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"ogB" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "ogF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/closet/firecloset, @@ -39969,6 +40012,12 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs) +"ohO" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/red, +/area/station/commons/dorms) "ohQ" = ( /obj/structure/curtain/cloth, /turf/open/floor/carpet/orange, @@ -40005,6 +40054,14 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"oii" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "ois" = ( /obj/effect/turf_decal/siding/white{ dir = 6 @@ -40045,14 +40102,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/plating, /area/station/cargo/office) -"oiM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "oiO" = ( /obj/structure/chair/comfy/beige{ dir = 8 @@ -40090,11 +40139,38 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/white, /area/station/commons/dorms) +"ojz" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/engineering/main) "ojD" = ( /obj/structure/cable, /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/security/lockers) +"ojK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/space/basic, +/area/space/nearstation) "ojU" = ( /obj/structure/rack, /obj/machinery/light/small/directional/south, @@ -40102,6 +40178,36 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/commons/dorms) +"ojW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/mass_driver, +/obj/item/stock_parts/matter_bin{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/item/stock_parts/servo/femto{ + pixel_y = 8; + pixel_x = -11 + }, +/obj/effect/decal/cleanable/glass, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) +"okg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "okl" = ( /obj/machinery/status_display/ai, /turf/closed/wall, @@ -40116,6 +40222,18 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/service/library) +"okt" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics Control" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos) "okz" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, @@ -40150,6 +40268,15 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/ordnance) +"olj" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "olm" = ( /obj/structure/table, /obj/item/mining_voucher, @@ -40193,12 +40320,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/science/lower) -"omJ" = ( -/obj/machinery/power/smes/engineering, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) "omW" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron/white/corner, @@ -40206,6 +40327,13 @@ "ona" = ( /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"onb" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + name = "Engine Exhaust" + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "ono" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -40220,6 +40348,18 @@ }, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"onv" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "onw" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -40273,6 +40413,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/small, /area/station/security/brig) +"ooe" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + 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/engineering/atmos) "oom" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -40321,11 +40470,24 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"opc" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/light/floor, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "opn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/small, /area/station/command/teleporter) +"opo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "opq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40339,13 +40501,6 @@ dir = 1 }, /area/station/science/xenobiology) -"opr" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/service/chapel) "opv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40403,6 +40558,13 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"oqE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "oqI" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -40435,6 +40597,9 @@ /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron, /area/station/security/execution/transfer) +"orb" = ( +/turf/closed/wall, +/area/station/engineering/main) "orC" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -40447,14 +40612,23 @@ /obj/structure/sign/clock/directional/north, /turf/open/floor/iron/smooth_large, /area/station/service/bar) -"orV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ +"orY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/structure/railing{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"osa" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "osf" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -40495,6 +40669,20 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"osu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "osy" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -40507,17 +40695,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"osE" = ( -/obj/machinery/shower/directional/south{ - name = "emergency shower" +"osT" = ( +/obj/structure/railing, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 6 +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron/stairs/old{ + dir = 8 }, -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/smooth_half, -/area/station/engineering/atmos) +/area/station/engineering/break_room) "osY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/corner/directional/south, @@ -40594,6 +40781,13 @@ dir = 1 }, /area/station/command/corporate_suite) +"oua" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/horizontal{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "ouf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40683,27 +40877,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"ovs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east{ - name = "Outer Window" +"ovt" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" }, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Brig Control Desk"; - req_access = list("armory") +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/folder/red, -/obj/item/storage/fancy/donut_box{ - pixel_y = 8 - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "wardshut"; - name = "Privacy Shutters" - }, -/turf/open/floor/iron/textured_large, -/area/station/security/warden) +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "ovA" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron, @@ -40729,6 +40913,11 @@ dir = 1 }, /area/station/command/gateway) +"owd" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/hallway) "owl" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -40742,10 +40931,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/cytology) -"owo" = ( -/obj/structure/altar_of_gods, -/turf/open/floor/wood/large, -/area/station/service/chapel) "owv" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 1; @@ -40793,20 +40978,23 @@ /area/station/hallway/primary/central/fore) "owZ" = ( /obj/item/kirbyplants/organic/applebush, -/obj/structure/secure_safe/caps_spare/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) -"oxb" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" +"oxc" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = 5; + pixel_y = 10 }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 10 +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = 13; + pixel_y = 6 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/item/food/pizzaslice/sassysage{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) "oxw" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/white/line{ @@ -40825,13 +41013,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) -"oyx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "oyA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -40857,6 +41038,12 @@ /obj/item/pai_card, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"oyU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/small, +/area/station/hallway/primary/fore) "oyW" = ( /obj/machinery/telecomms/bus/preset_two, /obj/machinery/camera/autoname/directional/west, @@ -40888,6 +41075,22 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"ozz" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/air, +/area/station/engineering/atmos/space_catwalk) +"ozM" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "ozO" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -40937,10 +41140,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/security/lockers) -"oAz" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "oAA" = ( /obj/structure/closet/emcloset, /obj/effect/mapping_helpers/broken_floor, @@ -40991,6 +41190,12 @@ /obj/structure/alien/weeds/node, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) +"oBk" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4, +/turf/open/space/basic, +/area/space/nearstation) "oBm" = ( /obj/structure/chair/sofa/bench/left, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -41065,6 +41270,16 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"oCE" = ( +/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/station/maintenance/department/electrical) +"oCF" = ( +/obj/machinery/air_sensor/helium_tank, +/turf/open/floor/engine/helium, +/area/station/ai_monitored/turret_protected/ai) "oCG" = ( /turf/closed/wall/rust, /area/station/cargo/bitrunning/den) @@ -41079,6 +41294,12 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"oDa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "oDc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41101,6 +41322,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"oDE" = ( +/obj/structure/lattice, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - North Exterior" + }, +/turf/open/space/basic, +/area/space/nearstation) "oDK" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -41138,15 +41366,19 @@ /obj/structure/holosign/barrier/atmos/tram, /turf/open/floor/tram, /area/station/security/tram) +"oEb" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/reagent_containers/cup/beaker/oldstation{ + pixel_y = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "oEi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/dorms) -"oEj" = ( -/turf/open/floor/grass, -/area/station/service/chapel) "oEr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -41157,6 +41389,26 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"oEt" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/requests_console/directional/north{ + department = "Chief Engineer's Desk"; + name = "Chief Engineer's Requests Console"; + pixel_y = -32 + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/turf/open/floor/iron/stairs/old{ + dir = 4 + }, +/area/station/command/heads_quarters/ce) "oEB" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/box/red/corners{ @@ -41185,13 +41437,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"oES" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/air_sensor/engine_chamber, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +"oFc" = ( +/obj/effect/spawner/random/trash, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/small, +/area/station/maintenance/department/electrical) "oFf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -41219,22 +41469,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/plating, /area/station/cargo/sorting) -"oFl" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood/large, -/area/station/service/chapel) -"oFm" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "oFu" = ( /turf/closed/wall, /area/station/security/office) @@ -41270,6 +41504,11 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/commons/dorms) +"oGn" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/layer_manifold/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "oGq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, @@ -41339,10 +41578,33 @@ dir = 1 }, /area/station/security/execution/transfer) +"oHO" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) +"oIf" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/maintenance/department/electrical) "oIk" = ( /obj/structure/table, /turf/open/floor/iron, /area/station/commons) +"oIF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) "oIK" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -41380,6 +41642,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"oJl" = ( +/obj/machinery/door/airlock/engineering{ + name = "Main Engineering" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/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/catwalk_floor, +/area/station/engineering/break_room) "oJn" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ @@ -41544,6 +41817,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oLN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/tank_dispenser, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "oLV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -41586,6 +41865,11 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/port) +"oMI" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/slime, +/turf/open/floor/engine, +/area/station/science/xenobiology) "oNd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/blue/corner{ @@ -41595,13 +41879,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"oNn" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "oNv" = ( /obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ dir = 1 @@ -41711,6 +41988,13 @@ /obj/structure/tram, /turf/open/floor/tram, /area/station/maintenance/port/aft) +"oPa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/blobstart, +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) "oPc" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/computer/upload/borg{ @@ -41718,6 +42002,10 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) +"oPg" = ( +/obj/machinery/air_sensor/mix_tank, +/turf/open/floor/engine/airless, +/area/station/engineering/atmos) "oPi" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -41822,6 +42110,19 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/cargo/storage) +"oQs" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 6 + }, +/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 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "oQF" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) @@ -41839,6 +42140,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/tools) +"oRj" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/disposalpipe/sorting/mail, +/obj/effect/mapping_helpers/mail_sorting/engineering/ce_office, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "oRm" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/mineral/random/stationside, @@ -41860,18 +42170,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"oRA" = ( -/obj/structure/cable, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Creature Pen"; - req_access = list("research") - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/science/xenobiology) "oRB" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -41935,12 +42233,25 @@ }, /turf/open/floor/iron/smooth, /area/station/command/bridge) +"oSw" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "oSx" = ( /obj/effect/turf_decal/siding/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"oSF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/structure/reagent_dispensers/watertank/high, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "oSG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/research_director, @@ -42007,6 +42318,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"oTY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/tank_holder/extinguisher/advanced, +/turf/open/floor/iron, +/area/station/engineering/atmos) "oTZ" = ( /obj/structure/table, /turf/open/floor/plating, @@ -42018,6 +42334,17 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"oUq" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "oUx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -42028,6 +42355,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"oUz" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/obj/structure/sign/warning/electric_shock/directional/west, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "oUB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42085,15 +42418,19 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"oVB" = ( -/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/transport/power_rectifier{ - configured_transport_id = "bird_2" - }, -/turf/open/floor/iron, -/area/station/maintenance/department/medical/central) +"oVt" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light/cold/dim/directional/west, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"oVF" = ( +/mob/living/basic/mining/lobstrosity, +/turf/open/misc/asteroid/airless, +/area/station/maintenance/department/engine) "oVK" = ( /obj/structure/chair{ pixel_y = -2 @@ -42155,6 +42492,12 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) +"oWE" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/sign/warning/engine_safety/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "oXe" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/duct, @@ -42211,6 +42554,14 @@ /obj/machinery/vending/dinnerware, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"oYv" = ( +/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/iron/half{ + dir = 8 + }, +/area/station/engineering/main) "oYy" = ( /obj/structure/chair/comfy/beige{ dir = 8 @@ -42224,12 +42575,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"oYJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos) "oYL" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -42238,6 +42583,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"oYN" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Mix to Filter" + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "oYS" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/computer/station_alert{ @@ -42258,13 +42611,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"oZg" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/engineering/supermatter) "oZi" = ( /obj/effect/turf_decal/siding/wideplating/dark/corner, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -42315,18 +42661,12 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"oZS" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 4 +"oZQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 }, /obj/structure/cable, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) "oZY" = ( @@ -42371,6 +42711,19 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"paW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"paX" = ( +/obj/structure/chair/bronze{ + dir = 8 + }, +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/catwalk_floor/titanium, +/area/station/command/heads_quarters/ce) "pbd" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -42384,13 +42737,37 @@ }, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"pbt" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 +"pbj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) +"pbl" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "pbu" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -42420,6 +42797,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/station/service/greenroom) +"pbT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "pcb" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 4 @@ -42476,6 +42861,14 @@ /obj/structure/thermoplastic/light, /turf/open/floor/tram, /area/station/maintenance/port/aft) +"pdh" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "pds" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -42562,6 +42955,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"pek" = ( +/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/department/engine) "pep" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ @@ -42587,14 +42986,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"peI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "peN" = ( /obj/structure/lattice, /obj/machinery/camera/motion/directional/north{ @@ -42608,6 +42999,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"peW" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Atmospherics Nitrous Chamber"; + dir = 9; + network = list("ss13","engineering") + }, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos/space_catwalk) "pfd" = ( /obj/effect/turf_decal/stripes/white/corner{ dir = 1 @@ -42624,6 +43026,30 @@ /obj/effect/gibspawner, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"pft" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/engineering/hallway) +"pfu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "pfv" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -42641,6 +43067,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"pfx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) "pfC" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 5 @@ -42652,12 +43085,24 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/small, /area/station/ai_monitored/command/storage/eva) -"pfM" = ( +"pfD" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, /obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "pfO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/directional/east, @@ -42677,21 +43122,6 @@ dir = 8 }, /area/station/service/bar/backroom) -"pgh" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/computer/records/security/laptop{ - dir = 8; - pixel_x = 10; - pixel_y = 4 - }, -/obj/machinery/recharger{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "pgq" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/siding/wood{ @@ -42700,6 +43130,15 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/small, /area/station/security/prison/shower) +"pgr" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "pgw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -42725,22 +43164,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/parquet, /area/station/service/library) -"pgO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 4 - }, -/area/station/maintenance/disposal/incinerator) +"pgU" = ( +/obj/structure/steam_vent, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "pgW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42757,12 +43185,42 @@ /obj/machinery/duct, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"phC" = ( +/obj/machinery/light/cold/dim/directional/west, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/directions/security/directional/west{ + dir = 2 + }, +/obj/structure/sign/directions/science/directional/west{ + pixel_y = 8; + dir = 10 + }, +/obj/structure/sign/directions/upload/directional/west{ + pixel_y = -8; + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "phE" = ( /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/small, /area/station/service/hydroponics/garden) +"phY" = ( +/obj/structure/railing{ + 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 = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "phZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42818,6 +43276,13 @@ /obj/effect/landmark/start/chemist, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) +"piL" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "piM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42827,25 +43292,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/commons/dorms) -"piT" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - Secondary" - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/engineering/atmos) "piZ" = ( /obj/structure/chair/sofa/right/maroon{ dir = 1 @@ -42929,6 +43375,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"pkd" = ( +/obj/machinery/door/window/right/directional/south, +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "pke" = ( /obj/machinery/door/airlock/centcom{ name = "Disposals Access:" @@ -42948,6 +43400,11 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"pkB" = ( +/obj/item/kirbyplants/random, +/obj/item/weldingtool, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "pkE" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -43029,6 +43486,17 @@ }, /turf/open/floor/wood/tile, /area/station/service/lawoffice) +"pmg" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/turf_decal/bot, +/obj/item/folder/yellow, +/obj/item/computer_disk/engineering, +/obj/item/phone{ + pixel_x = -6; + pixel_y = 7 + }, +/turf/open/floor/catwalk_floor/titanium, +/area/station/command/heads_quarters/ce) "pmn" = ( /obj/structure/chair/comfy/beige{ dir = 4 @@ -43052,6 +43520,21 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) +"pmA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/break_room) +"pmE" = ( +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "pmN" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -43068,6 +43551,9 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"pnl" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/department/electrical) "pnn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43087,10 +43573,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"pnM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "pnQ" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -43141,13 +43623,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) -"por" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "pox" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43186,6 +43661,16 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/checkpoint/escape) +"poL" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/red/end{ + dir = 1 + }, +/turf/open/floor/iron/dark/small, +/area/station/hallway/primary/fore) "poM" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43209,6 +43694,14 @@ /obj/effect/turf_decal/siding/wideplating/dark/corner, /turf/open/floor/iron, /area/station/security) +"poV" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/camera/directional/west{ + dir = 10; + c_tag = "Atmospherics - Control" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "ppk" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43236,6 +43729,16 @@ /obj/structure/cable, /turf/open/floor/iron/white/small, /area/station/command/heads_quarters/cmo) +"ppr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/reflector/single{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "pps" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/window/spawner/directional/north, @@ -43274,6 +43777,18 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"ppW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Secure Creature Pen"; + req_access = list("research") + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "pqa" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/basic, @@ -43281,6 +43796,25 @@ "pqm" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage/tcomms) +"pqo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/incident_display/delam/directional/north, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "pqs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43299,12 +43833,13 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"pqJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 6 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/station/engineering/supermatter) +"pqH" = ( +/obj/structure/closet/firecloset, +/obj/item/clothing/glasses/meson, +/obj/item/radio/intercom/directional/east, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/break_room) "pqK" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/south, @@ -43353,6 +43888,9 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/dark, /area/station/security/prison/safe) +"prI" = ( +/turf/closed/wall, +/area/station/engineering/hallway) "prQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43361,6 +43899,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"prV" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 + }, +/obj/effect/landmark/start/station_engineer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "prW" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 8 @@ -43394,6 +43941,19 @@ dir = 1 }, /area/station/science/auxlab/firing_range) +"pss" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "psI" = ( /obj/structure/table, /obj/effect/turf_decal/tile/blue/full, @@ -43415,6 +43975,30 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/lobby) +"psL" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/cold/dim/directional/east, +/obj/machinery/newscaster/directional/east, +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 19 + }, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 20 + }, +/obj/machinery/cell_charger{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "psP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43461,6 +44045,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/stone, /area/station/command/corporate_suite) +"ptz" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) "ptN" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/toy/talking/griffin{ @@ -43468,6 +44058,13 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) +"ptZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/grass, +/area/station/service/chapel) "pug" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43544,6 +44141,21 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/wood/tile, /area/station/service/bar) +"puI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass{ + name = "North Tanks Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "puN" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/grimy, @@ -43559,20 +44171,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/brig/entrance) -"pvg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "pvt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -43582,6 +44180,18 @@ /obj/structure/chair/office, /turf/open/floor/plating, /area/station/service/library/abandoned) +"pvE" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "pvF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43590,6 +44200,17 @@ dir = 4 }, /area/station/science/research) +"pvP" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/thinplating_new/corner, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "pvR" = ( /obj/structure/table/wood, /obj/machinery/light_switch/directional/south, @@ -43640,6 +44261,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"pwv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall, +/area/station/engineering/atmos) "pww" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43661,6 +44286,15 @@ }, /turf/open/floor/iron/white/side, /area/station/science/research) +"pwD" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "pwJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43754,6 +44388,16 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"pyl" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/item/clothing/head/cone{ + pixel_y = -13 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "pyp" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair{ @@ -43794,6 +44438,10 @@ "pzd" = ( /turf/closed/wall, /area/station/commons/fitness/recreation/entertainment) +"pzi" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/hallway) "pzn" = ( /obj/structure/table, /obj/effect/turf_decal/siding/wood{ @@ -43865,6 +44513,11 @@ /obj/effect/spawner/random/entertainment/toy, /turf/open/floor/plating, /area/station/service/theater) +"pAa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "pAl" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43917,21 +44570,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"pAx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "pAB" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43998,12 +44636,6 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"pBy" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "pBD" = ( /obj/effect/spawner/structure/window, /obj/structure/cable, @@ -44026,6 +44658,20 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/education) +"pBT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "pCa" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -44034,10 +44680,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"pCs" = ( -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine/atmos) +"pCo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "pCv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44060,6 +44722,12 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/brig) +"pCQ" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "pCU" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -44110,6 +44778,25 @@ }, /turf/open/floor/wood/tile, /area/station/service/lawoffice) +"pDH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos/glass{ + name = "Locker Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"pDK" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "pDQ" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -44129,6 +44816,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"pEa" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/fireaxecabinet/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/engineering/atmos) "pEb" = ( /obj/structure/cable, /obj/structure/chair/office{ @@ -44139,10 +44836,34 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/wood/tile, /area/station/service/lawoffice) +"pEo" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "pEs" = ( /obj/effect/turf_decal/siding/blue, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"pEt" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/window/spawner/directional/west, +/obj/machinery/camera/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "pEy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -44204,22 +44925,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"pFN" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/stack/sheet/plasteel/fifty, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/electronics/airlock{ - pixel_x = -16 - }, -/obj/item/electronics/airlock{ - pixel_x = -16; - pixel_y = 7 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +"pFK" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "pFQ" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -44230,6 +44941,27 @@ /obj/machinery/door/window/brigdoor/right/directional/west, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) +"pFS" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/item/stack/cable_coil/five, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"pGi" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "pGp" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44240,6 +44972,13 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"pGt" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to Waste" + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "pGu" = ( /obj/structure/cable, /obj/structure/table/wood, @@ -44362,6 +45101,12 @@ }, /turf/open/floor/wood, /area/station/commons/fitness/recreation) +"pHN" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/sunny/style_random, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/grass, +/area/station/service/chapel) "pHQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -44410,17 +45155,6 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"pIn" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Distro" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "pIp" = ( /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/stripes/white/line{ @@ -44432,6 +45166,12 @@ /obj/structure/bodycontainer/morgue, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) +"pIB" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "pIS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -44440,16 +45180,6 @@ }, /turf/open/floor/plating, /area/station/command/bridge) -"pJg" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "pJj" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -44487,13 +45217,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/aft) -"pJw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/navigate_destination/dockescpod, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "pJx" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -44519,6 +45242,20 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"pJT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"pKg" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos/space_catwalk) "pKi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -44621,6 +45358,22 @@ dir = 1 }, /area/station/command/corporate_showroom) +"pLI" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/north{ + req_access = list("engineering"); + name = "Engineering Desk" + }, +/obj/item/folder/yellow{ + pixel_x = -10; + pixel_y = 3 + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/break_room) "pLK" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -44638,16 +45391,24 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) -"pMr" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +"pMg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "pMs" = ( /obj/structure/transit_tube/horizontal, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"pMu" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "pMA" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/catwalk_floor/iron_dark, @@ -44662,6 +45423,16 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/research) +"pML" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "pMS" = ( /obj/structure/table, /obj/machinery/light/small/directional/south, @@ -44721,18 +45492,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/small, /area/station/science/lab) -"pNR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/left/directional/east{ - name = "Maximum Security Test Chamber"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/science/xenobiology) "pOb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44753,6 +45512,20 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/cargo/office) +"pOi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/main) "pOj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44797,6 +45570,16 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/herringbone, /area/station/security/execution/education) +"pOB" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) "pOJ" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4; @@ -44834,12 +45617,30 @@ /obj/effect/landmark/start/coroner, /turf/open/floor/iron/small, /area/station/medical/morgue) +"pPm" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light_switch/directional/south, +/obj/item/airlock_painter, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) "pPq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"pPH" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Atmospherics Project Bay" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "pPK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44865,6 +45666,10 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/tile, /area/station/service/bar) +"pQj" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "pQr" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 1 @@ -44907,6 +45712,11 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/wood, /area/station/service/chapel/office) +"pRw" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "pRz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, @@ -44996,11 +45806,6 @@ /obj/machinery/light/small/red/directional/west, /turf/open/floor/iron/white, /area/station/maintenance/central/greater) -"pSo" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "pSq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/north, @@ -45043,6 +45848,10 @@ /obj/structure/bookcase/random/adult, /turf/open/floor/iron/grimy, /area/station/service/library) +"pSQ" = ( +/obj/structure/cable, +/turf/closed/wall, +/area/station/engineering/supermatter/room) "pST" = ( /obj/structure/table, /obj/item/plant_analyzer, @@ -45078,6 +45887,13 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/stone, /area/station/service/theater) +"pTp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/wood, +/area/station/engineering/atmos) "pTq" = ( /obj/machinery/door/airlock/maintenance{ name = "Crematorium Maintenance" @@ -45093,6 +45909,15 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/service/lawoffice) +"pTt" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/machinery/door/airlock/engineering{ + name = "Suit Lockers" + }, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "pTz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45149,6 +45974,13 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"pUe" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos/space_catwalk) "pUl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -45157,6 +45989,19 @@ }, /turf/open/floor/iron/textured_half, /area/station/service/hydroponics/garden) +"pUs" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/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/machinery/door/airlock/engineering/glass{ + name = "Engineering Foyer" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "pUt" = ( /obj/structure/grille, /obj/effect/decal/cleanable/glass, @@ -45182,6 +46027,19 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"pUK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Turbine" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/disposal/incinerator) "pUL" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table/reinforced/plastitaniumglass, @@ -45201,6 +46059,10 @@ }, /turf/open/floor/iron/textured_half, /area/station/service/hydroponics/garden) +"pUR" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "pUS" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -45244,6 +46106,21 @@ /obj/effect/mapping_helpers/broken_floor, /turf/closed/wall, /area/station/maintenance/department/medical/central) +"pVM" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/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/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "pVN" = ( /obj/structure/chair/sofa/bench/left, /obj/effect/turf_decal/tile/dark_red/opposingcorners, @@ -45275,6 +46152,9 @@ dir = 4 }, /area/station/science/lobby) +"pWm" = ( +/turf/closed/wall, +/area/station/maintenance/department/electrical) "pWt" = ( /obj/structure/lattice, /obj/structure/railing/corner{ @@ -45309,6 +46189,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"pWH" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/stairs{ + dir = 1 + }, +/area/station/engineering/lobby) "pWM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -45361,6 +46250,11 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"pXc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "pXh" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -45381,6 +46275,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"pXu" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "pXz" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted, /obj/machinery/firealarm/directional/south, @@ -45404,6 +46307,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"pXL" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/window/right/directional/north{ + name = "Medical Deliveries"; + req_access = list("medical") + }, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "pXQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/north, @@ -45457,6 +46370,14 @@ }, /turf/open/floor/engine, /area/station/science/explab) +"pYE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/effect/landmark/start/hangover, +/turf/open/floor/grass, +/area/station/service/chapel) "pYG" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -45479,6 +46400,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/herringbone, /area/station/service/abandoned_gambling_den/gaming) +"pYP" = ( +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos) "pYY" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -45486,10 +46415,6 @@ /obj/structure/cable, /turf/open/floor/iron/checker, /area/station/security/breakroom) -"pZj" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/grass, -/area/station/service/chapel) "pZl" = ( /obj/structure/chair{ dir = 8 @@ -45514,21 +46439,24 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/plating, /area/station/cargo/storage) -"pZI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "pZK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/iron, /area/station/cargo/storage) +"pZQ" = ( +/obj/structure/grille, +/obj/item/shard/titanium, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"qaA" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "qaH" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/dark_red/corner{ @@ -45586,6 +46514,21 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/checker, /area/station/security/breakroom) +"qbr" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/service/chapel) +"qbv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "qbw" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -45601,21 +46544,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/checkpoint/supply) -"qbB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "qbC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron/kitchen/small, /area/station/hallway/secondary/service) +"qbE" = ( +/obj/item/stack/tile/catwalk_tile/iron, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "qbK" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -45631,6 +46569,28 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"qbP" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm/directional/east, +/obj/structure/table/reinforced, +/obj/item/folder/yellow{ + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -6; + pixel_y = 6 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) +"qbR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "qcf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45663,29 +46623,10 @@ /obj/effect/landmark/navigate_destination/dockarrival, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qcG" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = 10 - }, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel"; - pixel_x = 26; - pixel_y = -13 - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) +"qcF" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "qcQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45740,6 +46681,19 @@ /obj/machinery/duct, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"qdJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/structure/sign/warning/radiation/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "qdM" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -45796,6 +46750,10 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron, /area/station/security/prison/workout) +"qeq" = ( +/obj/structure/fluff/broken_canister_frame, +/turf/open/misc/asteroid, +/area/station/maintenance/department/engine/atmos) "qey" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -45836,6 +46794,16 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"qeV" = ( +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/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/diagonal, +/area/station/engineering/lobby) "qfb" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -45843,6 +46811,18 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) +"qfn" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, +/obj/machinery/air_sensor/plasma_tank, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Atmospherics CO2 Chamber"; + dir = 9; + network = list("ss13","engineering") + }, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/space_catwalk) "qfo" = ( /obj/structure/disposalpipe/segment, /obj/structure/sign/departments/lawyer/directional/east, @@ -46092,6 +47072,12 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/wood, /area/station/commons/fitness/recreation) +"qid" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "qin" = ( /obj/docking_port/stationary/escape_pod, /turf/open/space/basic, @@ -46127,19 +47113,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/tools) -"qiE" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "qiM" = ( /obj/structure/table, /turf/open/floor/iron/cafeteria, @@ -46160,15 +47133,6 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/engine, /area/station/science/xenobiology) -"qiX" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "qjh" = ( /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/white, @@ -46196,6 +47160,19 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"qjp" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"qjq" = ( +/obj/machinery/door/window/left/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "qju" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -46205,6 +47182,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/meeting_room) +"qjx" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "qjy" = ( /obj/structure/hedge, /turf/open/floor/iron/smooth, @@ -46248,9 +47234,25 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"qkv" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/service/chapel) +"qkw" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/service/chapel) "qkF" = ( /turf/open/floor/iron, /area/station/commons) +"qkI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "qkK" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -46268,8 +47270,20 @@ "qld" = ( /obj/machinery/destructive_scanner, /obj/machinery/light/small/directional/south, +/obj/structure/sign/departments/telecomms/directional/south, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"qli" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"qlk" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/horizontal{ + dir = 2 + }, +/turf/open/space/basic, +/area/space/nearstation) "qll" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -46334,6 +47348,14 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/carpet/lone, /area/station/service/theater) +"qmo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/space/basic, +/area/space/nearstation) "qmr" = ( /obj/effect/turf_decal/siding/red{ dir = 9 @@ -46341,6 +47363,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/brig) +"qmv" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Atmospherics Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "qmx" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/full, @@ -46479,17 +47508,6 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"qoh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "qoj" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/window/right/directional/west{ @@ -46499,6 +47517,13 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating, /area/station/medical/morgue) +"qol" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos) "qon" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /obj/structure/extinguisher_cabinet/directional/north, @@ -46509,6 +47534,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/space/nearstation) +"qoA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "qoD" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_showroom) @@ -46579,6 +47611,22 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"qqr" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer5{ + dir = 4; + name = "Air to Pure" + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2 to Pure" + }, +/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ + dir = 4; + name = "O2 to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "qqx" = ( /obj/structure/bed/maint, /turf/open/floor/eighties/red, @@ -46590,10 +47638,38 @@ /obj/machinery/light/floor, /turf/open/floor/glass/reinforced, /area/station/command/bridge) +"qqJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/smooth_corner{ + dir = 1 + }, +/area/station/engineering/supermatter/room) "qrb" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, /area/station/science/xenobiology) +"qrc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner, +/obj/structure/reflector/box{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "qrg" = ( /obj/structure/cable, /obj/structure/displaycase/captain{ @@ -46646,6 +47722,16 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"qsa" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Airlock" + }, +/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/iron/small, +/area/station/engineering/supermatter/room) "qsg" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/terminal, @@ -46653,13 +47739,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/circuit, /area/station/tcommsat/server) -"qsi" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) "qsj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -46734,23 +47813,17 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/cargo/sorting) -"qty" = ( -/obj/structure/table/reinforced, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/paper_bin{ - pixel_x = 4; - pixel_y = 3 +"qtv" = ( +/obj/structure/railing{ + dir = 4 }, -/obj/machinery/door/window/left/directional/north{ - name = "Research Lab Desk"; - req_access = list("science") +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 10 }, -/obj/structure/desk_bell{ - pixel_x = -8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_large, -/area/station/science/lab) +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/station/engineering/atmos/office) "qtE" = ( /obj/structure/bed{ dir = 4 @@ -46771,6 +47844,26 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"qtP" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics - Central" + }, +/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/iron/small, +/area/station/engineering/atmos) "qtQ" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -46791,12 +47884,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood/parquet, /area/station/service/theater) -"quj" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/small/directional/south, -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "qul" = ( /obj/machinery/light/small/directional/east, /obj/machinery/light_switch/directional/east, @@ -46838,6 +47925,45 @@ }, /turf/open/floor/iron/dark/small, /area/station/maintenance/aft) +"quJ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/small/directional/south, +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"quO" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/machinery/recharger{ + pixel_x = 7; + pixel_y = 9 + }, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) +"quP" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/clothing/gloves/color/black, +/obj/item/electronics/airalarm{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/machinery/light/cold/dim/directional/west, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "quS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46896,12 +48022,23 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"qwc" = ( +/obj/structure/tank_holder/emergency_oxygen, +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos) "qwn" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"qwo" = ( +/obj/structure/lattice, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - South Exterior" + }, +/turf/open/space/basic, +/area/space/nearstation) "qwq" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/computer/prisoner/management{ @@ -47013,6 +48150,21 @@ /obj/item/restraints/handcuffs/fake, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"qxz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"qxF" = ( +/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/plating/elevatorshaft, +/area/station/engineering/break_room) "qxN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47036,12 +48188,31 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/misc/sandy_dirt, /area/station/science/research) -"qyo" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +"qyb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 4 + }, +/obj/machinery/light_switch/directional/south, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = -7 + }, +/obj/item/flashlight{ + pixel_y = 8; + pixel_x = 3 + }, +/obj/item/flashlight{ + pixel_y = 3; + pixel_x = 10 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) "qyx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair{ @@ -47198,6 +48369,15 @@ }, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) +"qAr" = ( +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 8 + }, +/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/department/engine/atmos) "qAs" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/red/line{ @@ -47212,6 +48392,20 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"qAQ" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ + dir = 8 + }, +/turf/open/floor/engine/n2o, +/area/station/ai_monitored/turret_protected/ai) +"qAR" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/tank, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "qBc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47285,6 +48479,20 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/cargo/boutique) +"qBD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the turbine vent."; + dir = 1; + name = "turbine vent monitor"; + network = list("turbine"); + pixel_y = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "qBG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47326,6 +48534,17 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"qCg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"qCi" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood/large, +/area/station/service/chapel) "qCq" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -47355,6 +48574,19 @@ }, /turf/open/floor/iron/large, /area/station/command/heads_quarters/hop) +"qCR" = ( +/turf/open/floor/wood/large, +/area/station/service/chapel) +"qCT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/ce) "qCU" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/table/reinforced, @@ -47397,11 +48629,64 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"qDq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/brown/visible, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"qDv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 8 + }, +/turf/open/floor/iron/smooth_corner, +/area/station/engineering/supermatter/room) "qDx" = ( /obj/structure/toilet, /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/iron/white/small, /area/station/maintenance/port/aft) +"qDA" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Airlock" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "engine_airlock_1" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/main) +"qDJ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/button/door/directional/west{ + id = "atmosbridge"; + name = "Space Bridge" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "qDK" = ( /obj/machinery/light_switch/directional/west, /obj/structure/reagent_dispensers/water_cooler, @@ -47440,12 +48725,6 @@ dir = 8 }, /area/station/science/lobby) -"qEj" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/camera/autoname/directional/north, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "qEk" = ( /obj/structure/table/reinforced, /obj/item/folder/blue{ @@ -47455,6 +48734,13 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"qEm" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "qEp" = ( /obj/machinery/chem_master/condimaster{ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; @@ -47483,6 +48769,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lower) +"qEP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/poddoor/shutters, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "qFb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -47510,6 +48804,16 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"qFw" = ( +/obj/structure/fluff/broken_canister_frame, +/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/plating/elevatorshaft, +/area/station/engineering/atmos) "qFA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/office/light, @@ -47539,6 +48843,10 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/wood/parquet, /area/station/service/library) +"qGk" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "qGu" = ( /obj/effect/turf_decal/siding/dark_red, /obj/item/radio/intercom/directional/south, @@ -47596,13 +48904,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"qHg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "qHm" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -47642,23 +48943,6 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) -"qHS" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/machinery/door/window/right/directional/north{ - name = "Core Modules"; - req_access = list("captain") - }, -/obj/effect/spawner/random/aimodule/harmless, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) -"qHT" = ( -/obj/structure/closet/secure_closet/engineering_chief, -/obj/item/storage/briefcase/secure, -/obj/item/lighter, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/ce) "qHY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47785,6 +49069,34 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"qJN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/clothing/suit/hazardvest{ + pixel_y = 8 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_y = 5 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_y = 2 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_y = 4 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_y = 4 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -12; + pixel_y = 10 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -15; + pixel_y = 5 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "qKe" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/siding/green, @@ -47798,6 +49110,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) +"qKx" = ( +/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/engineering/storage_shared) "qKE" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -47827,14 +49144,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/cmo, /turf/open/floor/iron/white/small, /area/station/command/heads_quarters/cmo) -"qKZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth_edge{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) "qLc" = ( /obj/machinery/door/airlock{ id_tag = "Toilet3"; @@ -47842,17 +49151,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"qLf" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/engineering/main) -"qLh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/engineering/break_room) "qLj" = ( /obj/structure/bed{ dir = 4 @@ -47929,6 +49227,24 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/security/courtroom) +"qMu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) +"qMG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/maintenance/department/electrical) "qMK" = ( /turf/closed/wall, /area/station/command/bridge) @@ -47977,6 +49293,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) +"qNN" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "qNO" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/central) @@ -47988,11 +49310,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"qOi" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) "qOm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/turf_decal/stripes/corner{ @@ -48000,25 +49317,17 @@ }, /turf/open/floor/plating, /area/station/commons/storage/tools) +"qOp" = ( +/obj/structure/table/wood, +/obj/item/book/bible, +/turf/open/floor/wood/large, +/area/station/service/chapel) "qOt" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/cold/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) -"qOG" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "qON" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/table, @@ -48046,9 +49355,23 @@ /obj/effect/landmark/start/chemist, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"qPg" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 1 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "qPN" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) +"qPO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2{ + dir = 6 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "qQg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -48060,6 +49383,17 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"qQi" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/siding/yellow{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/wood, +/area/station/engineering/break_room) "qQo" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -48090,6 +49424,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"qQF" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Escape Pod Three"; + space_dir = 1 + }, +/turf/open/floor/iron/small, +/area/station/maintenance/department/electrical) "qQK" = ( /turf/open/floor/iron/white/corner{ dir = 1 @@ -48171,10 +49514,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"qRQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "qRU" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ dir = 8 @@ -48340,6 +49679,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"qUd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "qUe" = ( /obj/structure/cable, /obj/machinery/door/airlock/glass, @@ -48382,17 +49729,20 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) +"qUE" = ( +/obj/machinery/pipedispenser/disposal/transit_tube, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "qUF" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"qUL" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"qUN" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/iron/stairs/medium{ + dir = 1 }, -/obj/machinery/meter, -/turf/open/floor/iron/dark, /area/station/engineering/atmos) "qUS" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -48433,15 +49783,32 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) -"qVG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 +"qVJ" = ( +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 }, -/obj/item/storage/fancy/candle_box, -/obj/machinery/light_switch/directional/west, -/obj/structure/rack/skeletal, -/turf/open/floor/iron/grimy, -/area/station/service/library) +/obj/item/clothing/head/cone{ + pixel_x = 5; + pixel_y = 1 + }, +/obj/item/clothing/head/cone{ + pixel_x = -12; + pixel_y = 3 + }, +/obj/item/clothing/head/cone{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/item/clothing/head/cone{ + pixel_x = 5; + pixel_y = -7 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/broken/directional/east, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) "qVK" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/stripes/corner{ @@ -48558,6 +49925,16 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) +"qXd" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/closet/emcloset, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "qXe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48645,6 +50022,12 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/iron/dark/small, /area/station/security/tram) +"qYp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "qYq" = ( /obj/structure/table/glass, /obj/machinery/cell_charger, @@ -48683,6 +50066,17 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/shower) +"qYE" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "qYK" = ( /obj/structure/disposalpipe/trunk, /obj/structure/window/reinforced/spawner/directional/west, @@ -48719,6 +50113,13 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"qZm" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "qZn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -48746,6 +50147,19 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/commons/dorms) +"qZB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/station/service/chapel) +"qZE" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/turf/open/floor/iron/textured_half, +/area/station/maintenance/department/engine/atmos) "qZG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/corner/directional/south, @@ -48791,6 +50205,17 @@ }, /turf/open/floor/tram, /area/station/security/tram) +"ram" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood/large, +/area/station/service/chapel) +"rao" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "raz" = ( /obj/machinery/door/airlock/public/glass{ name = "Lavatorie" @@ -48798,6 +50223,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"raC" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "raE" = ( /obj/machinery/duct, /turf/open/floor/iron, @@ -48816,6 +50249,22 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"raP" = ( +/obj/item/kirbyplants/random, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) +"raX" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/bamboo/right{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) +"rba" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood/large, +/area/station/service/chapel) "rbc" = ( /obj/structure/transport/linear/tram, /obj/structure/tram, @@ -48824,11 +50273,39 @@ }, /turf/open/floor/tram, /area/station/security/tram) +"rbg" = ( +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"rbh" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/grass, +/area/station/service/chapel) +"rbl" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/light/cold/dim/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "rbo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) +"rbp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor{ + id = "Secure Storage"; + name = "Secure Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating/rust, +/area/station/engineering/main) "rbs" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -48891,6 +50368,25 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/engine, /area/station/science/xenobiology) +"rco" = ( +/obj/machinery/shieldgen, +/obj/item/clothing/gloves/color/black{ + pixel_y = -3; + pixel_x = -2 + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/clothing/mask/gas{ + pixel_y = 5 + }, +/obj/item/clothing/head/cone{ + pixel_x = 1; + pixel_y = 15 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "rcp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -48914,12 +50410,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics) -"rcv" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/light/small/directional/east, -/turf/open/floor/carpet/red, -/area/station/commons/dorms) "rcw" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 1 @@ -48938,6 +50428,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"rcQ" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/pods/directional/north, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "rdb" = ( /obj/machinery/door/airlock/public{ name = "Abandoned Domiciles" @@ -48971,6 +50468,10 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"rdH" = ( +/obj/machinery/keycard_auth/directional/south, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "rdK" = ( /obj/structure/chair/office, /obj/effect/landmark/start/botanist, @@ -49051,6 +50552,19 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/entry) +"reL" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/requests_console/directional/west{ + department = "Atmospherics"; + name = "Atmospherics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "reM" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/escape) @@ -49190,6 +50704,17 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"rgS" = ( +/obj/structure/railing/corner/end{ + dir = 1 + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "rgT" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/red/line{ @@ -49200,6 +50725,13 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/port) +"rhg" = ( +/obj/machinery/air_sensor/engine_chamber, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "rhj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49246,6 +50778,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"rhu" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 5 + }, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Atmospherics CO2 Chamber"; + dir = 9; + network = list("ss13","engineering") + }, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/space_catwalk) "rhy" = ( /obj/structure/chair{ dir = 1 @@ -49320,13 +50863,6 @@ dir = 1 }, /area/station/service/cafeteria) -"riN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/plumbed{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/medical/central) "riV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49371,12 +50907,45 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"rjo" = ( +/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/engineering/glass{ + name = "Abandoned Power Monitoring" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/station/maintenance/department/electrical) +"rjr" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating/rust, +/area/station/engineering/supermatter) +"rjv" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/red/end, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/hallway/primary/fore) "rjz" = ( /obj/effect/turf_decal/plaque{ icon_state = "L11" }, /turf/open/floor/glass, /area/station/hallway/secondary/spacebridge) +"rjE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "rjH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49397,21 +50966,16 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"rkc" = ( -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/effect/landmark/event_spawn, -/turf/open/floor/grass, -/area/station/service/chapel) -"rkm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +"rkk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/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/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/main) +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rkr" = ( /obj/structure/table_frame, /obj/effect/decal/cleanable/molten_object, @@ -49436,6 +51000,13 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/cargo/boutique) +"rkS" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/machinery/air_sensor/nitrous_tank, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/space_catwalk) "rlb" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -49465,6 +51036,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"rlk" = ( +/obj/machinery/light/broken/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "rlr" = ( /turf/closed/wall, /area/station/medical/storage) @@ -49511,12 +51090,28 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"rmD" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/machinery/door/airlock/engineering/glass{ + name = "Locker Room" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/engineering/engine_smes) "rmG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/north, /turf/open/floor/wood, /area/station/cargo/boutique) +"rmM" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/engineering/main) "rmX" = ( /obj/structure/table, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -49571,6 +51166,24 @@ /obj/structure/thermoplastic/light, /turf/open/floor/tram, /area/station/maintenance/port/aft) +"roc" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"roe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/structure/sign/warning/radiation/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "roi" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -49582,6 +51195,13 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/wood/tile, /area/station/maintenance/port/lesser) +"row" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/plumbed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "roz" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -49701,13 +51321,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"rqc" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table/wood, -/obj/machinery/camera/directional/south, -/obj/item/stack/cable_coil/five, -/turf/open/floor/plating, -/area/station/commons/vacant_room/commissary) "rqd" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/radio/intercom/directional/south, @@ -49757,18 +51370,33 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"rra" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +"rqV" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/effect/landmark/start/hangover, -/turf/open/floor/grass, -/area/station/service/chapel) +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "rrb" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) +"rro" = ( +/obj/structure/railing, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/engineering/main) "rrq" = ( /obj/structure/closet, /turf/open/floor/plating, @@ -49792,6 +51420,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"rrG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/iron/smooth_edge{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "rrH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49821,6 +51458,13 @@ /obj/effect/spawner/random/contraband/prison, /turf/open/floor/plating, /area/station/security/prison/safe) +"rse" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "rsg" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -49842,6 +51486,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"rsr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "rss" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/stripes/white/line{ @@ -49879,15 +51529,6 @@ "rsL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/fore) -"rsP" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/engineering/main) "rsQ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49963,6 +51604,12 @@ }, /turf/closed/wall, /area/station/hallway/secondary/recreation) +"rub" = ( +/obj/structure/railing/corner, +/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/department/engine/atmos) "ruc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49990,6 +51637,11 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/science/lower) +"rup" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/checkpoint/engineering) "ruC" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/tile/green/anticorner/contrasted, @@ -50063,6 +51715,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"rvX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/south{ + name = "Genetics Desk"; + req_access = list("genetics") + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white/textured_large, +/area/station/science/research) "rvY" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/dark, @@ -50082,6 +51751,16 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/research) +"rwl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "rwo" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/machinery/camera/directional/west, @@ -50111,6 +51790,12 @@ }, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"rwJ" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/siding/yellow, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/wood, +/area/station/engineering/break_room) "rwP" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -50150,6 +51835,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"rxs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8; + initialize_directions = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rxu" = ( /obj/structure/table, /obj/machinery/airalarm/directional/south, @@ -50224,6 +51919,13 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"ryp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "ryt" = ( /obj/machinery/light/dim/directional/north, /obj/effect/turf_decal/tile/neutral{ @@ -50264,6 +51966,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"rzu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/service/chapel) "rzG" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -50300,6 +52007,14 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) +"rAb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "rAg" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -50376,6 +52091,18 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/plating, /area/station/engineering/gravity_generator) +"rAH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/structure/reflector/box/anchored{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "rAN" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -50482,12 +52209,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"rBW" = ( -/obj/structure/cable, -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "rBY" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -50516,6 +52237,32 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) +"rCU" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/structure/sink/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) +"rCX" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/space_catwalk) +"rDc" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_y = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/engineering/break_room) "rDf" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -50567,6 +52314,9 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"rDV" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/storage_shared) "rDY" = ( /obj/effect/turf_decal/stripes/white/line, /obj/structure/transport/linear/tram, @@ -50580,11 +52330,17 @@ /obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"rEt" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) +"rEH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos{ + name = "Locker Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos) "rEL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -50622,6 +52378,13 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/station/cargo/sorting) +"rFb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "rFi" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -50651,6 +52414,9 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"rFC" = ( +/turf/open/floor/catwalk_floor, +/area/station/command/heads_quarters/ce) "rFF" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -50659,6 +52425,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) +"rFH" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Research Delivery"; + req_access = list("science") + }, +/turf/open/floor/iron/white/side{ + dir = 6 + }, +/area/station/science/research) "rFP" = ( /obj/structure/disposalpipe/trunk{ dir = 2 @@ -50785,6 +52564,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"rHe" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - South Corridor" + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "rHm" = ( /obj/effect/turf_decal/tile/brown/full, /obj/machinery/chem_master/condimaster{ @@ -50814,12 +52603,30 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/wood, /area/station/cargo/boutique) +"rHE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/mop_bucket/janitorialcart{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "rHH" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 }, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) +"rHK" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"rHL" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/delivery, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/modular_computer/preset/cargochat/service, +/turf/open/floor/iron/kitchen/small, +/area/station/hallway/secondary/service) "rHQ" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/cafeteria, @@ -51002,6 +52809,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/theater) +"rKR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "rKV" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -51011,6 +52826,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"rKZ" = ( +/obj/structure/railing, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine/atmos) +"rLj" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "rLk" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/box/corners{ @@ -51025,6 +52857,43 @@ /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) +"rLt" = ( +/obj/item/clothing/head/cone{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/clothing/head/cone{ + pixel_x = -5; + pixel_y = -9 + }, +/obj/effect/decal/cleanable/glass/titanium, +/obj/effect/decal/cleanable/insectguts, +/obj/machinery/light/small/dim/directional/north, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"rLu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/stock_parts/cell/high{ + pixel_x = -11; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/glass/bottle/vodka, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/citrus/orange{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/food/grown/grapes/green{ + pixel_y = -4; + pixel_x = -6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "rLw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -51044,7 +52913,7 @@ /turf/open/misc/sandy_dirt, /area/station/maintenance/starboard/aft) "rLN" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/lazarus_injector, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/siding/thinplating_new{ @@ -51052,6 +52921,11 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) +"rLT" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "rMa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51070,6 +52944,19 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"rMf" = ( +/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"; + dir = 4; + pixel_y = 7 + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "rMl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51093,9 +52980,13 @@ }, /turf/open/space/basic, /area/space/nearstation) -"rMn" = ( +"rMs" = ( /obj/structure/lattice/catwalk, +/obj/structure/cable, /obj/structure/railing{ + dir = 5 + }, +/obj/structure/railing/corner{ dir = 8 }, /turf/open/space/basic, @@ -51116,6 +53007,17 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) +"rMR" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "rMV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -51170,6 +53072,15 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/command/gateway) +"rNI" = ( +/obj/effect/turf_decal/siding/thinplating_new/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/dark/small, +/area/station/command/heads_quarters/ce) "rNJ" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/iron/cafeteria, @@ -51290,13 +53201,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) -"rPo" = ( -/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/orange/hidden/layer1, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/engineering/atmos) "rPx" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -51334,9 +53238,22 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) +"rPV" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron, +/area/station/engineering/main) "rQi" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) +"rQm" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "rQt" = ( /obj/effect/landmark/start/mime, /turf/open/floor/carpet/lone, @@ -51366,6 +53283,23 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /turf/open/floor/iron/dark/small, /area/station/medical/pharmacy) +"rQH" = ( +/obj/structure/rack, +/obj/item/clothing/neck/petcollar, +/obj/item/flashlight/flare/candle{ + pixel_x = 10 + }, +/obj/item/flashlight/flare/candle{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/screwdriver{ + pixel_y = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "rQN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ @@ -51400,13 +53334,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space/basic, /area/space/nearstation) -"rRp" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "rRu" = ( /obj/structure/transit_tube/horizontal, /obj/effect/decal/cleanable/dirt, @@ -51503,13 +53430,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/coroner, /turf/open/floor/iron/small, /area/station/medical/morgue) -"rSw" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "rSz" = ( /obj/structure/chair/comfy/brown{ buildstackamount = 0; @@ -51529,15 +53449,17 @@ "rST" = ( /turf/closed/wall, /area/station/cargo/storage) -"rTg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"rSW" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, -/area/station/engineering/break_room) +/area/station/engineering/main) "rTj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51601,6 +53523,15 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"rUa" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/engineering/atmos) "rUb" = ( /obj/structure/hedge, /obj/machinery/status_display/evac/directional/east, @@ -51616,6 +53547,12 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"rUs" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Decontamination B" + }, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/break_room) "rUt" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -51633,6 +53570,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/large, /area/station/hallway/secondary/spacebridge) +"rUD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "rUE" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, @@ -51682,6 +53638,15 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) +"rVA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rVH" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/table/glass, @@ -51717,15 +53682,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/processing) -"rVV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "rVX" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/side{ @@ -51772,6 +53728,13 @@ /obj/machinery/holopad, /turf/open/floor/iron/diagonal, /area/station/command/heads_quarters/hop) +"rWH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/ce) "rWM" = ( /obj/structure/table, /obj/item/exodrone{ @@ -51806,6 +53769,17 @@ dir = 1 }, /area/station/cargo/bitrunning/den) +"rWQ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Engineering Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "engine_airlock_2" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "rWW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -51885,6 +53859,16 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/security/prison/workout) +"rYL" = ( +/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/machinery/camera/directional/south{ + c_tag = "Engineering - CE Office" + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "rZc" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -51892,19 +53876,6 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) -"rZh" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos{ - name = "Central Atmospherics" - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/engineering/atmos) "rZi" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -51938,6 +53909,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"rZu" = ( +/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/department/electrical) "rZG" = ( /obj/structure/closet/crate/trashcart, /obj/effect/spawner/random/trash/food_packaging, @@ -51980,34 +53956,24 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) +"sav" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "say" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue/half, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"saD" = ( -/obj/machinery/camera/directional/south, -/obj/machinery/light/small/directional/south, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/table, -/obj/item/storage/box/mousetraps{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/restraints/legcuffs/beartrap{ - pixel_x = 8; - pixel_y = 13 - }, -/obj/item/flashlight{ - pixel_y = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white/small, -/area/station/service/janitor) "saY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52021,6 +53987,18 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) +"sbf" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "sbm" = ( /obj/structure/plasticflaps/opaque, /obj/machinery/duct, @@ -52045,12 +54023,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark, /area/station/science/genetics) -"sbt" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/kitchen/small, -/area/station/hallway/secondary/service) "sbx" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -52068,6 +54040,15 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) +"sbG" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/machinery/door/airlock/engineering/glass{ + name = "Freezer Room" + }, +/turf/open/floor/iron/textured_half, +/area/station/engineering/supermatter/room) "sbN" = ( /obj/machinery/rnd/server, /turf/open/floor/circuit, @@ -52105,31 +54086,6 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"scc" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"scf" = ( -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "Creature Pen"; - req_access = list("research") - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/science/xenobiology) -"scg" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "scj" = ( /turf/closed/wall/r_wall, /area/station/science/lower) @@ -52197,17 +54153,24 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"sdi" = ( +"sdg" = ( +/obj/structure/cable, /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/grass, /area/station/service/chapel) "sdm" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"sdF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "sdQ" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance{ @@ -52228,6 +54191,14 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"sed" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "sei" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 8 @@ -52264,10 +54235,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space/basic, /area/space/nearstation) -"sfb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +"sfd" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 10 + }, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos/space_catwalk) "sfh" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/brown/full, @@ -52281,6 +54254,13 @@ }, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"sfl" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "sfq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52299,6 +54279,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"sfF" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Office" + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmos_airlock_1" + }, +/turf/open/floor/iron/smooth_half{ + dir = 8 + }, +/area/station/engineering/main) "sfK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52438,6 +54439,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"shK" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/engineering/hallway) "shL" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod One"; @@ -52495,6 +54504,19 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/service/cafeteria) +"sio" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "sip" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/item/robot_suit, @@ -52555,6 +54577,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"sjZ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "skc" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -52664,6 +54694,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/office) +"slC" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/spider/stickyweb, +/obj/item/hfr_box/corner, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) "slG" = ( /obj/docking_port/stationary{ dir = 2; @@ -52710,6 +54748,20 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/station/security/detectives_office) +"smd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 6 + }, +/obj/effect/landmark/navigate_destination/incinerator, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "smf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52735,12 +54787,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) -"smo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "smH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -52764,19 +54810,28 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"sne" = ( +"snj" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "ceprivacy"; + name = "Chief's Privacy Shutters" + }, +/turf/open/floor/plating, +/area/station/engineering/lobby) +"snm" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/end{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "snn" = ( /obj/machinery/rnd/experimentor, /turf/open/floor/engine, @@ -52804,6 +54859,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/courtroom) +"snX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/reflector/single/anchored{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "snZ" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -52828,6 +54892,28 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"son" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Gas to Filter" + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"soo" = ( +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "sor" = ( /obj/machinery/computer/exoscanner_control{ dir = 1 @@ -52839,18 +54925,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"sot" = ( -/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/small, -/area/station/engineering/atmos) "sox" = ( /obj/effect/turf_decal/stripes/white/line, /obj/structure/transport/linear/tram, /obj/structure/tram, /turf/open/floor/tram, /area/station/security/tram) +"soB" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/space_catwalk) +"soC" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) "soD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 8 @@ -52880,6 +54972,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"soV" = ( +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"spa" = ( +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos) "spg" = ( /obj/effect/mapping_helpers/airlock/access/any/security/general, /obj/machinery/door/airlock/security{ @@ -52951,6 +55051,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"sqg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/hallway) "sqh" = ( /obj/item/kirbyplants/random, /obj/machinery/light/cold/directional/west, @@ -52962,6 +55066,13 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"sql" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/machinery/field/generator, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "sqo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52989,6 +55100,13 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) +"sqB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "sqV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/left{ @@ -53013,23 +55131,10 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"srm" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "srn" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/port/greater) -"sru" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "srA" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -53134,6 +55239,10 @@ /obj/item/stock_parts/subspace/filter, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) +"ssP" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/hallway) "ssY" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -53146,6 +55255,13 @@ dir = 1 }, /area/station/maintenance/department/science/xenobiology) +"stm" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/break_room) "stP" = ( /obj/effect/turf_decal/siding{ dir = 1 @@ -53234,6 +55350,18 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"svr" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/textured_half, +/area/station/engineering/atmos) "svs" = ( /turf/closed/wall, /area/station/hallway/secondary/dock) @@ -53256,6 +55384,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/science/xenobiology) +"svB" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) "svD" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/flora/bush/flowers_yw, @@ -53266,6 +55399,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/science/explab) +"svK" = ( +/obj/machinery/light/cold/dim/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "svP" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/office/light{ @@ -53358,16 +55501,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/maintenance/starboard/central) -"swI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "swJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -53396,6 +55529,20 @@ }, /turf/open/floor/grass, /area/station/cargo/storage) +"swT" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Engineering Maintenance" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "swV" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table/wood, @@ -53465,6 +55612,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"sxD" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos/space_catwalk) "sxF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53499,6 +55653,13 @@ }, /turf/open/space/basic, /area/space) +"syc" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/space_catwalk) "sye" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/window/reinforced/spawner/directional/east, @@ -53529,6 +55690,10 @@ "syk" = ( /turf/closed/wall, /area/station/security/warden) +"syv" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/grass, +/area/station/service/chapel) "syx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -53543,14 +55708,10 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) -"syE" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/window/spawner/directional/west, -/obj/machinery/vending/medical, -/obj/machinery/camera/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) +"syG" = ( +/obj/effect/spawner/xmastree, +/turf/open/floor/grass, +/area/station/service/chapel) "syN" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, @@ -53573,6 +55734,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/catwalk_floor/iron, /area/station/maintenance/department/medical/central) +"szy" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/grass, +/area/station/service/chapel) "szz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53609,13 +55774,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/wood/tile, /area/station/service/bar) -"szN" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/transport/power_rectifier{ - configured_transport_id = "bird_2" - }, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "szS" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/full, @@ -53646,6 +55804,14 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"sAb" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2, +/turf/open/space/basic, +/area/space/nearstation) "sAA" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt, @@ -53661,6 +55827,37 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"sAM" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/south, +/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"sAW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "sBm" = ( /obj/structure/transport/linear/tram, /obj/structure/fluff/tram_rail/floor, @@ -53720,6 +55917,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"sCm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "sCp" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -53770,9 +55971,40 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"sDh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - Engine Bay East" + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/smooth_edge{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "sDj" = ( /turf/closed/wall/r_wall, /area/station/science/cytology) +"sDl" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) +"sDo" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/item/storage/box/gloves{ + pixel_y = -7; + pixel_x = -15 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "sDp" = ( /obj/structure/cable, /obj/structure/table, @@ -53801,15 +56033,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"sDD" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/modular_computer/preset/cargochat/service{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/kitchen/small, -/area/station/hallway/secondary/service) "sDT" = ( /obj/machinery/firealarm/directional/north, /obj/structure/cable, @@ -53817,6 +56040,12 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) +"sEj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "sEn" = ( /obj/item/clothing/head/cone, /obj/item/clothing/head/cone{ @@ -53877,14 +56106,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"sFg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "sFk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53989,10 +56210,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"sHg" = ( -/obj/machinery/air_sensor/nitrous_tank, -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) +"sHk" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/spawner/random/structure/table, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "sHs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54002,6 +56225,31 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"sHH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) +"sHM" = ( +/obj/structure/railing, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) +"sHO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/main) "sHV" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -54013,20 +56261,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/engine, /area/station/science/cytology) -"sId" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"sIg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/break_room) "sIh" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/stairs{ @@ -54054,6 +56288,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"sID" = ( +/obj/effect/turf_decal/arrows/white, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "sIG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/directions/evac/directional/west, @@ -54069,6 +56308,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"sIO" = ( +/obj/structure/grille/broken, +/obj/item/shard/titanium, +/obj/effect/decal/cleanable/glass/titanium, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "sIS" = ( /obj/structure/cable, /turf/open/floor/plating/rust, @@ -54183,6 +56428,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"sKD" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Airlock" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "sKE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/small, @@ -54194,22 +56449,25 @@ /obj/effect/gibspawner, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"sKX" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/phone{ - pixel_x = 7; - pixel_y = 1 +"sLu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/item/reagent_containers/cup/glass/mug/coco{ - pixel_x = -6; - pixel_y = 5 +/obj/structure/table/greyscale, +/obj/item/weldingtool/mini/empty{ + pixel_x = 5; + pixel_y = -1 }, -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics - Closet" +/obj/item/storage/box/masks{ + pixel_x = 10; + pixel_y = 13 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +/obj/item/clothing/ears/earmuffs{ + pixel_x = -4; + pixel_y = 7 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "sLB" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54275,6 +56533,14 @@ dir = 1 }, /area/station/science/research) +"sMi" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/grass, +/area/station/service/chapel) "sMq" = ( /obj/machinery/light/warm/directional/west, /turf/open/floor/iron, @@ -54319,6 +56585,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"sNc" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/machinery/light/small/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/atmos) "sNg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -54386,11 +56663,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"sOL" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/floor, -/turf/open/floor/wood/large, -/area/station/service/chapel) "sON" = ( /turf/closed/wall, /area/station/service/bar/backroom) @@ -54428,6 +56700,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/greater) +"sPk" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/engineering/main) "sPt" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -54470,6 +56753,17 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"sQa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/space/basic, +/area/space/nearstation) "sQb" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -54483,11 +56777,34 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"sQm" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "sQn" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/maintenance/central/greater) +"sQt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/reflector/single{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "sQv" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/spawner/random/structure/closet_empty/crate, @@ -54503,6 +56820,38 @@ /obj/structure/railing, /turf/open/floor/stone, /area/station/service/theater) +"sQI" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/modular_computer/preset/id, +/obj/machinery/button/ticket_machine{ + pixel_x = 9; + pixel_y = 23 + }, +/obj/machinery/button/door/directional/south{ + id = "hop"; + name = "Privacy Shutters Control"; + pixel_x = -2; + pixel_y = 23; + req_access = list("hop") + }, +/obj/machinery/button/door/directional/south{ + id = "hopqueue"; + name = "Queue Shutters Control"; + pixel_x = -13; + pixel_y = 23; + req_access = list("hop") + }, +/obj/machinery/button/flasher{ + id = "hopflash"; + pixel_x = -24; + pixel_y = 6 + }, +/obj/machinery/button/photobooth{ + pixel_y = -6; + pixel_x = -24 + }, +/turf/open/floor/iron/dark/textured_corner, +/area/station/command/heads_quarters/hop) "sQS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54526,6 +56875,12 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"sRf" = ( +/obj/machinery/power/turbine/inlet_compressor{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "sRg" = ( /turf/closed/wall, /area/station/commons/storage/tools) @@ -54538,21 +56893,18 @@ dir = 8 }, /area/station/science/lobby) -"sRm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +"sRv" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + name = "Hydroponics Desk"; + req_access = list("hydroponics") }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_large, +/area/station/hallway/primary/central/fore) "sRL" = ( /turf/closed/wall, /area/station/service/janitor) -"sRP" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "sRR" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -54568,25 +56920,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) -"sSm" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/engineering/atmos) "sSq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54636,6 +56969,9 @@ /obj/item/folder/yellow, /turf/open/floor/iron, /area/station/cargo/sorting) +"sSB" = ( +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "sSK" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -54643,6 +56979,16 @@ /obj/structure/table_frame, /turf/open/floor/iron, /area/station/cargo/sorting) +"sSM" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/textured_half, +/area/station/engineering/atmos) "sSQ" = ( /turf/closed/wall, /area/station/maintenance/department/medical/central) @@ -54726,11 +57072,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"sTH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/engineering/break_room) "sTK" = ( /obj/machinery/telecomms/bus/preset_one, /turf/open/floor/circuit, @@ -54752,6 +57093,13 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"sTW" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "sUe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -54762,6 +57110,13 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"sUk" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Fuel Pipe to Incinerator" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "sUy" = ( /turf/closed/wall/r_wall, /area/station/command/meeting_room) @@ -54788,6 +57143,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/checker, /area/station/security/breakroom) +"sUV" = ( +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "sUZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ @@ -54817,6 +57181,16 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"sVu" = ( +/obj/machinery/light/cold/dim/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning/no_smoking/circle/directional/south, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "sVA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/vending/colavend, @@ -54832,16 +57206,6 @@ "sVN" = ( /turf/closed/wall/r_wall, /area/station/security/prison/workout) -"sWm" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "sWq" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/purple{ @@ -54862,6 +57226,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/maintenance/starboard/greater) +"sWE" = ( +/obj/machinery/light/broken/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "sWJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54890,6 +57258,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/theater) +"sXm" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "sXo" = ( /obj/structure/sign/directions/engineering{ dir = 1; @@ -54966,6 +57341,13 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine, /area/station/science/cytology) +"sYg" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "sYo" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/machinery/airalarm/directional/north, @@ -54999,11 +57381,17 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/cryo) -"sYz" = ( +"sYF" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 }, -/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"sYK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, /area/station/service/chapel) "sZn" = ( @@ -55016,9 +57404,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/plating, /area/station/service/theater) -"sZu" = ( -/turf/closed/wall/rust, -/area/station/maintenance/department/engine) "sZx" = ( /obj/structure/cable, /obj/structure/disposalpipe/trunk{ @@ -55087,6 +57472,16 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/security/courtroom) +"tau" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/status_display/evac/directional/south, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "tax" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55106,6 +57501,22 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs/auxiliary) +"taK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/meter, +/turf/open/floor/iron/smooth_corner{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "taL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55136,10 +57547,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security/execution/transfer) -"tbf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/large, -/area/station/service/chapel) "tbk" = ( /obj/structure/cable, /obj/machinery/door/airlock/hatch{ @@ -55155,10 +57562,38 @@ /obj/machinery/duct, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"tbr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/grunge{ + name = "Abandoned Control Booth" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured_half, +/area/station/maintenance/department/engine/atmos) "tbu" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/explab) +"tbB" = ( +/obj/structure/table/reinforced, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Research Lab Desk"; + req_access = list("science") + }, +/obj/structure/desk_bell{ + pixel_x = -8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white/textured_large, +/area/station/science/lab) "tbD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -55177,6 +57612,12 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"tbX" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2, +/turf/open/space/basic, +/area/space/nearstation) "tca" = ( /turf/open/floor/carpet/donk, /area/station/command/heads_quarters/qm) @@ -55223,6 +57664,22 @@ dir = 1 }, /area/station/hallway/primary/central/fore) +"tcZ" = ( +/obj/effect/turf_decal/siding/red{ + dir = 6 + }, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Atmospherics CO2 Chamber"; + dir = 5; + network = list("ss13","engineering") + }, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos/space_catwalk) +"tdg" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "tdh" = ( /obj/structure/chair/sofa/corp/right{ dir = 4 @@ -55299,6 +57756,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/science/explab) +"tdY" = ( +/obj/structure/closet/emcloset, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/rust, +/area/station/maintenance/department/electrical) "tec" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -55388,25 +57851,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/rd, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/server) -"tfl" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Pure" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) -"tfo" = ( -/obj/structure/flora/bush/sunny/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) "tfy" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/red{ @@ -55414,11 +57858,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) -"tfC" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "tfE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -55426,12 +57865,6 @@ /obj/item/clipboard, /turf/open/floor/iron/white/small, /area/station/science/server) -"tfU" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "tgj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/easel, @@ -55443,11 +57876,39 @@ "tgl" = ( /turf/closed/wall, /area/station/service/greenroom) +"tgp" = ( +/obj/structure/table/reinforced, +/obj/item/folder{ + pixel_x = -6 + }, +/obj/machinery/door/window/left/directional/east{ + name = "Robotics Desk"; + req_access = list("robotics") + }, +/obj/structure/desk_bell{ + pixel_x = 6 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "roboticshut"; + name = "Robotics Shutters" + }, +/turf/open/floor/iron/textured_large, +/area/station/science/robotics/lab) "tgw" = ( /obj/machinery/computer/cargo/request, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) +"tgD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) "tgJ" = ( /obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ @@ -55473,6 +57934,14 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/service/cafeteria) +"thb" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/wood, +/area/station/engineering/break_room) "the" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55492,12 +57961,34 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/service/hydroponics) +"thI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/obj/machinery/meter, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "thM" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/structure/closet/secure_closet/miner, /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"tic" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + 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/smooth, +/area/station/engineering/atmos) "tii" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55519,6 +58010,11 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"tit" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) "tiC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, @@ -55546,6 +58042,29 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/science/lab) +"tiS" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 5 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"tiU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 5 + }, +/obj/machinery/meter, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/supermatter) "tiW" = ( /obj/structure/chair{ pixel_y = -2 @@ -55571,9 +58090,27 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tjd" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "Engineering Security Doors" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/lobby) "tjj" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload) +"tjH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "tkp" = ( /obj/machinery/door/airlock/public/glass{ name = "Services Corridor" @@ -55587,12 +58124,13 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"tkK" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/grass, -/area/station/service/chapel) +"tkN" = ( +/obj/structure/closet/crate, +/obj/item/camera, +/obj/item/c_tube, +/obj/item/broken_bottle, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "tkS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -55617,16 +58155,10 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"tly" = ( +"tlC" = ( /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/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/engineering/atmos) +/turf/closed/wall/r_wall, +/area/station/maintenance/department/electrical) "tlI" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/rock/pile/jungle/style_random, @@ -55646,17 +58178,24 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"tmk" = ( +/obj/machinery/power/emitter, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "tms" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"tmN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ +"tmL" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/curved/flipped{ dir = 4 }, -/turf/open/floor/grass, -/area/station/service/chapel) +/turf/open/space/basic, +/area/space/nearstation) "tmQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55732,22 +58271,24 @@ }, /turf/open/floor/tram, /area/station/maintenance/port/aft) +"tnF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/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/maintenance/department/engine/atmos) +"tnH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "tnO" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"tod" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "tof" = ( /turf/closed/wall/rust, /area/station/ai_monitored/turret_protected/ai) @@ -55830,23 +58371,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"toL" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos{ - name = "Central Atmospherics" - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/engineering/atmos) +"toK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/suit_storage_unit/atmos, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "toT" = ( /obj/structure/flora/rock/pile/jungle/style_random, /obj/structure/window/reinforced/spawner/directional/west, @@ -55868,13 +58399,6 @@ /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron, /area/station/security/brig/entrance) -"tpd" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 9 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/station/engineering/supermatter) "tpk" = ( /obj/machinery/vending/wardrobe/law_wardrobe, /obj/effect/turf_decal/siding/wood{ @@ -55898,13 +58422,6 @@ }, /turf/open/floor/wood, /area/station/commons/fitness/recreation) -"tpH" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/item/pickaxe, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "tpK" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 4 @@ -56023,11 +58540,6 @@ dir = 1 }, /area/station/hallway/secondary/dock) -"trd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "trk" = ( /obj/effect/turf_decal/bot, /obj/effect/mapping_helpers/broken_floor, @@ -56053,6 +58565,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"trA" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "trI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56079,6 +58601,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/tram) +"tsl" = ( +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "tst" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 4 @@ -56103,11 +58633,17 @@ "tsF" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central/fore) -"tsL" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) +"tsR" = ( +/obj/machinery/electrolyzer, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/disposal/incinerator) +"ttg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "tts" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56199,13 +58735,6 @@ "tuZ" = ( /turf/closed/wall, /area/station/security/brig/entrance) -"tvg" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/modular_computer/preset/cargochat/medical{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "tvM" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -56327,6 +58856,14 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"twL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/dresser, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/ce) "twN" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -56361,6 +58898,13 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"txd" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/machinery/air_sensor/carbon_tank, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos/space_catwalk) "txh" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_suite) @@ -56373,6 +58917,18 @@ "txN" = ( /turf/closed/wall, /area/station/security/prison/workout) +"txS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "txV" = ( /obj/machinery/button/door/directional/east{ id = "AuxToilet3"; @@ -56414,6 +58970,22 @@ /obj/effect/mapping_helpers/airlock/access/all/command/captain, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"tyu" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "tyx" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -56444,6 +59016,19 @@ dir = 4 }, /area/station/science/ordnance/testlab) +"tzh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + 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/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "tzo" = ( /obj/structure/alien/egg/burst, /obj/structure/alien/weeds, @@ -56496,14 +59081,6 @@ }, /turf/open/floor/plating, /area/station/service/janitor) -"tzF" = ( -/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/steam_vent, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "tzH" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/vending/wardrobe/gene_wardrobe, @@ -56512,6 +59089,25 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"tzJ" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"tAm" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + 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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "tAq" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -56671,6 +59267,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/workout) +"tCc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"tCk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/service/chapel) "tCm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red{ @@ -56727,6 +59341,20 @@ /obj/machinery/shower/directional/west, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) +"tDl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "tDn" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/prison) @@ -56823,6 +59451,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tEU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/service/chapel) "tEW" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -56850,6 +59485,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"tFB" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/station/engineering/atmos) "tFE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56897,19 +59539,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"tGk" = ( -/obj/machinery/flasher/directional/west{ - id = "AI"; - pixel_y = 26 - }, -/obj/structure/cable, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Secondary AI Core Access"; - req_access = list("ai_upload"); - pixel_x = -4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "tGp" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine, @@ -56939,6 +59568,9 @@ /obj/machinery/computer/records/security, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) +"tGK" = ( +/turf/closed/wall/rust, +/area/station/maintenance/department/electrical) "tGU" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/blue, @@ -56946,6 +59578,13 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"tHa" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) "tHh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -56978,6 +59617,14 @@ /obj/machinery/research/anomaly_refinery, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"tHY" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "tIc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57006,6 +59653,18 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"tIB" = ( +/obj/item/clothing/head/cone{ + pixel_x = 16; + pixel_y = 7 + }, +/obj/item/clothing/head/cone{ + pixel_x = -1; + pixel_y = -5 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "tIE" = ( /turf/closed/wall/mineral/titanium, /area/station/commons/fitness/recreation/entertainment) @@ -57022,6 +59681,22 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"tIN" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/toy/figure/engineer{ + pixel_y = 11; + pixel_x = 17 + }, +/obj/item/geiger_counter{ + pixel_x = 7; + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) "tJe" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -57098,11 +59773,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) -"tJO" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/brown/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos) "tJX" = ( /turf/open/floor/plating, /area/station/maintenance/aft) @@ -57160,23 +59830,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/security/processing) -"tKO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/button/door/directional/east{ - id = "engsm"; - name = "Radiation Shutters Control"; - req_access = list("engineering") - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/meter, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "tKR" = ( /obj/structure/cable, /obj/machinery/power/smes, @@ -57244,6 +59897,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"tMm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/machinery/meter, +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/station/engineering/supermatter/room) "tMs" = ( /obj/structure/cable, /obj/machinery/telecomms/server/presets/service, @@ -57268,6 +59931,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"tMJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "tMR" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -57347,6 +60017,26 @@ /obj/structure/bed/maint, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"tNH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/clothing/gloves/color/red/insulated, +/obj/item/clothing/ears/earmuffs{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson{ + pixel_y = -1; + pixel_x = -14 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 3; + pixel_x = -14 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "tNS" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57366,6 +60056,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/kitchen/small, /area/station/maintenance/aft) +"tNV" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/random/directional/north, +/obj/item/airlock_painter, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) +"tOc" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "tOk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57445,21 +60146,6 @@ }, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"tPA" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/east{ - id = "qm_warehouse_aft"; - name = "Warehouse Door Control"; - pixel_x = -24; - pixel_y = -23; - req_access = list("cargo") - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "tPH" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/south, @@ -57507,6 +60193,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) +"tQZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/fire/directional/east, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "tRc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57526,6 +60221,14 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/security/courtroom) +"tRj" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/turf/open/floor/catwalk_floor, +/area/station/engineering/supermatter/room) "tRp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -57541,8 +60244,8 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -57562,6 +60265,15 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/maintenance/central/greater) +"tRM" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/table/wood, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/obj/item/stack/cable_coil/five, +/turf/open/floor/plating, +/area/station/commons/vacant_room/commissary) "tSe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -57572,10 +60284,24 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"tSg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "tSh" = ( /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"tSi" = ( +/obj/machinery/light/cold/directional/west, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "tSn" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -57626,10 +60352,25 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) -"tTd" = ( -/obj/effect/turf_decal/sand/plating, +"tSN" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, /turf/open/floor/plating, -/area/station/maintenance/department/engine) +/area/station/engineering/supermatter) +"tSV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 5 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/smooth_corner{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "tTg" = ( /obj/structure/table, /obj/item/trash/cheesie{ @@ -57676,11 +60417,21 @@ /obj/machinery/light/very_dim/directional/east, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"tTR" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos) +"tTG" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/grass, +/area/station/service/chapel) +"tTK" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "tTW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57818,22 +60569,19 @@ }, /turf/open/floor/plating, /area/station/science/robotics/lab) +"tVN" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 6 + }, +/obj/machinery/meter, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/supermatter) "tVR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron, /area/station/cargo/storage) -"tWj" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "tWo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -57906,12 +60654,15 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"tXK" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/vending/wardrobe/atmos_wardrobe, +"tXL" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) +/area/station/engineering/lobby) "tXP" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green/opposingcorners{ @@ -57919,6 +60670,14 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"tXS" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/small/directional/west, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/turf/open/floor/catwalk_floor, +/area/station/engineering/supermatter/room) "tXT" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -57957,6 +60716,16 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"tYn" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "tYq" = ( /turf/closed/wall, /area/station/security/execution/transfer) @@ -57967,6 +60736,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"tYC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) "tYH" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58079,6 +60857,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"tZI" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "tZJ" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -58088,6 +60873,12 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"tZP" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/bot, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "tZR" = ( /obj/effect/turf_decal/tile/neutral/full, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -58105,6 +60896,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"uaa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "uab" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58117,6 +60914,21 @@ /obj/machinery/smartfridge/chemistry/virology/preloaded, /turf/open/floor/iron/white, /area/station/medical/virology) +"uah" = ( +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_x = 9; + pixel_y = -6 + }, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) +"uao" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/flora/tree/stump, +/turf/open/floor/grass, +/area/station/service/chapel) "uax" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58126,6 +60938,21 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) +"uaE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"uaK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/engineering/atmos) "uaP" = ( /obj/structure/mirror/directional/east, /obj/structure/chair/stool/bar/directional/east, @@ -58136,6 +60963,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) +"uaT" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "uaV" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/window/reinforced/spawner/directional/north, @@ -58145,6 +60985,17 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"uaZ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "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, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "ubb" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -58162,6 +61013,27 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"ubh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/item/lead_pipe, +/obj/item/pipe_dispenser, +/obj/item/stack/pipe_cleaner_coil, +/obj/item/pipe, +/obj/item/pipe, +/obj/item/pipe, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"ubs" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/space/basic, +/area/space/nearstation) "uby" = ( /turf/closed/wall, /area/station/security/prison/garden) @@ -58357,6 +61229,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"udP" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) "udZ" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -58398,15 +61276,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/smooth, /area/station/command/bridge) -"ueD" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/engineering/gravity_generator) "ueG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -58416,6 +61285,28 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"ueH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "Privacy Shutters" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Head of Personnel's Desk"; + req_access = list("hop") + }, +/obj/machinery/door/window/left/directional/west{ + name = "Reception Window" + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/iron/textured_large, +/area/station/command/heads_quarters/hop) "ueX" = ( /turf/closed/wall/rust, /area/station/maintenance/port/fore) @@ -58461,12 +61352,15 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ugb" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/engineering/break_room) +"ufR" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/door/airlock/engineering/glass{ + name = "Freezer Room" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/engineering/supermatter/room) "uge" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -58495,6 +61389,15 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"ugA" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) "ugC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58504,6 +61407,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"ugF" = ( +/obj/machinery/power/emitter, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "ugH" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 8 @@ -58544,6 +61454,12 @@ }, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"uhh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/iron/stairs/left{ + dir = 1 + }, +/area/station/engineering/atmos) "uhj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58615,6 +61531,14 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) +"uic" = ( +/obj/machinery/computer/atmos_alert{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "uid" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58699,14 +61623,6 @@ /obj/item/stack/sheet/cardboard, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"uju" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/boxing/yellow, -/obj/item/clothing/gloves/boxing/green{ - pixel_y = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "ujA" = ( /turf/closed/wall/r_wall, /area/station/security/warden) @@ -58754,6 +61670,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"ukA" = ( +/obj/machinery/pipedispenser/disposal, +/obj/structure/spider/stickyweb, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "ukB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58805,29 +61726,6 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"ulo" = ( -/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/table/reinforced, -/obj/machinery/door/window/left/directional/east{ - name = "Engineering Desk"; - req_access = list("engineering") - }, -/obj/item/folder/yellow{ - pixel_x = 4 - }, -/obj/item/pen{ - pixel_x = 5 - }, -/obj/structure/desk_bell{ - pixel_x = -8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) "ulq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58847,9 +61745,6 @@ "ulO" = ( /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"ulS" = ( -/turf/open/floor/wood/large, -/area/station/service/chapel) "ume" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -58862,6 +61757,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"umn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "South Ports to Wastes" + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "umr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -58869,6 +61777,9 @@ }, /turf/open/floor/engine, /area/station/science/explab) +"ums" = ( +/turf/closed/wall/r_wall, +/area/station/security/checkpoint/engineering) "umx" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -58916,6 +61827,13 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"unG" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "unK" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -58979,6 +61897,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"upf" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/light/cold/dim/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "upg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, @@ -59039,6 +61965,15 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/primary/starboard) +"upG" = ( +/obj/structure/railing, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/stairs/old{ + dir = 4 + }, +/area/station/command/heads_quarters/ce) "upP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59053,6 +61988,13 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"uqe" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "uql" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -59064,6 +62006,26 @@ "uqw" = ( /turf/closed/wall/r_wall, /area/station/commons/fitness/recreation) +"uqA" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix Outlet Pump" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"uqG" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "uqH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59102,6 +62064,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"urg" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Office" + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmos_airlock_1" + }, +/turf/open/floor/iron/smooth_half{ + dir = 8 + }, +/area/station/engineering/main) "urh" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -59161,6 +62143,10 @@ }, /turf/open/floor/iron, /area/station/security) +"urz" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/room) "urB" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -59168,6 +62154,11 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/small, /area/station/hallway/secondary/dock) +"urE" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/light/cold/dim/directional/west, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "urM" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -59208,6 +62199,16 @@ "usJ" = ( /turf/open/floor/iron/kitchen/small, /area/station/maintenance/aft) +"utf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8; + initialize_directions = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "uth" = ( /obj/effect/turf_decal/plaque{ icon_state = "L2" @@ -59222,6 +62223,21 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"utv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) +"uty" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/service/chapel) "utD" = ( /obj/machinery/light_switch/directional/west, /obj/effect/turf_decal/stripes/corner{ @@ -59300,6 +62316,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/service/lawoffice) +"uus" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Lockers" + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "uuv" = ( /obj/effect/turf_decal/plaque{ icon_state = "L4" @@ -59346,6 +62372,19 @@ }, /turf/open/floor/catwalk_floor, /area/station/ai_monitored/command/nuke_storage) +"uvo" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to Mix Chamber" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) "uvu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -59362,6 +62401,20 @@ "uvA" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) +"uvB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "uwl" = ( /obj/effect/turf_decal/plaque{ icon_state = "L6" @@ -59394,6 +62447,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/command/corporate_dock) +"uwH" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/survival_pod/left/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "uwI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59445,14 +62505,6 @@ /obj/structure/trap/stun, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"uxS" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/flora/bush/sunny/style_random, -/obj/machinery/light/small/directional/west, -/turf/open/floor/grass, -/area/station/service/chapel) "uya" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -59479,13 +62531,13 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"uyE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +"uyB" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Atmospherics Project Bay" }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/atmos) "uyH" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -59503,6 +62555,16 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"uyS" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix to Engine" + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "uyZ" = ( /obj/structure/closet{ name = "Evidence Closet 4" @@ -59535,6 +62597,13 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/aft) +"uzI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "uzJ" = ( /turf/open/floor/iron, /area/station/cargo/storage) @@ -59610,6 +62679,12 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/tile, /area/station/command/bridge) +"uAT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/supermatter) "uAV" = ( /obj/structure/cable, /obj/machinery/duct, @@ -59628,15 +62703,15 @@ "uBc" = ( /turf/closed/wall/r_wall, /area/station/security/brig/entrance) -"uBg" = ( -/obj/effect/turf_decal/tile/yellow{ +"uBj" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/structure/chair/office/light{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron, +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/wood, /area/station/engineering/break_room) "uBl" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -59672,6 +62747,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs, /area/station/engineering/storage/tech) +"uBM" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "Engineering Security Doors" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/lobby) "uBQ" = ( /obj/structure/table/bronze, /obj/machinery/microwave{ @@ -59684,6 +62768,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/side, /area/station/hallway/primary/starboard) +"uCa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ + dir = 4; + piping_layer = 2 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "uCe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -59721,6 +62826,22 @@ /obj/effect/spawner/xmastree, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"uCE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/obj/structure/railing, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) +"uCH" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light/cold/dim/directional/east, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) "uCJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -59731,6 +62852,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/theater) +"uCL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "uDg" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -59859,11 +62990,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/brig) -"uEV" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "uFc" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59901,6 +63027,17 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/security/lockers) +"uFy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) "uFA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59933,6 +63070,15 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/station/service/chapel/funeral) +"uFT" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/engineering/atmos/office) "uGj" = ( /obj/effect/turf_decal/tile/green/half/contrasted, /obj/structure/table/glass, @@ -59955,6 +63101,10 @@ /obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) +"uGy" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "uGA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -59976,6 +63126,28 @@ dir = 1 }, /area/station/hallway/primary/starboard) +"uGB" = ( +/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, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) +"uGH" = ( +/obj/machinery/rnd/production/circuit_imprinter, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - Supplies" + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "uGK" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -60002,12 +63174,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/brig) -"uGP" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +"uGS" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - PROJECT" }, -/turf/open/floor/grass, -/area/station/service/chapel) +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "uGT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60077,6 +63250,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"uHq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/space/basic, +/area/space/nearstation) "uHv" = ( /obj/structure/rack, /obj/item/pipe_dispenser, @@ -60168,6 +63350,22 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"uIX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/modular_computer/preset/civilian{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) +"uJd" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"uJC" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/engineering/atmos) "uJD" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -60181,6 +63379,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/maintenance/fore/greater) +"uJH" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/machinery/shieldgen, +/turf/open/floor/iron/dark/small, +/area/station/engineering/storage_shared) "uJR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -60188,6 +63393,27 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) +"uJU" = ( +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = 5; + pixel_y = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"uKh" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/start/hangover, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "uKl" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -60229,6 +63455,19 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"uKO" = ( +/obj/structure/table/greyscale, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = -10; + pixel_y = 6 + }, +/obj/item/stack/sheet/iron/fifty{ + pixel_y = 10; + pixel_x = 2 + }, +/obj/item/clothing/glasses/welding, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "uKP" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table/wood, @@ -60237,17 +63476,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"uKQ" = ( -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Creature Pen"; - req_access = list("research") - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/science/xenobiology) "uLf" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/landmark/atmospheric_sanity/ignore_area, @@ -60274,6 +63502,14 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) +"uLB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/half, +/area/station/hallway/primary/central/fore) "uLO" = ( /obj/item/stack/sheet/cardboard{ amount = 14 @@ -60287,6 +63523,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/security/prison/work) +"uLW" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "uMa" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -60297,6 +63540,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"uMh" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "uMl" = ( /obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ @@ -60366,6 +63616,18 @@ "uMU" = ( /turf/closed/wall, /area/station/science/robotics/mechbay) +"uMV" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner, +/obj/structure/cable, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "uMW" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/glass, @@ -60390,10 +63652,22 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) +"uNk" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/machinery/shower/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/engineering/break_room) "uNn" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) +"uNO" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "uNQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/south, @@ -60431,6 +63705,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/glass, /area/station/hallway/secondary/spacebridge) +"uOk" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/window/spawner/directional/south, +/obj/machinery/vending/engivend, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/main) "uOw" = ( /turf/open/floor/iron, /area/station/maintenance/department/medical/central) @@ -60439,6 +63720,13 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"uOL" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/hfr_box/body/fuel_input, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "uOP" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/north, @@ -60452,14 +63740,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"uPq" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair/sofa/bamboo/left{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/service/chapel) +"uPf" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "uPr" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/bot, @@ -60498,6 +63782,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"uPN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall, +/area/station/engineering/supermatter/room) "uPO" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, @@ -60549,17 +63838,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"uQK" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/obj/machinery/camera/directional/south, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white/side, -/area/station/hallway/primary/starboard) "uQR" = ( /obj/machinery/exodrone_launcher, /obj/machinery/firealarm/directional/east, @@ -60595,17 +63873,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"uRu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/yellow/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "uRF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -60616,6 +63883,23 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/execution/education) +"uRO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "uRR" = ( /obj/structure/table, /obj/item/plant_analyzer, @@ -60628,6 +63912,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/small, /area/station/security/execution/education) +"uRX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/flora/tree/jungle/small/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"uRY" = ( +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"uSa" = ( +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "uSi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60655,6 +63955,14 @@ /obj/effect/landmark/navigate_destination/tcomms, /turf/open/floor/iron, /area/station/science/lower) +"uSC" = ( +/obj/effect/landmark/start/assistant, +/obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "uSG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60728,13 +64036,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"uTS" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/door/window/survival_pod/left/directional/east, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "uUb" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -60765,12 +64066,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"uUp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "uUq" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/newscaster/directional/south, /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/commons/dorms) +"uUA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "uUE" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -60783,6 +64097,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"uUG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "uUI" = ( /obj/structure/table, /obj/effect/turf_decal/bot, @@ -60935,29 +64255,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"uWM" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/west{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = -10 - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel"; - pixel_x = -26; - pixel_y = -13 - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "uWQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ @@ -60975,20 +64272,6 @@ "uXb" = ( /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"uXo" = ( -/obj/item/kirbyplants/random, -/obj/machinery/button/door/directional/north{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_x = 24; - pixel_y = 23; - req_access = list("atmospherics") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "uXs" = ( /obj/structure/window/spawner/directional/east, /obj/structure/window/spawner/directional/west, @@ -61011,11 +64294,39 @@ "uXC" = ( /turf/closed/wall, /area/station/science/lower) +"uXI" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"uXN" = ( +/obj/structure/altar_of_gods, +/turf/open/floor/wood/large, +/area/station/service/chapel) +"uXS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "uXU" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft) +"uXV" = ( +/obj/structure/cable, +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Creature Pen"; + req_access = list("research") + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/science/xenobiology) "uXY" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/nuke_storage) @@ -61033,20 +64344,6 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"uYx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/layer_manifold/brown/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"uYy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "uYD" = ( /obj/structure/table, /obj/effect/turf_decal/tile/green/fourcorners, @@ -61059,22 +64356,6 @@ /obj/item/pai_card, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"uYG" = ( -/obj/machinery/door/airlock/engineering{ - name = "Smoke Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/textured_half{ - dir = 1 - }, -/area/station/engineering/atmospherics_engine) "uYH" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/stripes/end, @@ -61104,6 +64385,22 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/courtroom) +"uZw" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/machinery/light_switch/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/turf/open/floor/iron/smooth, +/area/station/service/greenroom) "uZA" = ( /obj/structure/chair{ dir = 1; @@ -61111,27 +64408,18 @@ }, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"uZB" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/smes/full, +/turf/open/floor/plating, +/area/station/maintenance/department/prison) "uZG" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white/side{ dir = 1 }, /area/station/science/lower) -"uZR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Atmos to Loop" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "uZY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61195,18 +64483,14 @@ "vbK" = ( /turf/closed/wall, /area/station/science/research) -"vbM" = ( -/obj/structure/cable, -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Creature Pen"; - req_access = list("research") +"vbL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 }, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Creature Pen"; - req_access = list("research") - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/science/xenobiology) +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "vbO" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -61229,6 +64513,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"vcm" = ( +/obj/item/pickaxe, +/turf/open/misc/asteroid, +/area/station/maintenance/department/electrical) "vct" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61282,6 +64570,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"vcR" = ( +/turf/open/floor/iron/stairs/medium{ + dir = 1 + }, +/area/station/engineering/atmos) "vcW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61311,6 +64604,26 @@ /obj/structure/railing/corner, /turf/open/space/basic, /area/space/nearstation) +"vdi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "vdj" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/filingcabinet/chestdrawer{ @@ -61321,19 +64634,58 @@ dir = 1 }, /area/station/command/heads_quarters/hop) +"vdl" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/east{ + id = "qm_warehouse_aft"; + name = "Warehouse Door Control"; + pixel_x = -24; + pixel_y = -23; + req_access = list("cargo") + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vdm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"vdp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Turbine to Waste" +"vdt" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 5 + }, +/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 = 5 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/small, +/area/station/engineering/main) +"vdw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) +"vdB" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/tank, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "vdH" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue{ @@ -61341,6 +64693,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"vdS" = ( +/obj/structure/closet/firecloset, +/obj/item/clothing/glasses/meson, +/obj/item/radio/intercom/directional/east, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "vdX" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -61371,6 +64730,12 @@ "vej" = ( /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"veo" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta/corner, +/obj/structure/chair/stool/directional/east, +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine/atmos) "veq" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -61442,16 +64807,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/lab) -"vfA" = ( -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "vfD" = ( /obj/effect/turf_decal/siding/thinplating_new/light, /obj/structure/reagent_dispensers/fueltank, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"vfG" = ( +/obj/structure/hedge, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "vfK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -61501,6 +64866,20 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) +"vgp" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Atmospherics 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/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmos_airlock_1" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "vgy" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -61523,6 +64902,19 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"vgJ" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/obj/item/pen{ + pixel_x = 11 + }, +/obj/item/paper_bin{ + pixel_x = -7; + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen/small, +/area/station/hallway/secondary/service) "vgN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -61581,6 +64973,11 @@ dir = 8 }, /area/station/science/research) +"viw" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "viy" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61593,12 +64990,13 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/science/server) -"viC" = ( -/obj/machinery/computer/department_orders/science{ - dir = 1 +"viE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/turf/open/floor/iron/white, -/area/station/science/research) +/obj/item/stack/cable_coil/cut, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "viK" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61645,6 +65043,15 @@ }, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"vja" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/engineering/hallway) "vjb" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -61683,6 +65090,13 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/command/teleporter) +"vjK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "vjZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61696,15 +65110,6 @@ "vkh" = ( /turf/closed/wall, /area/station/service/bar) -"vkk" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "vkn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61735,18 +65140,27 @@ }, /turf/open/floor/iron, /area/station/science/research) -"vkw" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 6 - }, -/obj/structure/fireaxecabinet/directional/north, +"vkz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/turf/open/floor/wood/large, +/area/station/service/chapel) +"vkD" = ( +/obj/structure/table, +/obj/item/stack/ore/gold{ + pixel_y = 13; + pixel_x = 5 + }, +/obj/item/stack/ore/uranium{ + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"vkG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "vkJ" = ( /obj/item/book/manual/wiki/security_space_law{ pixel_x = 9; @@ -61764,11 +65178,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/command/heads_quarters/qm) -"vkP" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/break_room) "vkS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61845,6 +65254,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"vlC" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/grille/broken, +/obj/item/stack/rods/two, +/obj/effect/decal/cleanable/molten_object, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "vlV" = ( /turf/closed/wall, /area/station/maintenance/aft) @@ -61948,14 +65364,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood, /area/station/service/chapel/office) -"vna" = ( -/obj/machinery/atmospherics/components/tank/nitrous{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos) "vnb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -62006,6 +65414,21 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/chapel/office) +"vnp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "vnq" = ( /obj/structure/cable, /obj/structure/bed/medical/anchored{ @@ -62033,6 +65456,16 @@ /obj/machinery/door/airlock/glass, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"vnz" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "vnF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -62132,19 +65565,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/aft) -"vpl" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/bridge_pipe/brown/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"vpm" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) "vpq" = ( /obj/machinery/door/poddoor/massdriver_ordnance, /obj/effect/turf_decal/stripes/end, @@ -62168,6 +65588,20 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron, /area/station/service/bar) +"vpS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "vpT" = ( /obj/structure/chair/sofa/bench{ dir = 1 @@ -62192,6 +65626,19 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"vpZ" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering-Lobby" + }, +/turf/open/floor/iron/diagonal, +/area/station/engineering/lobby) "vqb" = ( /obj/structure/broken_flooring/singular/directional/east, /obj/effect/spawner/random/trash/graffiti{ @@ -62214,6 +65661,11 @@ "vqp" = ( /turf/open/floor/carpet/lone, /area/station/service/theater) +"vqw" = ( +/obj/effect/decal/cleanable/glass/titanium, +/obj/item/stack/rods/two, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "vqH" = ( /obj/structure/railing{ dir = 8 @@ -62240,6 +65692,16 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood, /area/station/service/chapel/office) +"vrh" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/half{ + dir = 8 + }, +/area/station/engineering/main) "vrn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -62263,12 +65725,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/carpet/lone, /area/station/service/theater) -"vrw" = ( -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmospherics_engine) "vrz" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -62294,6 +65750,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"vrK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "vrO" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ @@ -62423,6 +65888,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/primary/port) +"vtw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "vtA" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -62443,18 +65918,30 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"vtJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 10 + }, +/obj/machinery/power/terminal, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/electrical) "vtL" = ( /obj/structure/cable, /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"vtV" = ( -/obj/machinery/power/smes/engineering, -/obj/effect/decal/cleanable/dirt, +"vuk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, /obj/structure/cable, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) +/turf/open/space/basic, +/area/space/nearstation) "vum" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/north, @@ -62466,6 +65953,18 @@ "vuo" = ( /turf/closed/wall/r_wall, /area/station/commons/vacant_room/commissary) +"vuq" = ( +/obj/effect/turf_decal/tile/yellow{ + 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 = 6 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "vuu" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -62557,11 +66056,28 @@ }, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/aft) +"vvg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste to Port Filter" + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "vvl" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/small/broken/directional/west, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"vvs" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "vvz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -62710,6 +66226,13 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"vxX" = ( +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "vyi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62732,6 +66255,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/corporate_dock) +"vyM" = ( +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "vyR" = ( /turf/open/floor/glass, /area/station/command/corporate_dock) @@ -62786,12 +66316,25 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood/parquet, /area/station/service/library) +"vzK" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ + dir = 4 + }, +/turf/open/floor/engine/helium, +/area/station/ai_monitored/turret_protected/ai) "vzM" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/full, /obj/structure/sink/kitchen/directional/south, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"vzP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "vzV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62800,6 +66343,22 @@ }, /turf/open/floor/iron, /area/station/security/tram) +"vzW" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) +"vzX" = ( +/obj/machinery/door/airlock/command{ + name = "Centcom Dock" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/turf/open/floor/iron/textured_half, +/area/station/command/corporate_dock) "vzY" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -62811,6 +66370,21 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/security/tram) +"vAb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/structure/cable, +/obj/item/clothing/head/cone{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/clothing/head/cone{ + pixel_x = 11; + pixel_y = -9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "vAo" = ( /obj/item/radio/intercom/directional/north{ broadcasting = 1; @@ -62849,6 +66423,14 @@ }, /turf/open/floor/iron/small, /area/station/security/tram) +"vAA" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "vAC" = ( /obj/structure/flora/bush/large/style_random{ pixel_y = -3 @@ -62871,6 +66453,14 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"vAR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "vAT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62955,15 +66545,13 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/ordnance/storage) -"vDA" = ( +"vDg" = ( /obj/structure/chair{ - pixel_y = -2 + dir = 1 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "vDB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -62979,6 +66567,10 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"vDD" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "vDK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -62999,6 +66591,14 @@ /obj/machinery/griddle, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"vEb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/iron/kitchen/small, +/area/station/security/prison/mess) "vEe" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/small/directional/north, @@ -63025,6 +66625,12 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/starboard) +"vEC" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "vEI" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -63036,9 +66642,47 @@ "vEP" = ( /turf/closed/wall/r_wall, /area/station/security/brig) +"vEQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/smooth, +/area/station/engineering/engine_smes) "vEW" = ( /turf/closed/wall/r_wall, /area/station/security/prison/shower) +"vEZ" = ( +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"vFf" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/meter, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "vFh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/blobstart, @@ -63197,6 +66841,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/office) +"vHk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/window/left/directional/east{ + name = "Mass Driver Door"; + req_access = list("ordnance") + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/ordnance/testlab) "vHu" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/closet/secure_closet/security/sec, @@ -63263,6 +66918,22 @@ }, /turf/open/floor/wood, /area/station/service/chapel/office) +"vIp" = ( +/obj/structure/table, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/phone{ + pixel_x = -6; + pixel_y = 7 + }, +/turf/open/floor/iron/small, +/area/station/engineering/engine_smes) "vIt" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -63272,6 +66943,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"vIF" = ( +/turf/closed/wall, +/area/station/engineering/atmos/pumproom) "vIJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -63310,6 +66984,12 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) +"vJe" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/south, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "vJn" = ( /obj/structure/closet/crate/coffin, /obj/structure/window/spawner/directional/west, @@ -63375,15 +67055,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/security/brig/entrance) -"vJW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/grass, -/area/station/service/chapel) "vKa" = ( /obj/structure/closet/crate/coffin, /obj/effect/turf_decal/weather, @@ -63393,6 +67064,12 @@ "vKb" = ( /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"vKe" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/power/smes/full, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/construction) "vKi" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -63401,6 +67078,26 @@ /obj/machinery/computer/crew, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) +"vKn" = ( +/obj/structure/chair/office/light{ + name = "blue"; + color = "#6495ED"; + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/wood, +/area/station/command/heads_quarters/ce) +"vKs" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "vKy" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -63539,10 +67236,7 @@ dir = 8 }, /obj/effect/turf_decal/stripes/box, -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) "vLT" = ( @@ -63552,6 +67246,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"vMo" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/tank{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "vMr" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/alien/weeds, @@ -63652,14 +67355,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"vNK" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "vNV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63679,6 +67374,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) +"vOL" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/engineering/main) "vOP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -63751,6 +67461,11 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"vPY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vQk" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -63824,18 +67539,20 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/smooth_large, /area/station/service/bar) -"vRU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/floor, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) +"vRH" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "vSg" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) +"vSh" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "vSj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/west, @@ -63844,16 +67561,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"vSm" = ( -/obj/machinery/door/airlock/hatch, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/department/engine) "vSu" = ( /obj/structure/chair{ dir = 8 @@ -63874,6 +67581,12 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"vSE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "vSL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -63894,6 +67607,10 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"vSX" = ( +/obj/structure/flora/bush/sunny/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "vSY" = ( /obj/structure/table, /obj/item/chisel{ @@ -63911,6 +67628,28 @@ /obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) +"vTg" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/item/storage/pill_bottle/potassiodide{ + pixel_y = 12; + pixel_x = -6 + }, +/obj/item/pen/screwdriver, +/obj/item/radio/intercom/directional/west, +/obj/item/geiger_counter{ + pixel_x = 7; + pixel_y = 14 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/storage/gas) +"vTj" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "vTm" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/condiment, @@ -63948,6 +67687,13 @@ }, /turf/open/floor/iron, /area/station/commons/storage/art) +"vTE" = ( +/obj/item/trash/shok_roks/tropical, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/maintenance/department/engine/atmos) "vTG" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/department/medical/central) @@ -63991,6 +67737,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) +"vUh" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vUq" = ( /obj/machinery/restaurant_portal/bar, /obj/machinery/firealarm/directional/west, @@ -64022,6 +67775,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/security/detectives_office) +"vUM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "justice gas pump" + }, +/obj/item/wrench, +/obj/machinery/door/window/right/directional/east{ + name = "Gas Ports" + }, +/turf/open/floor/plating, +/area/station/security/execution/education) "vUP" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east, @@ -64098,16 +67868,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"vVE" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "vVF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ @@ -64184,6 +67944,17 @@ }, /turf/open/space/basic, /area/space) +"vWI" = ( +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Creature Pen"; + req_access = list("research") + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/science/xenobiology) "vWM" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/fore) @@ -64272,19 +68043,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"vYg" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/corner, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "vYj" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -64386,16 +68144,17 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/station/security/courtroom) -"vZJ" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Port" +"vZM" = ( +/obj/item/clothing/head/cone{ + pixel_x = -17; + pixel_y = -7 }, -/obj/structure/fireaxecabinet/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 4 }, -/turf/open/floor/iron/dark, +/obj/effect/decal/cleanable/glass/plasma, +/turf/open/floor/engine, /area/station/engineering/atmos) "vZW" = ( /obj/structure/chair/sofa/bench/right{ @@ -64413,6 +68172,18 @@ /obj/item/folder/red, /turf/open/floor/iron, /area/station/security/courtroom) +"wap" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/stairs/old{ + dir = 8 + }, +/area/station/engineering/break_room) "wat" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -64424,6 +68195,22 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) +"way" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"waH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "waN" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -64451,6 +68238,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"waX" = ( +/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/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "wbb" = ( /obj/item/kirbyplants/random, /obj/effect/mapping_helpers/broken_floor, @@ -64468,11 +68262,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"wbj" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/engineering/break_room) "wbk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -64491,6 +68280,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/science/lab) +"wby" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "wbH" = ( /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, @@ -64582,6 +68379,11 @@ "wdk" = ( /turf/closed/mineral/random/stationside, /area/station/maintenance/starboard/greater) +"wdo" = ( +/obj/structure/fluff/broken_canister_frame, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "wdp" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -64592,6 +68394,11 @@ }, /turf/open/space/basic, /area/space/nearstation) +"wdJ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5, +/turf/open/space/basic, +/area/space/nearstation) "wdS" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 4 @@ -64605,6 +68412,10 @@ /obj/structure/chair/stool/bamboo, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) +"wdY" = ( +/obj/effect/spawner/random/structure/table, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "wec" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 1 @@ -64620,12 +68431,33 @@ "wen" = ( /turf/closed/wall, /area/station/ai_monitored/turret_protected/aisat/maint) +"weA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/stripes/white/end{ + name = "blue"; + color = "#6495ED" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/engineering/lobby) "weT" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"weU" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Air" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos/office) "wfa" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -64675,6 +68507,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/research) +"wfE" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/vending/tool, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wfP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -64724,6 +68563,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) +"wgl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "wgn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -64788,6 +68641,13 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"whl" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) "wht" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -64831,6 +68691,11 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) +"whM" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "whX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock{ @@ -64840,38 +68705,12 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"wib" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) -"wik" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix to Engine" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) "win" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/closed/wall/r_wall, /area/station/security/brig/entrance) -"wiw" = ( -/obj/structure/cable, -/obj/structure/bed, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/item/bedsheet/ce, -/obj/effect/landmark/start/chief_engineer, -/obj/structure/secure_safe/directional/south, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/ce) "wix" = ( /obj/item/kirbyplants/random, /obj/machinery/newscaster/directional/west, @@ -64913,6 +68752,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/space/nearstation) +"wiR" = ( +/obj/structure/cable, +/turf/closed/wall, +/area/station/engineering/engine_smes) "wiT" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/newscaster/directional/south, @@ -64928,17 +68771,6 @@ "wja" = ( /turf/closed/wall/r_wall, /area/station/commons/toilet/auxiliary) -"wjn" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/break_room) "wjr" = ( /obj/structure/tank_holder/extinguisher, /turf/open/floor/iron/white, @@ -64947,6 +68779,13 @@ /obj/structure/filingcabinet, /turf/open/floor/iron/dark/small, /area/station/security/detectives_office) +"wjK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/flora/bush/sunny/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "wjM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -65001,13 +68840,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) -"wkl" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/computer/department_orders/service, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/kitchen/small, -/area/station/hallway/secondary/service) "wkm" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/decal/cleanable/dirt, @@ -65019,11 +68851,30 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/hallway/secondary/recreation) +"wkU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/space/basic, +/area/space/nearstation) "wla" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) +"wld" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/rcl/pre_loaded, +/obj/item/stock_parts/cell/high{ + pixel_y = 17 + }, +/obj/machinery/light/small/directional/south, +/obj/structure/secure_safe/directional/east, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "wlf" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/glass, @@ -65034,6 +68885,11 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"wlF" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/station/service/chapel) "wlJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65048,6 +68904,38 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) +"wlQ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) +"wlS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wlU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Release" + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"wmd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ + dir = 10 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "wme" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -65134,6 +69022,27 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"wnw" = ( +/obj/machinery/pdapainter/engineering, +/obj/effect/turf_decal/bot, +/obj/machinery/light/cold/directional/south, +/obj/machinery/button/door/directional/south{ + id = "ceprivacy"; + name = "Privacy Shutters Control"; + pixel_x = 9 + }, +/obj/machinery/button/door/directional/west{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_x = -2; + pixel_y = -24; + req_access = list("atmospherics") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "wnB" = ( /obj/effect/turf_decal/plaque{ icon_state = "L1" @@ -65160,6 +69069,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"wnR" = ( +/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/small, +/area/station/engineering/break_room) "wnY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65185,16 +69102,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"woe" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/sign/warning/engine_safety/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "woi" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/starboard/fore) @@ -65213,6 +69120,12 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"woB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/station/service/chapel) "woD" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -65237,8 +69150,8 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/machinery/disposal/bin, /obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark, /area/station/security/office) "woT" = ( @@ -65276,17 +69189,6 @@ /obj/effect/turf_decal/tile/dark_red/fourcorners, /turf/open/floor/iron, /area/station/security/execution/transfer) -"wpE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/remains/human{ - pixel_x = 6; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "wpO" = ( /turf/closed/wall/r_wall, /area/station/security/processing) @@ -65298,6 +69200,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"wpY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "wqb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65314,14 +69227,6 @@ "wqj" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) -"wqm" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "wqs" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -65342,6 +69247,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) +"wqP" = ( +/turf/closed/wall/r_wall/rust, +/area/station/maintenance/department/electrical) +"wqW" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + 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 = 9 + }, +/turf/open/floor/wood, +/area/station/engineering/main) "wqY" = ( /obj/machinery/camera/autoname/directional/east, /obj/machinery/light/small/directional/east, @@ -65441,16 +69363,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) -"wsL" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "wsR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -65460,16 +69372,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"wsZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/layer_manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "wta" = ( /obj/structure/railing/corner/end/flip, /obj/effect/mapping_helpers/broken_floor, @@ -65546,6 +69448,11 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) +"wtG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/red/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "wtT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65575,30 +69482,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"wuk" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_y = 4 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/clothing/mask/gas{ - pixel_y = 4 - }, -/obj/item/clothing/mask/gas, -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) "wum" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -65651,24 +69534,6 @@ "wuM" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) -"wvg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ - dir = 8 - }, -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/machinery/computer/security/telescreen/interrogation{ - dir = 8; - name = "isolation room monitor"; - network = list("isolation"); - pixel_x = 30 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "wvn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65676,6 +69541,11 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/catwalk_floor/iron_dark, /area/station/service/library) +"wvo" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/kitchen/small, +/area/station/hallway/secondary/service) "wvv" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -65694,6 +69564,12 @@ /obj/machinery/light/floor, /turf/open/floor/iron/white/small, /area/station/science/cubicle) +"wvT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "wvX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -65777,15 +69653,23 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron/cafeteria, /area/station/maintenance/starboard/fore) -"wxt" = ( -/obj/machinery/power/emitter, +"wxp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, /obj/structure/cable, -/turf/open/floor/plating, +/turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) "wxu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/maintenance/starboard/central) +"wxG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/engine/atmos) "wxR" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -65874,16 +69758,6 @@ /obj/effect/spawner/random/decoration/flower, /turf/open/floor/wood, /area/station/service/chapel/office) -"wyn" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/service/chapel) -"wyt" = ( -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "wyy" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/computer/scan_consolenew{ @@ -65896,6 +69770,19 @@ /obj/machinery/light/warm/directional/east, /turf/open/floor/iron/dark, /area/station/science/genetics) +"wyH" = ( +/obj/machinery/door/airlock/maintenance{ + name = "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, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "wyK" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/broken_floor, @@ -65921,23 +69808,29 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/command/heads_quarters/hos) -"wyP" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 +"wyU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/break_room) +/obj/machinery/light/cold/directional/north, +/obj/machinery/meter, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "wyY" = ( /obj/structure/disposalpipe/segment, /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) +"wyZ" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "wzb" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -65961,6 +69854,26 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron/smooth, /area/station/cargo/office) +"wzv" = ( +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"wzB" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/barricade/wooden, +/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/atmospherics_engine) +"wzF" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) "wzK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65983,6 +69896,12 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/breakroom) +"wAf" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "wAj" = ( /obj/structure/table/wood, /obj/machinery/computer/records/medical/laptop{ @@ -66015,6 +69934,13 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"wAM" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "wAS" = ( /obj/structure/table/wood, /obj/item/hand_labeler, @@ -66098,14 +70024,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/space/basic, /area/space/nearstation) -"wCp" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "wCt" = ( /obj/machinery/flasher/directional/east{ id = "hopflash" @@ -66166,12 +70084,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"wCQ" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "wCR" = ( /turf/closed/wall, /area/station/cargo/boutique) @@ -66200,6 +70112,13 @@ /obj/item/stack/sheet/iron/ten, /turf/open/floor/wood/tile, /area/station/commons/vacant_room/commissary) +"wDF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "wDG" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random/fullysynthetic, @@ -66217,6 +70136,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"wDM" = ( +/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/plating, +/area/station/maintenance/department/engine/atmos) "wDV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -66230,6 +70156,19 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) +"wEc" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/twenty, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/stack/sheet/mineral/titanium, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "wEf" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -66265,6 +70204,12 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"wEU" = ( +/obj/structure/transit_tube/horizontal{ + dir = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "wEV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -66309,10 +70254,24 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"wFV" = ( +/obj/item/stack/sheet/iron, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "wGh" = ( /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"wGo" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/rack, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, +/obj/machinery/status_display/evac/directional/south, +/obj/item/tank/internals/emergency_oxygen, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/engineering/hallway) "wGq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66355,51 +70314,10 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"wHa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/effect/decal/cleanable/ash{ - pixel_x = -16 - }, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) "wHg" = ( /obj/structure/filingcabinet/filingcabinet, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"wHh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"wHl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/grass, -/area/station/service/chapel) "wHE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66407,6 +70325,23 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/port) +"wHH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"wHL" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/transit_tube/station/dispenser/reverse/flipped{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "wHN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66459,19 +70394,52 @@ dir = 1 }, /area/station/science/xenobiology) +"wIm" = ( +/obj/machinery/door/airlock/hatch{ + name = "Centcom Dock" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "wIp" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space/basic, /area/space/nearstation) -"wII" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +"wIu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/greyscale, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/floor/iron/grimy, +/area/station/engineering/main) "wIY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/robotics/lab) +"wJa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/power/emitter{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "wJc" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -66496,19 +70464,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"wJn" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "wJo" = ( /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) -"wJt" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "wJx" = ( /turf/closed/wall/r_wall, /area/station/security/courtroom) @@ -66542,13 +70505,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"wJU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/rnd/production/protolathe/department/engineering, -/turf/open/floor/plating, -/area/station/engineering/break_room) "wJV" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/painting/large/library{ @@ -66615,20 +70571,21 @@ /obj/structure/bookcase/random, /turf/open/floor/wood/parquet, /area/station/service/library) +"wKy" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/engineering/atmos/office) "wKz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) -"wKD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "wKG" = ( /obj/structure/alien/resin/wall, /obj/structure/alien/weeds, @@ -66716,9 +70673,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/library) -"wMm" = ( -/turf/closed/wall/rust, -/area/station/engineering/break_room) "wMA" = ( /obj/machinery/camera/directional/west, /obj/structure/bookcase/random/religion, @@ -66793,6 +70747,17 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"wNi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wNv" = ( /obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/smooth_half, @@ -66805,6 +70770,16 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"wNA" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/engineering/supermatter/room) "wNK" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, @@ -66837,6 +70812,11 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/glass, /area/station/command/heads_quarters/rd) +"wNU" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) "wNW" = ( /obj/structure/disposalpipe/junction/flip{ dir = 4 @@ -66914,6 +70894,19 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/genetics) +"wOz" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/electrical) "wOC" = ( /turf/open/floor/iron, /area/station/construction/mining/aux_base) @@ -66930,13 +70923,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"wOW" = ( -/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/department/engine) "wPd" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/lesser) @@ -66964,12 +70950,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/small, /area/station/security/detectives_office) -"wPi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor, -/turf/open/floor/wood/large, -/area/station/service/chapel) +"wPt" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "wPu" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -66986,6 +70974,22 @@ /obj/effect/landmark/start/geneticist, /turf/open/floor/iron/dark, /area/station/science/genetics) +"wPM" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "wPP" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 1 @@ -67006,15 +71010,27 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) -"wPV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +"wQa" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ +/obj/effect/decal/cleanable/glass, +/obj/machinery/light/dim/directional/north, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"wQi" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/area/station/engineering/main) "wQj" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -67124,15 +71140,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/hydroponics/garden) -"wRM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - 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/dark, -/area/station/engineering/atmos) "wRN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -67143,15 +71150,34 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"wRP" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = 8; + pixel_y = 13 + }, +/obj/item/flashlight{ + pixel_y = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/white/small, +/area/station/service/janitor) "wRU" = ( /obj/machinery/smartfridge/organ, /turf/open/floor/plating, /area/station/medical/morgue) -"wRW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/atmospheric_sanity/ignore_area, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos/project) "wSf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -67211,13 +71237,6 @@ "wSZ" = ( /turf/closed/wall/r_wall, /area/station/maintenance/hallway/abandoned_command) -"wTb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/grass, -/area/station/service/chapel) "wTd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67246,13 +71265,6 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/commons/dorms) -"wTv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/break_room) "wTH" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -67356,14 +71368,6 @@ }, /turf/open/floor/iron, /area/station/security) -"wUG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/duct, -/turf/open/floor/iron/kitchen/small, -/area/station/security/prison/mess) "wUZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -67381,6 +71385,17 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"wVh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "wVs" = ( /obj/machinery/computer/security/telescreen/interrogation{ name = "reflection room monitor"; @@ -67415,6 +71430,19 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"wWa" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/effect/landmark/event_spawn, +/turf/open/floor/grass, +/area/station/service/chapel) +"wWb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "wWc" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -67433,16 +71461,14 @@ dir = 1 }, /area/station/hallway/secondary/construction) -"wWO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "SM Bleed to Turbine" +"wWP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron, /area/station/engineering/atmos) "wWR" = ( /obj/structure/table, @@ -67519,14 +71545,6 @@ }, /turf/open/floor/iron/small, /area/station/security/brig) -"wXM" = ( -/obj/machinery/atmospherics/components/tank/nitrous{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/station/engineering/atmos) "wXO" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -67537,6 +71555,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"wXV" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "wYa" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -67678,6 +71702,15 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/security/brig/entrance) +"wZk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/table/rolling, +/obj/item/mod/module/thermal_regulator, +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "wZl" = ( /turf/closed/wall, /area/station/commons) @@ -67700,6 +71733,12 @@ }, /turf/open/floor/iron/small, /area/station/hallway/secondary/exit/departure_lounge) +"wZr" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/station/maintenance/department/engine/atmos) "wZA" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -67827,6 +71866,14 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"xaK" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Engineering Maintenance" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "xaN" = ( /turf/closed/wall, /area/station/maintenance/starboard/central) @@ -67943,6 +71990,9 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"xck" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/office) "xcq" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -67964,6 +72014,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"xcS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) "xda" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -67978,6 +72035,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"xdl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/spawner/random/trash, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "xdo" = ( /obj/machinery/firealarm/directional/north, /obj/item/kirbyplants/random/fullysynthetic, @@ -68031,6 +72096,19 @@ dir = 4 }, /area/station/science/research) +"xdJ" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Airlock" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "engine_airlock_2" + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/break_room) "xdR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68043,6 +72121,21 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) +"xed" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/storage_shared) +"xef" = ( +/obj/item/stack/rods/two, +/obj/item/book/manual/wiki/atmospherics{ + pixel_x = 5; + pixel_y = 5; + desc = "Glass shards are embedded in the cover. Hopefully you'll learn sometthing from this." + }, +/turf/open/floor/engine, +/area/station/engineering/atmos) "xen" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68085,16 +72178,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"xeD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/east, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron, -/area/station/engineering/break_room) "xeM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68137,6 +72220,21 @@ /obj/effect/spawner/random/armory/disablers, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) +"xeX" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/north{ + name = "Genetics Desk"; + req_access = list("genetics") + }, +/obj/item/folder, +/obj/item/pen{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white/textured_large, +/area/station/science/research) "xfa" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -68171,6 +72269,22 @@ /obj/structure/rack, /turf/open/floor/tram, /area/station/maintenance/port/aft) +"xfz" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) +"xfB" = ( +/mob/living/simple_animal/bot/firebot, +/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/smooth_large, +/area/station/engineering/storage_shared) "xfH" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron, @@ -68251,13 +72365,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xgB" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/brown/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "xgK" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -68352,16 +72459,13 @@ "xia" = ( /turf/closed/wall, /area/station/science/cubicle) -"xif" = ( -/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 +"xih" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +/turf/open/floor/iron, +/area/station/engineering/hallway) "xik" = ( /turf/closed/wall, /area/station/security/prison/rec) @@ -68410,6 +72514,28 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"xiN" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Equipment Storage"; + pixel_x = -1; + req_access = list("eva") + }, +/obj/structure/rack, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/turf/open/floor/iron/large, +/area/station/ai_monitored/command/storage/eva) "xiT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68425,6 +72551,15 @@ dir = 5 }, /area/station/science/lower) +"xjc" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "xjg" = ( /turf/open/floor/iron/dark, /area/station/security/interrogation) @@ -68537,11 +72672,6 @@ "xkt" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) -"xkD" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron, -/area/station/engineering/break_room) "xkK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68578,6 +72708,14 @@ }, /turf/open/floor/iron/smooth, /area/station/service/greenroom) +"xkX" = ( +/obj/effect/turf_decal/tile/yellow/diagonal_centre, +/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/diagonal, +/area/station/engineering/lobby) "xla" = ( /obj/structure/toilet{ dir = 8 @@ -68619,16 +72757,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/vacant_room/office) -"xlF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "xlL" = ( /turf/open/floor/iron/white, /area/station/science/cytology) @@ -68651,22 +72779,15 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) -"xmb" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/east, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Gas to Filter" - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "xmd" = ( /obj/structure/window/spawner/directional/east, /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) +"xme" = ( +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/engine, +/area/station/engineering/atmos) "xmg" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/machinery/light/small/directional/east, @@ -68703,18 +72824,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"xmB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/sign/poster/random/directional/east, -/obj/machinery/conveyor{ - id = "mining" - }, -/obj/machinery/brm, -/turf/open/floor/iron, -/area/station/cargo/miningfoundry) "xmD" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -68734,21 +72843,6 @@ "xmO" = ( /turf/closed/wall/r_wall, /area/station/maintenance/fore/greater) -"xmT" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "xmX" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/small/directional/east, @@ -68775,6 +72869,11 @@ /obj/effect/turf_decal/delivery/white, /turf/open/floor/iron, /area/station/cargo/sorting) +"xnA" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "xnB" = ( /obj/effect/turf_decal/stripes/white/corner, /obj/effect/turf_decal/stripes/white/line, @@ -68790,6 +72889,14 @@ "xnE" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/entry) +"xnL" = ( +/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/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "xnR" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/decal/cleanable/dirt, @@ -68813,6 +72920,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"xoh" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) "xok" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/central) @@ -68828,12 +72942,24 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/smooth, /area/station/security/evidence) +"xoz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "xoB" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/side{ dir = 4 }, /area/station/science/xenobiology) +"xoJ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "xoS" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 9 @@ -68841,6 +72967,25 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/small, /area/station/ai_monitored/command/storage/eva) +"xoV" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 4 + }, +/obj/item/geiger_counter{ + pixel_x = 7; + pixel_y = 14 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/radio/off{ + pixel_x = 1; + pixel_y = 3 + }, +/turf/open/floor/iron/small, +/area/station/engineering/atmos/pumproom) "xoW" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -68927,6 +73072,13 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"xpT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/service/chapel) "xpU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -68974,23 +73126,18 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"xql" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance{ - name = "Incinerator Access" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) "xqn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/small, /area/station/science/cubicle) +"xqp" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/item/trash/tray, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/engine/atmos) "xqq" = ( /obj/item/reagent_containers/cup/glass/bottle/beer{ pixel_x = 8 @@ -69029,12 +73176,33 @@ "xqW" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/starboard) +"xri" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "xrk" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/station/security/processing) +"xrm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "xru" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/airalarm/directional/east, @@ -69056,6 +73224,10 @@ dir = 8 }, /area/station/service/theater) +"xrA" = ( +/obj/structure/sign/warning/pods/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "xrC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69069,6 +73241,16 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"xrX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/window/right/directional/south{ + layer = 3.1; + name = "Upload Console Window"; + req_access = list("ai_upload") + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "xrZ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -69187,6 +73369,25 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"xsX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) +"xta" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/engineering/main) "xte" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -69226,17 +73427,6 @@ "xtW" = ( /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"xtX" = ( -/obj/machinery/power/emitter{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "xtZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69246,15 +73436,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"xua" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"xug" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 8 }, -/obj/machinery/power/port_gen/pacman, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/engine_smes) +/obj/structure/sign/warning/cold_temp/directional/east, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "xuh" = ( /obj/structure/chair/pew/left, /obj/item/bouquet/sunflower, @@ -69281,6 +73471,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"xuv" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/chair/stool/directional/east, +/mob/living/basic/parrot/poly, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "xuD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -69317,6 +73515,10 @@ dir = 1 }, /area/station/science/research) +"xuX" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "xva" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69325,6 +73527,16 @@ dir = 1 }, /area/station/science/research) +"xvb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/fuel_pool, +/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/engineering/atmospherics_engine) "xvf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69340,15 +73552,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"xvl" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "xvv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69496,6 +73699,10 @@ "xxs" = ( /turf/closed/wall, /area/station/security/checkpoint/escape) +"xxt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "xxA" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -69560,11 +73767,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/security/brig/entrance) -"xya" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "xye" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -69593,14 +73795,6 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) -"xyj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "xyk" = ( /obj/structure/table, /obj/effect/turf_decal/tile/blue/full, @@ -69665,6 +73859,11 @@ }, /turf/open/floor/iron/small, /area/station/hallway/secondary/exit/departure_lounge) +"xzm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall, +/area/station/engineering/atmos) "xzo" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock" @@ -69679,18 +73878,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/parquet, /area/station/service/theater) -"xzB" = ( -/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/table/reinforced/titaniumglass, -/obj/item/folder/yellow{ - pixel_x = 4 - }, -/turf/open/floor/iron/textured_large, -/area/station/engineering/break_room) "xzE" = ( /obj/structure/table, /obj/effect/turf_decal/tile/dark_red, @@ -69706,16 +73893,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/processing) -"xzJ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Engineering Maintenance" - }, -/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/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "xzQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/radio/intercom/directional/west, @@ -69734,6 +73911,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"xAh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "xAm" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -69796,6 +73987,28 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/primary/central/fore) +"xAW" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"xBa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass{ + name = "South Tanks Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "xBe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -69821,6 +74034,12 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"xBD" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "xBF" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -69828,6 +74047,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"xBH" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "xBK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69837,6 +74061,10 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) +"xBV" = ( +/obj/effect/spawner/random/structure/chair_flipped, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "xBY" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, @@ -69852,6 +74080,16 @@ }, /turf/open/floor/iron/small, /area/station/hallway/secondary/exit/departure_lounge) +"xCc" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/station/command/heads_quarters/ce) "xCl" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69877,6 +74115,18 @@ }, /turf/open/space/basic, /area/space/nearstation) +"xCR" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Engineering 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/cyclelink_helper_multi{ + cycle_id = "engine_airlock_2" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "xCS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70044,6 +74294,20 @@ "xFe" = ( /turf/closed/wall, /area/station/security/lockers) +"xFj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "xFw" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/chair/sofa/bench{ @@ -70111,6 +74375,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/service/greenroom) +"xGe" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/orange, +/area/station/commons/dorms) "xGl" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -70125,23 +74399,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"xGA" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/south{ - name = "Genetics Desk"; - req_access = list("genetics") - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_large, -/area/station/science/research) +"xGH" = ( +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "xGJ" = ( /turf/closed/wall, /area/station/command/corporate_showroom) @@ -70192,20 +74453,6 @@ }, /turf/open/floor/iron/terracotta/small, /area/station/security/checkpoint/escape) -"xHv" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south, -/turf/open/floor/iron/smooth, -/area/station/service/greenroom) "xHB" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table, @@ -70242,6 +74489,21 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/security/tram) +"xHT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xHV" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "xIj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70264,6 +74526,13 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"xIr" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/holopad, +/obj/effect/landmark/atmospheric_sanity/ignore_area, +/turf/open/floor/iron, +/area/station/engineering/atmos/space_catwalk) "xIu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -70466,6 +74735,15 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) +"xKz" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/wideplating, +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/airalarm/directional/north, +/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos, +/turf/open/floor/iron, +/area/station/engineering/atmos) "xKG" = ( /turf/open/floor/iron, /area/station/hallway/primary/port) @@ -70478,6 +74756,9 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) +"xKS" = ( +/turf/closed/wall, +/area/station/engineering/atmos/space_catwalk) "xKX" = ( /turf/open/floor/iron/white/side{ dir = 4 @@ -70529,6 +74810,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"xLp" = ( +/obj/machinery/computer/atmos_control/air_tank{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "xLu" = ( /obj/structure/mirror/directional/east, /obj/structure/chair/stool/bar/directional/east, @@ -70538,6 +74826,11 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) +"xLy" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) "xLE" = ( /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, @@ -70636,6 +74929,18 @@ "xNw" = ( /turf/closed/wall, /area/station/science/breakroom) +"xNE" = ( +/obj/structure/steam_vent, +/obj/structure/closet/crate, +/obj/structure/spider/stickyweb, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/body/moderator_input, +/obj/item/grenade/chem_grenade/cleaner, +/obj/structure/sign/poster/official/random/directional/north, +/obj/item/pipe_dispenser, +/obj/item/clothing/gloves/color/red/insulated, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "xNI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -70650,10 +74955,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"xNU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "xNV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70716,6 +75017,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_half, /area/station/security/breakroom) +"xOJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 10 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/station/engineering/supermatter) "xOM" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/mapping_helpers/broken_floor, @@ -70734,6 +75041,16 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) +"xOO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 10 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "xOP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70744,6 +75061,12 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"xOR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{ + dir = 8 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/atmos) "xOS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral, @@ -70803,9 +75126,9 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"xPO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood/large, +"xPR" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/floor/grass, /area/station/service/chapel) "xPW" = ( /obj/item/kirbyplants/random/fullysynthetic, @@ -70838,14 +75161,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"xQi" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Privacy Shutter" - }, -/turf/open/floor/plating, -/area/station/engineering/break_room) "xQj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -70858,6 +75173,14 @@ "xQr" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/supermatter) +"xQt" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "xQv" = ( /obj/structure/cable, /obj/structure/closet/secure_closet/hop, @@ -70890,15 +75213,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"xQC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron, -/area/station/engineering/break_room) "xQD" = ( /obj/structure/chair/wood/wings, /obj/effect/turf_decal/siding/wood{ @@ -70907,24 +75221,16 @@ /obj/structure/cable, /turf/open/floor/stone, /area/station/command/heads_quarters/captain/private) +"xQG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "xQI" = ( /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "xQJ" = ( /turf/closed/wall, /area/station/service/abandoned_gambling_den/gaming) -"xQK" = ( -/obj/effect/turf_decal/tile/dark_red{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 8 - }, -/obj/machinery/computer/department_orders/security{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig/entrance) "xQN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -70932,6 +75238,18 @@ }, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) +"xQS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "xQW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70941,6 +75259,25 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/diagonal, /area/station/science/auxlab/firing_range) +"xQZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) +"xRa" = ( +/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/plating/elevatorshaft, +/area/station/engineering/atmos) "xRg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70974,6 +75311,11 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"xRv" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2, +/turf/open/space/basic, +/area/space/nearstation) "xRA" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -71031,6 +75373,10 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) +"xRZ" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/station/service/chapel) "xSe" = ( /obj/structure/table/glass, /obj/structure/microscope, @@ -71047,6 +75393,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"xSi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "xSp" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -71160,6 +75514,12 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"xTM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 6 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "xTO" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -71271,6 +75631,11 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/station/security/execution/transfer) +"xVd" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/stack/ore/slag, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "xVj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -71304,13 +75669,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/small, /area/station/science/cubicle) -"xVx" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "xVG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71451,6 +75809,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"xXl" = ( +/obj/structure/table/reinforced, +/obj/structure/showcase/machinery/microwave{ + pixel_y = 7 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "xXr" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71538,6 +75904,17 @@ "xXT" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) +"xYm" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/iron/stairs/old{ + dir = 4 + }, +/area/station/engineering/supermatter/room) "xYu" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -71548,6 +75925,9 @@ /obj/effect/gibspawner/human, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) +"xYD" = ( +/turf/open/floor/grass, +/area/station/service/chapel) "xYE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71573,6 +75953,18 @@ "xYO" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/bridge) +"xYX" = ( +/obj/effect/turf_decal/siding/red{ + dir = 8 + }, +/obj/machinery/air_sensor/nitrogen_tank, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos/space_catwalk) +"xZb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/main) "xZd" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/decal/cleanable/dirt, @@ -71632,9 +76024,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/primary/central/fore) -"xZV" = ( -/turf/closed/mineral/random/stationside, -/area/station/engineering/supermatter/room) "xZX" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -71650,6 +76039,10 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"yac" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/iron/stairs/medium, +/area/station/engineering/atmos) "yag" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -71667,6 +76060,19 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron, /area/station/security/tram) +"yaq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer5{ + dir = 1 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "yat" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/landmark/start/assistant, @@ -71687,6 +76093,12 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/stone, /area/station/command/heads_quarters/hos) +"yaG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "yaI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -71729,6 +76141,23 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security/interrogation) +"ybs" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine/atmos) +"ybC" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Break Room" + }, +/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/hallway) "ybD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71775,14 +76204,6 @@ "ybO" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"yca" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/prison) "ycd" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -71827,6 +76248,21 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"ycx" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/primary/central/fore) "ycC" = ( /turf/closed/wall/r_wall, /area/station/command/bridge) @@ -71836,6 +76272,10 @@ "ycS" = ( /turf/open/floor/wood/tile, /area/station/service/bar) +"ycW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_edge, +/area/station/engineering/supermatter/room) "ycZ" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -71854,6 +76294,23 @@ }, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) +"ydi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass{ + name = "South Tanks Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos/space_catwalk) "ydj" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -71898,6 +76355,30 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"ydI" = ( +/obj/machinery/light/cold/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"ydL" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"ydV" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + 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{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "yea" = ( /turf/closed/wall, /area/station/service/chapel/office) @@ -71950,10 +76431,6 @@ /obj/structure/sign/warning/test_chamber/directional/east, /turf/open/floor/iron/white, /area/station/science/robotics/augments) -"yes" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/grass, -/area/station/service/chapel) "yeu" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71970,14 +76447,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"yez" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/tcommsat/server) "yeD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -71985,14 +76454,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"yeE" = ( -/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/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "yeF" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -72023,6 +76484,17 @@ }, /turf/open/floor/plating, /area/station/security/detectives_office) +"yeY" = ( +/obj/structure/window/spawner/directional/east, +/obj/item/screwdriver, +/obj/item/weldingtool/mini{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/lobby) "yeZ" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/testlab) @@ -72037,13 +76509,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"yfe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal/incinerator) "yfg" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/smooth_corner{ @@ -72097,6 +76562,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"yfN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "yfP" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 4 @@ -72162,18 +76633,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) -"ygP" = ( -/obj/structure/cable, -/obj/machinery/modular_computer/preset/engineering{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "ygU" = ( /obj/structure/table/glass, /obj/machinery/computer/records/medical/laptop{ @@ -72193,6 +76652,16 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/security/medical) +"yha" = ( +/obj/structure/cable, +/obj/structure/table, +/obj/machinery/door/window/right/directional/north{ + name = "Core Modules"; + req_access = list("captain") + }, +/obj/effect/spawner/random/aimodule/harmless, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "yhq" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ @@ -72224,11 +76693,21 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"yic" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"yhS" = ( +/obj/effect/decal/cleanable/insectguts, /turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +/area/station/engineering/atmospherics_engine) +"yhY" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 6 + }, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Atmospherics CO2 Chamber"; + dir = 5; + network = list("ss13","engineering") + }, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos/space_catwalk) "yig" = ( /obj/structure/table, /obj/structure/window/reinforced/spawner/directional/east, @@ -72242,6 +76721,13 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) +"yii" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + name = "North Ports to Wastes" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "yij" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -72252,6 +76738,13 @@ }, /turf/open/floor/iron/white/side, /area/station/hallway/primary/starboard) +"yil" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "yim" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/railing{ @@ -72295,20 +76788,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/theatre, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"yiy" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"yiF" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "yiL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -72343,17 +76822,6 @@ "yjd" = ( /turf/open/floor/iron/dark, /area/station/security/lockers) -"yjg" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "yjr" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/siding/red, @@ -72374,6 +76842,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"yjD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "yjE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) @@ -72383,6 +76857,35 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/service/abandoned_gambling_den/gaming) +"yjN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) +"yjQ" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/structure/cable, +/obj/structure/closet/secure_closet/security/engine, +/obj/item/radio/off{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/item/geiger_counter{ + pixel_x = 7; + pixel_y = 3 + }, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/engineering) "yjV" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/aisat/exterior) @@ -72416,16 +76919,20 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"ykC" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - South" + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) "ykL" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload_foyer) -"ykQ" = ( -/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/rust, -/area/station/maintenance/department/engine) "ykT" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, @@ -72472,12 +76979,6 @@ /obj/effect/turf_decal/siding, /turf/open/floor/iron/white/small, /area/station/science/lobby) -"ylr" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/station/service/library) "yly" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -72486,20 +76987,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/ordnance/testlab) -"ylB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/machinery/door/window/brigdoor/left/directional/west{ - atom_integrity = 300 - }, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = -8; - pixel_y = -24 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/disposal/incinerator) "ylD" = ( /turf/closed/wall, /area/station/maintenance/starboard/greater) @@ -72513,6 +77000,13 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/commons/dorms) +"ylK" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "ylR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72545,6 +77039,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"ymj" = ( +/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/station/engineering/atmospherics_engine) (1,1,1) = {" dDB @@ -74381,7 +78882,7 @@ dDB dDB dDB dDB -dDB +aan dDB dDB dDB @@ -74646,8 +79147,8 @@ dDB dDB dDB dDB -dDB -dDB +aJq +aJq dDB dDB dDB @@ -74902,9 +79403,9 @@ dDB dDB dDB dDB -dDB -dDB -dDB +tYT +aJq +aJq dDB dDB dDB @@ -75159,8 +79660,8 @@ dDB dDB dDB dDB -dDB -dDB +tYT +tYT dDB dDB dDB @@ -75406,6 +79907,8 @@ dDB dDB dDB dDB +aJq +aJq dDB dDB dDB @@ -75413,10 +79916,8 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB +aJq +aJq dDB dDB dDB @@ -75662,17 +80163,17 @@ dDB dDB dDB dDB +aJq +aJq +aJq +aJq dDB dDB dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB +aJq dDB dDB dDB @@ -75919,6 +80420,26 @@ dDB dDB dDB dDB +aJq +aJq +aJq +tYT +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +xZx dDB dDB dDB @@ -75936,27 +80457,7 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +bjQ dDB dDB dDB @@ -76176,6 +80677,26 @@ dDB dDB dDB dDB +tYT +aJq +aJq +tYT +tYT +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +xZx +dDB +dDB +blb dDB dDB dDB @@ -76193,30 +80714,10 @@ dDB dDB dDB dDB +blb dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +bjQ dDB dDB dDB @@ -76432,6 +80933,13 @@ dDB dDB dDB dDB +tYT +tYT +aJq +aJq +aJq +aJq +aJq dDB dDB dDB @@ -76442,38 +80950,31 @@ dDB dDB dDB dDB +blb +dDB +dDB +blb dDB dDB dDB dDB dDB dDB +xxo +dDB +dDB +dDB +xxo dDB dDB dDB dDB dDB dDB +blb dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +blb dDB dDB dDB @@ -76689,24 +81190,13 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aan -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +tYT +aJq +aJq +aJq +aJq +aJq +aJq dDB dDB dDB @@ -76717,20 +81207,31 @@ dDB dDB dDB dDB +blb +dDB +dDB +blb dDB dDB dDB dDB dDB dDB +blb +dDB +dDB +dDB +blb dDB dDB dDB dDB dDB dDB +blb dDB dDB +blb dDB dDB dDB @@ -76946,6 +81447,14 @@ dDB dDB dDB dDB +tYT +aJq +aJq +aJq +aJq +aJq +aJq +aJq dDB dDB dDB @@ -76955,39 +81464,31 @@ dDB dDB dDB dDB +blb +dDB +dDB +jrj dDB dDB dDB dDB dDB dDB +blb +dDB +dDB +dDB +blb dDB dDB dDB dDB dDB dDB +jrj dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +blb dDB dDB dDB @@ -77197,7 +81698,20 @@ dDB dDB dDB dDB -aan +dDB +dDB +dDB +dDB +dDB +dDB +dDB +aJq +aJq +aJq +aJq +tYT +tYT +aJq dDB dDB dDB @@ -77207,44 +81721,31 @@ dDB dDB dDB dDB +blb +fNQ +xQZ +wlU dDB dDB dDB dDB dDB dDB +xck +blb +jFk +blb +xck dDB dDB dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -rpi -rpi -rpi -rpi -rpi -rpi -rpi -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +lTC +xQZ +khr +blb dDB dDB dDB @@ -77459,57 +81960,57 @@ dDB dDB dDB dDB -wCc -wCc -wCc -wCc -wCc +dDB +dDB +dDB +aJq +tYT +tYT +dDB +dDB +gcs +dDB +dDB +dDB +dDB +dDB +chj +chj +chj +chj blb +aky blb -wCc -wCc -wCc -wCc -wCc -wCc +wpY +dDB +dDB +dDB +dDB +dDB +dDB +xck +kFH +iRp +kFH +xck +dDB +dDB +dDB +dDB +dDB +dDB +wpY blb +aky blb -blb -blb -wCc -wCc -wCc -wCc -blb -blb -rpi -rpi -blb -blb -rpi -blb -blb -rpi -rpi -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +chj +chj +chj +chj dDB dDB dDB +xxo dDB dDB dDB @@ -77718,7 +82219,8 @@ dDB dDB dDB dDB -blb +dDB +gcs dDB dDB dDB @@ -77729,44 +82231,43 @@ dDB dDB dDB dDB +chj +qfn +gbE +kYo +eAI +eVk +blb +ekf dDB dDB dDB dDB dDB dDB +xck +uic +fMP +bbF +xck dDB dDB dDB -rpi -rpi +dDB +dDB +dDB +ekf +blb +kHQ +oBk +oGn +hXB +kRu +chj blb blb -beL -dBV -bxH blb -blb -rpi -rpi -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +svB dDB dDB dDB @@ -77972,59 +82473,59 @@ dDB dDB dDB dDB -aJq -aJq +dDB +dDB +dDB +dDB +kaP +dDB +dDB +dDB dDB blb dDB dDB dDB dDB -wCc -wCc +dDB +chj +ijn +rCX +dzA +lsK +diL +lsK +xFj blb blb -wCc -wCc -wCc -wCc -wCc -wCc +blb +xck +xck +xck +xck +wyZ +pvE +aKU +xck +xck +xck +xck blb blb -wCc -wCc blb -rpi +ekf blb +mSS +sfl +oGn +keS +ozz +chj +dDB +dDB +dDB +kaP blb -bfG -bkz -dBV -bkz -bBf -blb -blb -rpi -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aan -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB dDB dDB dDB @@ -78228,21 +82729,12 @@ dDB dDB dDB dDB -aJq -aJq -hwJ -blb -blb -blb -blb -blb -blb -blb dDB dDB dDB dDB dDB +svB dDB dDB dDB @@ -78252,37 +82744,46 @@ dDB dDB dDB dDB -rpi +dDB +chj +chj +chj +chj blb -beL -dBV -bkH -bsQ -bkH -dBV -bxH +iwi blb -rpi -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +xAh dDB dDB dDB dDB +kFH +aKo +poV +clX +qtv +hsy +reL +xLp +kFH dDB dDB dDB dDB +ekf +blb +uRO +blb +chj +chj +chj +chj dDB dDB dDB +kaP dDB +xxo dDB dDB dDB @@ -78485,44 +82986,19 @@ dDB dDB dDB dDB -aJq -aJq -aJq -tYT +aan +dDB +dDB +dDB +dDB +kaP +dDB +dDB +dDB +dDB blb dDB dDB -alD -anv -rMn -rMn -rMn -rMn -rMn -rMn -rpi -rMn -rMn -rMn -rMn -rMn -rMn -rpi -rpi -rpi -rpi -dBV -bfN -blG -btL -bxN -dBV -bTa -rpi -rpi -dDB -dDB -dDB dDB dDB dDB @@ -78531,6 +83007,29 @@ dDB dDB dDB dDB +iwi +blb +xAh +dDB +dDB +dDB +dDB +kFH +fiq +xHV +duY +cVY +wKy +pXu +kRW +kFH +dDB +dDB +dDB +dDB +ekf +blb +uRO dDB dDB dDB @@ -78539,7 +83038,9 @@ dDB dDB dDB dDB +kaP dDB +svB dDB dDB dDB @@ -78741,62 +83242,62 @@ dDB dDB dDB dDB -aJq -aJq -aJq -aJq +dDB +dDB +dDB +dDB +dDB +dDB +kaP +dDB +dDB +dDB +dDB +gcs tYT +dDB +dDB +dDB +chj +chj +chj +chj +chj blb -dDB -dDB -alR -voO -rpi -rpi -voO -voO -voO -voO -voO -voO -rpi -voO -voO -voO -voO -voO -rpi -rpi +iwi blb -vrw -dBV -bkH -bsQ -bkH -bkz -byk +xAh +dDB +dDB +dDB +dDB +kFH +ehw +gBG +hir +weU +iCp +aXy +nMQ +kFH +dDB +dDB +dDB +dDB +ekf blb -rpi -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +uRO +blb +chj +chj +chj +chj +chj dDB dDB +xxo dDB +kaP dDB dDB dDB @@ -78998,62 +83499,62 @@ dDB dDB dDB dDB -aJq +dDB +dDB +dDB +dDB +dDB +dDB +gcs +dDB +dDB +dDB aJq aJq tYT -tYT -tYT -dDB -dDB -amp -dDB -dDB -dDB -dDB -dDB -dDB -dDB dDB dDB dDB +chj +jbo +rkS +hIU +kYo +ubs +tDl blb -dDB -dDB -dDB -dDB -dDB -rpi +xAh blb blb -bfX -dBV -bkz -dBV -bBl +oDE +xck +xck +xck +xck +kph +nQC +uFT +xck +xck +xck +xck +qwo blb blb -rpi -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +ekf +blb +uCa +tbX +oGn +hFR +xYX +cPv +chj dDB dDB dDB dDB +kaP dDB dDB dDB @@ -79255,62 +83756,62 @@ dDB dDB dDB dDB +dDB +dDB +dDB +dDB +dDB +dDB +aJq +aJq +tYT +tYT aJq aJq aJq -tYT -tYT -tYT -tYT -dDB -amp -dDB -dDB -dDB dDB dDB dDB +chj +rhu +soB +syc +dzA +lsK +bWg +lsK +wgl dDB dDB dDB dDB blb -lgg -sRm -dDB -lgg -sRm -rpi -rpi +xck +oLN +uMh +pwD +pyl +ojW +xck blb -blb -vrw -dBV -byk -blb -blb -rpi -rpi dDB dDB dDB dDB +gcR +lsK +nUB +lsK +dzA +cpC +ltz +tcZ +chj dDB dDB dDB dDB -knv -ctV -cmf -ctV -knv -dDB -dDB -dDB -dDB -dDB -dDB -dDB +kaP dDB dDB dDB @@ -79511,63 +84012,63 @@ dDB dDB dDB dDB -aJq -aJq +dDB +dDB +dDB +dDB +dDB +dDB +dDB aJq aJq aJq tYT tYT +aJq +aJq tYT dDB -amp -dDB -dDB -dDB -dDB -dDB dDB +chj +chj +chj +chj +chj +blb +kHI +blb +xAh dDB dDB dDB dDB blb -vrT -vrT -aGa -vrT -vrT -blb -rpi -rpi -blb -blb -rpi -blb -blb -rpi -rpi +xck +toK +cTS +raP +aOS +akS +xck blb dDB dDB dDB dDB +xAh +blb +sAW +blb +chj +chj +chj +chj +chj dDB dDB +xxo dDB -knv -cmf -dJN -eiM -eFN -knv -cmf -dDB -dDB -dDB -dDB -dDB -aan +svB dDB dDB dDB @@ -79767,17 +84268,6 @@ dDB dDB dDB dDB -blb -ayi -ayi -acF -ayi -ayi -arP -acF -ayi -ayi -amq dDB dDB dDB @@ -79786,39 +84276,45 @@ dDB dDB dDB dDB +aJq +aJq +aJq +aJq +tYT +aJq +aJq +aJq dDB dDB -blb -anV -anV -dDB -anV -anV -blb -dDB -rpi -rpi -rpi -rpi -rpi -rpi -rpi dDB +vmL blb dDB dDB dDB +kHI +blb +xAh dDB dDB +blb +xck +xck +xck +gnd +jWk +gnd +cxQ +gnd +xck +xck +xck +blb dDB dDB -knv -dpN -dKj -eiU -cvJ -eYV -knv +xAh +blb +sAW dDB dDB dDB @@ -79827,6 +84323,11 @@ dDB dDB dDB dDB +kaP +dDB +kaP +dDB +dDB dDB dDB dDB @@ -80024,64 +84525,64 @@ dDB dDB dDB dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +aJq +aJq +aJq +aJq +aJq +tYT +aJq +aJq +tYT +dDB +chj +chj +chj +chj +chj blb -arP -abs -adO -ayi -aeF -aeF -aeF -ajI -ajM -amp +kgG +ttg +gEy +dmb +dmb +cnU +ilb +nks +cbJ +xKS +ptz +cBR +udP +xKS +cbJ +nks +tYn +bsn +yaq +yaq +nWE +ttg +fRm blb +chj +chj +chj +chj +chj dDB dDB +kaP dDB -dDB -dDB -dDB -dDB -dDB -lgg -oer -atN -cDk -dDB -qyo -atN -oer -sRm -dDB -blb -dDB -rpi -dDB -blb -dDB -dDB -blb -dDB -dDB -dDB -dDB -dDB -dDB -dDB -knv -dqG -dKk -cvJ -eFP -eZO -knv -dDB -dDB -dDB -dDB -dDB -dDB +xxo dDB dDB dDB @@ -80281,17 +84782,6 @@ dDB dDB dDB dDB -blb -arP -asf -asq -aeA -afi -agE -aiA -ajI -ayi -amG dDB dDB dDB @@ -80300,44 +84790,55 @@ dDB dDB dDB dDB -dDB -anV -blb -vrT +tYT +aJq +aJq +aJq +aJq +aJq +aJq +aJq +tYT +tYT +chj +izm +txd +pKg +kYo +wdJ +tiS +myi +dHU +rQm +rQm +cJb +qPg +puI +qkI +gIz +gNS +xIr +sDl +xBa +utv +ydi +nEa +fiI blb blb +ccu +bTJ +pCo +sAb +oGn +ckI +exr +sfd +chj +dDB +dDB +svB blb -vrT -blb -anV -dDB -blb -jZl -btP -jZl -blb -dDB -dDB -jZl -dDB -dDB -dDB -dDB -dDB -dDB -dDB -cmf -dqK -dPz -cvJ -cmf -faj -knv -dDB -dDB -dDB -dDB -dDB dDB dDB dDB @@ -80538,62 +85039,62 @@ dDB dDB dDB dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +tYT +aJq +aJq +aJq +aJq +aJq +aJq aJq -ayi -agn -aun -aEA -afP -agT -aiJ -aun -ajQ -amV -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -qyo -oer -yiy -sRm -dDB -lgg -yiy -oer -cDk -dDB blb -jZl -buy -jZl -bBy -bBy -bBy -jZl -aJq -dDB -dDB -dDB -dDB -dDB -dDB -knv -dra -dQS -cvJ -knv -fbo -cmf -dDB -dDB +chj +peW +aqn +sxD +dzA +lsK +qDq +hZb +nEN +fFe +fFe +cgh +rwl +nks +epr +xKS +fcI +dvv +cBV +xKS +epr +nks +vbL +vvg +fFe +fFe +cmu +mSc +dXa +lsK +dzA +mKV +pUe +yhY +chj dDB dDB +kaP dDB dDB dDB @@ -80795,62 +85296,62 @@ dDB dDB dDB dDB -aJq -ayi -agn -aun -aKH -afX -agT -aiJ -aun -ajQ -amV dDB dDB dDB dDB dDB dDB +dDB +dDB +dDB +tYT aJq aJq +aJq +aJq +aJq +aJq +aJq +blb +chj +chj +chj +chj +chj +blb +nYD +blb +aky +blb +dDB +dDB +ybO +ybO +ybO +hYC +okt +hYC +rEH +hYC +ybO +ybO +ybO dDB dDB blb -qyo -atN -aGF -atN -cDk -ayK -mKG -beO -ayK -jZl -buI -jZl -bCi -bTg -cbM -jZl -jZl -aJq -aJq -dDB -dDB -dDB -dDB -knv -knv -cmf -eki -knv -knv -knv -dDB -dDB +aky +blb +vdi +blb +chj +chj +chj +chj +chj dDB dDB +xxo dDB dDB dDB @@ -81051,58 +85552,54 @@ dDB dDB dDB dDB -aJq -aJq -ayi -acu -adR -acl -wRW -agY -ayi -ayi -acF -ann dDB dDB dDB dDB +dDB +dDB +dDB +dDB +dDB +dDB +tYT +tYT aJq aJq aJq aJq -ayK -ayK -ayK -ayK -jqF +aJq +aJq +tYT +tYT blb -jqF -ayK -ayK -hdT -qHg -ayK -bmk -buN -byV -bCu -bCu -kSL -tXK -jZl -aJq -aJq -aJq +vmL +blb +dDB +dDB +rUD +orY +pML dDB dDB dDB +tYT +kFS +hYC +wfE +gNI +lBw +coO +ftc +hYC +kFS +tYT dDB -cmf -ctV -elm -ctV -cmf +dDB +dDB +jhz +hsL +kpe dDB dDB dDB @@ -81111,6 +85608,10 @@ dDB dDB dDB dDB +blb +dDB +dDB +dDB dDB dDB dDB @@ -81307,64 +85808,64 @@ dDB dDB dDB dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +tYT +tYT aJq aJq aJq -btC -acN -adB -aPb -aed -ahe -aiN -arP +aJq +aJq +aJq +tYT +tYT +dDB +blb +tYT +tYT +dDB +dDB +jul blb blb +dDB +dDB +tYT +tYT +kFS +hYC +xKz +aAb +svr +coO +gSh +hYC +kFS +tYT +tYT +dDB +dDB blb +pJT +rqV +dDB +dDB +dDB +aJq +aJq +aJq +tYT +aJq blb -blb -blb -gcs -aJq -aJq -aJq -ayK -aoe -atF -ayK -oNn -hdT -oNn -ayK -gnL -dLC -bfj -ayK -sru -buW -bzf -bCM -bTv -cbN -cgO -jZl -aJq -aJq -aJq -dDB -dDB -dDB -dDB -dDB -cea -elO -crE -dDB -dDB -dDB -dDB -dDB -dDB dDB dDB dDB @@ -81564,18 +86065,12 @@ dDB dDB dDB dDB -aJq -aJq -aJq -btC -acl -aed -aeC -agD -ahy -aiO -ayi -gcs +dDB +dDB +dDB +dDB +dDB +dDB dDB dDB dDB @@ -81584,44 +86079,50 @@ aJq aJq aJq aJq -xZV -ayK -aou -xgB -aHc -bsz -aHc -dtH -leF -uyE -lJA -jMo -ayK -pBy -bvT -bzn -bEi -bTN -ccK -cgU -jZl aJq aJq aJq -dDB -dDB -dDB -dDB -dDB -cea -emf -crE -dDB -dDB -dDB -dDB -dDB -dDB +aJq +tYT +vmL +wBo +giq +wBo +giq +wBo +vmL +apj +vmL +vmL +vmL +ybO +tYT +aJq +kFS +hYC +hYC +pEa +iCL +pTp +hYC +hYC +kFS +aJq +tYT +ybO +vmL +vmL +kwH +lLE +vmL +ybO +aJq +aJq +aJq +aJq +aJq +aJq +vmL dDB dDB dDB @@ -81821,68 +86322,68 @@ dDB dDB dDB dDB -aJq -aJq -aJq -btC -adB -adB -btC -btC -agT -ajg -ayi -aJq +dDB +dDB +dDB +dDB +dDB dDB dDB dDB dDB aJq aJq -xZV -xZV -xYG -xYG -wHh -mWN -hlw -diK -aII -dID -tKO -ogB -bUl -jmm -ayK -jZl -jZl -jZl -bFb -bUy -jZl -jZl -jZl -rQi aJq aJq aJq -dDB -dDB -dDB -dDB -cea -elm -crE -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +aJq +aJq +aJq +tYT +tYT +tYT +fPb +hSG +drw +gvB +wBo +ybO +mKK +cwf +cwf +ybO +ybO +aJq +aJq +kFS +hYC +gJs +uaK +sSM +mvj +sAM +hYC +kFS +aJq +aJq +ybO +ybO +cwf +pfx +brC +ybO +ybO +akZ +akZ +akZ +akZ +akZ +akZ +gcs +blb +blb +blb +blb bjQ gAn gDC @@ -82078,64 +86579,64 @@ dDB dDB dDB dDB -aJq -aJq -aJq -btC -btC -acl -aPb -btC -agT -ayi -ayi -aJq dDB dDB dDB dDB -aJq -aJq -xZV -xZV -xZV -xYG -dsL -sFg -xQr -cFC -aJc -aME -xQr -cFF -kUy -diM -bfZ -bmn -bwg -rQi -bFM -bUX -rQi -iFB -wuk -rQi -rQi -aJq -aJq -aJq dDB dDB dDB -cea -elm -crE dDB dDB +tYT +aJq +aJq +aJq +aJq +aJq +aJq +aJq +tYT +blb +vmL +wBo +mnx +ylK +qBD +gKs +hXt +mXm +hXt +hXt +bJN +hYC +pwv +pwv +xzm +xzm +glJ +ooe +bdb +mxc +sNc +xzm +xzm +pwv +pwv +hYC +jrb +dZX +bDO +qqr +bkI +ybO +gBh +gBh +gBh +gBh +aJq aJq aJq -dDB -dDB dDB dDB dDB @@ -82335,68 +86836,68 @@ dDB dDB dDB dDB -aJq -aJq -aJq -btC -btC -aem -btC -aed -ahz -ajo -ayi -aJq dDB dDB dDB -aJq -aJq -aJq -xZV -xZV -xZV -npy -aqr -swI -xQr -qiX -jxu -buS -xQr -cdZ -gmi -wPV -npy -bmP -bzs -rQi -bHW -bUX -rQi -cNy -qLf -qsi -rQi -aJq -aJq -aJq -aJq -aJq -knv -ctV -elO -ctV -knv -aJq -aJq -aJq -aJq dDB dDB dDB dDB dDB +tYT +aJq +aJq +aJq +aJq +aJq +aJq +aJq +tYT +tYT +vmL +xRv +roc +qUd +jwC +vDD +gKs +ydI +ijP +ivT +gCP +sWE +hYC +gjP +quP +lrL +hYC +hYC +pDH +cwf +fXe +hYC +hYC +lMg +tSi +vnz +hYC +dYY +dqV +ivT +hZf +nkp +kvb +gBh +gBh +gBh +gBh +aJq +aJq +tYT +dDB +dDB +dDB +dDB dDB dDB ueX @@ -82592,64 +87093,64 @@ dDB dDB dDB dDB -aJq -aJq -aJq -ayi -btC -acl -aPb -aed -adB -ajo -ayi -ayi dDB dDB dDB -aJq -aJq -aJq -xZV -xZV -xZV -wxt -aqU -efa -oZg -geQ -aRR -pbt -cXF -bAq -mRT -dnp -bhc -bng -bzv -rQi -bHW -ctZ -ccN -cld -aFA -kwz -rQi +dDB +dDB +dDB +dDB +dDB aJq aJq aJq aJq -gBh -gBh -knv -emB -knv -knv +aJq +aJq +aJq +aJq +blb +vmL +aJq +vmL +wBo +nHR +fYo +jVI +bBd +sUk +apd +fJt +chb +hqm +uhh +gCR +lOk +cVS +kDY +kyg +xSi +tic +neM +bRc +kDY +cVS +bSm +qxz +mRA +hvZ +mXx +fJt +vPY +wPt +bNq cmf +fYU gBh -cmf knv knv +vmL +dDB dDB dDB dDB @@ -82849,64 +87350,64 @@ dDB dDB dDB dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +aJq +aJq +pWm +pWm +bvt +bvt +bvt +aJq +aJq tYT -tYT -aJq -acF -adF -aem -acl -aem -ahe -ayi -ayi -blb -blb -blb -blb -gcs -aJq -aJq -cwg -xZV -xZV -xYG -jKG -tod -vFW -aAt -oES -fzl -kBD -uRu -ofS -jOb -xtX -jAw -cdf -rQi -woe -kxK -rQi -clH -fIr -qsi +xpf +nqx +fPb +uNO +klL +vtw +gKs +mFZ +exE +tFB +wWP +dlk +qUN +paW +eOh +paW +nxO +pXc +nlI +iTZ +xTM +pXc +nxO +paW +qbv +paW +yac +tHY +efl +xoz +gro +mnA bNq -knv -knv -knv -gBh -gBh -gBh -dRi -enq -gCS -cuZ -hRz -cuZ -geI -knv +qeq +xLy +cvJ +ueX ggw +lzn +kCT kCT kCT kCT @@ -83107,66 +87608,66 @@ dDB dDB dDB dDB +dDB +dDB +aGa +dDB +dDB +dDB +dDB +aJq tYT -tYT -arP -adF -adB -aun -acl -ait -ajG -ayi -ayi -dDB -dDB -dDB +hjj +itv +wHL +lOM +bvt aJq -aJq -aJq -xZV -xZV -xZV -xYG -rVV -acn -iuu -iey -mwI -pqJ -tpd -kDS -wCp -frj -ayK -ayK -ayK -rQi -bIW -bVs -rQi -frq -rsP +pnl +vmL +xpf +lVW +cdW +smd +jdU +ihj +gKs +pIB +wNi +bPU +yii +tnH +vcR +fxV +wJn +pGt +uJC +rbg +qYp +tzh +rao +rbg +uJC +qNN +eOP +qNN +fFu +oDa +umn +bPU +wlS +akU bNq -bNq -wMC -cLH -cmf -knv -gBh -dsH -fze -cmf -knv -fRB -knv -knv -gfc -geG +vlC +nHd +lyR +qDJ sjq sNz wZF wZF +wZF +wZF gzD sjq gBi @@ -83358,69 +87859,69 @@ dDB dDB dDB dDB -aan dDB dDB dDB dDB dDB -tYT -tYT -arP -adF -adB -adB -acl -adB -ajG -acF -akZ dDB dDB dDB -aJq -aJq -aJq -xZV -xZV -xYG -xYG -dcg -vkk -xQr -xmb -uTS -aNe -xQr -ePu -scc -xYG -rQi -bGT -cwR -rQi -cZM -bGP -bNq -bNq -bNq -bNq -lUG -gQs -gCS -cLe -hRz -gCS -gCS -fAe -knv -pCs -lUG -knK -knv -gcm -knv +blb +dDB +dDB +eNm +bTd +qlk +hRF +kGn +pFK +cXu +kYI +pWm +pWm +pnl +fuC +xpf +sRf +fPb +tQZ +jNL +fEr +pUK +vjK +rVA +vUh +oTY +kXf +hvo +kQr +bNg +kQr +pPH +cTu +pvP +nhe +nqi +aEy +uyB +wAM +eEX +kQr +etX +wXV +xHT +lGq +sqB +fJP +eDe +viw +aIk +eiU +slY ggw +lzn +kCT kCT kCT kCT @@ -83622,62 +88123,62 @@ dDB dDB dDB dDB +dDB +blb +dDB +mys +blb +dDB +dDB tYT -ayi -acF -btC -btC -btC -ayi -ayi -ayi -akZ -dDB -dDB -dDB -aJq -aJq -aJq -xZV -xZV -xYG -lDE -arA -aRY -coA -hzi -bEG -leh -lkU -vYg -oZS -iQv -bhR -boL -bwJ -cPM -hSx -dhw +pWm +pWm +dre +pWm +pWm +pRw +pnl +nSo +cPB +mPe +wBo +gKs +fpF +gKs +gKs +aOb +utf +mfV +mFD +mrW +hYC +wVh +hFK +ubh +hYC +fuB +soo +qFw +sbf +pfD +hYC +uUp +nIL +lNC +hYC +wyU +rkk +blZ +rxs +upf bNq -dvQ -dFn -cuZ -gCS -gSV -cLa -bNq -bNq -ecq -bNq -bNq -knv -knv -knv -knv +gBh +ybs knv knv cmf -knv +vmL +dDB dDB dDB dDB @@ -83879,62 +88380,62 @@ dDB dDB dDB dDB -tYT -tYT -aJq -aJq -aJq -aJq -aJq -aJq -aJq -akZ +dDB +blb +mys +blb dDB dDB dDB dDB -aJq -aJq -xZV -xZV -xYG -gLx -aOP -aSd -qoh -pvg -uZR -uYy -ejH -alx -vVE -xyj -mpr -cNa -cNa -iIr -rkm -diO -doQ -clJ -gSV -cvJ -bNq -ecq -bNq -knv -cSv -duF -duF -ybO vmL -blb -blb -blb -dDB -dDB -dDB -dDB +pWm +jUx +jUx +wzv +jUx +pnl +xuX +bOb +uzI +hpi +dwP +jNr +tsR +gKs +obd +exA +vAb +tSg +nYP +xae +qol +mTt +qol +xae +qwc +ikf +fLj +rUa +csB +xae +uXI +iaW +vZM +xae +wvT +jBW +okg +vKs +ffE +bNq +gBh +ybs +knv +gBh +gBh +aJq +tYT dDB dDB dDB @@ -83966,7 +88467,7 @@ ovQ oRr poM uzJ -lpZ +mKB npA nFh riV @@ -84137,61 +88638,61 @@ dDB dDB dDB dDB -tYT -aJq -aJq -aJq -aJq -aJq -aJq -aJq -dDB -dDB -dDB -dDB -dDB -aJq -aJq -xZV -xZV -xYG -qEj -aOZ -ayK -ayK -hdT -gRc -ayK -ayK -bDP -ljk -naw -rQi -cTd -hdk -rQi -yjg -bWZ +tmL +blb +blb +blb +cLg +blb +blb +blb +tGK +pWm +pWm +pWm +aap +pnl +pnl +wqP +pnl +pnl +iXx +pnl +wqP +pnl +bBy +nsa +cgz +nsa +bBy +xae +xOR +oPg +aiL +xae +csB +opc +xRa +ozM +spa +xae +gPf +xef +xme +xae +vIF +bYY +nBM +bpv +vIF bNq cmf -dHC -knv -ecq -cGy -iUq -cLB -cSz -dcG -piT -dRm -enB -xae -xae -xae -xae -blb -dDB -dDB +liX +jqd +lxP +gBh +aJq +aJq dDB dDB dDB @@ -84235,11 +88736,11 @@ mhk mhk mhk mhk -mzp -uGP -uGP -uGP -gET +uRX +vzP +vzP +vzP +wjK wBm wXk xKG @@ -84392,15 +88893,9 @@ dDB dDB dDB dDB -tYT -tYT -tYT -aJq -aJq -aJq -aJq -aJq -aJq +dDB +dDB +oua dDB dDB dDB @@ -84408,47 +88903,53 @@ dDB dDB dDB dDB -aJq -aJq -xZV -ayK -arJ -bnc -ayK -kBq -aQy -aJu -vpm -yjE -aVq -yjE -yjE -yjE -yjE -yjE -yjE -fPv -dja -bNq -hln -dIm -dQY -ecq -dMj -hju -dEt -cSY -ddj -dvb -cwf -eop -tTR -fcD -fta +dDB +aWx +oFc +qcF +jUx +fbs +gKF +uPf +pWm +dzD +pAa +pWm +pRw +pnl +xNE +soC +mom +cWQ +pgU xae -blb -dDB -dDB +xae +xae +xae +xae +pYP +dyt +qtP +vEZ +gIr +xae +xae +xae +xae +xae +eWj +jMy +uvo +dJU +cla +qyb +bNq +olj +cmf +gBh +gBh +aJq +aJq dDB dDB dDB @@ -84488,15 +88989,15 @@ ozn ozn sqe mhk -dJi -rra -uGP -uxS -jBE -oEj -nQr -oAz -pZj +pMg +pYE +vzP +aWw +vkG +xYD +xPR +tzJ +xRZ wBm wXk oOy @@ -84537,7 +89038,7 @@ ets eva hXU dUA -bZB +vUM sbW cGj rtQ @@ -84648,63 +89149,63 @@ dDB dDB dDB dDB -tYT -tYT -tYT -tYT -tYT -aJq -aJq -tYT -tYT -tYT dDB dDB dDB +oua dDB dDB dDB +wNL dDB -aJq -aJq -xZV -ayK -ayK -ayK -ayK -xua -aAE -aKm -vtV -aQI -aVz -yjE -bKu -vxt -kLq -smo -yjE -uYG -djC +dDB +dDB +qin +qQF +lgr +fFO +wzv +pWm +pWm +yil +dbo +yil +kNn +yil +kNn +pnl +rlk +wby +juF +chf +lSF +nsa +lpT +uOL +iME +nsy +beg +adV +beg +jIa +beg +beg +dIZ +lRz +xQS +fKA +fKA +oUq +sav +gIM +amH +ccO bNq -hDn -dIe -dRE -ecF -wpE -hjT -ioQ -eQe -faw -dwJ -dSM -eoK -eGJ -fdF -ftO -xae -blb -blb +olj +gBh +gBh +gBh +gcs blb blb blb @@ -84745,15 +89246,15 @@ udt rXw sqz mhk -iYM -oEj -cpq -wyn -tkK -sYz -rkc -oEj -quj +yjD +xYD +rLT +qCg +qZB +cPd +wWa +xYD +quJ wAW hDT glM @@ -84905,15 +89406,10 @@ dDB dDB dDB dDB -tYT -aJq -aJq -tYT -tYT -tYT -tYT -tYT -tYT +dDB +dDB +dDB +oua dDB dDB dDB @@ -84922,48 +89418,53 @@ dDB dDB dDB dDB -aJq -aJq -aJq -aJq -aJq -aJq -ayK -avp -aBs -aKG -omJ -yjE -vSm -yjE -bUk -yfa -gJA -yfa -yjE -lSh -djE -ecq -vDA -dIm -dSd +aWx +tdY +qcF +wzv +yil +xnL +yil +pWm +pWm +pWm +mMF +mDb +pnl +cSP +kgW +uJU +hNU +mBq +bBy +yhS +gCp +uah +beg +glO +lda +ybC +uGB +vja +ssP +ioN +qPO +oYN +dNM +lPw +wDF +qid +bkO +nHP +xoV bNq -wHa -hhR -ieu -eQi -fbq -dxP -oYJ -eoY -xae -xae -xae -xae +bJK +dez +gBh +aJq +aJq dDB dDB -blb -dDB dDB dDB dDB @@ -85002,15 +89503,15 @@ xLO mhk mhk mhk -foF -tkK -cVc -ulS -xPO -kDx -tkK -oEj -pZj +csp +qZB +uaa +qCR +ram +ryp +qZB +xYD +xRZ wBm wXk jte @@ -85162,63 +89663,63 @@ dDB dDB dDB dDB -aJq -aJq -aJq -aJq -tYT -tYT -tYT -tYT -tYT dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -aJq -avp -coJ -aKZ -yjE -aRv -aXL -bMq -bUF -vxt -cxr -bwY -yjE -niJ -dkd -dpO -dwL -dJh -dTm -bNq -wXM -vna -kUl -cTr -ddk -eYm -hYC -vmL -cMq -vmL -cMq -flQ +bre blb -dDB +blb +blb +cLg +blb +blb +blb +pWm +pWm +pWm +pWm +pWm +rjo +pWm +pWm +pWm +bvt +bvt +bXb +yil +dfz +ymj +wzB +xvb +pbT +nBd +kLv +nBd +ibB +ibB +beg +fKR +owd +dYw +oQs +wGo +gKz +sio +hqr +uqG +iql +wmd +iSE +lJF +sTW +mTC +bNq +bNq +cmf +olj +knv +aJq +tYT dDB dDB dDB @@ -85258,16 +89759,16 @@ srn uSM rYv srn -dpe -aHz -opr -sOL -oFl -cca -wPi -ofV -yes -nrK +sMi +pMu +qaA +qkv +qCi +raC +dty +vzW +syv +wlF wzk tDJ blq @@ -85419,69 +89920,69 @@ dDB dDB dDB dDB +dDB +dDB +dDB +oua +dDB +dDB +dDB +dDB +dDB +dDB +dDB +tYT aJq aJq -aJq -aJq +pWm +ako +mmT +vtJ +acg +pWm +bvt +bvt +vcm +oii +pnl +uGS +aIE +dOY +wZk +bWk +bBy +sdF +eAC +aHb +beg +xQt +xih +fLy +kNG +jzJ +sqg +gub +uyS +iKK +uqA +vMo +vdB +kDj +thI +hnG +cmf +gBh +knv +aIk +knv aJq tYT -tYT -tYT dDB dDB dDB dDB dDB dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -aJq -ouj -eMV -aOE -mQB -dSD -dSD -vxt -bWJ -vxt -vxt -vxt -yjE -eFv -dkm -dqj -dxG -dJn -dTr -bNq -ybO -ybO -kUl -cTD -ddN -dzQ -hYC -cLB -hYC -fdK -blb -blb -blb -blb -blb -dDB -dDB -dDB -dDB -dDB mEB gEc gIx @@ -85515,16 +90016,16 @@ mhk tKf rYD mhk -nPv -oEj -nUZ -owo -ulS -dKy -tbf -nEw -aFa -kIU +jrZ +xYD +jEU +uXN +qCR +raX +vkz +agF +syG +pHN wAW wXk xiF @@ -85677,64 +90178,64 @@ dDB dDB dDB dDB -aJq -aJq -aJq -aJq -aJq +dDB +dDB +oua +dDB +dDB +dDB +dDB +dDB +dDB +dDB tYT -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB aJq aJq +pWm +arN +wOz +viE +bOa +pWm +bvt +bvt +bvt +oii +pnl +opo +sID +dxr +dpk +xdl +nsa +niv +jRR +niv +beg +qXd +pft +kwr +ydV +shK +pzi +vpS +iqY +vnp +vIF +jrS +qAR +eIv +eKU +bNq +bNq +gBh +knv +liX +knv aJq aJq -aJq -aJq -vxt -vxt -vxt -vxt -wyt -aXR -vxt -cIy -cIy -fch -cIy -kFP -kGd -dkd -cdt -cmA -dJp -dVu -efe -pAx -tfC -cMB -eQz -deB -dAh -dUn -eoZ -dRm -fel -xae -xae -xae -xae -xae -blb +dDB +dDB dDB dDB dDB @@ -85772,16 +90273,16 @@ mhk xmI pbu mhk -vJW -oEj -mMl -fYQ -ulS -bnQ -tbf -uPq -hTk -pZj +mYS +xYD +yaG +qOp +qCR +uSC +vkz +vAA +szy +xRZ wAW iLK glM @@ -85934,11 +90435,9 @@ dDB dDB dDB dDB -aJq -aJq -aJq -aJq -aJq +dDB +dDB +oua dDB dDB dDB @@ -85946,51 +90445,53 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq tYT aJq aJq -vnI -vnI -vxt -vxt -bHd -vxt -vxt -wyt -cyp -yfa -yjE -fAR -dlR +pWm +pWm +hDg +qMG +pWm +bvt +bvt +bvt +bvt +yil +pnl +wQa +tgD +vyM +hmB +slC +pnl +wqP +pnl +pnl +beg +prI +cVM +mvn +jwM +prI +beg bNq bNq bNq bNq bNq -ybO -vZJ -cMI -eSB -dfB -dAl -dUT -epq -oYJ -ffs -eGt -fHQ -gfE -gqw -xae +bNq +bNq +bNq +gBh +gBh +gBh +knv +aIk +knv +aJq +hwJ +blb blb blb blb @@ -86029,16 +90530,16 @@ mhk mhk xLO mhk -wTb -tfU -mMl -ebs -ulS -dKy -fUp -nEw -oEj -dTX +ptZ +sYF +yaG +qkw +qCR +raX +rzu +agF +xYD +wlQ wBm wXk glM @@ -86193,8 +90694,7 @@ dDB dDB dDB dDB -aJq -aJq +oua dDB dDB dDB @@ -86203,57 +90703,58 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -tYT -tYT tYT aJq -aJq -vnI -vxt -vxt -jmI -xya -yfa -yjE -yjE -yjE -yjE -yjE -mRl -cqJ -bNq -dye -dKC -dVM -gDL -lPf -rBW -cMV -hSM -dfC -fmj -aIr -iGh -dSM -ffO -eGJ -fLX -gfL -grW -xae +bvt +bvt +fiw +oIf +pWm +bvt +bvt +bvt +pWm +oii +pnl +bFr +aFU +mgz +vSh +bbp +pnl +oCE +oCE +lYH +fGU +bYl +onv +gcM +tAm +iQr +kfv +vgp +jhk +hrx +hrx +lLe +mid +knv +rQH +wdo +tkN +gBh +knv +ovt +knv +knv +knv +dDB +dDB +dDB blb dDB dDB dDB -dDB -dDB slY mEk tYI @@ -86287,15 +90788,15 @@ tYL pbu mhk mhk -por -eMX -acQ -ulS -cGd -hgQ -oiM -jFD -aGw +oqE +qbr +hNT +qCR +rba +rAb +vAR +vSE +woB ntw vuR xgA @@ -86450,6 +90951,7 @@ dDB dDB dDB dDB +cBX dDB dDB dDB @@ -86457,57 +90959,56 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -tYT tYT tYT aJq -aJq -vnI -vnI -vxt -aOK -kqa -dgv -yfa -yjE -bhV -dER -cKm -ybO -dbh -bzM -ybO -lPf -hYN -dWx -egk -lPf -iqH -eHS -eSF -dgr -fnp -ivx -fGE -hYC -vmL -xae -xae -xae -xae -xae +bvt +bvt +bvt +bvt +bvt +bvt +bvt +bvt +pWm +yil +pnl +jZl +iXn +lix +aaA +jZl +pnl +oCE +pWm +pWm +pWm +rQi +urg +rQi +sfF +rQi +bNq +bNq +bNq +knv +knv +hgV +wDM +uaZ +fTf +tnF +dAI +whM +loq +sXm +fBO +knv +blb dDB dDB dDB +blb dDB dDB dDB @@ -86544,15 +91045,15 @@ sNW rYD xLO mhk -lgk -tfU -bnu -uGP -uGP -jBE -aev -oEj -pZj +sYK +sYF +uao +vzP +vzP +vkG +bOl +xYD +xRZ wAZ wXk xgN @@ -86561,7 +91062,7 @@ kar vnr vIh wfb -cGx +alg xfU xjU fEC @@ -86576,7 +91077,7 @@ ntf uMT xkt ujA -ovs +cDH fFH fYX vTV @@ -86707,65 +91208,65 @@ dDB dDB dDB dDB +eNn +blb +blb +blb +blb +blb +blb +blb +aJq +aJq +aJq +bvt +bvt +bvt +bvt +bvt +bvt +bvt +bvt +pWm +qjp +kNn +pnl +pnl +pnl +wqP +pnl +tOc +oCE +pWm +cua +rMf +rQi +eCJ +vdt +pOi +orb +gBh +cLa +lUG +cvJ +iHw +cvJ +cvJ +knv +rcQ +nQs +yfN +jJW +uSa +hpe +rHE +knv +blb dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -tYT tYT aJq -vnI -vnI -vnI -vnI -iyO -lmG -dhK -dgv -yjE -bjf -bpg -mcx -ybO -vfA -tly -jgZ -lPf -fLz -auB -gJe -eqM -ewU -cMV -eSF -dgr -dBb -dVF -ept -eHR -fhS -vmL -cMq -blb -blb -blb -dDB -dDB -dDB -dDB dDB dDB ueX @@ -86802,14 +91303,14 @@ xYJ pbu mhk mhk -hfh -oEj -oEj -oEj -nQr -oEj -tfo -crq +xpT +xYD +xYD +xYD +xPR +xYD +vSX +tdg wBm wXk bVv @@ -86853,7 +91354,7 @@ dwa dBr eWB lzM -hRv +nTy mnb cDt xpV @@ -86964,65 +91465,65 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -tYT +eNn +kAG +kQo +kQo +kQo +wJa +blb +vmL aJq -vnI -vnI -vnI -tTd -tTd -nAS -yfa -dhK -yjE -eBO -eeg -eeg -fUL -bMN -tly -fzc -lPf -lAF -yic -iTG -eqS -exJ -eHS -eSU -djf -dBb -dWw -eqL -hYC -fiF -xae -xae -xae -xae -xae +aJq +aJq +bvt +pWm +pWm +pWm +bvt +bvt +bvt +pnl +pnl +wqP +kNn +oCE +vxX +oCE +oCE +rZu +rZu +rZu +bgn +wtG +kSj +rQi +aIY +kBC +iyn +orb +gBh +cLa +mbG +vvs +knv +hwr +knv +knv +knv +knv +rub +meh +xqp +meh +dUw +knv blb dDB dDB -dDB +aJq +aJq +tYT dDB dDB dDB @@ -87059,14 +91560,14 @@ sqz xLO xLO mhk -aOb -azB -kpk -lJh -wHl -tmN -sdi -dLU +tCk +uaE +uty +rbh +tTG +sdg +tEU +hpP wAW mdU xhe @@ -87150,7 +91651,7 @@ pSd tDn qdv rwP -yca +uZB tDn uug xwT @@ -87221,64 +91722,64 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +eNn +uHq +blb +blb +blb +vrK +blb +vmL +aJq +ayK +urz +pSQ +pSQ +mfU +wiR +wiR +wiR +mLD +tlC +mfU +pnl +pUR +jUx +pnl +pnl +pnl +pnl +pnl +pnl +rQi +rQi +rQi +rQi +iCF +sHO +vOL +rQi +bNq +bNq +ecq +bNq +bNq +bNq +bNq +ukA +gqt +obW +qAr +bmN +rgS +krk +jMM +obW +blb dDB dDB aJq aJq -aJq -vnI -vnI -aCf -tTd -aOM -aRF -bIf -xya -yjE -cmY -eeg -eeg -fUL -bNg -tly -dsq -lPf -pFN -wKD -cAC -eqS -hoo -cNe -eTu -djj -dBi -dWI -eqX -oYJ -fjK -eGt -fMN -gic -gsf -xae -dDB -dDB -dDB dDB dDB dDB @@ -87478,64 +91979,64 @@ dDB dDB dDB dDB +eNn +ojK +sQa +lxO +sQa +osu +vuk +ayK +ayK +ayK +lhZ +kXj +xYG +wiR +ouj +pCQ +oUz +cMZ +pnl +tlC +pnl +xaK +pnl +pnl +neL +fHD +agR +dgV +sHH +rQi +rPV +nki +uOk +nmH +sHO +ojz +sLu +urE +ess +jCY +vfG +oSw +jyl +bNq +pkB +sCm +obW +grF +ecn +kmH +rLu +cPe +obW +blb dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -vnI -vnI -aCf -bUk -aPh -aSa -aYd -xya -yjE -dzT -bpm -dWp -ybO -lcU -tly -nSz -lPf -fNk -glB -ybO -ybO -hoL -cNq -hXt -dkq -fnZ -fAM -fHa -dSM -fjR -eGJ -fNr -gig -gtG -xae -dDB -dDB -dDB +tYT +blb dDB dDB dDB @@ -87735,65 +92236,65 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -vnI -avD -cqp -tTd -bxx -bCl -aZi -dhK -yjE -cnL -bpG -eiK -ybO -bNJ -xif -eVb -lPf -sKX -gNh -ybO -vkw -hpc -cNw -hVO -dkC -fpb -fAX -fHh -cLB -fjS -xae -xae -xae -xae -xae +eNn +uHq +blb +blb +blb +luC +lOC +jkV +cYt +gyt +gQK +tjH +xYG +dEA +kWK +bhb +hEt +qMu +ouj +tXS +uus +wNA +ceA +rDV +ugF +eTj +gtU +uJH +tHa +noU +bxu +xta +cbj +bKl +cqM +dgm +wIu +oHO +sDo +fhX +lsd +jJu +kya +bNq +muy +hAN +tbr +grF +sUV +vTE +lon +kNC +obW blb dDB dDB dDB +blb +dDB dDB dDB dDB @@ -87992,60 +92493,60 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -vnI -vnI -aCf -cqp -cqp -wyt -yfa -xya -yjE -yjE -yjE -yjE -ybO -bOe -sSm -ybO -ybO -ybO -ybO -ybO -wWO -hqB -cNW -hWY -dkF -fnp -dXH -erk -cwf -fkt -vmL -flQ -cMq -blb +eNn +sQt +sQa +sQa +sQa +uMV +qmo +ayK +ayK +ayK +kpq +qsa +uPN +vIp +iAS +vEQ +jph +kTu +bnq +tRj +pgr +cUa +hyx +cDE +fCW +oPa +xfB +qKx +xed +rbp +vrh +eat +oYv +jJg +bsG +wqW +jad +hUh +hUh +uXS +nTK +uGy +mMH +qZE +lER +hRO +knv +rKZ +mGn +lvK +jiC +vdw +knv +knv blb blb blb @@ -88060,7 +92561,7 @@ slY ohl xwz pjG -xmB +hZe bOY rzL xwz @@ -88249,62 +92750,62 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aan -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -vnI -vnI -vnI -aLT -vxt -vxt -vxt -bNG -vxt -jDw -bqs -yjE -bzT -bNg -cnM -eYM -nOI -xNU -gpS -cBc -wRM -dGO -eIk -eTL -eTL -fnp -dXK -tfl -hYC -fjS -xae -xae -xae -xae -xae +eNn +uHq blb +blb +blb +lUu +blb +aJq +ayK +aKb +uUG +aEq +xYG +ouj +ouj +ouj +iyl +fZL +ouj +gxK +aWG +trA +wEc +rDV +tmk +wzF +gom +gzs +ilz +noU +hFA +gkW +rmM +btV +lMl +ayR +erJ +vDg +euP +all +eWf +eIx +kWg +bNq +wxG +uIX +obW +dph +nEz +cvJ +vqw +nEz +qEP +dDB +dDB +dDB dDB dDB dDB @@ -88506,61 +93007,61 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +eNn +rMs +qrc +uFy +uFy +kVK +blb aJq -aJq -aJq -vnI -vnI -vxt -aYe -gJA -cSX -bda -dgD -dgD -dgD -xzJ -sot -ddd -lWv -rPo -rPo -ftF -kka -kmR -orV -trd -eIk -cUd -dkW -fnp -dXT -wsL -uYx -vpl -tJO -fNA -gij -gtT -xae +ayK +xYG +pTt +xYG +xYG +ccL +unG +ouj +rmD +eZt +ouj +xYG +ufR +xYG +xYG +rDV +cGb +dwC +iAk +sql +qVJ +rQi +uGH +tZP +nra +hGp +sHO +drI +cRq +rbl +jcx +uKO +vfG +fnm +gUo +bNq +hOX +fEU +obW +dph +bEW +qbE +gNb +sIO +qEP +dDB +dDB dDB dDB dDB @@ -88576,7 +93077,7 @@ pJQ wZF pqv wZF -tPA +vdl slY ueX rVQ @@ -88763,6 +93264,59 @@ dDB dDB dDB dDB +eNn +blb +wkU +blb +blb +blb +blb +vmL +aSV +hMb +fuT +lgc +sbG +qDv +eVm +lPW +htQ +tMm +fWe +hxG +iXg +tSV +xYG +rDV +rDV +rDV +rDV +rDV +rDV +rQi +orb +orb +orb +rro +sHO +sPk +orb +orb +orb +orb +orb +bNq +ecq +bNq +fYr +jfA +obW +dph +aeu +hCq +wFV +bEW +qEP dDB dDB dDB @@ -88770,59 +93324,6 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -vnI -vxt -vxt -vxt -vxt -azq -vxt -bKu -gJA -yfa -yjE -faX -qRQ -bXV -bNg -col -fNH -grM -cCw -peI -kyT -eIk -cUF -dll -fpk -fAZ -fHn -cwf -flg -ftZ -fOn -giy -gtW -xae -dDB -dDB -dDB -dDB -dDB mEB gEI mFA @@ -89020,62 +93521,62 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -vnI -bKu -wyt -gJA -aSP -cGG -vxt -yjE -sZu -yjE -wBo -wBo -xql -wBo -nMU -wBo -wBo -wBo -ybO -gUc -wII -eJk -hSA -qUL -pZI -ivE -iGu -hYC -flQ -xae -xae -xae -xae -xae +fJX blb +tCc +blb +bSo +bSo +blb +blb +ayK +iJO +bdd +prV +hdT +ktL +eLZ +uCL +pss +sed +drF +fZV +bcZ +kLk +ejN +xZb +rCU +lfQ +eld +ejN +ejL +feo +oVt +mUI +rFb +rSW +wPM +qYE +xBD +waH +cdz +ifN +xGH +qmv +cvJ +knv +knv +knv +knv +hLW +nEz +bEW +pZQ +nEz +qEP +dDB +dDB +dDB dDB dDB dDB @@ -89277,70 +93778,70 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -avL -yfa -sZu -yfa -ykQ -aZM -hui -hui -cok -yjE -bxc -bAi -bOs -qKZ -cdB -icS -fPt -wBo -gJN -oyx -gwf -los -ybO -cwf -cwf -dZd -esw -ybO -vmL -vmL -cMq -flQ -cMq +eNn +blb +wkU +blb +uqe +uLW +blb +blb +aSV +xug +dxu +isv +sbG +njH +uJd +xQr +xQr +xQr +xQr +xQr +bYe +aPB +qDA +bIi +oet +cYU +bIi +qDA +bLu +hkG +hkG +way +vuq +faQ +uaT +nGP +nPF +wQi +rKR +rHe +ecf +bNq +xxt +ecs +knv +wdY +knv +emB +knv +knv +knv +knv +knv +knv +blb +blb +blb +blb +blb +blb blb -dDB -dDB -dDB -dDB -dDB -dDB ueX mGu -fEF +gKK gPW hau oPF @@ -89372,7 +93873,7 @@ oTH mhk xHB pOK -sDD +wvo iEX yfC aws @@ -89461,7 +93962,7 @@ ohR eoz eoz tTW -wvg +nha tMS xIj vfN @@ -89530,11 +94031,63 @@ dDB dDB dDB dDB -aan dDB dDB dDB dDB +eNn +blb +wkU +bSv +sQm +sQm +wNU +aci +ayK +ayK +ayK +ayK +ayK +aUR +qdJ +xQr +snm +izT +emC +xQr +roe +xri +xYG +xYG +vdS +hox +orb +wfn +eDo +ecY +ecY +ecY +pUs +wfn +gKL +lwW +kBZ +elv +lwW +rQi +hgv +kGY +xxt +xxt +knv +xxt +aqo +cvJ +xrA +cvJ +cvJ +uRY +knv dDB dDB dDB @@ -89543,58 +94096,6 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -tTd -aCZ -vxt -vxt -cBn -vxt -sZu -bKu -cpt -yjE -czy -eyi -dOq -dOq -jcF -yfe -pgO -cwC -cDa -sId -vdp -npr -jAB -erW -dBM -eag -esC -eKU -ecQ -cMq -xae -xae -xae -xae -dDB -dDB -dDB -dDB -dDB -dDB slY atx ueX @@ -89627,7 +94128,7 @@ rkR mhk mhk mhk -sbt +vgJ uAV tDT fDp @@ -89791,62 +94292,62 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -vxt -vxt -sZu -aPm -cDh -cXU -sZu -sZu -dAS -yjE -mfK -iHy -eoG -dmw -hDX -dyG -dLb -wBo -uXo -ddh -wsZ -cIE -ebj -dLy -dDN -eaC -esE -eLJ -fnr -fuo -eGJ -giO -gux -xae +eNn blb +wkU +osa +vrT +vrT +blb +osa +blb +vmL +hdT +bsJ +iGc +lfI +xYm +xQr +gzL +aGc +gzL +xQr +ezG +pGi +fEi +xYG +xYG +xYG +xYG +tNV +hss +lYF +uBj +nRA +wnR +dLj +gKL +jOi +rNI +cyG +dAF +fpO +fpO +bNq +bNq +cvJ +cvJ +xxt +rHK +xxt +xxt +knv +xxt +xxt +knv +knv +dDB +dDB dDB dDB dDB @@ -89884,7 +94385,7 @@ rlz rHD qVR wCR -wkl +rHL tDP qbC lsJ @@ -89993,7 +94494,7 @@ qeP lrE oPV pId -ikZ +kld qRM vSx eGL @@ -90046,63 +94547,63 @@ dDB dDB dDB dDB +aan dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -vnI -vnI -vxt -aPn -cFt -bIG -djU -vxt -tWj -cAh -cLn +eNn +blb +jia +gBe +sQm +sQm +aci +bWl +wNU +wNU +gfA +lFT +eUR +hTC +wWb +qjq +xAW +npL +czf +hwG +uCE +jhJ +tTK +aZu +fBZ +abR +xYG +wfn +lFH +ugA +tIN +hEl +svK +wfn +gKL +upG +daC +jBo +oEt +gpI +lhq +cBw +bNq +bNq +bNq +bNq +knv +eeY +knv +knv +xxt +cvJ +wMC +knv blb -iYJ -fPb -dUr -dzl -ylB -wBo -ehB -kfK -oxb -qOG -rEt -wik -qbB -fBe -fIg -eLL -qOi -ffs -eGt -gjT -guT -xae blb blb blb @@ -90250,7 +94751,7 @@ qeP lrE oPV eHf -wUG +vEb eHf qsR eGL @@ -90305,62 +94806,62 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -vnI -vnI -vxt -cnS -cFI -bat -bdJ -dvq -wOW -sZu -eaA +eNn +blb +luC +amV +vrT +lBp +sYg blb blb -fPb -cdW -fPb -fRd -nMU -wBo -hYC -rZh -toL -ecQ -wib -pIn -iwM -iJx -eNb -eKU -flQ -xae -xae -xae -xae blb +hdT +qJN +oaB +oZQ +nbj +nVe +son +ieM +miN +pkd +egR +jhJ +kJs +lyX +rjE +pFS +keY +wfn +nuu +thb +oxc +rwJ +wnR +xXl +gKL +gdA +xuv +eYD +bed +fvs +hpj +rYL +gpI +jlL +iwJ +bNq +neg +wZr +jWe +knv +xxt +knv +knv +knv +dDB +dDB dDB dDB dDB @@ -90507,7 +95008,7 @@ lub tBA oPV iNz -cvR +lHi jDe tSB eGL @@ -90562,61 +95063,61 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -vxt -sZu -cIX -baW -vxt -vxt -yeE -vxt -eaA -blb -blb -wCQ -hIR -ftb -cqR -gtZ -gKs -gUl -sfb -nBP -ecQ -dnj -dFs -eaE -euj -eNG -ecQ -cMq -cMq +eNn blb +luC +amV +vrT +uqe +uLW +bSv +wNU +wNU +gfA +tNH +lae +xrm +bxs +tVN +uAT +aLu +xOJ +tiU +egR +wxp +ycW +snX +aSc +fqQ +odE +wfn +aWA +lVv +nHq +exQ +fib +cca +gKL +mZb +pmg +kxb +rsr +rFC +qEm +waX +fdE +mfn +vKn +bNq +mFL +veo +lIt +knv +xxt +dsh +knv +dDB dDB -blb dDB dDB dDB @@ -90819,61 +95320,61 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -aJq -aJq -vxt -aTd -ygP -bem -sWm -rRp -cAh -dXE -eoU -rMn -xpf -xpf -xpf -crm -nSo -wBo -osE -pnM -eJZ -eKU -dnq -dFH -ebc -euQ -eOo -ecQ -ecQ -eKU -flQ -dDB +fJX blb +wHH +nIK +sQm +sQm +qZm +osa +blb +onb +xnA +oSF +iPg +dbN +ayx +vFW +qbR +rhg +ilN +kBD +dvO +miR +nhE +gWJ +jqh +vJe +xYG +wfn +mpE +nCC +rDc +qQi +sVu +wfn +gKL +nmX +cyy +paX +rdH +gpI +ceP +wld +gpI +qCT +rWH +bNq +fRv +laF +qUE +knv +xxt +eEL +knv +dDB +dDB dDB dDB dDB @@ -91076,61 +95577,61 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -aan -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -aJq -aJq -vxt -sZu -vxt -sZu -cGG -sZu -vxt -cLz -cVV -bOL -fAN +eNn +blb +ppr +osa +vrT +vrT +blb +osa +blb +blb +hdT +ilB +koV +sjZ +dkR +tSN +lrD +kGm +oaJ +caB +tyu +cjP +oWE +tMJ +rAH +aZf +xYG +nXC +nmi +cED +nQE +rLj +gNt +lkQ +gKL +fMA +gFF +xCc +wnw +fpO +cPS +etl +fpO +krW +twL +bNq +knv +knv +knv +knv +cvJ +mid +knv +knv blb -fuC -fSL -guI -wBo -ybO -cBz -eKd -ecQ -dnt -dGt -ebx -euX -eOp -foi -fuR -foi -cMq -hem -hem blb blb blb @@ -91333,60 +95834,60 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -aJq -aJq -vnI -tpH -tTd -pJg -vxt -fJO -awi -fZq -yfa +eNn +eoU +aNc +gBe +hHV +sQm +wNU +qZm yjE yjE yjE yjE -yjE -vxt -jpJ -eUi -bcc -eUi -feq -dIt -ecQ -evg -ecQ -eKU -ecQ -ecQ -hem -maf +ayK +pbj +cKv +xQr +eqB +nGt +eqB +xQr +gDe +eIX +xYG +xYG +xYG +xYG +xYG +wfn +wfn +osT +qxF +wap +wfn +gKL +nlZ +aiK +snj +aiK +aiK +nlZ +bgq +weA +nlZ +lYj +lYj +lYj +uKh +lLA +lpJ +knv +bFR +knv +knv +qtG qtG qtG qtG @@ -91402,7 +95903,7 @@ iCw jDP wyg hvy -ayn +iDO xRV xRV xRV @@ -91435,7 +95936,7 @@ xRV xRV xRV szH -iPf +sRv xRV saZ sxw @@ -91489,7 +95990,7 @@ trp trp trp trp -szN +nCL xqd xul trp @@ -91590,64 +96091,64 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -aJq -aJq -vnI -pSo -aSP -bfo -bjx -gJA -gJA -bAK -bQh -vxt -ctI -dBa -ykQ -dSD -elY -xlF -cpW -cOQ -cXe -dnW -wbi -iwe -mDU -wJt -for -fvC -xvl -gkN -guV -gwD -wbi -wbi -wbi +eNn +luC +blb +amV +lBp +sYg +eNm +bTd +gQI +wEU +nEL +fBy +yjE +pqo +auQ +xQr +pdh +mcT +rjr +xQr +txS +lFE +gWl +ezQ +hkT +uNk +rUs +gBA +sSB +sHM +iqB +fdy +hnS +sKD +hxY +vpZ +oRj +cjz +rMR +hjk +mGr +hjQ +uBM +piL +pEo +phC +lyt +aAQ +lyt +cPR +lyt +bpe +kAp +lyt +lyt +lyt +lyt +lyt wbi wbi hrY @@ -91847,64 +96348,64 @@ dDB dDB dDB dDB +eNn +jxh +voO +ccx +blb +mys dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -aJq -aJq -vnI -jDw -bft -vxt -vxt -vxt -vxt -vxt -vxt -srm -vxt -wOW -vxt -vxt -jMk -hvh -hHy +blb +xQG +xBH +yfa +tsl +yjE +taK +chr +uvB +mRY +yjN +jGk +dOU +vFf +ioX +xdJ +iCr +pmA +pmA +stm +xdJ +sEj +qjx +iqB +phY +jmZ +oJl +bDh +fPY +xkX +hYS +dsb +dsb +nje +dSO +lMr +gSr +gSr +gSr +gSr hNY -hTR +pBT hNY -xmT -qiE -nyt +pfu hNY +muM +fpg +ekV +fLE hNY -hNY -gli -gvp -ggW -gwV -gxR -hTR +pbl gwV hNY gBk @@ -91961,7 +96462,7 @@ cmT vJV qBN iKm -xQK +eUZ vEP hji pCF @@ -92104,64 +96605,64 @@ dDB dDB dDB dDB +xjc +blb +dDB +blb +mys dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -vnI -vnI -bfF -vNK -vNK -tzF -bAL -bQU vxt vxt +nQk vxt -ykQ -smo -vxt -gUS -sne -hAc -cXP -msg -gAi -msg -fIE -fNh -gAi -gBD -msg -glz -gvX -ghd -msg -msg -msg +yjE +ayK +xOO +cEH +lvG +lvG +lvG +nGm +mTi +ayK +yjE +yjE +pqH +gXn +wfn +jKU +jKU +jRU +iqB +ahW +wfn +gKL +ejM +ggX +pmE +hDh +ctb +pWH +fEe +lCw +tjd +fQL +gnS +eiN +eVY +eVY +eVY +dAz +eVY +ccG +oyU +eVY +eVY +eVY +eVY +eVY msg msg hsc @@ -92362,59 +96863,59 @@ dDB dDB dDB dDB +mxX +bTd +ihA dDB dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -vnI -vnI -vnI -sZu -bUk vxt yfa -bRo -scg -kUI -ykQ -wOW -fXi -vxt -wMm -wbj -eLO -wbj -wbj -wfn -fCg -fIK -fOj -foJ -fqf -fqf -fqf -fpO +qGk +oEb +yjE +hlM +irZ +sDh +rrG +rrG +gDq +qqJ +yjE +rco +yjE +dGV +fDO +jKU +vTg +jKU +nQB +pVM +xfz +eGw +gKL +iJS +hSP +cza +axX +cow +cow +tXL +eiD +cow +poL +rjv +hem +hFp +bgE +lpJ +hKX +hKX +hem +hem +qtG qtG qtG qtG @@ -92620,59 +97121,59 @@ dDB dDB dDB dDB +blb dDB dDB dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -vnI -vnI -vnI -vnI -tTd vxt -kLq -bRA -yiF +uUA +iok +dsE yjE -fAN +fXo +yjE +yjE +evm yjE yjE yjE -kzo -rSw -oFm -sIg -kxD -wfn -ecY -ulo -ecY -fpO -fvJ -lVZ -gmp -fpO -maf +yjE +yjE +yjE +eIT +whl +flE +jnB +eqS +gsY +xsX +obe +iwz +aNJ +hvT +kfW +qeV +jqD +cow +yeY +dQi +aeX +cow +vxt +vxt +vxt +vxt +vxt +vxt +vnI +vnI +vnI +hem +hem +blb blb blb blb @@ -92689,8 +97190,8 @@ xoS hwo hDC tsF -ibq -nZg +ijN +uLB yat wCt lEa @@ -92709,7 +97210,7 @@ yfH jVM wzj nvo -fZd +row jVM puD pQe @@ -92877,24 +97378,7 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB +aGa dDB dDB dDB @@ -92902,33 +97386,50 @@ dDB dDB dDB vxt -vxt -sZu -vxt -bqZ -vxt -fBf -bSj -xVx yfa -gKL -cbu -aMm -cEc -wTv -qLh -cQb -wqm -sTH -wMm -izq -evs -bGc -fqf -fvT -ahM -gnf -fpO +uUA +uUA +yfa +afB +rWQ +idH +evM +mWs +xCR +lHh +hVq +hVq +yjE +oIF +tit +kIp +tYC +izE +mls +dSh +fDW +kmD +pLI +bja +jyC +fgG +lNJ +cow +lBm +iIW +kSc +jAz +vxt +dhC +bqu +vkD +dsp +vnI +vnI +vnI +vnI +aJq +aJq dDB dDB dDB @@ -92947,7 +97448,7 @@ cmd qly uVT uVT -jZV +ueH xQw uVT jsN @@ -93136,57 +97637,57 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB aan dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -cLg -blb -blb -blb -sZu vxt -vxt -sZu -xFZ -eLE -wyt +vRH +vRH +hJs +yfa +bwY +yjE +cYL +aEP +auc +yjE +vnI +vnI +hVq +yjE +xcS +bAU +gwl +pPm +jKU +qbP +psL +nck +tau gKL -ugb -vkP -vkP -wTv -xkD -xeD -hXQ -sTH -mKy -iAn -rTg -ePw -fqf -fwO -iUH -gnw -foJ -dDB +ums +rup +fXB +ums +ums +yjE +wyH +vxt +vxt +vxt +kEx +wAf +odh +ijV +vnI +vnI +vnI +vnI +aJq +aJq +tYT dDB dDB dDB @@ -93203,7 +97704,7 @@ rto hwp qlP uVT -jxV +sQI iri bah uVT @@ -93398,52 +97899,52 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -ddG -ntH -ddy -tnx -bYE -pMr +vxt +xQG +vxt +xQG +vxt +xQG +yjE +yjE +yjE +yjE +yjE +vnI +vnI +hVq +yjE +uCH +iJJ +pOB +lPf +lPf gKL -dLf -cwG -hJo -mSq -gCJ -hIq -cYm -fgL -fsf -fDs -evE -ePA -frs -fxt -vRU -gof -fpO -dDB +gKL +gKL +gKL +gKL +hbG +gtu +eYF +cUH +fVA +yjE +pek +uUA +vTj +vxt +ncQ +qoA +xVd +vnI +vnI +vnI +vnI +vnI +aJq +aJq +aJq dDB dDB dDB @@ -93458,7 +97959,7 @@ iDk sUy jaK hwx -hDZ +xiN uVT rEY irQ @@ -93655,52 +98156,52 @@ dDB dDB dDB dDB +vxt dDB dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -wNL -dDB -dDB -dDB -qin -bst -hyD -kpz -pJw -sRP +vxt +aJq +aJq +aJq +vnI +vnI +vnI +hVq yjE yjE -fAN yjE -gKL -gUT -jUm -xzB -eXa -fhj -fsz -fDw -evP -eQJ -fpO -fxw -fSr -gph -fpO -dDB +dnU +yjE +dKl +soV +bqs +vxt +vnI +vxt +kqr +quO +bnV +yjQ +gPb +yjE +tZI +nSd +nSd +drO +bUF +tIB +vnI +vnI +vnI +vnI +oVF +vnI +aJq +aJq +aJq dDB dDB dDB @@ -93919,45 +98420,45 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -ddG -bxq -ddy -bSn -uEV -uEV -ejt -lCH -mZw -gLA -gVV -inH -wyP -cYs -fik -fsD -fDC -ewy -eQO -fpO -fyr -fSv -gpI -fpO -dDB +tYT +aJq +aJq +aJq +aJq +vnI +hVq +hVq +ayO +nPM +jKa +vxt +xBV +yfa +bBX +vxt +vnI +vxt +vxt +yjE +yjE +yjE +yjE +yjE +vxt +fBf +dhK +vxt +rLt +cgt +vnI +vnI +vnI +vnI +vnI +vnI +aJq +aJq +aJq dDB dDB dDB @@ -94179,41 +98680,41 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -cLg -blb -blb -blb +aJq +aJq +vnI +vnI +vnI +vxt +tnx +sHk vxt vxt +eQY vxt -sZu vxt -sZu +hTL +vnI +vnI +vnI +kkK +qli +cyU vxt -fBf -dLZ -sZu -gLK -wjn -uBg -xQC -cYC -jbO -fsV -fDF -exi -eSh -fpO -fyQ -fSW -qHT -fpO +iOx +iOx +mCL +vxt +pDK +vxt +vxt +vnI +vnI +vnI +vnI +vnI +aJq +gcs blb blb blb @@ -94437,40 +98938,40 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -blb -cMq -bBa -ddT -jZR -gJA -fBz -eLE +aJq +aJq +aJq +aJq +vnI +rse +fBf vxt -jco -wJU -aWC -eNV -wMm -fiA -wfn -pgh -eyv -eSo -fpO -fyT -wiw -fpO -fpO +xFZ +ldb +pQj +bRf +ldb +vEC +ydL +ydL +hFb +iOx +dhK +dhK +dhK +vxt +ffp +vxt +dWS +vxt +aJq +aJq +aJq +aJq +aJq +aJq +aJq +blb dDB dDB dDB @@ -94696,37 +99197,37 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -blb -blb -blb +tYT +aJq +vnI +bZQ +pQj +ldb +iGA +vnI +vnI +vnI vxt vxt vxt vxt -hvJ +swT vxt vxt -wfn -xQi -wMm -xQi -wfn -xQi -wfn -xQi -wMm -xQi -fpO -foJ -fpO -foJ +vxt +ddy +vxt +ddy +vxt +ddy +vxt +vmL +aJq +aJq +gcs +aJq +tYT +dDB blb dDB dDB @@ -94954,17 +99455,17 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -dDB -blb -dDB -dDB +aJq +vnI +ddy +vxt +ddy +vxt +vnI +aJq +aJq +aJq +aJq vxt ddy yhB @@ -94977,8 +99478,8 @@ dDB dDB dDB blb -dDB -dDB +tYT +tYT dDB blb dDB @@ -95216,10 +99717,10 @@ dDB dDB dDB dDB -dDB -dDB -dDB -dDB +vxt +vxt +aJq +tYT dDB dDB dDB @@ -97327,7 +101828,7 @@ oGJ wQB wix xeO -qVG +hee mbK mqz jVM @@ -97537,9 +102038,9 @@ fpY fpY oRm uTA -fEb -bfy -sHg +apZ +vzK +oCF uTA fpY wct @@ -97584,7 +102085,7 @@ oGJ wQB xAV xeO -ylr +lMy puN pSI jVM @@ -97800,7 +102301,7 @@ cwX hJp wct wct -eMI +iWV yfP wct isj @@ -98049,7 +102550,7 @@ yjV fpY uTA uTA -uWM +bZy cfk fkj dMg @@ -98096,10 +102597,10 @@ geE tWL oGJ wQB -lbM +ycx xeO lMH -mFc +cnu jVM jVM xCz @@ -98306,7 +102807,7 @@ dNq fpY uTA dfo -tGk +dor fNF dCj iyq @@ -98425,7 +102926,7 @@ gQR uKM raE dBy -riN +ena gKE tzs eOJ @@ -98562,7 +103063,7 @@ aJq yjV fpY uTA -bSN +jBA xTV dua gnA @@ -98820,7 +103321,7 @@ yjV fpY uTA dhh -mNa +cam dun dCR dKQ @@ -99077,7 +103578,7 @@ yjV fpY tof bSX -qcG +cbi cfk fkj dPa @@ -99593,9 +104094,9 @@ fpY fpY fpY uTA -fEb -mbN -fEb +bat +qAQ +bat uTA fpY wct @@ -99603,7 +104104,7 @@ wct hJp wct gOm -efp +kiQ eFe eYk xvT @@ -99696,7 +104197,7 @@ blb tFQ uql plf -mOc +pXL lMp dYI mDl @@ -99953,7 +104454,7 @@ dDB xSO wHN xrC -syE +pEt sSQ vYj sSQ @@ -100210,7 +104711,7 @@ dDB xSO wuj xrC -tvg +icY sSQ vYj sSQ @@ -100460,14 +104961,14 @@ xIu jHi tAH rTJ -aPO +aBb xQa blb blb tFQ mXT mUg -gcf +kGq sSQ bbh sSQ @@ -100485,7 +104986,7 @@ kel wgL rWW sSQ -oVB +hia ggl eBQ ndp @@ -100929,7 +105430,7 @@ tgl tgl wRD tSn -xHv +uZw jVM ohF rhD @@ -100981,7 +105482,7 @@ pqa tFQ vLc xrC -ceK +xoJ sSQ miA sSQ @@ -103501,9 +108002,9 @@ pUO rRy xIW ylJ -rcv +ohO rqw -aLM +dBA sAB dWW qUt @@ -103519,7 +108020,7 @@ wJx npZ xpU xMr -uQK +lqg qir hoQ wpk @@ -103549,7 +108050,7 @@ wfr wfr vLQ uSj -jBx +baP haq wYA dCe @@ -104270,7 +108771,7 @@ wAn pwq mvA mhY -nwg +ykC qUt qUt qUt @@ -104529,9 +109030,9 @@ mvJ nfD xcF ylJ -nkX +xGe rqw -aPR +ein sAB umM nnE @@ -105023,7 +109524,7 @@ iFP iGl hqW wSZ -ueD +xoh hXP wLl iEZ @@ -105806,7 +110307,7 @@ ghW boX kCP kBH -saD +wRP sRL sRL sRL @@ -107365,7 +111866,7 @@ kzX rdW sGT kVl -rqc +tRM vuo wWX blf @@ -108402,11 +112903,11 @@ iOq nhZ ufF xMr -mOa +vzX vyR vyR vyR -mwb +wIm roz xzZ xQI @@ -109396,7 +113897,7 @@ bqy bqy tIE kGz -cHN +kZo nFW lLv sJR @@ -109653,7 +114154,7 @@ bqy bqy doX yec -hIj +fls nFW nFW nFW @@ -109910,8 +114411,8 @@ bqy bqy tIE kGz -idi -guD +jPr +gxZ dxz kXJ xwy @@ -110167,11 +114668,11 @@ aJN aJN tIE nFW -uju -pfM +iSW +fRZ liR jQL -iyK +uwH nfy nFW kLu @@ -110424,7 +114925,7 @@ jIb pyt nvS nFW -bHQ +iUy hnF iKN jRb @@ -110476,7 +114977,7 @@ ssz iWZ rfJ rcl -oRA +nhC oUB bLT hAJ @@ -110484,7 +114985,7 @@ gPY vsW aAL opq -vbM +uXV euO rfJ mOI @@ -110683,7 +115184,7 @@ pyt vcE vcE rdh -fza +fjN jRz sSV nfy @@ -110737,7 +115238,7 @@ yeQ lEu bLT tEj -ctJ +bqD rcl aAL mwF @@ -111234,10 +115735,10 @@ xPv uSi wtu wKz -cPP +xrX xBj xUB -qHS +yha tqD dDB ssz @@ -111251,7 +115752,7 @@ fJl gtl iTB aSy -scf +kkd aSy wtc lVC @@ -112022,7 +116523,7 @@ jGL kKe iTB aSy -uKQ +vWI aSy wtc stU @@ -112509,7 +117010,7 @@ fpB wPd gsv bBu -qty +tbB ygu xdc ugj @@ -112787,9 +117288,9 @@ eBn roz ssz iWZ -tsL +oMI okB -oRA +nhC oUB mBQ oEB @@ -112797,9 +117298,9 @@ sGh uEC aAL wxZ -vbM +uXV tEj -ctJ +bqD mOI rIY hLS @@ -114580,7 +119081,7 @@ mdt fdM tVt reh -anZ +tgp reh reh vnf @@ -115363,7 +119864,7 @@ cqn qcq foI gJS -pNR +lIL gJS arB mOm @@ -115598,7 +120099,7 @@ wPK xfc vRh xUV -viC +rpk uMU eAn bZN @@ -115846,13 +120347,13 @@ eWD jQo vRh pwA -xGA +rvX rZH svy sSW tbS wQj -gfB +xeX xvf xUO ycq @@ -115877,7 +120378,7 @@ xlM qrB yeQ yeQ -dLd +ppW yeQ yeQ qrB @@ -118471,7 +122972,7 @@ grm svs fnw exR -lur +bIg svs dDB dDB @@ -118684,7 +123185,7 @@ gAA jtI tRw xFA -nDm +rFH xFA fbO ixU @@ -119728,7 +124229,7 @@ uzK rOs nVF qsg -yez +kcW wos udv tSq @@ -124341,7 +128842,7 @@ dDB nFI yeZ wXg -dKZ +vHk wKY rFp yly @@ -124639,7 +129140,7 @@ mCF xIP rGO mqO -ldW +vKe gXS njL xIP @@ -125116,7 +129617,7 @@ blb blb yeZ pUC -mSs +iNC kQt hyE hyE diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index a3c1471de61..3c986b5ebeb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -17274,10 +17274,7 @@ location = "QM #1" }, /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/storage) "brO" = ( @@ -17884,10 +17881,7 @@ location = "QM #2" }, /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/storage) "btt" = ( @@ -29569,7 +29563,7 @@ /turf/open/floor/engine, /area/station/engineering/main) "csT" = ( -/obj/machinery/door/window/brigdoor{ +/obj/machinery/door/window/brigdoor/left/directional/south{ req_access = list("brig") }, /turf/open/floor/iron/dark/side, @@ -36774,7 +36768,7 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "fBE" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "fBI" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 638ef1140fd..d97755766cb 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1144,6 +1144,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"anU" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/white, +/area/station/science/research) "anV" = ( /obj/effect/landmark/start/hangover/closet, /obj/structure/closet/firecloset, @@ -1158,13 +1166,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay) -"anY" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) "anZ" = ( /obj/structure/sign/nanotrasen{ pixel_y = 32 @@ -1404,6 +1405,30 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"aqS" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 1 + }, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) +"aqU" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/bot/left, +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/machinery/modular_computer/preset/cargochat/science{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/research) "aqW" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster/directional/north, @@ -1440,6 +1465,20 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"arr" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/right/directional/west{ + name = "Security Desk"; + req_access = list("security") + }, +/obj/machinery/door/window/right/directional/east{ + name = "Security Desk" + }, +/obj/item/folder/red, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "arw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -2229,26 +2268,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"aBi" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel" - }, -/obj/item/radio/intercom/directional/west{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) "aBn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -2360,6 +2379,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"aCA" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Research Division"; + name = "Research Division Fax Machine"; + pixel_x = 1 + }, +/turf/open/floor/iron, +/area/station/science/research) "aCJ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -2883,6 +2914,14 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"aJj" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/recharge_station, +/turf/open/floor/iron, +/area/station/science/research) "aJu" = ( /obj/structure/cable, /obj/machinery/power/smes/engineering, @@ -4651,6 +4690,20 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"bgH" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xeno2"; + name = "Creature Cell #2" + }, +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "bgL" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -4848,16 +4901,6 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/white, /area/station/science/lobby) -"biZ" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "bjk" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -5662,19 +5705,6 @@ "btH" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai) -"btI" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/machinery/door/window/left/directional/north{ - name = "Danger: Conveyor Access"; - req_access = list("maint_tunnels") - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/disposal) "btX" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance_hatch{ @@ -6441,6 +6471,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"bDg" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Theater Stage" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/service/theater/abandoned) "bDu" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -6464,6 +6501,9 @@ }, /turf/open/floor/plating, /area/station/security/prison) +"bDx" = ( +/turf/open/floor/iron, +/area/station/security/office) "bDy" = ( /obj/machinery/camera/directional/north{ c_tag = "Chapel - Confessional"; @@ -6503,6 +6543,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/theater/abandoned) +"bEf" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/north{ + freerange = 1; + listening = 0; + name = "Custom Channel" + }, +/obj/item/radio/intercom/directional/west{ + freerange = 1; + listening = 0; + name = "Common Channel" + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel" + }, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai) "bEl" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -6510,6 +6570,26 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) +"bEm" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/north{ + freerange = 1; + listening = 0; + name = "Custom Channel" + }, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Common Channel" + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel" + }, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai) "bEs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6782,17 +6862,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"bGM" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/landmark/start/medical_doctor, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/medical/storage) "bGN" = ( /obj/structure/closet/secure_closet/personal, /obj/effect/landmark/start/hangover/closet, @@ -6892,6 +6961,20 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/engineering/main) +"bIh" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xeno4"; + name = "Creature Cell #4" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "bIk" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -6943,6 +7026,22 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"bIW" = ( +/obj/machinery/turretid{ + icon_state = "control_stun"; + name = "AI Chamber turret control"; + pixel_x = 3; + pixel_y = -23 + }, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Primary AI Core Access"; + req_access = list("ai_upload") + }, +/obj/structure/cable, +/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) "bJf" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -6967,22 +7066,13 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"bJo" = ( -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = 3; - pixel_y = -23 +"bJi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Primary AI Core Access"; - req_access = list("ai_upload") - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/hallway/secondary/service) "bJs" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/iron{ @@ -7602,7 +7692,6 @@ /area/station/maintenance/port) "bRw" = ( /obj/structure/sign/warning/deathsposal/directional/east, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, @@ -7614,6 +7703,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/science/xenobiology) "bRy" = ( @@ -7968,14 +8058,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron, /area/station/engineering/storage) -"bUz" = ( -/obj/structure/sign/warning/secure_area/directional/south, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "bUE" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -8658,10 +8740,10 @@ "cdJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/cable, /turf/open/floor/iron/dark/corner{ dir = 1 }, @@ -8758,6 +8840,16 @@ "cfu" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) +"cfx" = ( +/obj/structure/plaque/static_plaque/golden{ + pixel_y = -32 + }, +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/office) "cfy" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -8884,15 +8976,18 @@ /obj/structure/cable, /turf/open/space/basic, /area/space/nearstation) -"chv" = ( +"chs" = ( /obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/window/brigdoor/left/directional/north{ + id = "engcell"; + name = "Engineering Cell"; + req_access = list("security") }, -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, -/area/station/engineering/gravity_generator) +/area/station/security/checkpoint/engineering) "chF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9856,6 +9951,16 @@ dir = 8 }, /area/station/hallway/primary/port) +"csO" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/science/xenobiology) "csR" = ( /obj/machinery/shieldgen, /obj/effect/decal/cleanable/dirt, @@ -10164,7 +10269,6 @@ "cxu" = ( /obj/structure/table/reinforced, /obj/item/storage/medkit/regular, -/obj/structure/secure_safe/caps_spare/directional/west, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -10338,7 +10442,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/newscaster/directional/west, /obj/structure/cable, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, /area/station/hallway/secondary/exit/departure_lounge) "czL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -10477,6 +10586,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/storage) +"cBB" = ( +/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/hallway/secondary/service) "cBC" = ( /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -11149,6 +11264,16 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) +"cJQ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/medical/storage) "cJX" = ( /obj/structure/table/reinforced, /obj/machinery/status_display/evac/directional/west, @@ -11741,19 +11866,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/department/eva/abandoned) -"cRR" = ( -/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/conveyor_switch_construct{ - pixel_x = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "cRT" = ( /turf/open/floor/iron, /area/station/medical/abandoned) @@ -12056,6 +12168,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/central) +"cVD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "cVN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -13005,6 +13124,18 @@ "diL" = ( /turf/closed/wall/r_wall, /area/station/command/bridge) +"diV" = ( +/obj/structure/table/reinforced, +/obj/item/gps/mining{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/item/storage/medkit/regular{ + pixel_x = 6; + pixel_y = 10 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "djd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13268,14 +13399,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"dlw" = ( -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "Secure Creature Pen"; - req_access = list("research") - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/science/xenobiology) "dlx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -13526,16 +13649,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"dqj" = ( -/obj/machinery/modular_computer/preset/cargochat/medical, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/machinery/light_switch/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/medical/storage) "dql" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -14239,6 +14352,18 @@ /obj/item/aquarium_kit, /turf/open/floor/carpet/red, /area/station/hallway/secondary/service) +"dxi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/window/left/directional/west{ + name = "Fitness Ring" + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/commons/fitness/recreation) "dxk" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/dark, @@ -14580,20 +14705,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"dCI" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/computer/department_orders/science{ - dir = 4 - }, -/obj/effect/turf_decal/bot/left, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, -/turf/open/floor/iron, -/area/station/science/research) "dCT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, @@ -15134,20 +15245,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"dKw" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/right/directional/west{ - name = "Security Desk"; - req_access = list("security") - }, -/obj/machinery/door/window/right/directional/east{ - name = "Security Desk" - }, -/obj/item/folder/red, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "dKx" = ( /obj/effect/decal/cleanable/oil, /turf/open/floor/iron, @@ -15484,16 +15581,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"dNt" = ( -/obj/structure/cable, -/obj/structure/table/wood/fancy/blue, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/right/directional/west{ - name = "Core Modules"; - req_access = list("captain") - }, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) "dNM" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/airalarm/directional/west, @@ -15538,13 +15625,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"dOe" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/status_display/evac/directional/east, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "dOk" = ( /turf/open/floor/circuit, /area/station/science/robotics/mechbay) @@ -16287,13 +16367,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"dYK" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Theater Stage" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/service/theater/abandoned) "dYL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16351,21 +16424,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/service/chapel/storage) -"dZw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Service Hall"; - dir = 9; - name = "service camera" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "dZD" = ( /obj/machinery/telecomms/server/presets/science, /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ @@ -17895,7 +17953,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, -/obj/machinery/disposal/bin, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/engineering/storage) "eua" = ( @@ -18009,19 +18067,6 @@ "evq" = ( /turf/open/floor/iron/dark, /area/station/service/electronic_marketing_den) -"evr" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Medical Delivery"; - req_access = list("medical") - }, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/textured, -/area/station/medical/storage) "evH" = ( /obj/machinery/camera/directional/west{ c_tag = "Atmospherics - Storage"; @@ -18953,7 +18998,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/folder/blue, +/obj/structure/desk_bell{ + pixel_x = 7 + }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "eIy" = ( @@ -20157,14 +20204,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"eWN" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "eWR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -21965,22 +22004,11 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"ftZ" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/obj/machinery/light/floor, -/turf/open/floor/iron, -/area/station/science/xenobiology) "fuw" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/machinery/status_display/evac/directional/south, -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/structure/sign/directions/arrival{ dir = 1; @@ -21990,6 +22018,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "fux" = ( @@ -22569,6 +22598,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"fCd" = ( +/obj/machinery/holopad/secure, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Tertiary AI Core Access"; + req_access = list("ai_upload"); + pixel_x = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "fCf" = ( /obj/machinery/door/poddoor/preopen{ id = "atmoslock"; @@ -22742,16 +22781,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"fEX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "fFb" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/drugs{ @@ -23865,13 +23894,6 @@ "fTS" = ( /turf/open/floor/iron, /area/station/security/prison/work) -"fTZ" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "fUf" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/maintenance, @@ -23990,17 +24012,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/treatment_center) -"fVA" = ( -/obj/machinery/modular_computer/preset/cargochat/engineering{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "fVT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -24455,6 +24466,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"gbj" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xeno3"; + name = "Creature Cell #3" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "gbo" = ( /obj/machinery/airalarm/directional/south, /obj/structure/table/wood, @@ -25053,24 +25078,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"gib" = ( -/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{ - name = "High-Risk Modules"; - req_access = list("captain") - }, -/obj/effect/spawner/random/aimodule/harmful{ - pixel_y = -16 - }, -/obj/item/ai_module/reset/purge{ - pixel_y = 11 - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "gic" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/bot, @@ -25689,19 +25696,6 @@ /obj/item/storage/dice, /turf/open/floor/iron/checker, /area/station/service/bar/backroom) -"gpu" = ( -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/table/wood/fancy/blue, -/obj/machinery/door/window/right/directional/west{ - name = "Core Modules"; - req_access = list("captain") - }, -/obj/effect/spawner/random/aimodule/neutral{ - pixel_y = -16 - }, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) "gpw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -26101,18 +26095,6 @@ /obj/item/toy/cards/deck, /turf/open/floor/iron/grimy, /area/station/service/abandoned_gambling_den) -"gty" = ( -/obj/structure/table/reinforced, -/obj/item/gps/mining{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/obj/item/storage/medkit/regular{ - pixel_x = 6; - pixel_y = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "gtG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -27286,7 +27268,6 @@ /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "gIa" = ( -/obj/machinery/disposal/bin, /obj/machinery/light/small/directional/north, /obj/structure/disposalpipe/trunk{ dir = 8 @@ -27295,6 +27276,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/security/brig) "gIc" = ( @@ -27384,12 +27366,6 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"gIE" = ( -/obj/machinery/modular_computer/preset/cargochat/service, -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "gII" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -27885,6 +27861,18 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/security/prison) +"gPH" = ( +/obj/structure/sign/poster/official/moth_epi/directional/west, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/medical/storage) "gPO" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp/green, @@ -29232,16 +29220,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"hiI" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/obj/machinery/light/floor, -/turf/open/floor/iron, -/area/station/science/xenobiology) "hiJ" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, @@ -29316,6 +29294,11 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/station/medical/pharmacy) +"hjH" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/photocopier, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "hjJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -29415,6 +29398,14 @@ dir = 1 }, /area/station/science/ordnance/storage) +"hkZ" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/white, +/area/station/science/research) "hlj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/holopad, @@ -30025,6 +30016,15 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"htK" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "QM #1" + }, +/obj/effect/turf_decal/delivery, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/iron, +/area/station/cargo/storage) "htQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -31142,20 +31142,6 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"hJw" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xeno1"; - name = "Creature Cell #1" - }, -/obj/structure/cable, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "hJz" = ( /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) @@ -31710,6 +31696,15 @@ /obj/effect/turf_decal/tile/dark_blue/fourcorners, /turf/open/floor/iron, /area/station/commons/dorms/laundry) +"hRU" = ( +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/small/directional/south, +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "hRV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -31780,14 +31775,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/science/xenobiology) -"hSj" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/landmark/start/hangover, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "hSl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -32198,6 +32185,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/research/abandoned) +"hXQ" = ( +/obj/machinery/door/window/left/directional/east{ + name = "'Monkey Pen"; + req_access = list("genetics") + }, +/obj/structure/flora/bush/lavendergrass, +/obj/structure/flora/bush/flowers_yw, +/turf/open/floor/grass, +/area/station/science/genetics) "hXZ" = ( /obj/item/storage/box/teargas{ pixel_x = 3; @@ -32241,7 +32237,6 @@ /obj/structure/tank_holder/extinguisher, /obj/machinery/camera/directional/south{ c_tag = "Library - Art Gallery"; - default_camera_icon = "Service - Cafeteria Aft"; name = "library camera" }, /turf/open/floor/wood/tile, @@ -32372,22 +32367,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/storage) -"iac" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/right/directional/east{ - layer = 3 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal) "iad" = ( /obj/machinery/newscaster/directional/east, /obj/effect/landmark/start/hangover, @@ -32898,10 +32877,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"iff" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "ifi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/virology/glass{ @@ -33843,28 +33818,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) -"irZ" = ( -/obj/machinery/door/poddoor/preopen{ - id = "justicechamber"; - name = "Justice Chamber Blast Door" - }, -/obj/machinery/door/window/brigdoor/right/directional/south{ - name = "Justice Chamber"; - req_access = list("armory") - }, -/obj/machinery/door/window/brigdoor/right/directional/north{ - name = "Justice Chamber"; - req_access = list("armory") - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "isc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -34053,6 +34006,16 @@ }, /turf/open/floor/iron, /area/station/medical/abandoned) +"iuH" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/cable, +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "High-Risk Modules"; + req_access = list("captain") + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "iuI" = ( /obj/item/book/manual/hydroponics_pod_people, /obj/item/paper/guides/jobs/hydroponics, @@ -34220,20 +34183,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"ixo" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno7"; - name = "Creature Cell #7" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "ixs" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/right/brown{ @@ -34720,15 +34669,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"iDS" = ( -/obj/machinery/computer/department_orders/engineering{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "iEa" = ( /obj/structure/table/wood, /obj/item/clothing/under/costume/maid, @@ -35516,6 +35456,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"iOp" = ( +/obj/machinery/light_switch/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/textured, +/area/station/medical/storage) "iOu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36064,6 +36013,16 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"iWq" = ( +/obj/structure/cable, +/obj/machinery/door/window/brigdoor/left/directional/south{ + id = "cargocell"; + name = "Cargo Cell"; + req_access = list("brig_entrance") + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "iWA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36107,6 +36066,20 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"iWX" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xeno1"; + name = "Creature Cell #1" + }, +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "iXc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36328,19 +36301,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"iZK" = ( -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Secure Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenosecure"; - name = "Secure Pen Shutters" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "iZN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36863,7 +36823,7 @@ /turf/open/floor/iron/large, /area/station/security/processing) "jeZ" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/clothing/neck/stethoscope, /obj/item/book{ desc = "An undeniably handy book."; @@ -37000,7 +36960,6 @@ /turf/open/floor/iron, /area/station/security/prison/garden) "jgl" = ( -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ name = "Morgue" }, @@ -37037,6 +36996,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"jgG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Service Hall"; + dir = 9; + name = "service camera" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "jgN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37089,11 +37060,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"jhj" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/any/double, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "jhl" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -37212,6 +37178,16 @@ /obj/effect/landmark/atmospheric_sanity/mark_all_station_areas_as_goal, /turf/open/space/basic, /area/space) +"jjm" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/science/xenobiology) "jjw" = ( /obj/machinery/camera/directional/east{ c_tag = "Engineering - Supermatter"; @@ -37385,16 +37361,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/visit) -"jkW" = ( -/obj/machinery/holopad/secure, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Secondary AI Core Access"; - req_access = list("ai_upload"); - pixel_x = -4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "jkZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37556,6 +37522,25 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"jmH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/folder/yellow{ + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = -6 + }, +/obj/machinery/door/window/left/directional/north{ + req_access = list("cargo"); + name = "Office Desk" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/cargo/office) "jmQ" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -37719,12 +37704,6 @@ /obj/item/clothing/suit/toggle/labcoat, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"joU" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "jpe" = ( /obj/machinery/computer/records/security{ dir = 4 @@ -38029,6 +38008,19 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/textured, /area/station/medical/medbay) +"jtm" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/machinery/door/window/left/directional/north{ + name = "Danger: Conveyor Access"; + req_access = list("maint_tunnels") + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/disposal) "jto" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38256,13 +38248,6 @@ /obj/effect/turf_decal/trimline/purple/filled/warning, /turf/open/floor/iron/white, /area/station/science/lobby) -"jwA" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "jwT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -38966,7 +38951,6 @@ /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "jFa" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/machinery/status_display/evac/directional/west, /obj/effect/turf_decal/siding/purple{ @@ -38976,6 +38960,7 @@ dir = 4 }, /obj/machinery/light/directional/west, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/science/lab) "jFb" = ( @@ -39512,6 +39497,22 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/large, /area/station/security/checkpoint/escape) +"jMk" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Danger: Conveyor Access"; + req_access = list("maint_tunnels") + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "garbage" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "jMs" = ( /obj/structure/bookcase/random, /turf/open/floor/iron, @@ -39632,6 +39633,18 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"jNZ" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Mass Driver"; + req_access = list("chapel_office") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "jOe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -40601,6 +40614,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"kav" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/folder/yellow{ + pixel_y = -5; + pixel_x = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "kax" = ( /obj/structure/chair/office/light{ dir = 4 @@ -40658,25 +40686,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"kbc" = ( -/obj/machinery/computer/department_orders/medical, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/requests_console/directional/north{ - department = "Medbay"; - name = "Medbay Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay - Storage"; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron, -/area/station/medical/storage) "kbd" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -40870,18 +40879,6 @@ /obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/white, /area/station/science/research) -"kds" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/left/directional/west{ - name = "Fitness Ring" - }, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/commons/fitness/recreation) "kdC" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster/directional/east, @@ -41830,6 +41827,18 @@ "kpa" = ( /turf/closed/wall, /area/station/maintenance/department/eva/abandoned) +"kpc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/window/left/directional/east{ + name = "Fitness Ring" + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/commons/fitness/recreation) "kpj" = ( /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/glass/fifty, @@ -42610,12 +42619,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/research) -"kzV" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/computer/department_orders/service, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "kzX" = ( /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, @@ -42703,6 +42706,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/science/xenobiology) +"kBR" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Smoking Room" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/smooth_large, +/area/station/commons/fitness/recreation) "kBT" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment{ @@ -43611,6 +43624,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"kPD" = ( +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Secure Creature Pen"; + req_access = list("research") + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/science/xenobiology) "kPI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46150,11 +46171,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/science/ordnance/office) -"lvX" = ( -/obj/structure/cable, -/mob/living/simple_animal/slime, -/turf/open/floor/circuit/green, -/area/station/science/xenobiology) "lvZ" = ( /turf/closed/wall, /area/station/medical/break_room) @@ -46443,6 +46459,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/theater) +"lAe" = ( +/obj/machinery/light/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Security - Office Aft" + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/security/office) "lAg" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -46991,7 +47021,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/table/wood, /obj/structure/window/reinforced/spawner/directional/east, -/obj/item/flashlight/lamp, +/obj/machinery/computer/security/wooden_tv, /turf/open/floor/iron/grimy, /area/station/command/bridge) "lGE" = ( @@ -48468,16 +48498,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/general, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"maX" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 1 - }, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "mbk" = ( /obj/structure/cable, /obj/effect/landmark/event_spawn, @@ -49245,10 +49265,8 @@ req_access = list("kitchen") }, /obj/machinery/button/ticket_machine{ - pixel_y = 22 - }, -/obj/item/radio/intercom/directional/north{ - pixel_y = 30 + pixel_y = 22; + pixel_x = -6 }, /obj/machinery/button/door/directional/west{ id = "hopblast"; @@ -49263,6 +49281,10 @@ req_access = list("hop") }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/button/photobooth{ + pixel_y = 22; + pixel_x = 6 + }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) "mlW" = ( @@ -49996,14 +50018,6 @@ }, /turf/open/floor/plating, /area/station/medical/pharmacy) -"mwm" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "mwA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, @@ -50634,18 +50648,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"mDJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/left/directional/east{ - name = "Fitness Ring" - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/commons/fitness/recreation) "mDO" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Laundromat" @@ -50816,6 +50818,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mFX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/right/directional/west{ + name = "Security Desk"; + pixel_x = -8; + req_one_access = list("hop","security") + }, +/obj/item/folder/red, +/obj/item/hand_labeler, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/arrivals) "mGi" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/bot, @@ -51249,17 +51265,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"mKa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Service Hallway"; - name = "Service Fax Machine" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "mKc" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -51442,16 +51447,13 @@ /turf/open/floor/iron, /area/station/medical/virology) "mNL" = ( -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/light/directional/east, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/medical/medbay) "mNX" = ( @@ -52026,6 +52028,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) +"mVX" = ( +/obj/machinery/power/smes/full, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) "mVY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52538,15 +52546,6 @@ /obj/effect/turf_decal/bot_red, /turf/open/floor/iron/dark, /area/station/security/office) -"ndB" = ( -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Primary AI Core Access"; - req_access = list("ai_upload") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "ndH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -52974,6 +52973,20 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"nkj" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xeno6"; + name = "Creature Cell #6" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "nkn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -53078,14 +53091,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/medical/virology) -"nlp" = ( -/obj/structure/sign/warning/secure_area/directional/south, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "nly" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -53570,12 +53575,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) -"nsG" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) "nsH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -53865,6 +53864,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /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{ + name = "High-Risk Modules"; + req_access = list("captain") + }, +/obj/effect/spawner/random/aimodule/harmful{ + pixel_y = -16 + }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "nwY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55186,11 +55203,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel) -"nOn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/photocopier, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "nOr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55584,20 +55596,6 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"nTk" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno4"; - name = "Creature Cell #4" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "nTn" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -55627,6 +55625,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) +"nTU" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "nUc" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -55962,21 +55968,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"nYE" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Warden's Desk"; - req_access = list("armory") - }, -/obj/machinery/door/window/left/directional/west{ - name = "Warden's Desk" - }, -/obj/item/folder/red, -/obj/item/pen, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/warden) "nYJ" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -56849,15 +56840,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"okl" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - location = "QM #1" - }, -/obj/effect/turf_decal/delivery, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/storage) "okr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/meter, @@ -57681,16 +57663,6 @@ }, /turf/open/floor/wood, /area/station/service/library/abandoned) -"ovQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "ovS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57902,38 +57874,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay) -"oyV" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/folder/yellow{ - pixel_x = -3; - pixel_y = -6 - }, -/obj/item/pen{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "chemisttop"; - name = "Pharmacy Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east{ - name = "Pharmacy Desk"; - req_access = list("pharmacy") - }, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) "oyZ" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/table, @@ -58094,6 +58034,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"oBa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "oBd" = ( /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -58451,6 +58398,22 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/station/command/corporate_showroom) +"oGq" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/right/directional/east{ + layer = 3 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal) "oGr" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/fueltank, @@ -58652,16 +58615,6 @@ "oJy" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) -"oJB" = ( -/obj/structure/cable, -/obj/machinery/door/window/brigdoor/left/directional/south{ - id = "cargocell"; - name = "Cargo Cell"; - req_access = list("brig_entrance") - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "oJP" = ( /obj/structure/chair{ dir = 4 @@ -58772,6 +58725,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/department/science) +"oLO" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/status_display/evac/directional/east, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "oLT" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -59091,6 +59051,21 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) +"oPF" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Science - Central Access"; + dir = 9; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/research) "oPL" = ( /obj/machinery/door/window/right/directional/east{ name = "Danger: Conveyor Access"; @@ -59207,6 +59182,11 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/commons/fitness/recreation) +"oRq" = ( +/obj/structure/cable, +/mob/living/basic/slime, +/turf/open/floor/circuit/green, +/area/station/science/xenobiology) "oRs" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -59472,6 +59452,23 @@ }, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) +"oUf" = ( +/obj/machinery/requests_console/directional/north{ + department = "Medbay"; + name = "Medbay Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Storage"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/obj/machinery/modular_computer/preset/cargochat/medical, +/obj/effect/turf_decal/trimline/brown/filled/end, +/turf/open/floor/iron, +/area/station/medical/storage) "oUh" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ dir = 1 @@ -59673,6 +59670,15 @@ dir = 8 }, /area/station/engineering/atmos/project) +"oXX" = ( +/obj/machinery/disposal/bin, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "oYe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59742,20 +59748,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"oYQ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/right/directional/west{ - name = "Security Desk"; - pixel_x = -8; - req_one_access = list("hop","security") - }, -/obj/item/folder/red, -/obj/item/hand_labeler, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/arrivals) "oYV" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -59826,6 +59818,7 @@ /obj/structure/table/wood, /obj/item/papercutter, /obj/item/paper/fluff/ids_for_dummies, +/obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "paQ" = ( @@ -59930,15 +59923,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"pbV" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "pbW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60170,7 +60154,6 @@ }, /area/station/commons/fitness/recreation) "pen" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/trunk{ dir = 1 @@ -60179,6 +60162,7 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/science/xenobiology) "peo" = ( @@ -60579,17 +60563,6 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"piu" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/textured, -/area/station/medical/storage) "piv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62009,16 +61982,6 @@ dir = 4 }, /area/station/commons/fitness/recreation) -"pBm" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "visitation"; - name = "Visitation Shutters" - }, -/obj/machinery/door/window/right/directional/east, -/turf/open/floor/iron, -/area/station/security/prison/visit) "pBs" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, @@ -62788,21 +62751,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/science/breakroom) -"pKa" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/sign/warning/electric_shock/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "AI Chamber - Fore"; - name = "motion-sensitive ai camera"; - network = list("aichamber") - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "pKb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -63167,6 +63115,16 @@ /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"pOu" = ( +/obj/machinery/power/smes/full, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "pOz" = ( /obj/structure/cable, /obj/machinery/modular_computer/preset/id{ @@ -63730,6 +63688,17 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/lockers) +"pUm" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "pUp" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/item/radio/intercom/directional/east, @@ -65103,14 +65072,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/green, /area/station/service/library) -"qlY" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "qmd" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -66026,11 +65987,9 @@ /turf/open/floor/iron, /area/station/engineering/main) "qyK" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/photobooth/security, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) "qyX" = ( @@ -66234,19 +66193,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"qBn" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/sign/poster/official/moth_epi/directional/west, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/medical/storage) "qBo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66310,8 +66256,8 @@ "qBY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/secure_safe/caps_spare, /obj/structure/table/wood, -/obj/machinery/computer/security/wooden_tv, /turf/open/floor/iron/grimy, /area/station/command/bridge) "qCb" = ( @@ -67088,24 +67034,13 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom) "qLa" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/pen{ - pixel_x = -6; - pixel_y = 5 - }, /obj/machinery/flasher/directional/east{ id = "hopflash"; pixel_x = 0; pixel_y = 26 }, -/obj/structure/desk_bell{ - pixel_x = 7 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/photobooth, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) "qLg" = ( @@ -67525,21 +67460,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore) -"qQy" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp{ - pixel_x = -7; - pixel_y = 9 - }, -/obj/item/folder/yellow{ - pixel_y = -5; - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qQE" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -67794,6 +67714,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"qUL" = ( +/obj/machinery/modular_computer/preset/cargochat/engineering{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/end{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "qUM" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -68580,18 +68509,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) -"rgH" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) "rgK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69300,22 +69217,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/port) -"rnz" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Danger: Conveyor Access"; - req_access = list("maint_tunnels") - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/conveyor/inverted{ - dir = 6; - id = "garbage" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "rnA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69367,6 +69268,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) +"roh" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/photocopier, +/turf/open/floor/iron/white, +/area/station/science/research) "rol" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -69446,11 +69356,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) -"rpH" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wideplating, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "rpK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70275,16 +70180,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) -"rAM" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Smoking Room" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white/smooth_large, -/area/station/commons/fitness/recreation) "rAN" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, /obj/machinery/camera/directional/east{ @@ -70571,7 +70466,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos/storage) "rFV" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/trunk, /obj/machinery/camera/directional/north{ @@ -70581,6 +70475,7 @@ /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/north, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark, /area/station/security/office) "rFZ" = ( @@ -70763,11 +70658,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"rIx" = ( -/obj/structure/table, -/obj/item/clipboard, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "rID" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -71315,19 +71205,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) -"rOL" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - location = "QM #4" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/button/door/directional/west{ - id = "warehouse_shutters"; - name = "warehouse shutters control" - }, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/storage) "rON" = ( /obj/structure/closet/secure_closet/hos, /obj/structure/extinguisher_cabinet/directional/south, @@ -71374,18 +71251,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"rOW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/brigdoor/left/directional/north{ - id = "engcell"; - name = "Engineering Cell"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "rOX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -71902,6 +71767,20 @@ }, /turf/open/floor/plating, /area/station/science/explab) +"rUl" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xeno8"; + name = "Creature Cell #8" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "rUn" = ( /obj/structure/sign/departments/science/directional/west, /obj/effect/turf_decal/tile/purple{ @@ -72232,16 +72111,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"rYG" = ( -/obj/machinery/holopad/secure, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Tertiary AI Core Access"; - req_access = list("ai_upload"); - pixel_x = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "rYR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, @@ -72537,6 +72406,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"sbZ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "sca" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -72572,6 +72451,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"scJ" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Service Hallway"; + name = "Service Fax Machine" + }, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "scR" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, @@ -72583,6 +72471,15 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/plating, /area/station/service/library/abandoned) +"scX" = ( +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Primary AI Core Access"; + req_access = list("ai_upload") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "sdi" = ( /obj/machinery/atmospherics/pipe/smart/manifold/supply/visible, /obj/machinery/meter/monitored/distro_loop, @@ -72869,6 +72766,14 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"sgG" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "sgI" = ( /obj/docking_port/stationary/escape_pod{ dir = 4 @@ -73112,14 +73017,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"skv" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/recharge_station, -/obj/effect/turf_decal/bot_red, -/turf/open/floor/iron, -/area/station/science/research) "skx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -73192,6 +73089,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"sle" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Warden's Desk"; + req_access = list("armory") + }, +/obj/machinery/door/window/left/directional/west{ + name = "Warden's Desk" + }, +/obj/item/folder/red, +/obj/item/pen, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/warden) "slp" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -73730,17 +73642,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/pharmacy) -"stp" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/modular_computer/preset/cargochat/science{ - dir = 4 - }, -/obj/effect/turf_decal/bot/left, -/turf/open/floor/iron, -/area/station/science/research) "stx" = ( /obj/structure/chair/pew/left, /turf/open/floor/iron/chapel{ @@ -73854,6 +73755,16 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/engineering/storage_shared) +"suQ" = ( +/obj/structure/cable, +/obj/structure/table/wood/fancy/blue, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/right/directional/west{ + name = "Core Modules"; + req_access = list("captain") + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) "suZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74154,26 +74065,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) -"syb" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel" - }, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) "sye" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -74304,15 +74195,6 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"szt" = ( -/obj/machinery/door/window/left/directional/east{ - name = "'Monkey Pen"; - req_access = list("genetics") - }, -/obj/structure/flora/bush/lavendergrass, -/obj/structure/flora/bush/flowers_yw, -/turf/open/floor/grass, -/area/station/science/genetics) "szy" = ( /turf/closed/wall, /area/station/service/bar/backroom) @@ -74785,6 +74667,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/ai_upload) +"sGp" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/security/office) "sGx" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -74810,6 +74699,16 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"sGJ" = ( +/obj/machinery/holopad/secure, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Secondary AI Core Access"; + req_access = list("ai_upload"); + pixel_x = -4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "sGQ" = ( /obj/structure/chair/office{ dir = 4 @@ -75559,18 +75458,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"sQo" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Delivery Desk"; - req_access = list("cargo") - }, -/obj/effect/turf_decal/delivery, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/cargo/lobby) "sQp" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy/lily, @@ -75598,17 +75485,6 @@ "sQA" = ( /turf/closed/wall, /area/station/command/meeting_room/council) -"sQB" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 1 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "sQD" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Cell 4" @@ -75713,15 +75589,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/security) -"sRB" = ( -/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/iron/dark, -/area/station/hallway/secondary/service) "sRC" = ( /obj/machinery/door/morgue{ name = "Confession Booth" @@ -76262,6 +76129,12 @@ }, /turf/open/floor/iron, /area/station/science/lab) +"sYe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "sYf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76437,6 +76310,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) +"taO" = ( +/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/conveyor_switch_construct{ + pixel_x = 10 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "tbd" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -77411,6 +77297,33 @@ /obj/machinery/light/small/dim/directional/north, /turf/open/floor/iron/dark, /area/station/maintenance/department/science) +"tpV" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/door/window/left/directional/east{ + name = "Medical Delivery"; + req_access = list("medical") + }, +/turf/open/floor/iron/textured, +/area/station/medical/storage) +"tpX" = ( +/obj/machinery/power/smes/full, +/obj/structure/sign/warning/electric_shock/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "AI Chamber - Fore"; + name = "motion-sensitive ai camera"; + network = list("aichamber") + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "tpZ" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) @@ -77894,15 +77807,6 @@ /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"tuM" = ( -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) "tuN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -79216,18 +79120,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"tMr" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Mass Driver"; - req_access = list("chapel_office") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "tMA" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) @@ -81025,20 +80917,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"uiL" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno3"; - name = "Creature Cell #3" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "uiM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -81588,6 +81466,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"upv" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "QM #4" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/button/door/directional/west{ + id = "warehouse_shutters"; + name = "warehouse shutters control" + }, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/iron, +/area/station/cargo/storage) "upB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82557,20 +82448,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) -"uBY" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Security - Office Aft" - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/modular_computer/preset/cargochat/security{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) "uBZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -82743,6 +82620,14 @@ /obj/machinery/telecomms/server/presets/security, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"uEo" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/landmark/start/hangover, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "uEv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/toolbox, @@ -83117,6 +83002,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"uJl" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/holopad, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "uJm" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, @@ -83357,20 +83248,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/maintenance/department/science) -"uMa" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno8"; - name = "Creature Cell #8" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "uMb" = ( /obj/structure/table, /obj/item/analyzer, @@ -84132,12 +84009,6 @@ "uUW" = ( /turf/closed/wall, /area/station/maintenance/space_hut/observatory) -"uVd" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "uVe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance_hatch{ @@ -84401,6 +84272,13 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"uZc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) "uZe" = ( /obj/machinery/door/window/brigdoor/left/directional/south{ name = "Coroner's Office"; @@ -85228,6 +85106,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"vke" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "vkg" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -86658,25 +86543,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"vCg" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder/yellow{ - pixel_x = -6 - }, -/obj/item/pen{ - pixel_x = -6 - }, -/obj/machinery/door/window/left/directional/north{ - req_access = list("cargo"); - name = "Office Desk" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "vCk" = ( /obj/structure/sign/departments/medbay/alt{ pixel_x = 32 @@ -86723,16 +86589,6 @@ }, /turf/open/floor/wood/large, /area/station/service/theater) -"vCI" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/cable, -/obj/structure/table/wood/fancy/red, -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "High-Risk Modules"; - req_access = list("captain") - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "vCM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -86964,6 +86820,19 @@ dir = 8 }, /area/station/commons/fitness/recreation) +"vFw" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/table/wood/fancy/blue, +/obj/machinery/door/window/right/directional/west{ + name = "Core Modules"; + req_access = list("captain") + }, +/obj/effect/spawner/random/aimodule/neutral{ + pixel_y = -16 + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) "vFz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/green/filled/corner, @@ -87890,6 +87759,38 @@ }, /turf/open/floor/iron, /area/station/science/research) +"vUf" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/folder/yellow{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "chemisttop"; + name = "Pharmacy Shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/east{ + name = "Pharmacy Desk"; + req_access = list("pharmacy") + }, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) "vUk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump{ @@ -88274,20 +88175,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) -"vZV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Research Division"; - name = "Research Division Fax Machine"; - pixel_x = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "vZX" = ( /obj/machinery/status_display/ai/directional/north, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -88758,6 +88645,13 @@ /obj/item/flashlight/lamp, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"wgz" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "wgC" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; @@ -89105,6 +88999,17 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"wkV" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "wlc" = ( /obj/structure/table/reinforced, /obj/item/gun/energy/laser/carbine/practice{ @@ -89722,20 +89627,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"wrd" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno5"; - name = "Creature Cell #5" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "wri" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /obj/item/kirbyplants/random, @@ -90154,20 +90045,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"wvW" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xeno2"; - name = "Creature Cell #2" - }, -/obj/structure/cable, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "wwb" = ( /obj/structure/chair/office/light{ dir = 4 @@ -90491,6 +90368,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"wAl" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Delivery Desk"; + req_access = list("cargo") + }, +/obj/effect/turf_decal/delivery, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/cargo/lobby) "wAt" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, @@ -91742,6 +91631,12 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/captain) +"wRJ" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "wRL" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/light/small/broken/directional/west, @@ -92042,18 +91937,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"wWH" = ( -/obj/structure/plaque/static_plaque/golden{ - pixel_y = -32 - }, -/obj/machinery/computer/department_orders/security{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) "wWJ" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/bot, @@ -93244,6 +93127,16 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"xmm" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/right/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/visit) "xms" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -93275,6 +93168,28 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"xmY" = ( +/obj/machinery/door/poddoor/preopen{ + id = "justicechamber"; + name = "Justice Chamber Blast Door" + }, +/obj/machinery/door/window/brigdoor/right/directional/south{ + name = "Justice Chamber"; + req_access = list("armory") + }, +/obj/machinery/door/window/brigdoor/right/directional/north{ + name = "Justice Chamber"; + req_access = list("armory") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "xna" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -93679,6 +93594,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"xso" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/any/double, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "xsp" = ( /obj/structure/table/reinforced, /obj/machinery/status_display/ai/directional/east, @@ -93704,6 +93624,19 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space, /area/space/nearstation) +"xsH" = ( +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Secure Creature Pen"; + req_access = list("research") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenosecure"; + name = "Secure Pen Shutters" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "xsN" = ( /obj/structure/disposaloutlet, /obj/structure/disposalpipe/trunk{ @@ -93830,20 +93763,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/fore) -"xtP" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno6"; - name = "Creature Cell #6" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "xtZ" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/delivery, @@ -95632,7 +95551,7 @@ /obj/item/clothing/head/costume/kitty, /obj/item/clothing/under/costume/maid, /obj/item/clothing/head/costume/rabbitears, -/obj/item/clothing/under/dress/redeveninggown, +/obj/item/clothing/under/dress/eveninggown, /turf/open/floor/wood, /area/station/commons/dorms) "xRa" = ( @@ -96451,6 +96370,20 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"ycY" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xeno5"; + name = "Creature Cell #5" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "ydb" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/stool/bar/directional/west, @@ -96695,6 +96628,20 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/iron, /area/station/cargo/lobby) +"ygV" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xeno7"; + name = "Creature Cell #7" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "ygW" = ( /obj/machinery/vending/hydroseeds, /obj/effect/turf_decal/bot, @@ -96780,22 +96727,6 @@ "yhJ" = ( /turf/open/floor/plating/airless, /area/space/nearstation) -"yhO" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science - Central Access"; - dir = 9; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/obj/machinery/photocopier, -/turf/open/floor/iron/white, -/area/station/science/research) "yhW" = ( /obj/machinery/conveyor{ dir = 4; @@ -103634,7 +103565,7 @@ btH btH btH bPC -rgH +pOu bTq jYp vgi @@ -104141,7 +104072,7 @@ btH vxN cKE btH -aBi +bEf btH rhH ueB @@ -104398,7 +104329,7 @@ cQh vOZ xnu kXJ -jkW +sGJ kXJ kXJ jPe @@ -104412,8 +104343,8 @@ bPC bPC bPC cdt -gib -vCI +nwW +iuH eCk fKM cdt @@ -105169,7 +105100,7 @@ wJU bCu yga btH -bJo +bIW btH btH lMy @@ -105421,7 +105352,7 @@ alK qPm btH btH -pKa +tpX kXJ bEl xMy @@ -105683,7 +105614,7 @@ ixt abJ yga btH -ndB +scX btH btH jnr @@ -106454,7 +106385,7 @@ cQh nkb eLP kXJ -rYG +fCd kXJ kXJ xMX @@ -106468,8 +106399,8 @@ bPC bPC bPC cdt -gpu -dNt +vFw +suQ eCk kex cdt @@ -106711,7 +106642,7 @@ btH aLQ pUF btH -syb +bEm btH kxx lyf @@ -116777,7 +116708,7 @@ uhb ebW kNG imx -iZK +xsH umb kNG lZF @@ -117034,7 +116965,7 @@ uhb xIa cQT gxT -dlw +kPD rxX oWn afN @@ -117250,7 +117181,7 @@ xqR qzc kUx kTV -chv +vke dQl oIE fFu @@ -118573,15 +118504,15 @@ mQO rTW shO rTW -nTk -hiI +bIh +csO rhi tLp pWL -ftZ -uMa +jjm +rUl rTW -lvX +oRq rTW oVW oUe @@ -119344,13 +119275,13 @@ mQO rTW shO rTW -uiL -hiI +gbj +csO uDQ dxU kSA -ftZ -ixo +jjm +ygV rTW shO rTW @@ -120115,15 +120046,15 @@ mQO rTW shO rTW -wvW -hiI +bgH +csO uDQ dxU kSA -ftZ -xtP +jjm +nkj rTW -lvX +oRq rTW oVW fmi @@ -120586,7 +120517,7 @@ fXF jgZ mrd rDL -iDS +qUL uCa wkj bqP @@ -120843,7 +120774,7 @@ fXF suH ikV gIk -fVA +wkV leE bfq iFn @@ -120884,15 +120815,15 @@ uKY gcr mQO rTW -lvX +oRq rTW -hJw -hiI +iWX +csO bXL xzo urx -ftZ -wrd +jjm +ycY rTW shO rTW @@ -121100,7 +121031,7 @@ nmi xvf oQJ xJJ -pbV +oBa uCa aTz ygM @@ -121613,7 +121544,7 @@ wiZ fXF xkz hwe -jwA +wRJ vpV uCa gQk @@ -123937,7 +123868,7 @@ uGQ oGb qHu tpP -rOW +chs dVC lhn wgF @@ -126799,7 +126730,7 @@ nIa hSf ffb cMn -bUz +hkZ sIX sIX cLR @@ -128341,15 +128272,15 @@ txc pZM ffb dqP -nlp +anU sIX sIX xbJ sIX sIX -skv -dCI -stp +aCA +aqU +aJj dNN qMB wtS @@ -129369,13 +129300,13 @@ bGn igg tFM cTj -dyx +ikZ oRh oHq wNV -tuM +roh dNN -vZV +uMV sEF sVi xWf @@ -129632,7 +129563,7 @@ dNN dNN dNN dNN -yhO +oPF dCx aJT fDF @@ -129931,7 +129862,7 @@ lAA qQM tUi vHT -jhj +xso baB qQM aaa @@ -132964,7 +132895,7 @@ rcW oJy oFr pXk -szt +hXQ lfz fvi nlK @@ -133147,7 +133078,7 @@ sid sBG sLz vRB -rIx +sgG xMe kVP bSp @@ -133403,8 +133334,8 @@ cnL kfa pPI kVP -fEX -fTZ +sbZ +oXX jVP kVP pET @@ -133660,8 +133591,8 @@ vdZ qPp pXt kVP -ovQ -joU +cVD +uJl iXO kVP pgN @@ -133917,8 +133848,8 @@ vBt tyK kVP kVP -dZw -uVd +jgG +wgz gMB kVP kVP @@ -134174,11 +134105,11 @@ kVP kVP kVP dUH -sRB -eWN -iff -rpH -biZ +cBB +bJi +giz +kVr +hRU kVP sGS qOT @@ -135202,8 +135133,8 @@ xSf mqV kVP giz -nOn -mKa +giz +sYe lJJ maV ptC @@ -135460,7 +135391,7 @@ kVP kVP vat kVP -gIE +hjH hUh kVP cAV @@ -135717,7 +135648,7 @@ pOD tWU sSH kVP -kzV +scJ qPX kVP aVE @@ -136476,7 +136407,7 @@ uWL xvo gfl vPl -oYQ +mFX eBb jJc xbp @@ -136579,9 +136510,9 @@ umA veM veM ako -piu -evr -qBn +tpV +cJQ +gPH uQF ibh cYk @@ -136836,8 +136767,8 @@ oCo fiU jRJ ako -dqj -bGM +iOp +dNc dNc dNc jhs @@ -137078,7 +137009,7 @@ squ pEU cwh pCr -oyV +vUf cwh cwh udd @@ -137093,7 +137024,7 @@ euF oCo sJG ako -kbc +oUf rjO oOI oOI @@ -137564,7 +137495,7 @@ ilI ilI ilI hup -qlY +mVX cMD ilI ilI @@ -138561,7 +138492,7 @@ hqK hLa rve iJr -vCg +jmH qQE xjx euK @@ -138809,7 +138740,7 @@ xKn fFi fye wBc -oJB +iWq qKL fFK cjj @@ -139077,7 +139008,7 @@ vKl wfK hoC yfI -sQo +wAl kGo vSm xhW @@ -139321,7 +139252,7 @@ lDi oKr rgj eoy -dKw +arr oKr oKr eoy @@ -140084,10 +140015,10 @@ jdL aix wHa mIA -okl +htK tfy tuZ -rOL +upv dgU nZK hey @@ -142421,7 +142352,7 @@ aFb sAL occ lDu -cRR +taO eCQ tpZ uoz @@ -143191,8 +143122,8 @@ uMS jyZ azD cTv -qQy -gty +kav +diV tDD rWo aad @@ -143417,7 +143348,7 @@ aad oeX sZt fQL -iac +oGq xBu rum akS @@ -143674,7 +143605,7 @@ aad oeX gdM lbu -btI +jtm ikR yhW akS @@ -143932,7 +143863,7 @@ kic gdM qvW rEb -rnz +jMk oPL yie oeX @@ -147135,7 +147066,7 @@ hmQ wCv flE gcB -tMr +jNZ liQ brb aaa @@ -147607,9 +147538,9 @@ oCP rqa ibo kGA -maX +aqS yaI -sQB +pUm hLA vty kUC @@ -148864,7 +148795,7 @@ ohI sRd ufR lra -nYE +sle lra ufR ufR @@ -148923,7 +148854,7 @@ nXH eqw uhB nXH -dYK +bDg lAW lBV uEJ @@ -149109,7 +149040,7 @@ nzR gKp gDP rTG -nsG +sGp ozu dql pWH @@ -149623,8 +149554,8 @@ ieg eIl ieg ieg -tXW -anY +uZc +bDx dql eBE gIV @@ -149656,7 +149587,7 @@ juF rYA yaI qkv -mwm +nTU yaI xQZ xnF @@ -149880,8 +149811,8 @@ qlN bdx lpI iIb -sYN -wWH +tXW +cfx vgK wdC lTt @@ -149916,15 +149847,15 @@ qqe qVa yaI fNn -hSj +uEo lsg yaI pwC -dOe +oLO vmP yaI xxN -dOe +oLO qfH yaI ouy @@ -150138,7 +150069,7 @@ sKp tXJ bkN gCV -uBY +lAe vgK ljX tLx @@ -150691,7 +150622,7 @@ vii vii cwA vRn -mDJ +kpc apz apz apz @@ -151919,9 +151850,9 @@ bnU vSK kRM lAj -pBm +xmm lAj -pBm +xmm vxs lVn krO @@ -151979,7 +151910,7 @@ vFn bgW bgW bgW -kds +dxi pei jCI owU @@ -152501,7 +152432,7 @@ mfC mfC uKw fNN -rAM +kBR cUn uKw qYo @@ -153717,7 +153648,7 @@ bCC hhn qVf xsP -irZ +xmY uuj fRe eho diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 05833fb789c..e81e9481cf7 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -562,6 +562,16 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) +"akG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "akK" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -1095,6 +1105,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"asJ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/service/hydroponics) "asM" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -1622,6 +1643,23 @@ /obj/effect/turf_decal/delivery/red, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) +"azU" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "robotics"; + name = "Robotics Lab Shutters" + }, +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/door/window/left/directional/south{ + name = "Robotics Desk"; + req_access = list("robotics") + }, +/turf/open/floor/plating, +/area/station/science/robotics/lab) "aAa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1636,6 +1674,22 @@ /obj/machinery/incident_display/delam, /turf/closed/wall/r_wall, /area/station/command/bridge) +"aAi" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table/wood/fancy/red, +/obj/effect/spawner/random/aimodule/harmful, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "High-Risk Modules"; + req_access = list("captain") + }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "aAl" = ( /obj/machinery/computer/mech_bay_power_console{ dir = 1 @@ -1813,6 +1867,32 @@ /obj/structure/sign/departments/cargo, /turf/closed/wall/r_wall, /area/station/cargo/warehouse) +"aES" = ( +/obj/structure/table/wood/fancy/blue, +/obj/effect/spawner/random/aimodule/neutral, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/window/right/directional/west{ + name = "Core Modules"; + req_access = list("captain") + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/item/reagent_containers/pill/iron{ + pixel_x = 13; + pixel_y = -13 + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) +"aEU" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "aFg" = ( /obj/machinery/button/door/directional/east{ id = "lawyer_blast"; @@ -1943,6 +2023,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/command/meeting_room) +"aHZ" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "aIe" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel" @@ -1983,6 +2068,16 @@ /obj/structure/closet/toolcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"aIN" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ + id = "Cell 3"; + name = "Cell 3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/station/security/brig) "aIU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2197,6 +2292,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"aMd" = ( +/obj/machinery/door/window/right/directional/east{ + name = "Incoming Mail"; + req_access = list("shipping") + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) "aMr" = ( /obj/structure/chair/office{ dir = 4 @@ -2296,20 +2401,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/mine/eva) -"aOg" = ( -/obj/structure/bed{ - dir = 1 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/station/security/prison/safe) "aOz" = ( /obj/structure/chair{ dir = 4 @@ -2939,15 +3030,6 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/security/armory/upper) -"aWq" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/closet/mini_fridge{ - name = "mini-fridge" - }, -/obj/item/reagent_containers/condiment/milk, -/obj/structure/table, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "aWD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3461,10 +3543,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, /area/mine/eva/lower) -"bfB" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "bfL" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -3604,17 +3682,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"bhc" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 4"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "bhk" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -3675,15 +3742,6 @@ dir = 8 }, /area/mine/living_quarters) -"bip" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Medbay Delivery"; - req_access = list("medical") - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/yellow/full, -/turf/open/floor/iron/large, -/area/station/medical/storage) "bit" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -3724,16 +3782,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"biV" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ - id = "Cell 1"; - name = "Cell 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/security/brig) "biY" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/fore) @@ -3771,6 +3819,18 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) +"bjn" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 11"; + req_access = list("xenobiology") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio11"; + name = "Xenobio Pen 11 Blast Door" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "bjp" = ( /turf/open/floor/iron/dark/textured_edge{ dir = 4 @@ -3826,6 +3886,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) +"bkq" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Graveyard Access"; + req_access = list("chapel_office") + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/service/chapel) "bkr" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -3954,6 +4023,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/library) +"bmf" = ( +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/machinery/computer/order_console/cook{ + dir = 1 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "bml" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -3993,6 +4069,15 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"bmZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "bna" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -4002,6 +4087,18 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) +"bnh" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 7"; + req_access = list("xenobiology") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio7"; + name = "Xenobio Pen 7 Blast Door" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "bnl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4410,6 +4507,13 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) +"bsR" = ( +/obj/structure/cable, +/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/white, +/area/station/medical/medbay/aft) "bta" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -5085,6 +5189,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"bCr" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Pharmacy Desk"; + req_access = list("pharmacy") + }, +/obj/item/folder/white, +/obj/item/pen, +/obj/machinery/door/firedoor, +/obj/structure/sign/warning/fire/directional/west, +/obj/structure/table/reinforced, +/turf/open/floor/plating, +/area/station/medical/treatment_center) "bCs" = ( /obj/machinery/door/airlock/engineering{ name = "Construction Area" @@ -5272,6 +5388,17 @@ /obj/machinery/photocopier, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"bEq" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Terrarium"; + req_access = list("hydroponics") + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/service/hydroponics) "bEz" = ( /obj/machinery/door/airlock/command/glass{ name = "Secure EVA Storage" @@ -5779,23 +5906,6 @@ }, /turf/open/floor/iron/freezer, /area/mine/laborcamp) -"bLP" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/spawner/random/aimodule/neutral, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/right/directional/west{ - name = "Core Modules"; - req_access = list("captain") - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/item/reagent_containers/pill/iron{ - pixel_x = 13; - pixel_y = -13 - }, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) "bLQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood{ @@ -5829,6 +5939,17 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"bMu" = ( +/obj/machinery/door/airlock{ + name = "Service Hall" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_half, +/area/station/hallway/secondary/service) "bMz" = ( /obj/docking_port/stationary{ dir = 8; @@ -6325,6 +6446,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"bUK" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio5"; + name = "Xenobio Pen 5 Blast Door" + }, +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 5"; + req_access = list("xenobiology") + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "bUW" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -6363,14 +6496,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"bVz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/table, -/obj/item/aquarium_kit, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "bVI" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -6728,6 +6853,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"caC" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Monkey Pen"; + req_access = list("genetics") + }, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/engine, +/area/station/science/genetics) "caH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -6824,6 +6957,19 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"ccp" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/effect/landmark/start/hangover, +/obj/machinery/button/door/directional/south{ + id = "Dorm5"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "ccr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7336,23 +7482,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"cjp" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) -"cjw" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Fitness Ring" - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/commons/fitness) "cjz" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/rack, @@ -7428,13 +7557,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine, /area/station/science/xenobiology) -"ckK" = ( -/obj/effect/turf_decal/siding/white{ - dir = 10 - }, -/obj/effect/spawner/random/entertainment/arcade, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "ckN" = ( /obj/structure/cable, /obj/machinery/newscaster/directional/south, @@ -7471,6 +7593,17 @@ "clq" = ( /turf/open/floor/iron/dark, /area/station/security/processing) +"clr" = ( +/obj/machinery/power/smes{ + capacity = 1.8e+008; + charge = 2e+005 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/dark/textured_large, +/area/station/maintenance/disposal/incinerator) "clz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -7716,17 +7849,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"coy" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 3"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "coL" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/structure/cable, @@ -8219,20 +8341,30 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating, /area/station/security/courtroom) +"cwu" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/door/window/right/directional/north{ + name = "First-Aid Supplies"; + red_alert_access = 1; + req_access = list("medical") + }, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/storage) "cwO" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"cwZ" = ( -/obj/effect/turf_decal/tile/blue/diagonal_edge, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "cxd" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/side{ @@ -8304,11 +8436,10 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "cyo" = ( -/obj/machinery/stasis{ - dir = 4 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 }, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "cyA" = ( /obj/machinery/door/airlock/maintenance, @@ -9006,11 +9137,6 @@ /obj/machinery/vending/autodrobe, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cHH" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/holopad, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "cHO" = ( /obj/effect/turf_decal/tile/dark_green{ dir = 4 @@ -9237,6 +9363,30 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"cLw" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "Engineering Security Door" + }, +/obj/structure/desk_bell{ + pixel_x = 6 + }, +/obj/machinery/door/window/left/directional/east{ + name = "Engineering Desk"; + req_access = list("engineering") + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "cLB" = ( /obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 4 @@ -9299,6 +9449,16 @@ "cMk" = ( /turf/closed/wall/r_wall, /area/mine/production) +"cMs" = ( +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "cMv" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -9714,15 +9874,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"cSy" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "cSE" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9885,17 +10036,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) -"cWE" = ( -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/machinery/door/window/left/directional/west{ - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/obj/effect/spawner/random/structure/table_fancy, -/turf/open/floor/wood, -/area/station/service/library) "cWG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9938,6 +10078,12 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"cXp" = ( +/obj/structure/bed/pod, +/obj/effect/spawner/random/bedsheet/any, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/fore) "cXu" = ( /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -9975,6 +10121,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"cXX" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 11"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "cXZ" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, @@ -10283,6 +10440,19 @@ /obj/structure/cable, /turf/open/floor/carpet/red, /area/station/security/prison/work) +"dcq" = ( +/obj/structure/bed, +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/button/door/directional/east{ + id = "Dorm3"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "dcr" = ( /obj/machinery/chem_master, /obj/structure/window/reinforced/spawner/directional/south, @@ -10387,15 +10557,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/brig/upper) -"ddg" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #1" - }, -/obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/storage) "ddh" = ( /obj/structure/chair/stool/directional/north, /obj/effect/landmark/start/assistant, @@ -10552,26 +10713,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"dgk" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/toxin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/toxin, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/door/window/right/directional/north{ - name = "First-Aid Supplies"; - red_alert_access = 1; - req_access = list("medical") - }, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/storage) "dgl" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -11303,8 +11444,8 @@ /turf/open/floor/iron, /area/station/commons/storage/mining) "drG" = ( -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/cargo/office) "drH" = ( @@ -11463,25 +11604,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"dtn" = ( -/obj/machinery/door/window/brigdoor/right/directional/west{ - name = "Observation Deck"; - req_access = list("xenobiology") - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "dtr" = ( /obj/machinery/computer/records/medical, /obj/effect/turf_decal/tile/green/anticorner/contrasted, @@ -11933,6 +12055,19 @@ /obj/item/cultivator/rake, /turf/open/floor/grass, /area/station/maintenance/starboard/aft) +"dAB" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Research Director Observation"; + req_access = list("rd") + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white/side{ + dir = 5 + }, +/area/station/command/heads_quarters/rd) "dAP" = ( /obj/structure/cable, /obj/structure/chair{ @@ -12641,19 +12776,6 @@ /obj/effect/spawner/random/food_or_drink/donkpockets, /turf/open/floor/iron, /area/mine/laborcamp) -"dMg" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Mass Driver"; - req_access = list("chapel_office") - }, -/obj/machinery/mass_driver/chapelgun{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/service/chapel) "dMp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12730,6 +12852,16 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"dNv" = ( +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "dNw" = ( /obj/structure/chair/office{ dir = 8 @@ -12904,6 +13036,17 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"dQZ" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 9"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "dRc" = ( /obj/structure/table, /obj/machinery/firealarm/directional/west, @@ -13554,6 +13697,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"ecZ" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "edd" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -13887,6 +14035,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"ehO" = ( +/obj/machinery/door/window/brigdoor/right/directional/west{ + name = "Observation Deck"; + req_access = list("xenobiology") + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "ehP" = ( /obj/structure/sign/warning/cold_temp, /turf/closed/wall/r_wall, @@ -14007,6 +14174,15 @@ "ejX" = ( /turf/open/floor/plating, /area/station/security/prison/safe) +"eke" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/closet/mini_fridge{ + name = "mini-fridge" + }, +/obj/item/reagent_containers/condiment/milk, +/obj/structure/table, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "ekh" = ( /obj/machinery/camera/directional/west{ c_tag = "Atmospherics - Central" @@ -14086,19 +14262,6 @@ dir = 8 }, /area/station/science/explab) -"elo" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/right/directional/east{ - req_access = list("brig_entrance") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "medsecprivacy"; - name = "Privacy Shutters" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/station/security/checkpoint/medical) "elw" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/upper) @@ -14126,6 +14289,16 @@ dir = 6 }, /area/station/command/heads_quarters/rd) +"emM" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ + id = "Cell 1"; + name = "Cell 1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/station/security/brig) "ena" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -14144,6 +14317,14 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/engineering/lobby) +"enG" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "enI" = ( /obj/machinery/door/airlock/maintenance{ name = "Tool Storage Maintenance" @@ -14602,12 +14783,7 @@ /obj/structure/railing{ dir = 4 }, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/effect/turf_decal/stripes/white/end, /turf/open/floor/iron/white, /area/station/medical/pharmacy) @@ -14647,15 +14823,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"eut" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/light_switch/directional/east, -/obj/structure/sink/kitchen/directional/west, -/obj/structure/table, -/obj/item/book/manual/chef_recipes, -/obj/item/holosign_creator/robot_seat/restaurant, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "euw" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -14672,6 +14839,22 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron, /area/station/science/xenobiology) +"euR" = ( +/obj/structure/ladder{ + name = "chemistry lab access" + }, +/obj/effect/turf_decal/stripes/end, +/obj/structure/sign/departments/chemistry/directional/north, +/obj/structure/sign/warning/no_smoking{ + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/yellow/full, +/obj/machinery/door/window/left/directional/south{ + name = "Chemistry Lab Access Hatch"; + req_access = list("plumbing") + }, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/treatment_center) "euZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15113,18 +15296,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"eDa" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 7"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "eDc" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/cable, @@ -15413,13 +15584,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"eHU" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "eHW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16093,6 +16257,15 @@ /obj/item/seeds/tower, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"eUw" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/knife/kitchen{ + pixel_y = 2 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "eUA" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/green/corner{ @@ -16125,6 +16298,18 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"eUH" = ( +/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{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "eUI" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -16190,15 +16375,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/eva/lower) -"eVc" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Graveyard Access"; - req_access = list("chapel_office") - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/service/chapel) "eVl" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -16281,6 +16457,18 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"eWh" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 2"; + req_access = list("xenobiology") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "Xenobio Pen 2 Blast Door" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "eWj" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, @@ -16374,13 +16562,6 @@ "eYC" = ( /turf/open/floor/iron/smooth, /area/mine/laborcamp/security) -"eYH" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) "eYL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall, @@ -16865,19 +17046,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"fhY" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/effect/turf_decal/siding/yellow/corner{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Engineering Lobby"; - name = "Engineering Lobby Fax Machine" - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "fij" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16994,6 +17162,18 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"fjt" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 9"; + req_access = list("xenobiology") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio9"; + name = "Xenobio Pen 9 Blast Door" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fjz" = ( /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/dirt, @@ -17069,6 +17249,22 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"fkO" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Atmospherics Delivery"; + req_access = list("atmospherics") + }, +/obj/effect/turf_decal/loading_area, +/obj/effect/turf_decal/siding/yellow/corner, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/station/engineering/atmos/storage/gas) "fkV" = ( /obj/machinery/door/airlock/maintenance{ name = "Permabrig Maintenance" @@ -17557,26 +17753,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"fti" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/machinery/door/window/left/directional/east{ - name = "First-Aid Supplies"; - red_alert_access = 1; - req_access = list("medical") - }, -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/storage) "ftt" = ( /obj/structure/sign/warning/secure_area/directional/south{ desc = "A warning sign which reads 'SERVER ROOM'."; @@ -17590,6 +17766,20 @@ /obj/item/storage/box/prisoner, /turf/open/floor/iron/showroomfloor, /area/station/security/processing) +"ftJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "gene_desk_shutters"; + name = "Genetics Shutters" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/east{ + name = "Genetics Desk"; + req_access = list("genetics") + }, +/turf/open/floor/plating, +/area/station/science/genetics) "ftM" = ( /obj/machinery/button/door/directional/north{ id = "kitchencounter"; @@ -17785,11 +17975,8 @@ /turf/open/floor/iron/showroomfloor, /area/station/engineering/atmos) "fwQ" = ( +/obj/structure/secure_safe/caps_spare, /obj/structure/table/reinforced, -/obj/structure/secure_safe/caps_spare/directional/east, -/obj/item/papercutter{ - pixel_x = 7 - }, /turf/open/floor/iron, /area/station/command/bridge) "fwS" = ( @@ -17865,6 +18052,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"fyh" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/airalarm/directional/east, +/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/kitchen/diagonal, +/area/station/service/kitchen) "fyr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -18034,33 +18229,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"fBC" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/brigdoor/left/directional/south{ - req_access = list("brig") - }, -/obj/effect/mapping_helpers/trapdoor_placer, -/turf/open/floor/glass/reinforced, -/area/station/security/courtroom) "fBF" = ( /obj/effect/landmark/start/hangover, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"fBJ" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/machinery/duct, -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "fBM" = ( /obj/structure/chair{ dir = 4 @@ -18224,13 +18398,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"fEr" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Security Delivery"; - req_access = list("brig") - }, -/turf/open/floor/plating, -/area/station/security/processing) "fEA" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance{ @@ -18286,6 +18453,15 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) +"fEY" = ( +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/end{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/aft) "fEZ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -18352,18 +18528,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"fGe" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 11"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio11"; - name = "Xenobio Pen 11 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "fGn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18393,18 +18557,6 @@ /obj/structure/lattice/catwalk, /turf/open/openspace/icemoon/keep_below, /area/station/maintenance/port/lesser) -"fGK" = ( -/obj/machinery/door/poddoor/preopen{ - id = "misclab"; - name = "Test Chamber Blast Door" - }, -/obj/machinery/door/window/left/directional/west{ - name = "Test Chamber"; - req_access = list("xenobiology") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/engine, -/area/station/science/xenobiology) "fGM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -18844,6 +18996,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"fMP" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "fNa" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, @@ -18913,8 +19072,8 @@ /area/station/science/explab) "fOR" = ( /obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, /obj/machinery/airalarm/directional/east, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white/side{ dir = 9 }, @@ -19303,6 +19462,23 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"fVK" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white, +/obj/item/pen, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Pharmacy Desk"; + req_access = list("pharmacy") + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "pharmacy_shutters2"; + name = "Pharmacy Shutters" + }, +/turf/open/floor/iron, +/area/station/medical/pharmacy) "fVS" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, @@ -19470,11 +19646,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) -"fYv" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "fYF" = ( /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/openspace, @@ -19788,6 +19959,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"gdz" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/door/window/right/directional/south{ + name = "First-Aid Supplies"; + red_alert_access = 1; + req_access = list("medical") + }, +/obj/structure/table/glass, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/mod/module/signlang_radio, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/storage) "gdC" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -19855,11 +20041,6 @@ /obj/structure/railing, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"gen" = ( -/obj/machinery/door/firedoor, -/obj/machinery/biogenerator, -/turf/open/floor/iron, -/area/station/service/hydroponics) "geq" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -20204,6 +20385,18 @@ "gka" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"gkf" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "gko" = ( /obj/machinery/conveyor{ dir = 8; @@ -20431,10 +20624,12 @@ /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/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "gnh" = ( @@ -20469,6 +20664,10 @@ dir = 8 }, /obj/machinery/light/small/directional/west, +/obj/machinery/requests_console/directional/west, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "gnL" = ( @@ -21130,19 +21329,6 @@ /obj/item/extinguisher, /turf/open/floor/iron/dark/textured, /area/station/command/gateway) -"gAl" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/east{ - req_access = list("brig_entrance") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "medsecprivacy"; - name = "Privacy Shutters" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/station/security/checkpoint/medical) "gAn" = ( /obj/machinery/door/firedoor/border_only, /turf/open/openspace, @@ -21206,6 +21392,18 @@ /obj/structure/sign/warning/cold_temp/directional/west, /turf/open/floor/iron, /area/station/cargo/miningdock) +"gBb" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 3"; + req_access = list("xenobiology") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio3"; + name = "Xenobio Pen 3 Blast Door" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "gBc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -21446,6 +21644,20 @@ "gEE" = ( /turf/open/openspace, /area/station/service/chapel) +"gEL" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 6 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Service Botany - Upper North" + }, +/obj/item/hand_labeler, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gER" = ( /turf/open/floor/iron, /area/station/command/bridge) @@ -22314,6 +22526,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating, /area/station/cargo/storage) +"gTf" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/photocopier, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "gTi" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Chemistry Access" @@ -22593,18 +22810,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) -"gXA" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - name = "Hydroponics Desk"; - req_access = list("hydroponics") - }, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "gXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22636,6 +22841,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"gYt" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Research Division Delivery"; + req_access = list("research") + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/breakroom) "gYz" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -22655,6 +22875,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"gYP" = ( +/obj/machinery/power/smes/full, +/obj/structure/cable, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "gZa" = ( /obj/structure/sign/nanotrasen{ pixel_x = -32 @@ -22975,16 +23200,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"hdT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "hdV" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ @@ -23046,15 +23261,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) -"heI" = ( -/obj/machinery/door/window/right/directional/east{ - name = "Captain's Desk Door"; - req_access = list("captain") - }, -/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/captain) "heQ" = ( /obj/structure/table, /obj/item/stack/cable_coil, @@ -23111,6 +23317,15 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/mess) +"hfw" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/obj/machinery/camera/directional/south{ + c_tag = "Labor Camp Utilities"; + network = list("labor") + }, +/turf/open/floor/iron/smooth, +/area/mine/laborcamp/security) "hfA" = ( /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 2 @@ -23239,6 +23454,19 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"hio" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Engineering Lobby"; + name = "Engineering Lobby Fax Machine" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "hjh" = ( /obj/machinery/computer/records/security{ dir = 4 @@ -23436,6 +23664,17 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"hmt" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/north{ + name = "Security Checkpoint"; + req_access = list("security") + }, +/obj/effect/turf_decal/delivery, +/obj/item/paper, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs/auxiliary) "hmX" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ color = "#0000ff"; @@ -23564,6 +23803,16 @@ }, /turf/open/floor/iron, /area/station/commons/dorms/laundry) +"hpc" = ( +/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/half/contrasted{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "hpd" = ( /turf/open/floor/plating, /area/station/engineering/engine_smes) @@ -23692,6 +23941,13 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/station/science/genetics) +"hqi" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Security Delivery"; + req_access = list("brig") + }, +/turf/open/floor/plating, +/area/station/security/processing) "hqm" = ( /obj/structure/table, /obj/item/storage/crayons, @@ -24552,18 +24808,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore) -"hDY" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Pharmacy Desk"; - req_access = list("pharmacy") - }, -/obj/item/folder/white, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/structure/sign/warning/fire/directional/west, -/obj/structure/table/reinforced, -/turf/open/floor/plating, -/area/station/medical/treatment_center) "hEl" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -24670,6 +24914,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/teleporter) +"hGj" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_corner{ + dir = 4 + }, +/area/station/security/office) "hGs" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -24794,6 +25050,10 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"hIK" = ( +/mob/living/basic/slime, +/turf/open/floor/engine, +/area/station/science/xenobiology) "hIN" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, @@ -24815,6 +25075,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore) +"hJi" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 6"; + req_access = list("xenobiology") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio6"; + name = "Xenobio Pen 6 Blast Door" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "hJm" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -25173,7 +25445,7 @@ /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) "hPf" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/clothing/head/costume/bearpelt, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, @@ -25322,6 +25594,17 @@ "hRA" = ( /turf/closed/wall, /area/station/medical/psychology) +"hRC" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Test Chamber"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/iron, +/area/station/science/xenobiology) "hRD" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/computer/mechpad{ @@ -25614,14 +25897,6 @@ /obj/machinery/teleport/hub, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) -"hWu" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Monkey Pen"; - req_access = list("genetics") - }, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/engine, -/area/station/science/genetics) "hWI" = ( /obj/effect/turf_decal/box, /obj/effect/spawner/random/structure/closet_empty/crate/with_loot, @@ -25662,22 +25937,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"hXu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/firealarm/directional/east, -/obj/machinery/door/airlock{ - name = "Service Hall" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured_half, -/area/station/hallway/secondary/service) "hXC" = ( /obj/structure/chair{ dir = 8 @@ -25694,19 +25953,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/white, /area/station/medical/cryo) -"hXZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/structure/bed{ - dir = 1 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 1 - }, -/obj/effect/spawner/random/contraband/permabrig_gear, -/turf/open/floor/iron/white, -/area/station/security/prison/safe) "hYb" = ( /obj/machinery/door/airlock/maintenance{ name = "Disposal Access" @@ -25763,7 +26009,6 @@ /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) "hYW" = ( -/obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/red{ dir = 4 }, @@ -25826,11 +26071,12 @@ /turf/open/floor/iron, /area/station/cargo/storage) "iaS" = ( -/obj/machinery/modular_computer/preset/id, -/obj/item/paper/fluff/ids_for_dummies, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, +/obj/structure/chair/office{ + dir = 8 + }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "iaT" = ( @@ -26005,6 +26251,19 @@ dir = 6 }, /area/station/service/chapel) +"icA" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/east{ + req_access = list("brig_entrance") + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "medsecprivacy"; + name = "Privacy Shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/checkpoint/medical) "icB" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 5 @@ -26138,6 +26397,14 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar/backroom) +"idN" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/window/brigdoor/left/directional/south{ + req_access = list("brig") + }, +/obj/effect/mapping_helpers/trapdoor_placer, +/turf/open/floor/glass/reinforced, +/area/station/security/courtroom) "idO" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -26221,18 +26488,6 @@ /obj/item/soap/nanotrasen, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) -"iga" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Service Hallway - Upper West" - }, -/obj/machinery/modular_computer/preset/cargochat/service{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "igi" = ( /obj/item/kirbyplants/organic/plant10, /obj/machinery/camera/directional/west{ @@ -26399,6 +26654,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"ijf" = ( +/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/box/white{ + color = "#52B4E9" + }, +/obj/machinery/holopad, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "iji" = ( /obj/structure/table, /obj/item/multitool/circuit{ @@ -27073,17 +27339,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/auxiliary) -"isG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 5"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "isP" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, @@ -27195,6 +27450,18 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) +"iuK" = ( +/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/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "iuS" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/glass/reinforced, @@ -27240,17 +27507,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"ivL" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 1"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "iwf" = ( /turf/closed/wall/r_wall, /area/mine/mechbay) @@ -27463,6 +27719,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) +"izA" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 8"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "izC" = ( /turf/closed/wall, /area/station/service/bar/atrium) @@ -27688,6 +27955,22 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"iCz" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "robotics2"; + name = "Robotics Lab Shutters" + }, +/obj/item/folder/white, +/obj/item/pen, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/west{ + name = "Robotics Desk"; + req_access = list("robotics") + }, +/turf/open/floor/plating, +/area/station/science/robotics/lab) "iCC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27755,6 +28038,17 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/security/prison/rec) +"iDG" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 3"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "iDQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -27929,6 +28223,26 @@ /obj/structure/cable, /turf/open/floor/carpet/red, /area/station/security/prison/work) +"iHZ" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/door/window/left/directional/east{ + name = "First-Aid Supplies"; + red_alert_access = 1; + req_access = list("medical") + }, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/storage) "iIa" = ( /obj/structure/cable, /obj/structure/railing, @@ -28230,12 +28544,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/interrogation) -"iML" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "iMT" = ( /turf/open/floor/iron, /area/station/commons/storage/primary) @@ -28686,18 +28994,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/science/genetics) -"iTO" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - 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, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/processing) "iTP" = ( /obj/item/reagent_containers/cup/bucket, /obj/effect/turf_decal/trimline/green/filled/line, @@ -28889,6 +29185,19 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"iWS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/brigdoor/left/directional/north{ + 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, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/security/holding_cell) "iWZ" = ( /obj/effect/decal/cleanable/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28984,17 +29293,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"iYz" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 9"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "iYA" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -29515,14 +29813,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"jih" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/tank_holder/extinguisher, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "jjk" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -29578,14 +29868,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"jjM" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "jjO" = ( /obj/structure/sink/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29794,6 +30076,19 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"joa" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/right/directional/east{ + req_access = list("brig_entrance") + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "medsecprivacy"; + name = "Privacy Shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/checkpoint/medical) "joh" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/wintercoat/eva{ @@ -30374,6 +30669,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) +"jwv" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/machinery/processor{ + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "jwx" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -30544,6 +30847,17 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"jAF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 5"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "jAI" = ( /obj/machinery/module_duplicator, /obj/machinery/light/directional/south, @@ -30840,6 +31154,22 @@ /obj/structure/rack, /turf/open/floor/iron, /area/station/command/gateway) +"jFA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/east, +/obj/machinery/door/airlock{ + name = "Service Hall" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_half, +/area/station/hallway/secondary/service) "jFJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -31452,14 +31782,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"jOA" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/airalarm/directional/east, -/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/kitchen/diagonal, -/area/station/service/kitchen) "jOD" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -31483,6 +31805,14 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"jPa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/aquarium_kit, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "jPc" = ( /obj/machinery/conveyor_switch/oneway{ id = "QMLoad2" @@ -31569,6 +31899,13 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"jQo" = ( +/obj/effect/turf_decal/siding/white{ + dir = 10 + }, +/obj/effect/spawner/random/entertainment/arcade, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "jQt" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=1"; @@ -31737,6 +32074,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/engineering/storage/tech) +"jSm" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "jSt" = ( /obj/machinery/door/airlock/external{ name = "Security Yard"; @@ -31773,10 +32118,15 @@ /obj/structure/sign/poster/official/here_for_your_safety/directional/east, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"jSW" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) +"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 @@ -32108,19 +32458,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"jYY" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Research Director Observation"; - req_access = list("rd") - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/station/command/heads_quarters/rd) "jZe" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -32143,6 +32480,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/eva) +"jZt" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_y = 9 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "jZB" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -32259,6 +32604,16 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"kbz" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Security Office"; + name = "Security Office Fax Machine" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "kbJ" = ( /obj/machinery/field/generator, /turf/open/floor/plating, @@ -32364,22 +32719,6 @@ }, /turf/open/floor/plating, /area/station/security/prison/visit) -"kcR" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Atmospherics Delivery"; - req_access = list("atmospherics") - }, -/obj/effect/turf_decal/loading_area, -/obj/effect/turf_decal/siding/yellow/corner, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/turf/open/floor/iron/textured_half{ - dir = 1 - }, -/area/station/engineering/atmos/storage/gas) "kcW" = ( /obj/structure/sign/warning/directional/south, /turf/open/genturf/blue, @@ -32448,6 +32787,18 @@ /obj/docking_port/stationary/escape_pod, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"keq" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/duct, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "keu" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy{ @@ -32743,6 +33094,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/construction) +"khv" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "khy" = ( /obj/structure/rack, /obj/item/wrench, @@ -33123,16 +33483,12 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "kmG" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/syringe, /obj/machinery/defibrillator_mount/directional/north, -/obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/blue/full, /obj/machinery/light/cold/directional/north, +/obj/machinery/stasis{ + dir = 4 + }, /turf/open/floor/iron/large, /area/station/medical/treatment_center) "kmH" = ( @@ -33170,16 +33526,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"kna" = ( -/obj/machinery/modular_computer/preset/cargochat/engineering, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) -"knc" = ( -/obj/machinery/computer/department_orders/engineering, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "knd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -33298,15 +33644,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"kpO" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "kpX" = ( /obj/structure/bed/medical{ dir = 4 @@ -33717,14 +34054,6 @@ /obj/structure/closet/cardboard, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"kuO" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/table, -/obj/machinery/processor{ - pixel_y = 6 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "kuR" = ( /obj/structure/barricade/wooden, /obj/machinery/door/airlock/maintenance, @@ -33770,6 +34099,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"kvs" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + name = "Hydroponics Desk"; + req_access = list("hydroponics") + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "kvu" = ( /obj/machinery/door/airlock/security{ id_tag = "IsolationCell"; @@ -33798,13 +34139,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/engineering/lobby) -"kvI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "kvR" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -34007,6 +34341,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"kzv" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet/any, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "kzw" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -35072,14 +35411,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/mine/storage) -"kPp" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/table, -/obj/item/plate, -/obj/item/food/piedough, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "kPq" = ( /obj/effect/spawner/random/structure/steam_vent, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35492,6 +35823,18 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"kVE" = ( +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/left/directional/west{ + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/obj/effect/spawner/random/structure/table_fancy, +/turf/open/floor/wood, +/area/station/service/library) "kVF" = ( /obj/structure/closet/secure_closet/courtroom, /obj/item/gavelhammer, @@ -36105,16 +36448,6 @@ /obj/effect/mapping_helpers/apc/cell_10k, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"lfq" = ( -/obj/machinery/door/window/right/directional/east{ - name = "Incoming Mail"; - req_access = list("shipping") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) "lfs" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -37004,17 +37337,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lty" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 8"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "ltE" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -37316,18 +37638,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) -"lyo" = ( -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/turf_decal/tile/red/anticorner, -/turf/open/floor/iron/dark/textured_corner{ - dir = 1 - }, -/area/station/security/office) "lyq" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/bot, @@ -37341,16 +37651,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/stone, /area/mine/eva/lower) -"lyw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "lyG" = ( /turf/open/floor/glass/reinforced, /area/station/ai_monitored/security/armory/upper) @@ -37532,6 +37832,17 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"lBZ" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 7"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "lCb" = ( /obj/effect/landmark/start/assistant, /obj/structure/cable, @@ -37605,18 +37916,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"lDd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/door/window/brigdoor/right/directional/west{ - name = "Medbay Access"; - req_access = list("medical") - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "lDg" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37697,15 +37996,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"lDL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/computer/department_orders/service{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "lDM" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -37728,6 +38018,14 @@ /obj/structure/cable, /turf/open/floor/carpet/blue, /area/station/security/prison/work) +"lEg" = ( +/obj/machinery/door/window/left/directional/north{ + name = "AI Core Door"; + req_access = list("ai_upload") + }, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "lEj" = ( /turf/open/floor/iron/dark/textured, /area/station/security/processing) @@ -38248,21 +38546,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) -"lMI" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/table, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "lNa" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -38941,6 +39224,19 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"lWS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "lXi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39529,18 +39825,6 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"miE" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 5"; - req_access = list("xenobiology") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "miR" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -39783,15 +40067,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/aft/greater) -"mmN" = ( -/obj/machinery/flasher/portable, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Flash Storage"; - req_access = list("brig") - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/security/brig/upper) "mmR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39801,18 +40076,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"mnr" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 2"; - req_access = list("xenobiology") - }, +"mnj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 }, -/turf/open/floor/engine, -/area/station/science/xenobiology) +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/hallway/secondary/service) "mnu" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -40564,6 +40839,15 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) +"mzs" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/light_switch/directional/east, +/obj/structure/sink/kitchen/directional/west, +/obj/structure/table, +/obj/item/book/manual/chef_recipes, +/obj/item/holosign_creator/robot_seat/restaurant, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "mzu" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -40879,6 +41163,18 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"mEZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Service Hallway - Upper West" + }, +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "mFj" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -40910,6 +41206,15 @@ "mFE" = ( /turf/closed/wall, /area/station/medical/surgery/aft) +"mFQ" = ( +/obj/machinery/flasher/portable, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Flash Storage"; + req_access = list("brig") + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/security/brig/upper) "mFR" = ( /obj/structure/sign/plaques/kiddie/badger{ pixel_y = 32 @@ -40986,6 +41291,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, /area/station/science/explab) +"mHe" = ( +/obj/machinery/conveyor{ + dir = 6; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/brm, +/turf/open/floor/iron, +/area/mine/production) "mHu" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, @@ -41107,6 +41425,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"mJO" = ( +/obj/structure/bed, +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/button/door/directional/east{ + id = "Dorm2"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "mJX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle, @@ -41145,20 +41476,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/textured_edge, /area/station/security/evidence) -"mKH" = ( -/obj/structure/bed, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/bedsheet, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/east{ - id = "Dorm4"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "mLa" = ( /obj/item/kirbyplants/random, /turf/open/floor/plating, @@ -41217,6 +41534,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"mMf" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/filingcabinet, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "mMk" = ( /obj/machinery/telecomms/message_server/preset, /turf/open/floor/iron/dark/telecomms, @@ -41264,15 +41586,6 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb) -"mMX" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Security Office"; - name = "Security Office Fax Machine" - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "mNj" = ( /obj/machinery/computer/security{ dir = 4 @@ -41632,15 +41945,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mUM" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured_corner{ - dir = 4 - }, -/area/station/security/office) "mUR" = ( /obj/machinery/firealarm/directional/north{ pixel_x = -26 @@ -42447,16 +42751,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"neL" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Shop Counter" - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "neM" = ( /obj/machinery/hydroponics/soil, /turf/open/misc/asteroid/snow/icemoon, @@ -42723,6 +43017,15 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/hydroponics) +"njx" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Fitness Ring" + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/commons/fitness) "njA" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -43235,19 +43538,6 @@ "npD" = ( /turf/closed/wall/r_wall, /area/station/maintenance/aft/greater) -"npE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "npH" = ( /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/cup/bucket, @@ -43286,6 +43576,15 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"nqt" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "nqv" = ( /obj/structure/fence{ dir = 4 @@ -43379,19 +43678,6 @@ /obj/effect/mapping_helpers/mail_sorting/service/theater, /turf/open/floor/wood/parquet, /area/station/commons/lounge) -"nry" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "nrA" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -43533,6 +43819,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) +"ntq" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + 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, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/processing) "ntx" = ( /obj/structure/sign/nanotrasen{ pixel_x = 32 @@ -43687,16 +43985,6 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"nwo" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ - id = "Cell 2"; - name = "Cell 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/security/brig) "nwr" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -44789,17 +45077,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/open/floor/plating, /area/station/maintenance/fore) -"nLz" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/north{ - name = "Security Checkpoint"; - req_access = list("security") - }, -/obj/effect/turf_decal/delivery, -/obj/item/paper, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "nLH" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -44983,6 +45260,20 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"nOl" = ( +/obj/structure/bed, +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/bedsheet, +/obj/effect/landmark/start/hangover, +/obj/machinery/button/door/directional/east{ + id = "Dorm4"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "nOx" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -45118,7 +45409,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "nRm" = ( @@ -45366,18 +45658,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"nUP" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 3"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "nVc" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -45476,16 +45756,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"nWX" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ - id = "Cell 3"; - name = "Cell 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/security/brig) "nXb" = ( /turf/closed/wall, /area/icemoon/surface/outdoors/nospawn) @@ -45546,6 +45816,9 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/security/prison/visit) +"nYm" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "nYn" = ( /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/carpet, @@ -45612,18 +45885,6 @@ /obj/item/stock_parts/subspace/amplifier, /turf/open/floor/plating, /area/station/engineering/storage/tech) -"nZG" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 6"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "nZH" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -45792,6 +46053,17 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"odd" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 6"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "odf" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -45819,19 +46091,6 @@ /obj/structure/stairs/east, /turf/open/floor/iron/white, /area/station/science/ordnance) -"odo" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/south{ - id = "Dorm5"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "odw" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, @@ -46284,6 +46543,26 @@ /obj/structure/bookcase/random/fiction, /turf/open/floor/iron/dark, /area/station/commons/lounge) +"okx" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Warden Desk"; + req_access = list("armory") + }, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/window/left/directional/north{ + name = "Warden Desk" + }, +/turf/open/floor/iron, +/area/station/security/warden) "okG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -46308,14 +46587,6 @@ "olf" = ( /turf/open/floor/carpet, /area/station/commons/dorms) -"olj" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/table, -/obj/machinery/reagentgrinder{ - pixel_y = 9 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "olH" = ( /obj/machinery/door/airlock/command{ name = "Captain's Quarters" @@ -47103,7 +47374,7 @@ start_active = 1 }, /turf/open/misc/asteroid/snow/icemoon, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/icemoon/surface/outdoors/nospawn) "oxB" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -47230,6 +47501,16 @@ }, /turf/open/floor/iron/dark, /area/station/security/mechbay) +"oyV" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/cook, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "oyW" = ( /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -47246,10 +47527,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"ozn" = ( -/obj/machinery/photocopier, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "ozo" = ( /obj/effect/landmark/carpspawn, /turf/open/misc/asteroid/snow/icemoon, @@ -48101,6 +48378,12 @@ /obj/structure/sign/warning/gas_mask, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) +"oLV" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe{ + pixel_x = -2 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "oLW" = ( /obj/machinery/computer/security/telescreen{ desc = "Used to access the various cameras on the station."; @@ -48590,17 +48873,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms) -"oTt" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Terrarium"; - req_access = list("hydroponics") - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/service/hydroponics) "oTx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48621,6 +48893,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oTE" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "oTM" = ( /obj/item/flashlight/lantern, /obj/structure/table/wood, @@ -48648,6 +48932,15 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"oUK" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "oUL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48984,16 +49277,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"oZW" = ( -/obj/machinery/newscaster/directional/south, -/obj/machinery/computer/department_orders/science{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/lab) "pac" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -49482,6 +49765,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"phU" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/door/window/right/directional/south{ + name = "Theater Stage" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/station/service/theater) "pib" = ( /obj/machinery/camera/motion/directional/south{ c_tag = "Vault"; @@ -49539,6 +49830,18 @@ dir = 1 }, /area/station/hallway/primary/central) +"piC" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/button/door/directional/south{ + id = "Dorm6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "piD" = ( /obj/machinery/computer/security/labor, /obj/structure/cable, @@ -49559,6 +49862,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"piL" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ + id = "Cell 2"; + name = "Cell 2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/station/security/brig) "piM" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -49683,14 +49996,6 @@ /obj/structure/closet/crate/freezer/blood, /turf/open/floor/iron/white, /area/station/medical/cryo) -"pko" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "pkN" = ( /obj/structure/railing, /obj/effect/mapping_helpers/burnt_floor, @@ -50389,22 +50694,6 @@ }, /turf/open/floor/eighties/red, /area/station/security/prison/safe) -"pvM" = ( -/obj/structure/ladder{ - name = "chemistry lab access" - }, -/obj/effect/turf_decal/stripes/end, -/obj/structure/sign/departments/chemistry/directional/north, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -28 - }, -/obj/effect/turf_decal/tile/yellow/full, -/obj/machinery/door/window/left/directional/south{ - name = "Chemistry Lab Access Hatch"; - req_access = list("plumbing") - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/treatment_center) "pvU" = ( /obj/item/toy/snowball{ pixel_x = 6; @@ -50518,6 +50807,19 @@ /obj/item/clothing/under/misc/burial, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"pxi" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Mass Driver"; + req_access = list("chapel_office") + }, +/obj/machinery/mass_driver/chapelgun{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/service/chapel) "pxn" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -50831,17 +51133,6 @@ "pBE" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) -"pBI" = ( -/obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/disposal/incinerator) "pBN" = ( /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, @@ -51459,15 +51750,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) -"pLK" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "pLZ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -51528,18 +51810,6 @@ "pMF" = ( /turf/open/floor/iron/white, /area/station/science/xenobiology) -"pMU" = ( -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/left/directional/west{ - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/obj/effect/spawner/random/structure/table_fancy, -/turf/open/floor/wood, -/area/station/service/library) "pMY" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -51682,13 +51952,6 @@ "pOL" = ( /turf/open/floor/iron/white, /area/station/science/ordnance) -"pOU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "pOV" = ( /obj/structure/rack, /obj/item/clothing/suit/hazardvest, @@ -52081,14 +52344,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"pVX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/photocopier, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "pWb" = ( /obj/effect/decal/cleanable/dirt, /obj/item/rack_parts, @@ -52251,6 +52506,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/janitor) +"pYI" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "pYT" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron, @@ -52611,9 +52874,35 @@ dir = 8 }, /area/station/service/chapel) +"qfe" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "qfh" = ( /turf/open/floor/iron/recharge_floor, /area/station/science/robotics/mechbay) +"qfi" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/large, +/area/station/medical/treatment_center) "qfj" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -53058,30 +53347,6 @@ "qnj" = ( /turf/closed/wall, /area/station/commons/locker) -"qnl" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Door" - }, -/obj/structure/desk_bell{ - pixel_x = 6 - }, -/obj/machinery/door/window/left/directional/east{ - name = "Engineering Desk"; - req_access = list("engineering") - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "qnm" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole/bookmanagement{ @@ -54051,6 +54316,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"qCH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "qCI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54126,6 +54397,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"qDZ" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/item/plate, +/obj/item/food/piedough, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "qEa" = ( /obj/structure/cable/layer3, /turf/open/floor/iron/dark, @@ -54377,6 +54656,16 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/checker, /area/station/commons/storage/emergency/port) +"qHa" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "qHg" = ( /obj/structure/transit_tube/curved/flipped{ dir = 1 @@ -54625,6 +54914,13 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/entry) +"qKN" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "qKQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -54710,6 +55006,18 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating, /area/station/service/lawoffice) +"qLN" = ( +/obj/machinery/door/poddoor/preopen{ + id = "misclab"; + name = "Test Chamber Blast Door" + }, +/obj/machinery/door/window/left/directional/west{ + name = "Test Chamber"; + req_access = list("xenobiology") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/engine, +/area/station/science/xenobiology) "qLQ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -54751,17 +55059,6 @@ }, /turf/open/floor/plating, /area/station/commons/dorms/laundry) -"qMs" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/service/hydroponics) "qMz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/white, @@ -55051,18 +55348,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"qQz" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/button/door/directional/south{ - id = "Dorm6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "qQC" = ( /turf/open/floor/iron, /area/station/commons/storage/mining) @@ -55174,22 +55459,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/prison/garden) -"qSp" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "robotics2"; - name = "Robotics Lab Shutters" - }, -/obj/item/folder/white, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/west{ - name = "Robotics Desk"; - req_access = list("robotics") - }, -/turf/open/floor/plating, -/area/station/science/robotics/lab) "qSq" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -55389,6 +55658,19 @@ /obj/structure/rack, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"qVB" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Armory Desk"; + req_access = list("armory") + }, +/obj/machinery/door/window/left/directional/north{ + name = "Armory Desk" + }, +/obj/item/hand_labeler, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory/upper) "qVD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -55583,6 +55865,19 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/auxiliary) +"qYD" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/machinery/duct, +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "qYP" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -55772,7 +56067,7 @@ start_active = 1 }, /turf/open/misc/asteroid/snow/icemoon, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/icemoon/surface/outdoors/nospawn) "rbs" = ( /obj/effect/turf_decal/tile/yellow, /obj/machinery/light/directional/east, @@ -55800,19 +56095,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) -"rcf" = ( -/obj/structure/bed, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/button/door/directional/east{ - id = "Dorm2"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "rcj" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=Lockers"; @@ -56004,6 +56286,18 @@ /obj/item/flashlight/flare/candle, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"reT" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 8"; + req_access = list("xenobiology") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio8"; + name = "Xenobio Pen 8 Blast Door" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "rfh" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -56172,23 +56466,6 @@ /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"rhU" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Pharmacy Desk"; - req_access = list("pharmacy") - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "pharmacy_shutters2"; - name = "Pharmacy Shutters" - }, -/turf/open/floor/iron, -/area/station/medical/pharmacy) "rhY" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/box/red, @@ -56379,19 +56656,6 @@ "rkL" = ( /turf/open/floor/carpet/blue, /area/station/medical/psychology) -"rkM" = ( -/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/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "rkN" = ( /turf/closed/wall, /area/station/engineering/atmos/hfr_room) @@ -56592,6 +56856,17 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"roA" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 4"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "roH" = ( /obj/structure/chair/pew/right, /turf/open/floor/wood, @@ -56620,14 +56895,6 @@ /obj/structure/closet/athletic_mixed, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"rpf" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "rpu" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -56721,20 +56988,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/auxiliary) -"rqq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "rqD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -57155,20 +57408,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"ryd" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "gene_desk_shutters"; - name = "Genetics Shutters" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east{ - name = "Genetics Desk"; - req_access = list("genetics") - }, -/turf/open/floor/plating, -/area/station/science/genetics) "ryf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57904,6 +58143,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/engineering/main) +"rJe" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 1"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "rJr" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/white, @@ -58113,17 +58363,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"rNa" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Test Chamber"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron, -/area/station/science/xenobiology) "rNc" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 8 @@ -58529,6 +58768,16 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"rUy" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #2" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/east, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/iron, +/area/station/cargo/storage) "rUz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -58786,9 +59035,6 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) "rYk" = ( -/obj/structure/chair/office{ - dir = 8 - }, /obj/machinery/button/flasher{ id = "hopflash"; pixel_x = 8; @@ -58813,6 +59059,10 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 }, +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/item/paper/fluff/ids_for_dummies, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "rYq" = ( @@ -58936,6 +59186,10 @@ dir = 4 }, /area/station/service/chapel) +"sao" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "sbc" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -59216,18 +59470,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/large, /area/station/hallway/secondary/entry) -"sfs" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 8"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "sfv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, @@ -59921,13 +60163,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"spl" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Fitness Ring" - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/fitness) "spv" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, /obj/structure/cable, @@ -59944,6 +60179,17 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"spW" = ( +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/obj/machinery/door/window/left/directional/west{ + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/obj/effect/spawner/random/structure/table_fancy, +/turf/open/floor/wood, +/area/station/service/library) "sqb" = ( /obj/item/coin/iron{ pixel_y = -5 @@ -60049,6 +60295,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"srk" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Library Desk Door"; + req_access = list("library") + }, +/turf/open/floor/wood, +/area/station/service/library) "srn" = ( /turf/open/floor/glass/reinforced, /area/station/medical/treatment_center) @@ -60176,9 +60429,9 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/machinery/disposal/bin, /obj/machinery/computer/security/telescreen/entertainment/directional/south, /obj/machinery/light/small/directional/east, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark, /area/station/engineering/storage) "sto" = ( @@ -60833,13 +61086,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"sCM" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "sCQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60849,24 +61095,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"sCW" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/east{ - name = "Atmospherics Desk"; - req_access = list("atmospherics") - }, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/item/wrench, -/obj/item/crowbar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "sCZ" = ( /turf/open/floor/iron/dark, /area/station/service/hydroponics) @@ -61099,6 +61327,18 @@ dir = 1 }, /area/station/ai_monitored/command/storage/eva) +"sGf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/door/window/brigdoor/right/directional/west{ + name = "Medbay Access"; + req_access = list("medical") + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "sGi" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/table/wood, @@ -61195,14 +61435,6 @@ /obj/effect/turf_decal/tile/yellow/full, /turf/open/floor/iron/large, /area/station/medical/pharmacy) -"sHd" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "sHh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -61683,18 +61915,6 @@ /obj/item/storage/bag/trash, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"sPi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron/half{ - dir = 1 - }, -/area/station/hallway/secondary/service) "sPA" = ( /obj/structure/rack, /obj/item/storage/bag/ore, @@ -61765,11 +61985,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/mine/living_quarters) -"sQy" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "sQB" = ( /turf/closed/wall, /area/station/security/brig/upper) @@ -62161,6 +62376,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/explab) +"sXG" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "sXK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62443,18 +62666,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"tdd" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 1"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "tdp" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -63020,26 +63231,6 @@ /obj/item/folder/yellow, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"tns" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Warden Desk"; - req_access = list("armory") - }, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/window/left/directional/north{ - name = "Warden Desk" - }, -/turf/open/floor/iron, -/area/station/security/warden) "tny" = ( /obj/structure/disposalpipe/segment, /obj/item/radio/intercom/directional/east, @@ -63205,6 +63396,11 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"tqZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/biogenerator, +/turf/open/floor/iron, +/area/station/service/hydroponics) "trb" = ( /obj/structure/table, /obj/machinery/computer/security/telescreen{ @@ -63291,6 +63487,19 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark/textured, /area/station/security/interrogation) +"tsK" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/bed{ + dir = 1 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 1 + }, +/obj/effect/spawner/random/contraband/permabrig_gear, +/turf/open/floor/iron/white, +/area/station/security/prison/safe) "tsQ" = ( /obj/machinery/door/airlock/public/glass{ name = "Public Mining Storage" @@ -63385,15 +63594,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) -"tuo" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/item/knife/kitchen{ - pixel_y = 2 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "tur" = ( /turf/open/floor/iron/cafeteria{ dir = 8 @@ -63436,18 +63636,6 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron, /area/station/security/prison/mess) -"tuI" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 10"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "tva" = ( /obj/machinery/light/small/directional/south, /turf/open/openspace, @@ -63708,14 +63896,6 @@ /obj/structure/chair/office, /turf/open/floor/wood, /area/station/service/library) -"tyH" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "tyK" = ( /obj/item/mop, /obj/item/reagent_containers/cup/bucket, @@ -63832,17 +64012,6 @@ "tBs" = ( /turf/closed/wall, /area/station/maintenance/department/chapel) -"tBv" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 7"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "tBL" = ( /obj/machinery/computer/atmos_control/nitrogen_tank{ dir = 1 @@ -64757,6 +64926,11 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/plating, /area/station/science/xenobiology) +"tOg" = ( +/obj/machinery/power/smes/full, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "tOi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65227,6 +65401,11 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"tXL" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/modular_computer/preset/cargochat/engineering, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "tXV" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/camera/directional/north{ @@ -65312,19 +65491,6 @@ /obj/structure/ladder, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"tZy" = ( -/obj/machinery/conveyor{ - dir = 6; - id = "mining_internal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/brm, -/turf/open/floor/iron, -/area/mine/production) "tZG" = ( /obj/machinery/meter, /obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ @@ -65513,6 +65679,18 @@ /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"; + req_access = list("xenobiology") + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio4"; + name = "Xenobio Pen 4 Blast Door" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "ucn" = ( /obj/item/toy/snowball{ pixel_x = 9; @@ -65526,17 +65704,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"ucy" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 6"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "ucD" = ( /obj/machinery/plate_press, /obj/structure/window/reinforced/spawner/directional/west, @@ -65888,19 +66055,6 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/ai_monitored/command/nuke_storage) -"uiV" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Armory Desk"; - req_access = list("armory") - }, -/obj/machinery/door/window/left/directional/north{ - name = "Armory Desk" - }, -/obj/item/hand_labeler, -/turf/open/floor/iron, -/area/station/ai_monitored/security/armory/upper) "uja" = ( /turf/closed/wall, /area/station/commons/toilet) @@ -66297,13 +66451,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/ce) -"uoR" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/effect/turf_decal/tile/blue/diagonal_edge, -/obj/item/radio/intercom/directional/west, -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "uoS" = ( /obj/machinery/vending/games, /obj/structure/window/reinforced/spawner/directional/east, @@ -66319,6 +66466,7 @@ /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/corner, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "upa" = ( @@ -66396,6 +66544,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/eva/lower) +"uqB" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/item/radio/intercom/directional/west, +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "uqG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66498,6 +66653,20 @@ "usP" = ( /turf/open/misc/asteroid/snow/standard_air, /area/station/science/research) +"usS" = ( +/obj/structure/bed{ + dir = 1 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/station/security/prison/safe) "utr" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -66654,21 +66823,6 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"uwL" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Research Division Delivery"; - req_access = list("research") - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/breakroom) "uwM" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/computer/mech_bay_power_console{ @@ -66880,17 +67034,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/security/range) -"uAH" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 10"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "uAJ" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -67364,15 +67507,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"uIt" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "uIx" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, @@ -67573,16 +67707,6 @@ }, /turf/open/floor/wood/parquet, /area/station/commons/lounge) -"uLV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "uLX" = ( /obj/machinery/door/airlock{ name = "Port Emergency Storage" @@ -67876,16 +68000,6 @@ dir = 8 }, /area/station/ai_monitored/command/storage/eva) -"uPH" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #2" - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/east, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/storage) "uPS" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -67899,14 +68013,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/production) -"uQm" = ( -/obj/machinery/door/window/left/directional/north{ - name = "AI Core Door"; - req_access = list("ai_upload") - }, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) "uQu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -68113,21 +68219,6 @@ dir = 4 }, /area/station/service/chapel) -"uUi" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Research Director Observation"; - req_access = list("rd") - }, -/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/command/heads_quarters/rd) "uUn" = ( /obj/structure/table/optable, /obj/effect/decal/cleanable/blood/old, @@ -68290,37 +68381,12 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"uXH" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/wood/fancy/red, -/obj/effect/spawner/random/aimodule/harmful, -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "High-Risk Modules"; - req_access = list("captain") - }, -/obj/item/ai_module/reset/purge{ - pixel_y = 11 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "uXV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) -"uXW" = ( -/obj/machinery/modular_computer/preset/cargochat/security{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "uYc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -68537,24 +68603,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"vbg" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Labor Camp Utilities"; - network = list("labor") - }, -/turf/open/floor/iron/smooth, -/area/mine/laborcamp/security) -"vbn" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) "vbz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68624,6 +68672,13 @@ "vcj" = ( /turf/closed/wall/r_wall, /area/mine/storage) +"vco" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Fitness Ring" + }, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/fitness) "vcH" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 9 @@ -68914,18 +68969,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/service/chapel) -"vhz" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 9"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "vhB" = ( /obj/structure/chair/plastic, /obj/effect/turf_decal/bot_red, @@ -69428,14 +69471,6 @@ /obj/structure/cable, /turf/open/floor/iron/recharge_floor, /area/station/security/mechbay) -"vpH" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/machinery/door/window/right/directional/south{ - name = "Theater Stage" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/service/theater) "vpR" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -69471,22 +69506,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"vqs" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet/any, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "vqv" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/science/ordnance) -"vqz" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Library Desk Door"; - req_access = list("library") - }, -/turf/open/floor/wood, -/area/station/service/library) "vqD" = ( /obj/machinery/door/airlock{ name = "Hydroponics Backroom" @@ -69504,6 +69527,21 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/medical/virology) +"vqJ" = ( +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/tile/red/anticorner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_corner{ + dir = 1 + }, +/area/station/security/office) "vqN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69540,27 +69578,11 @@ /turf/open/floor/iron, /area/station/security/courtroom) "vry" = ( -/obj/machinery/requests_console/directional/south{ - department = "Head of Personnel's Desk"; - name = "Head of Personnel's Requests Console" +/obj/machinery/button/photobooth{ + pixel_y = -26 }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) -"vrz" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 5 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/duct, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) "vrC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70360,6 +70382,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/brig/entrance) +"vDg" = ( +/obj/machinery/newscaster/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white/side{ + dir = 5 + }, +/area/station/science/lab) "vDh" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -70400,16 +70429,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"vDS" = ( -/obj/machinery/computer/department_orders/security{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "vEi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -70710,6 +70729,21 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"vJY" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Research Director Observation"; + req_access = list("rd") + }, +/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/command/heads_quarters/rd) "vKk" = ( /obj/machinery/vending/security, /turf/open/floor/iron/smooth_edge, @@ -70841,6 +70875,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"vMq" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/holopad, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) +"vMz" = ( +/obj/machinery/photobooth, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "vMA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70934,12 +70977,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vOX" = ( -/obj/machinery/vending/wardrobe/chef_wardrobe{ - pixel_x = -2 - }, -/turf/open/floor/plating/snowed/coldroom, -/area/station/service/kitchen/coldroom) "vPh" = ( /obj/machinery/light/directional/north, /obj/machinery/digital_clock/directional/north, @@ -70966,6 +71003,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"vPD" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 1"; + req_access = list("xenobiology") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio1"; + name = "Xenobio Pen 1 Blast Door" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "vPF" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -71199,21 +71248,6 @@ "vTc" = ( /turf/closed/wall, /area/station/medical/chem_storage) -"vTe" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/door/window/right/directional/south{ - name = "First-Aid Supplies"; - red_alert_access = 1; - req_access = list("medical") - }, -/obj/structure/table/glass, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/obj/effect/turf_decal/tile/blue/full, -/obj/item/mod/module/signlang_radio, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/storage) "vTg" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -71554,6 +71588,17 @@ /obj/structure/barricade/wooden/snowed, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"vYr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/pen{ + pixel_x = -5 + }, +/obj/item/paper_bin, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "vYs" = ( /obj/machinery/light/directional/east, /obj/structure/cable, @@ -71990,19 +72035,6 @@ dir = 4 }, /area/station/hallway/secondary/entry) -"wfJ" = ( -/obj/structure/bed, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/button/door/directional/east{ - id = "Dorm3"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "wfK" = ( /obj/item/folder/blue, /obj/structure/table/wood, @@ -72107,23 +72139,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"wgZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "robotics"; - name = "Robotics Lab Shutters" - }, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/obj/machinery/door/window/left/directional/south{ - name = "Robotics Desk"; - req_access = list("robotics") - }, -/turf/open/floor/plating, -/area/station/science/robotics/lab) "whb" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -72623,15 +72638,6 @@ /obj/structure/sign/poster/official/safety_eye_protection/directional/south, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"woF" = ( -/obj/machinery/modular_computer/preset/cargochat/medical{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 8 - }, -/turf/open/floor/iron/large, -/area/station/medical/medbay/aft) "woH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72851,6 +72857,14 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/disposal) +"wry" = ( +/obj/machinery/photocopier, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "wrA" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -72900,16 +72914,6 @@ }, /turf/open/floor/iron, /area/station/science/ordnance) -"wst" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/cook, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "wsu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -73177,6 +73181,30 @@ /mob/living/basic/pet/cat/runtime, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) +"wwn" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + name = "Reception Window" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "hop"; + name = "Privacy Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Head of Personnel's Desk"; + req_access = list("hop") + }, +/obj/machinery/flasher/directional/south{ + id = "hopflash"; + pixel_y = -23 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "wws" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73691,15 +73719,6 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wEe" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "wEh" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -73768,6 +73787,18 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"wFo" = ( +/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{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "wFO" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/siding/wood{ @@ -73797,15 +73828,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/explab) -"wGo" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/door/window/right/directional/east{ - name = "Airlock" - }, -/turf/open/floor/iron/dark, -/area/mine/mechbay) "wGv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -73917,17 +73939,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) -"wHJ" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 11"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "wIg" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 @@ -74029,6 +74040,14 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) +"wKm" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "wKv" = ( /obj/structure/table, /obj/item/radio/off, @@ -74079,15 +74098,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"wLL" = ( -/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) "wLO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74214,8 +74224,8 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "wMV" = ( -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark/textured_half{ dir = 1 }, @@ -74618,19 +74628,6 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"wST" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/window/brigdoor/left/directional/north{ - 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, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/security/holding_cell) "wSU" = ( /obj/structure/chair{ dir = 1 @@ -74948,6 +74945,17 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/office) +"wXX" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen 10"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "wYf" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -75170,6 +75178,15 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"xaF" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #1" + }, +/obj/effect/turf_decal/bot, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/iron, +/area/station/cargo/storage) "xaH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75222,6 +75239,11 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/grimy, /area/station/service/bar/atrium) +"xbn" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "xbo" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -75331,13 +75353,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/storage) -"xdm" = ( -/obj/effect/turf_decal/tile/blue/diagonal_edge, -/obj/machinery/computer/order_console/cook{ - dir = 1 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "xdA" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -75542,10 +75557,7 @@ req_access = list("brig"); specialfunctions = 4 }, -/obj/item/paper/crumpled{ - default_raw_text = "Remember! Corporate spent a lot of money to create this state of the art fashion show. If we EVER even so much as HEAR a rumor that a news crew or corporate rep is coming by, this place needs to be in TIP TOP condition. It's all of our asses (and our pensions) if it's not."; - name = "Crumpled Memo" - }, +/obj/machinery/photobooth/security, /turf/open/floor/iron/smooth, /area/station/security/execution/transfer) "xgg" = ( @@ -75679,6 +75691,27 @@ "xhk" = ( /turf/open/floor/iron/dark, /area/station/commons/storage/primary) +"xht" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Shop Counter" + }, +/obj/effect/turf_decal/siding/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) +"xhv" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 2"; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/science/xenobiology) "xhw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -75863,6 +75896,15 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) +"xlh" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Medbay Delivery"; + req_access = list("medical") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/yellow/full, +/turf/open/floor/iron/large, +/area/station/medical/storage) "xlq" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -76071,47 +76113,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"xos" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - name = "Reception Window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "hop"; - name = "Privacy Shutters" - }, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Head of Personnel's Desk"; - req_access = list("hop") - }, -/obj/machinery/flasher/directional/south{ - id = "hopflash"; - pixel_y = -23 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "xow" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) -"xoE" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen 2"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "xpo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76125,16 +76132,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"xpt" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 4 - }, -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/turf/open/floor/iron/large, -/area/station/medical/medbay/aft) "xpw" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -76185,6 +76182,18 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/port/greater) +"xqu" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen 10"; + req_access = list("xenobiology") + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio10"; + name = "Xenobio Pen 10 Blast Door" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "xqv" = ( /obj/effect/spawner/random/entertainment/gambling, /obj/structure/table/wood, @@ -76674,20 +76683,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/detectives_office) -"xyj" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 6 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Service Botany - Upper North" - }, -/obj/item/hand_labeler, -/turf/open/floor/iron, -/area/station/service/hydroponics) "xyl" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -77283,6 +77278,24 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"xGp" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/east{ + name = "Atmospherics Desk"; + req_access = list("atmospherics") + }, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/item/wrench, +/obj/item/crowbar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) "xGt" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -77537,6 +77550,15 @@ "xLq" = ( /turf/open/floor/glass/reinforced, /area/station/science/ordnance/office) +"xLF" = ( +/obj/machinery/door/window/right/directional/east{ + name = "Captain's Desk Door"; + req_access = list("captain") + }, +/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/captain) "xLK" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -77667,6 +77689,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"xOb" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Airlock" + }, +/turf/open/floor/iron/dark, +/area/mine/mechbay) "xOl" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -77800,22 +77831,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"xRt" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) -"xRu" = ( -/obj/machinery/door/airlock{ - name = "Service Hall" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured_half, -/area/station/hallway/secondary/service) "xRw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77937,12 +77952,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"xTz" = ( -/obj/structure/bed/pod, -/obj/effect/spawner/random/bedsheet/any, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "xTQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -79044,18 +79053,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"ylT" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 4"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ylU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -100065,7 +100062,7 @@ gIu hOo sgA ceS -wGo +xOb eLS iwf iDt @@ -104857,7 +104854,7 @@ tWK tWK tWK xhK -hXZ +tsK jGg vVH krV @@ -105123,7 +105120,7 @@ fHg eek vVH fps -aOg +usS vVH keD kqR @@ -105894,7 +105891,7 @@ fHg hnt vVH fps -aOg +usS vVH gwy ixw @@ -114618,7 +114615,7 @@ iDt nTO ody hMJ -vbg +hfw nTO iDt xMq @@ -164572,7 +164569,7 @@ dQd nWH nWH nWH -tZy +mHe dAq adm dTF @@ -169951,10 +169948,10 @@ thA thA thA thA -xMq psb scw psb +iDt thA thA xMq @@ -170152,13 +170149,13 @@ yiL eDq pDl dAZ -biV +emM wob dUO -nwo +piL wob dUO -nWX +aIN wob lyg gjq @@ -170208,10 +170205,10 @@ thA thA thA iDt -iDt scw iDt scw +iDt thA thA thA @@ -170465,10 +170462,10 @@ thA thA iDt iDt -iDt psb scw psb +iDt thA thA thA @@ -171192,7 +171189,7 @@ gjq gjq gjq gjq -fBC +idN ntT xUR jbI @@ -180506,7 +180503,7 @@ qMz hjM gmO sBJ -vqs +kzv nxM bYY cDh @@ -180722,7 +180719,7 @@ oXk tiF cSu ebq -vpH +phU fjC nrt shD @@ -180997,7 +180994,7 @@ fuH fuH btU btU -lDd +sGf lca kme dYr @@ -183302,7 +183299,7 @@ eHW dMS fUn mQk -vOX +oLV fwB fwB fwB @@ -187450,10 +187447,10 @@ tsa wHb qLY abe -jSW +hIK abe cKA -jSW +hIK abe cKA abe @@ -187964,19 +187961,19 @@ oXr wpv qLY lMu -miE +bUK oQo nmj -ylT +ucl aHz dIS -nUP +gBb dJx htp -mnr +eWh yjA tOf -tdd +vPD lqU mDg nPI @@ -188212,7 +188209,7 @@ ffe pXj cZT qSE -fGK +qLN cZT cZT pXj @@ -188221,19 +188218,19 @@ wZv axD qLY hEW -isG +jAF fma vdr -bhc +roA fma vdr -coy +iDG fma maO -xoE +xhv fma maO -ivL +rJe fma ffe nPI @@ -188469,7 +188466,7 @@ ffe nAf pMF mqe -rNa +hRC euM pMF sfv @@ -188732,22 +188729,22 @@ gtF ouP gLS cyh -wHJ +cXX bKI cyh -uAH +wXX bKI cyh -iYz +dQZ bKI cyh -lty +izA bKI cyh -tBv +lBZ bKI cyh -ucy +odd iER ffe nPI @@ -188989,22 +188986,22 @@ wPd fiq qLY prH -fGe +bjn qbq iar -tuI +xqu oir slp -vhz +fjt wgr xur -sfs +reT rxM aLA -eDa +bnh cNI tWd -nZG +hJi wGN mDg pQG @@ -189506,7 +189503,7 @@ abe abe gLj abe -jSW +hIK gLj abe abe @@ -190755,7 +190752,7 @@ uJt uJt hxI iAQ -eVc +bkq uTX wrX xMq @@ -224149,7 +224146,7 @@ lJO kyU qFJ mWY -nLz +hmt xzo kHP cuc @@ -228499,7 +228496,7 @@ tCr tCr lJO gLZ -xTz +cXp xiW lJO hjI @@ -229019,7 +229016,7 @@ lJO hjt lJO csf -neL +xht wlr qHj gQD @@ -231374,8 +231371,8 @@ ppo lxb eWV kXr -ddg -uPH +xaF +rUy smx qqJ gjP @@ -232909,7 +232906,7 @@ nXQ bLW jJe rCC -lfq +aMd rCC jIg wEh @@ -235230,10 +235227,10 @@ qrJ uLC xzh dnq -dnq qcu bDR hYW +mpy bep ylU dnq @@ -235258,7 +235255,7 @@ vjx mDf nLb kNp -vbn +gYP vFs mMk qAV @@ -235488,9 +235485,9 @@ nqU rcE rcE rcE -rcE hVc jII +jII dnq ylU dnq @@ -235735,7 +235732,7 @@ oyp phf sEl qRs -wLL +jST wUX odN iZq @@ -235745,8 +235742,8 @@ ydT iIA fSC iIA -iIA cvg +vMz jII okb ylU @@ -235935,7 +235932,7 @@ mAe jJM mAe stt -uiV +qVB eeD aSH lyG @@ -236002,8 +235999,8 @@ cpm cpm cpm egY -egY -xos +wwn +jfc cpm pzb cRF @@ -236958,10 +236955,10 @@ aBR aBR lbc nbp -uXW -vDS +dNv +sXG ijj -uLV +hpc lRF feJ mgZ @@ -237215,7 +237212,7 @@ aBR aBR nbp nbp -lyo +vqJ omk omk jeF @@ -237734,7 +237731,7 @@ sMY wMV qqM wMi -kvI +sao arA jwx kfy @@ -237743,7 +237740,7 @@ jwx wfp cZm hLf -tns +okx mLu lAL npn @@ -237781,7 +237778,7 @@ utR uEQ lET grA -cEv +fwQ nOH gxU gZq @@ -238046,7 +238043,7 @@ ybv khV jRg qCP -uXH +aAi ybv ybv bln @@ -238243,12 +238240,12 @@ bln lBD nbp nbp -mUM +hGj jeF omk jeF nQf -bfB +mMf arA rYB rgC @@ -238500,8 +238497,8 @@ tGr bln lbc nbp -mMX -pVX +kbz +wry dlK pbI jIm @@ -239627,7 +239624,7 @@ gwK bID bID hOc -qnl +cLw hOc djO hOc @@ -239873,7 +239870,7 @@ kRP oWl vRS stD -sCW +xGp eFd qeh eBV @@ -240060,7 +240057,7 @@ aKt tDk jjt lUw -wST +iWS vwt gII cHY @@ -240102,7 +240099,7 @@ ybv rox cBU twK -bLP +aES ybv ybv bln @@ -240139,7 +240136,7 @@ elj iRr omi tKi -kna +tXL ydg dAm szR @@ -240350,8 +240347,8 @@ nfk utR tmQ qnV -fwQ kBr +cEv lhv iGH bGm @@ -240396,7 +240393,7 @@ jkx fLq hro tKi -knc +gTf dxA oht rSC @@ -240653,7 +240650,7 @@ gwK jyR bID bID -fhY +hio vCK rSC rSC @@ -240843,16 +240840,16 @@ sDl skl jOQ skl -mKH +nOl oCF ygB -wfJ +dcq peb ygB -rcf +mJO oCF ygB -rcf +mJO oCF ygB lBD @@ -241166,7 +241163,7 @@ gMN xnE tvd egV -ozn +nYm syU vYJ fGn @@ -241391,7 +241388,7 @@ anu fue dmG uPB -heI +xLF lpM oGQ wKw @@ -241413,7 +241410,7 @@ cvS gDp iMA qNl -kcR +fkO tjY aMr cwj @@ -242372,7 +242369,7 @@ xQG olY hQi rRM -mmN +mFQ lbk bln sDl @@ -242643,7 +242640,7 @@ cIK jOQ skl ddr -odo +ccp ygB kCb gya @@ -243671,7 +243668,7 @@ iHz jOQ skl pOo -qQz +piC ygB fXo aos @@ -243911,7 +243908,7 @@ eyb wug uLF nSH -fEr +hqi dKA deY bUx @@ -244421,7 +244418,7 @@ lHu tIf tIf blT -iTO +ntq cWG ekW vRN @@ -244466,7 +244463,7 @@ rFr nAM toH toH -oTt +bEq kHV hmb lso @@ -244700,7 +244697,7 @@ jPv skl hYC eOl -spl +vco owU owU tkV @@ -244713,11 +244710,11 @@ uDV ojD ykZ vqD -vrz -qMs -fBJ -pLK -xyj +keq +asJ +qYD +oUK +gEL mpU qFC kTO @@ -244971,8 +244968,8 @@ tCs exw exw exw -gen -gXA +tqZ +kvs glQ exw exw @@ -245226,7 +245223,7 @@ exw hvr exw exw -bVz +jPa mdZ vlI nHa @@ -245254,7 +245251,7 @@ tdE fBR fKi tHr -pvM +euR soK kRP nMN @@ -245474,7 +245471,7 @@ vfW ewz lDg lDg -cjw +njx vfW sfA dIe @@ -245484,7 +245481,7 @@ xFA aTV rQt tGZ -xRu +bMu iFc mrF iFc @@ -245505,7 +245502,7 @@ cJw dip bHO azw -rhU +fVK rGw azw eiY @@ -245741,8 +245738,8 @@ rtc jJf voM etA -hXu -sPi +jFA +mnj uVn nnW wvb @@ -245997,9 +245994,9 @@ tux dsO kQX tGZ -iga +mEZ mdZ -ckK +jQo dqd bfZ izC @@ -246023,7 +246020,7 @@ cXu frP oIJ nRd -pOU +lwQ tHr tHr bxU @@ -246254,7 +246251,7 @@ gzw kiB kQX kyZ -lDL +vYr mdZ rth hid @@ -246281,13 +246278,13 @@ eqp cTV fHz lwQ -lwQ +qfi sEK eHg ahL wVw xyy -hDY +bCr bYK srn pBA @@ -246540,7 +246537,7 @@ sFG lwQ kmG cyo -kpO +lup lup aCA jDn @@ -246796,8 +246793,8 @@ mcW fPb bEL efK -evp juw +nji tkf ikz oSQ @@ -248097,7 +248094,7 @@ cIU mlR rWW atb -fti +iHZ uOg kRP pAN @@ -248321,7 +248318,7 @@ gtw gtw gtw gtw -uoR +uqB cpY cGZ lCi @@ -248353,9 +248350,9 @@ tQc vSY ubq lfL -vTe +gdz isP -dgk +cwu kRP kRP kRP @@ -248574,11 +248571,11 @@ oDm qZB gtw xHi -xRt -kuO -cjp +aHZ +jwv +pYI mVY -xdm +bmf cpY tLF cwO @@ -248586,8 +248583,8 @@ vwO qnU nKa dqO -gAl -elo +icA +joa dqO nKa tWZ @@ -248614,7 +248611,7 @@ rdG vQP rdG jzY -bip +xlh jQt uep uep @@ -248685,10 +248682,10 @@ ryf fyr lNC mlp -uQm +lEg cvh uBi -eYH +tOg jIZ oFx iHp @@ -248831,11 +248828,11 @@ ifg qZB gtw xHi -cHH -tuo -olj -jjM -cwZ +vMq +eUw +jZt +jSm +cMs cpY lkr lso @@ -248888,7 +248885,7 @@ oqc oAD xKX vep -pBI +clr sCm gGo bTQ @@ -249088,10 +249085,10 @@ son qZB gtw kpf -sQy -kPp -aWq -rpf +xbn +qDZ +eke +enG bpG oKb uXm @@ -249120,7 +249117,7 @@ tAx wbN grT lEo -woF +fEY qQp bVp jnS @@ -249346,9 +249343,9 @@ qZB oEh kpf gtw -lMI -fYv -rpf +qfe +ecZ +enG qIv oKb reM @@ -249377,7 +249374,7 @@ xyc dVw bkV ree -xpt +gkf qQp tQc jbx @@ -249602,10 +249599,10 @@ son skp eDx fkk -wEe -sCM -sCM -wst +aEU +fMP +fMP +oyV nqL oKb uXm @@ -249632,16 +249629,16 @@ kNa ica lDM klc -hdT -nry -cSy +qHa +iuK +bmZ mJj laD -npE +lWS +laD +laD +laD xLK -iML -iML -iML nHX hRA ist @@ -249857,9 +249854,9 @@ fbm bQP llG bzn -jOA -eut -tyH +fyh +mzs +wKm pAp haN kqA @@ -249889,16 +249886,16 @@ vzN oXq xWT klc -uIt +oTE pJX -rqq +ijf lPr vcY mmR -lyw -dMp +bsR dMp dMp +khv lqG grD xZW @@ -250146,16 +250143,16 @@ bNH rIc tVB klc -sHd -jih -rkM +akG +gsT +eUH iYs xFo rvA -rkM -eHU -pko -gsT +wFo +qCH +qKN +nqt fFJ hRA npo @@ -252716,7 +252713,7 @@ mGu wHc aEA dng -jYY +dAB ily ily ily @@ -253493,7 +253490,7 @@ tHK dfe dfe dfe -dtn +ehO lDX cpg cpg @@ -254000,7 +253997,7 @@ qyn nZf wHc wDW -uUi +vJY gJT jbU jbU @@ -254742,7 +254739,7 @@ hUD hUD hUD hUD -vqz +srk dal ssq sEi @@ -255267,7 +255264,7 @@ dFO cYE lso hDb -wgZ +azU nIl nVC abM @@ -255788,7 +255785,7 @@ ult ult mtI lsa -qSp +iCz mtI mtI cKk @@ -256276,8 +256273,8 @@ pzV uZn kKL xXU -cWE -pMU +spW +kVE xse iQQ gEE @@ -257592,7 +257589,7 @@ ljF ljF sDg gXJ -oZW +vDg oHK iZl iZl @@ -258072,7 +258069,7 @@ lUC lUC lUC daX -dMg +pxi wrX tLQ fBM @@ -258612,7 +258609,7 @@ elw elw elw pqo -ryd +ftJ mEJ jTG mEJ @@ -259903,14 +259900,14 @@ elw wnR iNn jKl -hWu +caC sTv mEJ nSC gVe whP mOc -uwL +gYt krY oOb ezJ diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 2448e719277..ba796554019 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -23305,7 +23305,7 @@ /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /mob/living/basic/bot/cleanbot/medbay{ - maints_access_required = list(22); + req_one_access = list(22); name = "Deacon Scrubsy" }, /turf/open/floor/iron/smooth_large, @@ -29881,6 +29881,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/secure_safe/caps_spare, /turf/open/floor/iron, /area/station/command/bridge) "jKz" = ( @@ -33391,7 +33392,7 @@ /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/spawner/random/structure/crate, /mob/living/basic/chicken{ - habitable_atmos = list("min_oxy"=0,"max_oxy"=0,"min_tox"=0,"max_tox"=1,"min_co2"=0,"max_co2"=0,"min_n2"=0,"max_n2"=0); + habitable_atmos = null; desc = "A timeless classic."; name = "Kentucky" }, @@ -39042,9 +39043,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/computer/department_orders/security{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/security/office) @@ -39901,9 +39899,6 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "nan" = ( -/obj/machinery/computer/department_orders/engineering{ - dir = 1 - }, /turf/open/floor/iron/dark, /area/station/engineering/main) "naw" = ( @@ -41663,11 +41658,6 @@ /area/station/cargo/storage) "nFN" = ( /obj/machinery/igniter/incinerator_ordmix, -/mob/living/basic/chicken{ - habitable_atmos = list("min_oxy"=0,"max_oxy"=0,"min_tox"=0,"max_tox"=1,"min_co2"=0,"max_co2"=0,"min_n2"=0,"max_n2"=0); - desc = "A timeless classic."; - name = "Kentucky" - }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) "nFT" = ( @@ -45459,7 +45449,6 @@ /obj/structure/table, /obj/item/healthanalyzer, /obj/item/hand_labeler, -/obj/structure/secure_safe/caps_spare/directional/north, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, @@ -53872,6 +53861,7 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, +/obj/item/piggy_bank/vault, /turf/open/floor/circuit/green{ luminosity = 2 }, @@ -61689,9 +61679,6 @@ /area/station/medical/chemistry) "ugG" = ( /obj/structure/cable, -/obj/machinery/computer/department_orders/service{ - dir = 4 - }, /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63363,9 +63350,6 @@ /obj/effect/turf_decal/trimline/brown/filled/end{ dir = 4 }, -/obj/machinery/computer/department_orders/science{ - dir = 1 - }, /turf/open/floor/iron/dark, /area/station/science/research) "uJN" = ( @@ -64681,7 +64665,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "vhx" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "vhK" = ( @@ -69681,9 +69665,6 @@ }, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/machinery/computer/department_orders/medical{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 diff --git a/_maps/map_files/LimaStation/LimaStation.dmm b/_maps/map_files/LimaStation/LimaStation.dmm index a812b83bdc1..51426f631ea 100644 --- a/_maps/map_files/LimaStation/LimaStation.dmm +++ b/_maps/map_files/LimaStation/LimaStation.dmm @@ -59175,7 +59175,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "wtB" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "wtI" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9c47146117f..2d414269001 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -326,6 +326,22 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"agQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/south{ + name = "Cargo Desk"; + req_access = list("shipping") + }, +/obj/item/paper_bin{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/paper/crumpled{ + pixel_x = 7 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/sorting) "agR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -530,24 +546,19 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"akT" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 4; - pixel_y = 2 +"akF" = ( +/obj/machinery/flasher/directional/north{ + id = "AI" }, -/obj/item/pen, -/obj/item/storage/box/prisoner, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 +/obj/structure/table/wood/fancy/blue, +/obj/effect/spawner/random/aimodule/neutral, +/obj/machinery/door/window/right/directional/east{ + name = "Core Modules"; + req_access = list("captain") }, -/obj/machinery/camera/directional/south{ - c_tag = "Prison Hallway Port"; - network = list("ss13","prison") - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/security/execution/transfer) +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) "akZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -570,6 +581,18 @@ }, /turf/open/floor/iron/dark, /area/station/security/mechbay) +"alI" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Bridge Deliveries"; + req_access = list("command") + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "Bridge Blast Door" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/command/bridge) "alW" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -619,23 +642,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"amK" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Service Deliveries"; - req_access = list("service") - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "amP" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -840,13 +846,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) -"aqx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "aqG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -964,13 +963,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"atJ" = ( -/obj/structure/table, -/obj/item/pai_card, -/obj/item/pai_card, -/obj/item/pai_card, -/turf/open/floor/iron, -/area/station/commons/locker) "atN" = ( /obj/structure/cable, /obj/machinery/computer/records/security{ @@ -981,6 +973,13 @@ }, /turf/open/floor/iron, /area/station/security/office) +"atS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "aub" = ( /obj/effect/spawner/random/structure/grille, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1105,6 +1104,19 @@ "avK" = ( /turf/closed/wall, /area/station/maintenance/fore/lesser) +"avU" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/button/door/directional/east{ + id = "Cabin2"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "awy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1200,17 +1212,6 @@ "ayr" = ( /turf/open/floor/iron, /area/station/engineering/break_room) -"ayG" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Danger: Conveyor Access"; - req_access = list("maint_tunnels") - }, -/obj/machinery/conveyor/inverted{ - dir = 6; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "ayH" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -1369,13 +1370,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"aBJ" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/siding, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron, -/area/station/science/lab) "aBL" = ( /obj/effect/spawner/structure/window, /obj/structure/cable, @@ -2241,6 +2235,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"aPx" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"aPH" = ( +/obj/structure/bed/dogbed/runtime, +/obj/item/toy/cattoy, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/mob/living/basic/pet/cat/runtime, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "aPX" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 1 @@ -2418,6 +2426,10 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"aTs" = ( +/mob/living/basic/slime, +/turf/open/floor/engine, +/area/station/science/xenobiology) "aTD" = ( /obj/machinery/vending/coffee, /obj/item/radio/intercom/directional/south, @@ -2703,6 +2715,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"aYk" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_y = 3 + }, +/obj/item/folder/yellow{ + pixel_y = 1; + pixel_x = 2 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) "aYl" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -2728,19 +2757,6 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) -"aYn" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/button/door/directional/west{ - id = "Cabin5"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "aYw" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three"; @@ -3059,6 +3075,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"bdv" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin/tagger, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 + }, +/obj/effect/turf_decal/siding, +/turf/open/floor/iron, +/area/station/science/lab) "bdy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -3194,19 +3220,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"bgn" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/requests_console/directional/east{ - department = "Research Lab"; - name = "Research Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron, -/area/station/science/lab) "bgs" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -3234,13 +3247,13 @@ network = list("ss13","medbay") }, /obj/item/radio/intercom/directional/west, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 4 }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "bgV" = ( @@ -3459,13 +3472,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/warden) -"bkE" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue, -/mob/living/basic/bot/cleanbot, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "bkF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3959,14 +3965,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/theater) -"bsD" = ( -/obj/machinery/door/window/left/directional/west{ - name = "MiniSat Airlock Access" - }, -/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) "bsE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3993,6 +3991,26 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) +"btn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/drinkingglasses, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/spawner/random/food_or_drink/cups, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "btt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -4044,12 +4062,6 @@ /obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"btQ" = ( -/obj/item/storage/fancy/candle_box, -/obj/machinery/light/small/directional/east, -/obj/structure/rack/skeletal, -/turf/open/floor/engine/cult, -/area/station/service/library) "bug" = ( /obj/structure/lattice, /obj/item/tank/internals/oxygen/empty, @@ -4090,16 +4102,6 @@ /obj/structure/closet/bombcloset, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"buw" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/orange, -/obj/item/restraints/handcuffs, -/obj/item/reagent_containers/spray/pepper, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "buE" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/window/spawner/directional/west, @@ -4218,18 +4220,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"bwG" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/door/window/left/directional/south{ - name = "MiniSat Walkway Access" - }, -/obj/machinery/camera/directional/east{ - c_tag = "MiniSat Exterior - Aft Port"; - network = list("minisat") - }, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "bwH" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating/airless, @@ -4263,12 +4253,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) -"bxo" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Animal Pen A" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "bxq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -4290,15 +4274,13 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"bxS" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Command Desk"; - req_access = list("command") +"bxO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "bxX" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -4610,14 +4592,6 @@ /obj/machinery/light/floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"bEv" = ( -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior{ - name = "Burn Chamber Exterior Airlock" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/burnchamber) "bEA" = ( /obj/structure/cable, /obj/machinery/camera/directional/south{ @@ -4634,23 +4608,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"bEB" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Mass Driver"; - req_access = list("maint_tunnels") - }, -/obj/machinery/door/window/left/directional/south{ - name = "Mass Driver"; - req_access = list("maint_tunnels") - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/machinery/computer/pod/old/mass_driver_controller/shack{ - pixel_x = -24 - }, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) "bEC" = ( /obj/machinery/computer/scan_consolenew{ dir = 4 @@ -4813,6 +4770,45 @@ }, /turf/open/floor/wood/large, /area/station/commons/lounge) +"bIq" = ( +/obj/structure/table/wood, +/obj/machinery/button/ticket_machine{ + pixel_x = 38 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = 6; + pixel_y = -34 + }, +/obj/machinery/button/door/directional/south{ + id = "hop"; + name = "Privacy Shutters Control"; + pixel_x = -6; + req_access = list("hop") + }, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stamp/head/hop{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/button/door/directional/south{ + id = "hopqueue"; + name = "Queue Shutters Control"; + pixel_x = -6; + pixel_y = -34; + req_access = list("hop") + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/machinery/button/photobooth{ + pixel_x = 26 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "bIv" = ( /obj/machinery/smartfridge/organ, /obj/machinery/door/firedoor, @@ -5013,7 +5009,7 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"bMp" = ( +"bMu" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/food/fortunecookie, /obj/structure/safe/floor, @@ -5289,26 +5285,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"bRL" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Jetpack Storage"; - pixel_x = -1; - req_access = list("eva") - }, -/obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = 4; - pixel_y = -1 - }, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) "bRT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5450,17 +5426,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/kitchen) -"bUm" = ( -/obj/structure/closet/crate, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/spawner/random/entertainment/dice, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "bUo" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/plasteel{ @@ -5639,6 +5604,18 @@ }, /turf/open/floor/wood, /area/station/security/office) +"bWS" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/door/window/right/directional/south{ + name = "MiniSat Walkway Access" + }, +/obj/machinery/camera/directional/west{ + c_tag = "MiniSat Exterior - Aft Starboard"; + network = list("minisat") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "bWV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5649,6 +5626,22 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"bXc" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/requests_console/directional/east{ + department = "Research Lab"; + name = "Research Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/trimline/purple/filled/warning/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/lab) "bXk" = ( /obj/machinery/telecomms/server/presets/command, /turf/open/floor/circuit/telecomms/mainframe, @@ -5859,14 +5852,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"cdm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/effect/turf_decal/bot, -/obj/item/electronics/apc, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "cdv" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet1"; @@ -6002,6 +5987,12 @@ dir = 1 }, /area/station/security/prison) +"cgk" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "cgl" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -6028,10 +6019,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"cgP" = ( -/obj/machinery/air_sensor/ordnance_burn_chamber, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/burnchamber) "cha" = ( /obj/machinery/door/airlock/research/glass{ name = "Ordnance Lab" @@ -6132,6 +6119,10 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"cjD" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/science/explab) "cjJ" = ( /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) @@ -6262,15 +6253,6 @@ /obj/item/toy/basketball, /turf/open/floor/iron, /area/station/security/prison) -"cnu" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/science/explab) "cnA" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6858,6 +6840,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"cwX" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Command Desk"; + req_access = list("command") + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "cxi" = ( /obj/item/solar_assembly, /obj/item/solar_assembly, @@ -6894,7 +6885,6 @@ /turf/open/space, /area/space/nearstation) "cxq" = ( -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 1 }, @@ -6906,6 +6896,7 @@ name = "Labor Camp Shuttle Lockdown"; req_access = list("brig") }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/security/brig) "cxt" = ( @@ -7006,16 +6997,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"cze" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Gas Ports" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "justice gas pump" - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "czs" = ( /obj/structure/easel, /obj/effect/mapping_helpers/broken_floor, @@ -7070,25 +7051,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"cAW" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south{ - name = "Reception Window" - }, -/obj/item/paper, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/item/storage/fancy/donut_box, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briglockdown"; - name = "Warden Desk Shutters" - }, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Brig Control Desk"; - req_access = list("armory") - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "cBc" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -7136,18 +7098,10 @@ }, /turf/open/floor/plating, /area/station/science/robotics/mechbay) -"cCx" = ( -/obj/machinery/modular_computer/preset/cargochat/science{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, +"cBZ" = ( +/obj/structure/railing, /turf/open/floor/iron, -/area/station/science/explab) +/area/station/cargo/miningoffice) "cCM" = ( /obj/structure/lattice/catwalk, /obj/item/reagent_containers/cup/glass/bottle/rum{ @@ -7200,32 +7154,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"cDf" = ( -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "visitation"; - name = "Visitation Shutters" - }, -/obj/machinery/door/window/right/directional/east, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/security/prison/visit) -"cDl" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy2"; - name = "Robotics Shutters" - }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/window/left/directional/north{ - name = "Robotics Desk"; - req_access = list("robotics") - }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) "cDD" = ( /obj/structure/lattice/catwalk, /obj/item/instrument/guitar, @@ -7695,6 +7623,11 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/sorting) +"cON" = ( +/obj/structure/table, +/obj/item/pai_card, +/turf/open/floor/iron, +/area/station/commons/locker) "cOQ" = ( /turf/open/floor/iron/white, /area/station/science/research) @@ -7707,12 +7640,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) -"cOT" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/burnchamber) "cOX" = ( /obj/structure/sign/warning/radiation/rad_area/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -7805,6 +7732,14 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"cQV" = ( +/obj/machinery/door/window/right/directional/south{ + name = "MiniSat Walkway Access" + }, +/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) "cRo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8354,26 +8289,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"dbd" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/machinery/button/door/directional/east{ - id = "rdrnd"; - name = "Primary Research Shutters Control"; - pixel_y = 6; - req_access = list("science") - }, -/obj/machinery/button/door/directional/east{ - id = "rndlab2"; - name = "Secondary Research Shutters Control"; - pixel_y = -6; - req_access = list("science") - }, -/turf/open/floor/iron, -/area/station/science/lab) "dbh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8612,10 +8527,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/theater) -"deY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/burnchamber) "dfh" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -8933,6 +8844,10 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) +"dke" = ( +/obj/machinery/air_sensor/ordnance_burn_chamber, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance) "dkx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -9078,6 +8993,30 @@ /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) +"dpg" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "roboticsprivacy2"; + name = "Robotics Shutters" + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/window/left/directional/north{ + name = "Robotics Desk"; + req_access = list("robotics") + }, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "dpl" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /obj/structure/table, @@ -9352,15 +9291,6 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) -"dub" = ( -/obj/machinery/modular_computer/preset/cargochat/medical{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "duk" = ( /obj/machinery/light/small/dim/directional/west, /turf/open/floor/iron, @@ -9396,6 +9326,10 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"duF" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/security/brig) "duI" = ( /turf/closed/wall, /area/station/command/bridge) @@ -9511,6 +9445,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"dxo" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "dxq" = ( /obj/structure/chair{ dir = 8 @@ -9609,7 +9553,6 @@ /turf/open/floor/iron, /area/station/science/research) "dBv" = ( -/obj/machinery/disposal/bin, /obj/machinery/airalarm/directional/east, /obj/structure/disposalpipe/trunk{ dir = 1 @@ -9618,6 +9561,7 @@ dir = 8 }, /obj/machinery/light/small/directional/east, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/cargo/storage) "dBV" = ( @@ -9761,14 +9705,6 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"dEF" = ( -/obj/machinery/atmospherics/components/binary/pump/on, -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/ordnance/burnchamber) "dEH" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -9878,11 +9814,6 @@ /obj/machinery/light/small/dim/directional/north, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"dGT" = ( -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/item/clothing/gloves/color/fyellow, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "dGW" = ( /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, @@ -9999,14 +9930,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"dJn" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/structure/closet/emcloset, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "dJo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10048,6 +9971,10 @@ /obj/structure/sign/warning/pods, /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) +"dKm" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/storage) "dKC" = ( /turf/closed/wall, /area/station/maintenance/aft/lesser) @@ -10394,6 +10321,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/central) +"dQy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/light/cold/directional/east, +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "dQA" = ( /obj/machinery/computer/rdservercontrol{ dir = 4 @@ -10716,15 +10652,6 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"dVU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/door/window/right/directional/east{ - name = "Infirmary" - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "dVX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10794,24 +10721,6 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"dWJ" = ( -/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/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) "dWN" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ dir = 4 @@ -10901,9 +10810,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"dXU" = ( -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/burnchamber) "dYa" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, @@ -10975,6 +10881,30 @@ }, /turf/open/floor/iron/dark, /area/station/science/lab) +"dZb" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/folder{ + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = -5 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "roboticsprivacy"; + name = "Robotics Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 6 + }, +/obj/machinery/door/window/left/directional/east{ + name = "Robotics Desk"; + req_access = list("robotics") + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "dZm" = ( /turf/closed/wall, /area/station/commons/storage/tools) @@ -11011,15 +10941,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood, /area/station/service/library) -"eaq" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/mob/living/basic/bot/medbot/autopatrol, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/medical/medbay/lobby) "eau" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -11520,10 +11441,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"eih" = ( -/mob/living/basic/bot/cleanbot/medbay, -/turf/open/floor/iron/white, -/area/station/medical/storage) "eiO" = ( /obj/structure/table, /obj/item/storage/backpack/duffelbag/sec{ @@ -11686,6 +11603,17 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"ekP" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ + id = "Cell 2"; + name = "Cell 2" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron, +/area/station/security/brig) "ekQ" = ( /obj/effect/turf_decal/siding{ dir = 4 @@ -12109,24 +12037,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/library) -"erT" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/window/spawner/directional/south, -/obj/structure/window/spawner/directional/north, -/obj/structure/window/spawner/directional/west, -/obj/machinery/door/window/right/directional/east{ - layer = 3 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "esd" = ( /obj/item/reagent_containers/cup/glass/drinkingglass{ pixel_x = 4; @@ -12218,22 +12128,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port) -"eto" = ( -/obj/machinery/flasher/directional/north{ - id = "AI" - }, -/obj/effect/spawner/random/aimodule/harmful, -/obj/structure/table/wood/fancy/red, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "High-Risk Modules"; - req_access = list("captain") - }, -/obj/item/ai_module/reset/purge{ - pixel_y = 11 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "ets" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos) @@ -12631,26 +12525,6 @@ /obj/item/clothing/suit/apron/surgical, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"eBQ" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Magboot Storage"; - pixel_x = -1; - req_access = list("eva") - }, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/shoes/magboots{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) "eBU" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/stripes/line{ @@ -12687,14 +12561,6 @@ /obj/effect/mapping_helpers/airlock/access/any/command/captain, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) -"eCI" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Mass Driver Control Door"; - req_access = list("ordnance") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "eCK" = ( /obj/machinery/computer/arcade/orion_trail{ desc = "For gamers only. Casuals need not apply."; @@ -12856,6 +12722,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"eGd" = ( +/obj/machinery/door/window/left/directional/north{ + name = "MiniSat Walkway Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "eGm" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ @@ -13069,6 +12945,14 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"eLr" = ( +/obj/machinery/door/window/left/directional/south{ + name = "MiniSat Walkway Access" + }, +/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) "eLv" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -13394,10 +13278,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/cryo) -"eRn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/burnchamber) "eRR" = ( /obj/structure/table, /obj/item/screwdriver{ @@ -13533,6 +13413,25 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"eVa" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south{ + name = "Reception Window" + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/item/storage/fancy/donut_box, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "briglockdown"; + name = "Warden Desk Shutters" + }, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Brig Control Desk"; + req_access = list("armory") + }, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "eVh" = ( /obj/machinery/conveyor{ dir = 1; @@ -13573,33 +13472,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"eWg" = ( -/obj/machinery/door/window/right/directional/north{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/toxin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/toxin, -/obj/item/storage/medkit/toxin{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/structure/window/spawner/directional/west, -/obj/machinery/requests_console/directional/south{ - department = "Medbay"; - name = "Medbay Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "eWn" = ( /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, @@ -13760,16 +13632,6 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) -"eYy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "eYz" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/newscaster/directional/north, @@ -13822,15 +13684,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/wood, /area/station/service/library) -"eZm" = ( -/obj/machinery/door/window/right/directional/east{ - name = "Research Delivery"; - req_access = list("science") - }, -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lab) "eZz" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14071,16 +13924,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"fed" = ( -/obj/structure/railing{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "fee" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/trunk{ @@ -14092,12 +13935,14 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) -"feC" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +"fev" = ( +/obj/effect/turf_decal/bot_red, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "feF" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/structure/cable, @@ -14748,6 +14593,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/command/teleporter) +"fnJ" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/item/clothing/gloves/color/fyellow, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fnN" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -14793,11 +14643,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) -"fow" = ( -/obj/effect/spawner/random/maintenance, -/obj/machinery/recharge_station, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "foB" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/stripes/line{ @@ -14817,6 +14662,14 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/storage) +"fpd" = ( +/obj/machinery/door/window/right/directional/west{ + name = "MiniSat Airlock Access" + }, +/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) "fpg" = ( /obj/structure/table/glass, /obj/item/retractor, @@ -14867,6 +14720,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/disposal) +"fpM" = ( +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance) "fqB" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, @@ -14878,14 +14734,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, /area/station/commons/lounge) -"fqI" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Mass Driver"; - req_access = list("chapel_office") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "fqR" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -15290,6 +15138,26 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) +"fBo" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Magboot Storage"; + pixel_x = -1; + req_access = list("eva") + }, +/obj/structure/rack, +/obj/item/clothing/shoes/magboots{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "fBz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15504,15 +15372,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"fGj" = ( -/obj/machinery/door/window/right/directional/east{ - name = "Engineering Deliveries"; - req_access = list("engineering") - }, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron, -/area/station/engineering/main) "fGp" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -15886,6 +15745,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fMr" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fMy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -15932,15 +15796,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"fNE" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/radio/intercom/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/science/explab) "fNI" = ( /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/wood, @@ -16304,33 +16159,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/station/security/prison/safe) -"fWr" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/south{ - name = "Atmospherics Desk"; - req_access = list("atmospherics") - }, -/obj/item/folder/yellow{ - pixel_x = 5 - }, -/obj/item/pen{ - pixel_x = 5 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/obj/structure/desk_bell{ - pixel_x = -8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "fWw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16581,21 +16409,6 @@ }, /turf/closed/wall, /area/station/security/courtroom) -"gaY" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/button/door/directional/west{ - id = "Cabin7"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "gbf" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -16655,13 +16468,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"gcR" = ( -/obj/machinery/conveyor{ - id = "mining" - }, -/obj/machinery/brm, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "gcU" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, @@ -16754,6 +16560,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"gey" = ( +/obj/machinery/door/window/left/directional/south{ + name = "MiniSat Walkway Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "geD" = ( /obj/structure/sign/warning/vacuum/external/directional/north, /obj/machinery/light/small/directional/north, @@ -16911,18 +16727,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"gil" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/obj/machinery/airlock_sensor/incinerator_ordmix{ - pixel_x = -24 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/ordnance/burnchamber) "gip" = ( /obj/structure/table/wood, /obj/machinery/fax{ @@ -17979,16 +17783,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"gAS" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Infirmary" - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/medical) "gAT" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -18053,6 +17847,22 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"gCE" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Prison Hallway Port"; + network = list("ss13","prison") + }, +/obj/machinery/light/directional/south, +/obj/item/storage/box/prisoner{ + pixel_y = 8 + }, +/obj/item/storage/box/prisoner, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "gCT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -18077,6 +17887,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"gDq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/item/circuitboard/machine/thermomachine, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) "gDv" = ( /obj/item/kirbyplants, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -18566,6 +18384,13 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/station/science/ordnance/testlab) +"gLJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/vending/medical, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "gLK" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19153,6 +18978,15 @@ /obj/machinery/light/no_nightlight/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos) +"gYe" = ( +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/explab) "gYi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19241,16 +19075,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space, /area/space/nearstation) -"gZQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/explab) "gZV" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ @@ -19292,6 +19116,16 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"haA" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/machinery/newscaster/directional/west, +/obj/item/pen/invisible, +/turf/open/floor/engine/cult, +/area/station/service/library) "haE" = ( /obj/structure/mirror/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19895,9 +19729,36 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"hlB" = ( +/obj/machinery/flasher/directional/north{ + id = "AI" + }, +/obj/effect/spawner/random/aimodule/harmful, +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "High-Risk Modules"; + req_access = list("captain") + }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "hlD" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"hlE" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "hlF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19930,6 +19791,15 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) +"hmu" = ( +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/end{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/brig) "hmy" = ( /obj/machinery/door/window/left/directional/south{ name = "Permabrig Kitchen" @@ -19984,14 +19854,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"hoe" = ( -/obj/machinery/door/window/left/directional/south{ - name = "MiniSat Walkway Access" - }, -/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) "hoE" = ( /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)."; @@ -20003,6 +19865,32 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"hoN" = ( +/obj/structure/table/reinforced, +/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 = "Pharmacy Desk"; + req_access = list("medical") + }, +/obj/item/reagent_containers/cup/bottle/morphine, +/obj/item/reagent_containers/cup/bottle/toxin{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = 8 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -5 + }, +/obj/item/reagent_containers/syringe/epinephrine, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "hoY" = ( /obj/structure/chair/office{ dir = 4 @@ -20036,9 +19924,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/medical/abandoned) -"hqj" = ( -/turf/closed/wall/r_wall, -/area/station/science/ordnance/burnchamber) "hqr" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ dir = 10 @@ -20071,25 +19956,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"hqQ" = ( -/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) "hqT" = ( /obj/structure/chair{ dir = 4 @@ -20152,6 +20018,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel) +"hsY" = ( +/obj/machinery/igniter/incinerator_ordmix, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance) "hsZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, @@ -20227,6 +20097,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"htN" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/ordnance) "htO" = ( /obj/structure/chair/office{ dir = 1 @@ -20372,6 +20248,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"hwe" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/west{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "hwg" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/structure/lattice, @@ -20392,13 +20278,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"hwy" = ( -/obj/structure/sign/painting/large/library_private{ - dir = 8; - pixel_x = -29 - }, -/turf/open/floor/engine/cult, -/area/station/service/library) "hwz" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -20520,6 +20399,16 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"hxW" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Gas Ports" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "justice gas pump" + }, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "hxY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -20587,10 +20476,31 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /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{ + name = "Tertiary AI Core Access"; + req_access = list("ai_upload"); + pixel_x = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "hza" = ( /obj/vehicle/sealed/mecha/ripley/paddy/preset, /turf/open/floor/iron/recharge_floor, /area/station/security/mechbay) +"hzb" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/north, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "hzt" = ( /obj/structure/transit_tube/curved/flipped, /obj/effect/turf_decal/tile/blue{ @@ -20617,23 +20527,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/cytology) -"hzV" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "Disposals" - }, -/obj/structure/plasticflaps, -/obj/machinery/door/window/right/directional/south{ - name = "Delivery Door"; - req_access = list("cargo") - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/conveyor{ - dir = 1; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "hAk" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -20663,6 +20556,16 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"hAL" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/right/directional/east, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/security/prison/visit) "hAN" = ( /obj/structure/cable, /obj/effect/spawner/random/trash/garbage{ @@ -20745,20 +20648,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"hBV" = ( -/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"; - req_access = list("ai_upload"); - pixel_x = -4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "hBY" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -20928,18 +20817,6 @@ /obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"hFv" = ( -/obj/machinery/computer/upload/borg, -/obj/machinery/door/window/left/directional/south{ - layer = 3.1; - name = "Cyborg Upload Console Window"; - req_access = list("ai_upload") - }, -/obj/structure/window/reinforced/spawner/directional/west, -/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) "hFz" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -20953,6 +20830,13 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"hFM" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/turf_decal/stripes/line, +/obj/effect/spawner/random/maintenance/two, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "hGi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -21621,23 +21505,6 @@ dir = 4 }, /area/station/medical/morgue) -"hSW" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/right/directional/north{ - name = "Head of Personnel's Desk"; - req_access = list("hop") - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/south{ - name = "Reception Window" - }, -/obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "hTb" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/landmark/navigate_destination, @@ -22140,6 +22007,28 @@ dir = 1 }, /area/station/service/chapel) +"icb" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Justice Chamber"; + req_access = list("armory") + }, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Justice Chamber"; + req_access = list("armory") + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "executionfireblast" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "ich" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, @@ -22161,14 +22050,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore) -"icF" = ( -/obj/machinery/door/window/right/directional/south{ - name = "MiniSat Walkway Access" - }, -/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) "icR" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -22473,13 +22354,6 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"iip" = ( -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/maintenance/two, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "iix" = ( /obj/item/flashlight/lamp, /obj/machinery/newscaster/directional/west, @@ -22752,14 +22626,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/cargo/warehouse) -"ims" = ( -/obj/machinery/vending/wardrobe/medi_wardrobe, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "imt" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 9 @@ -22809,6 +22675,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/brig) +"inH" = ( +/obj/structure/table/wood, +/obj/item/pai_card, +/turf/open/floor/wood, +/area/station/service/library) "inL" = ( /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -22829,13 +22700,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"inW" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/conveyor{ - id = "mining" - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "inX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -22853,6 +22717,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"iom" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Infirmary" + }, +/turf/open/floor/iron/white, +/area/station/security/medical) "iov" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -23102,9 +22975,41 @@ }, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) +"isO" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/machinery/door/window/left/directional/north{ + name = "Danger: Conveyor Access"; + req_access = list("maint_tunnels") + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "isV" = ( /turf/open/floor/engine/n2, /area/station/engineering/atmos) +"isX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/east{ + name = "Engineering Desk"; + req_access = list("engineering") + }, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/item/pen{ + pixel_x = 5 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/structure/desk_bell{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/break_room) "itg" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/bar, @@ -23499,15 +23404,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"izs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/right/directional/west{ - name = "Jim Norton's Quebecois Coffee"; - req_one_access = list("service","maint_tunnels") - }, -/obj/effect/turf_decal/trimline/green/line, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) "izv" = ( /obj/item/flashlight/lantern{ pixel_y = 7 @@ -23889,16 +23785,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/smooth_large, /area/station/cargo/bitrunning/den) -"iGT" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/camera/directional/north{ - c_tag = "Science Research Office"; - network = list("ss13","rd") - }, -/turf/open/floor/iron, -/area/station/science/lab) "iHc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -23944,6 +23830,13 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) +"iId" = ( +/obj/machinery/conveyor{ + id = "mining" + }, +/obj/machinery/brm, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "iIf" = ( /obj/machinery/camera/directional/north{ c_tag = "Locker Room Entrance" @@ -24011,34 +23904,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) -"iJx" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = -8 - }, -/obj/item/clothing/under/rank/prisoner{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "iJC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24093,6 +23958,33 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"iKV" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/south{ + name = "Atmospherics Desk"; + req_access = list("atmospherics") + }, +/obj/item/folder/yellow{ + pixel_x = 5 + }, +/obj/item/pen{ + pixel_x = 5 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/obj/structure/desk_bell{ + pixel_x = -8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) "iLe" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ @@ -24434,13 +24326,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"iPw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "iPx" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron, @@ -24518,17 +24403,6 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"iQq" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Medical Deliveries"; - req_access = list("medical") - }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/obj/structure/window/spawner/directional/east, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "iQr" = ( /obj/structure/chair{ dir = 1 @@ -24917,6 +24791,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"iWB" = ( +/obj/item/storage/fancy/candle_box, +/obj/machinery/light/small/directional/east, +/obj/structure/rack/skeletal, +/turf/open/floor/engine/cult, +/area/station/service/library) "iWD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -25127,35 +25007,17 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/medical/storage) -"iZt" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ +"iZC" = ( +/obj/structure/closet/crate, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" - }, -/obj/machinery/light/small/directional/south, +/obj/effect/spawner/random/entertainment/dice, +/obj/item/storage/toolbox/emergency, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"iZB" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east{ - name = "Hydroponics Desk"; - req_access = list("hydroponics") - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics) "iZF" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -25369,6 +25231,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"jei" = ( +/obj/machinery/light/cold/directional/south, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/bot_white, +/obj/machinery/vending/wardrobe/medi_wardrobe, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "jej" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -25451,30 +25320,6 @@ "jfG" = ( /turf/closed/wall, /area/station/maintenance/disposal) -"jfI" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "rndlab2"; - name = "Secondary Research and Development Shutter" - }, -/obj/machinery/door/window/left/directional/east{ - name = "Research Lab Desk"; - req_access = list("science") - }, -/obj/item/folder{ - pixel_x = -6 - }, -/obj/item/pen{ - pixel_x = -7 - }, -/obj/structure/desk_bell{ - pixel_x = 6 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/lab) "jfN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26027,13 +25872,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"jpn" = ( -/obj/structure/table/wood, -/obj/item/pai_card, -/obj/item/pai_card, -/obj/item/pai_card, -/turf/open/floor/wood, -/area/station/service/library) "jpr" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/command_all, @@ -26136,6 +25974,25 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"jrx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"jrJ" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/ordnance) "jrL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26338,15 +26195,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"juO" = ( -/obj/structure/bed/dogbed/runtime, -/obj/item/toy/cattoy, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/mob/living/basic/pet/cat/runtime, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "juV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26448,18 +26296,6 @@ /obj/machinery/shower/directional/north, /turf/open/floor/iron, /area/station/science/xenobiology) -"jwg" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 8 - }, -/obj/machinery/computer/department_orders/security{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) "jwj" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/siding/purple{ @@ -26718,6 +26554,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"jzC" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Animal Pen A" + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "jzD" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, @@ -26804,6 +26646,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"jBp" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/conveyor_switch/oneway{ + id = "mining"; + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "jBC" = ( /obj/structure/table, /obj/item/clothing/head/soft/grey{ @@ -26940,6 +26790,20 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"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"; + req_access = list("ai_upload"); + pixel_x = -4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "jEI" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -27245,6 +27109,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/execution/transfer) +"jJu" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Dock Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) "jJC" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice/catwalk, @@ -27353,30 +27226,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"jLm" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder{ - pixel_x = -6 - }, -/obj/item/pen{ - pixel_x = -5 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "roboticsprivacy"; - name = "Robotics Shutters" - }, -/obj/structure/desk_bell{ - pixel_x = 6 - }, -/obj/machinery/door/window/left/directional/east{ - name = "Robotics Desk"; - req_access = list("robotics") - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "jLo" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -27405,6 +27254,26 @@ /obj/structure/railing/corner, /turf/open/floor/plating/airless, /area/space/nearstation) +"jLQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/right/directional/north{ + name = "Head of Personnel's Desk"; + req_access = list("hop") + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/south{ + name = "Reception Window" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "Privacy Shutters" + }, +/obj/structure/cable, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "jMo" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -27461,20 +27330,6 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/storage/gas) -"jMX" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/button/door/directional/west{ - id = "Cabin4"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "jMY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -27525,20 +27380,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"jNI" = ( -/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{ - name = "Tertiary AI Core Access"; - req_access = list("ai_upload"); - pixel_x = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "jNN" = ( /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, @@ -27754,12 +27595,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"jRC" = ( -/obj/structure/cable, -/obj/structure/railing/corner/end/flip, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "jRD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -27772,6 +27607,17 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) +"jRO" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/camera/directional/north{ + c_tag = "Science Research Office"; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/turf/open/floor/iron, +/area/station/science/lab) "jRZ" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -27975,6 +27821,13 @@ /obj/structure/chair/office/light, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"jUH" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Fitness Ring" + }, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "jUP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28052,6 +27905,20 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"jVZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/west{ + name = "Outer Window" + }, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Security Desk"; + req_access = list("security") + }, +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jWg" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/disposalpipe/segment, @@ -28301,18 +28168,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) -"kbg" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/sign/painting/large/library{ - dir = 1 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/wood, -/area/station/service/library) "kbo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28354,6 +28209,18 @@ }, /turf/open/floor/iron, /area/station/service/janitor) +"kbR" = ( +/obj/structure/sign/poster/official/cleanliness/directional/east, +/obj/machinery/door/window/right/directional/north{ + name = "Hydroponics Delivery"; + req_access = list("hydroponics") + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron, +/area/station/service/hydroponics) "kbU" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -28590,10 +28457,6 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/virology) -"kgC" = ( -/obj/machinery/door/poddoor/incinerator_ordmix, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/burnchamber) "kgV" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -28630,6 +28493,14 @@ /mob/living/simple_animal/bot/secbot/beepsky/officer, /turf/open/floor/iron, /area/station/security/brig) +"kho" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Mass Driver"; + req_access = list("chapel_office") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "khu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -29373,11 +29244,6 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"kwq" = ( -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/structure/closet_empty/crate, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "kww" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/closed/wall/r_wall, @@ -29504,11 +29370,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"kyt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "kyQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29593,15 +29454,59 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"kAp" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Disposals Chute" + }, +/obj/machinery/disposal/delivery_chute{ + dir = 8; + name = "disposals chute"; + pixel_x = 5 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "kAF" = ( /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"kAI" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kAT" = ( /obj/effect/landmark/start/head_of_security, /obj/structure/chair/comfy/black, /turf/open/floor/iron/dark, /area/station/security/office) +"kBg" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/under/rank/prisoner/skirt{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/prisoner{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/prisoner/skirt{ + pixel_x = -13; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "kBh" = ( /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ @@ -29726,6 +29631,18 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/brig) +"kDp" = ( +/obj/machinery/light/directional/north, +/obj/structure/sign/warning/secure_area/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/break_room) "kDG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -29805,23 +29722,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"kFu" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper, -/obj/machinery/door/window/left/directional/south{ - name = "Hydroponics Window"; - req_access = list("hydroponics") - }, -/obj/effect/turf_decal/delivery, -/obj/item/pen, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "hydro_service"; - name = "Service Shutter" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "kFC" = ( /obj/machinery/door/poddoor/shutters/preopen{ dir = 8; @@ -29889,6 +29789,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"kGJ" = ( +/obj/machinery/door/window/right/directional/east{ + name = "Research Delivery"; + req_access = list("science") + }, +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lab) "kHg" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -30367,17 +30276,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"kQz" = ( -/obj/structure/table, -/obj/item/storage/box/prisoner{ - pixel_y = 8 - }, -/obj/item/storage/box/prisoner, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "kQP" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) @@ -30868,14 +30766,6 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"kYt" = ( -/obj/machinery/door/window/right/directional/west{ - name = "MiniSat Airlock Access" - }, -/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) "kYv" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" @@ -31163,29 +31053,11 @@ /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "lew" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"leN" = ( -/obj/structure/table/wood, -/obj/machinery/door/window/right/directional/south{ - name = "Captain's Desk"; - req_access = list("captain") - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) "leP" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 4 @@ -31209,16 +31081,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"lfd" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/obj/machinery/computer/department_orders/engineering, -/turf/open/floor/iron, -/area/station/engineering/break_room) "lfk" = ( /obj/effect/turf_decal/trimline/yellow/filled/end{ dir = 8 @@ -31476,13 +31338,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"llh" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "llk" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -31592,6 +31447,16 @@ "lnc" = ( /turf/closed/wall, /area/station/commons/dorms) +"lnu" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/toy/figure/scientist, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/lab) "lnv" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance{ @@ -31861,13 +31726,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"lsi" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Fitness Ring" - }, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "lsu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/freezer, @@ -31950,6 +31808,23 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"ltW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/paper, +/obj/machinery/door/window/left/directional/south{ + name = "Hydroponics Window"; + req_access = list("hydroponics") + }, +/obj/effect/turf_decal/delivery, +/obj/item/pen, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "hydro_service"; + name = "Service Shutter" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "ltX" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -31995,24 +31870,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"luB" = ( -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"luE" = ( -/obj/structure/rack, -/obj/item/integrated_circuit/loaded/hello_world, -/obj/item/storage/toolbox/electrical, -/obj/item/integrated_circuit/loaded/speech_relay, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/explab) "luF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -32027,6 +31884,15 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) +"luV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/window/right/directional/west{ + name = "Shooting Range" + }, +/turf/open/floor/iron, +/area/station/security/range) "lvs" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, @@ -32035,6 +31901,16 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"lvu" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Infirmary" + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/security/medical) "lvU" = ( /obj/machinery/door/airlock{ id_tag = "Toilet4"; @@ -32102,6 +31978,19 @@ }, /turf/open/floor/grass, /area/station/medical/virology) +"lxf" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/button/door/directional/west{ + id = "Cabin5"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "lxm" = ( /obj/machinery/atmospherics/components/trinary/mixer/airmix{ dir = 4 @@ -32227,6 +32116,13 @@ "lAu" = ( /turf/open/space/basic, /area/space/nearstation) +"lAH" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Research Director Observation"; + req_access = list("rd") + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/rd) "lAM" = ( /turf/closed/wall/r_wall, /area/station/security/brig) @@ -32520,13 +32416,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"lJo" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/north, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "lJr" = ( /obj/structure/chair{ dir = 1 @@ -32548,20 +32437,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"lKe" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageExternal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/south{ - name = "Crate Security Door"; - req_access = list("shipping") - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "lKu" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -32595,6 +32470,14 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"lLw" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Shower" + }, +/obj/machinery/shower/directional/south, +/obj/structure/curtain, +/turf/open/floor/iron/freezer, +/area/station/commons/fitness/recreation) "lLB" = ( /obj/structure/table/glass, /obj/item/wrench, @@ -32688,22 +32571,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"lMQ" = ( -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = 3; - pixel_y = -23 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Primary AI Core Access"; - req_access = list("ai_upload") - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "lMW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32867,6 +32734,26 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/office) +"lPt" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Jetpack Storage"; + pixel_x = -1; + req_access = list("eva") + }, +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "lPy" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -33612,14 +33499,6 @@ }, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"mda" = ( -/obj/machinery/door/window/left/directional/south{ - name = "HoP's Desk"; - req_access = list("hop") - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "mdk" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33660,27 +33539,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"mdM" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/obj/machinery/door/airlock/maintenance{ - name = "Mining Dock Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/turf/open/floor/plating, -/area/station/cargo/miningoffice) -"mdW" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/machinery/conveyor{ - dir = 10; - id = "mining" - }, -/obj/machinery/bouldertech/refinery, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "mei" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, @@ -33691,14 +33549,6 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/engine, /area/station/science/cytology) -"meG" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Shower" - }, -/obj/machinery/shower/directional/south, -/obj/structure/curtain, -/turf/open/floor/iron/freezer, -/area/station/commons/fitness/recreation) "meJ" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -33739,6 +33589,35 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) +"mgb" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "packageExternal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Cargo Bay - Aft"; + pixel_x = 14 + }, +/obj/machinery/light/directional/south, +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Crate to Shuttle"; + req_access = list("shipping") + }, +/obj/structure/plasticflaps/opaque{ + name = "Service Deliveries" + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) "mgc" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -33939,20 +33818,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"mje" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/west{ - name = "Outer Window" - }, -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "Security Desk"; - req_access = list("security") - }, -/obj/item/folder/red, -/obj/item/pen, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "mjg" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -33985,14 +33850,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"mjI" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Captain's Desk"; - req_access = list("captain") - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) "mkb" = ( /obj/machinery/conveyor_switch/oneway{ dir = 8; @@ -34026,6 +33883,12 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"mkz" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/item/hand_labeler_refill, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "mkO" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34073,18 +33936,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"mlY" = ( -/obj/machinery/computer/upload/ai, -/obj/machinery/door/window/right/directional/south{ - name = "Upload Console Window"; - req_access = list("ai_upload"); - layer = 3.1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/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) "mma" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/north, @@ -34461,22 +34312,6 @@ /obj/item/reagent_containers/cup/beaker/large, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"msW" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_y = 3 - }, -/obj/item/folder/yellow, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "mta" = ( /obj/machinery/camera/directional/north{ c_tag = "Starboard Primary Hallway - tech_storage" @@ -34514,22 +34349,6 @@ "mtu" = ( /turf/open/floor/engine, /area/station/science/xenobiology) -"mtD" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/south{ - name = "Cargo Desk"; - req_access = list("shipping") - }, -/obj/item/paper_bin{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/item/paper/crumpled{ - pixel_x = 7 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/sorting) "mtG" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -35320,19 +35139,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"mFw" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/conveyor{ - dir = 9; - id = "mining" - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "mFC" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/beerkeg, @@ -35553,6 +35359,30 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) +"mJT" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "rndlab2"; + name = "Secondary Research and Development Shutter" + }, +/obj/machinery/door/window/left/directional/east{ + name = "Research Lab Desk"; + req_access = list("science") + }, +/obj/item/folder{ + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = -7 + }, +/obj/structure/desk_bell{ + pixel_x = 6 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron/white, +/area/station/science/lab) "mKf" = ( /obj/structure/table, /obj/item/flashlight/flare/candle, @@ -35703,27 +35533,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"mME" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 7 - }, -/obj/item/reagent_containers/dropper{ - pixel_x = -3; - pixel_y = -6 - }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/science/lab) "mMK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -35732,6 +35541,25 @@ /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) @@ -35814,6 +35642,18 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"mPF" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Surgical Supplies"; + req_access = list("surgery") + }, +/obj/structure/table/reinforced, +/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/bone_gel, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "mPH" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35878,6 +35718,12 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) +"mQq" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/bluespace_vendor/directional/east, +/obj/machinery/photobooth, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "mQr" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -35967,6 +35813,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"mRY" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Mass Driver"; + req_access = list("maint_tunnels") + }, +/obj/machinery/door/window/left/directional/south{ + name = "Mass Driver"; + req_access = list("maint_tunnels") + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/machinery/computer/pod/old/mass_driver_controller/shack{ + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) "mSk" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36444,6 +36307,13 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"mZW" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue, +/mob/living/basic/bot/cleanbot, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "nae" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/caution/stand_clear/red{ @@ -36504,21 +36374,33 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/service/hydroponics) -"nbL" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Weapon Distribution"; - req_access = list("armory") +"nbS" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 }, -/obj/item/paper, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/south{ - name = "Requests Window" +/obj/item/clothing/under/rank/prisoner{ + pixel_x = 8; + pixel_y = 5 }, -/obj/item/pen, -/obj/item/papercutter, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = -8 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "nbT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36687,6 +36569,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) +"neO" = ( +/obj/machinery/door/window/brigdoor/security/holding/left/directional/south{ + id = "Holding Cell"; + name = "Holding Cell" + }, +/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, +/turf/open/floor/iron, +/area/station/security/holding_cell) "nfs" = ( /turf/open/floor/engine, /area/station/command/heads_quarters/rd) @@ -36923,6 +36816,14 @@ /obj/structure/chair/office, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"njP" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Captain's Desk"; + req_access = list("captain") + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "njW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37666,6 +37567,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"nwl" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Medical Deliveries"; + req_access = list("medical") + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/window/spawner/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "nwq" = ( /obj/structure/table, /obj/machinery/firealarm/directional/south, @@ -37674,13 +37586,6 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"nwx" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Captain's Bedroom"; - req_access = list("captain") - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) "nwC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -37691,6 +37596,18 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, /turf/closed/wall, /area/station/engineering/atmos/pumproom) +"nwL" = ( +/obj/machinery/computer/upload/ai, +/obj/machinery/door/window/right/directional/south{ + name = "Upload Console Window"; + req_access = list("ai_upload"); + layer = 3.1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/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) "nwT" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8 @@ -37965,6 +37882,18 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/wood, /area/station/service/bar/backroom) +"nBj" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/explab) "nBp" = ( /obj/structure/sink/directional/east, /obj/effect/spawner/random/trash/mess, @@ -38004,6 +37933,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/white, /area/station/medical/virology) +"nBI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/turf_decal/bot, +/obj/item/electronics/apc, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "nCa" = ( /obj/machinery/meter/layer2, /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2{ @@ -38167,16 +38104,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"nEf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/computer/order_console/cook{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "nEB" = ( /obj/structure/sign/poster/random/directional/east, /obj/machinery/requests_console/directional/south{ @@ -38249,6 +38176,11 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"nGo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "nGp" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/dice, @@ -38338,6 +38270,16 @@ /obj/structure/easel, /turf/open/floor/plating, /area/station/maintenance/disposal) +"nIP" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/pai_card, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/science/lobby) "nIR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -38527,18 +38469,6 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/maintenance/starboard/aft) -"nMo" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Bridge Deliveries"; - req_access = list("command") - }, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "Bridge Blast Door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/command/bridge) "nMz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -38685,10 +38615,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "nOq" = ( -/obj/machinery/holopad/secure{ - pixel_x = 9; - pixel_y = -9 - }, +/obj/machinery/holopad/secure, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) "nOv" = ( @@ -39199,12 +39126,6 @@ /obj/machinery/bookbinder, /turf/open/floor/wood, /area/station/service/library) -"nZL" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/ordnance/burnchamber) "nZQ" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39543,12 +39464,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/iron, /area/station/service/hydroponics) -"oet" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/burnchamber) "oew" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) @@ -39578,21 +39493,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/main) -"ofm" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/disk/tech_disk{ - pixel_x = -6 - }, -/obj/item/disk/tech_disk{ - pixel_x = 6 - }, -/obj/item/disk/tech_disk{ - pixel_y = 6 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/science/lab) "ofQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -40224,19 +40124,30 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"oto" = ( -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "visitation"; - name = "Visitation Shutters" - }, -/obj/machinery/door/window/left/directional/east, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/security/prison/visit) "otu" = ( /turf/closed/wall, /area/station/service/chapel) +"otB" = ( +/obj/machinery/button/door/directional/east{ + id = "rdrnd"; + name = "Primary Research Shutters Control"; + pixel_y = 6; + req_access = list("science") + }, +/obj/machinery/button/door/directional/east{ + id = "rndlab2"; + name = "Secondary Research Shutters Control"; + pixel_y = -6; + req_access = list("science") + }, +/obj/machinery/modular_computer/preset/cargochat/science{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/lab) "otG" = ( /obj/item/radio/intercom/directional/east, /obj/structure/window/spawner/directional/north, @@ -40314,13 +40225,6 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/hallway/primary/central) -"ouq" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Fitness Ring" - }, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "out" = ( /obj/structure/lattice, /obj/item/reagent_containers/cup/glass/bottle/goldschlager, @@ -40491,6 +40395,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) +"oxk" = ( +/obj/machinery/door/window/right/directional/east{ + name = "Engineering Deliveries"; + req_access = list("engineering") + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "oxx" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -40656,6 +40569,24 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"oBM" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/east{ + name = "Hydroponics Desk"; + req_access = list("hydroponics") + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/service/hydroponics) "oBO" = ( /obj/structure/cable, /obj/effect/landmark/start/medical_doctor, @@ -40904,6 +40835,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"oFT" = ( +/obj/structure/table, +/obj/item/integrated_circuit/loaded/speech_relay, +/obj/item/integrated_circuit/loaded/hello_world{ + pixel_y = 2; + pixel_x = 3 + }, +/turf/open/floor/iron, +/area/station/science/explab) "oFX" = ( /obj/machinery/door/airlock/maintenance{ name = "Ordnance Lab Maintenance" @@ -41063,24 +41003,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"oIN" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Disposals Chute" - }, -/obj/machinery/disposal/delivery_chute{ - dir = 8; - name = "disposals chute"; - pixel_x = 5 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "oIO" = ( /obj/machinery/computer/security/telescreen/interrogation{ dir = 8; @@ -41166,10 +41088,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"oKp" = ( -/obj/effect/spawner/random/structure/closet_empty/crate, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "oKx" = ( /obj/structure/tank_dispenser, /obj/machinery/light/directional/north, @@ -41573,35 +41491,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/corporate_showroom) -"oSu" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Mass Driver Door"; - req_access = list("ordnance") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "oSy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"oSM" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Hydroponics Desk"; - req_access = list("hydroponics") - }, -/obj/structure/desk_bell{ - pixel_x = 6; - pixel_y = 10 - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics) "oTa" = ( /obj/machinery/vending/cart{ req_access = list("hop") @@ -41820,7 +41715,7 @@ /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "oXK" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/storage/briefcase/secure/riches, /obj/item/storage/backpack/duffelbag/syndie/hitman, /obj/item/card/id/advanced/silver/reaper, @@ -41883,6 +41778,20 @@ /obj/machinery/light/small/red/directional/west, /turf/open/floor/plating/airless, /area/space/nearstation) +"oYv" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/button/door/directional/west{ + id = "Cabin4"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "oYz" = ( /obj/machinery/camera/directional/south{ c_tag = "Cargo Bay - Mailroom" @@ -41902,6 +41811,15 @@ "oYZ" = ( /turf/closed/wall, /area/station/command/heads_quarters/rd) +"oZj" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album/library, +/obj/structure/sign/painting/large/library_private{ + dir = 8; + pixel_x = -29 + }, +/turf/open/floor/engine/cult, +/area/station/service/library) "oZs" = ( /obj/structure/bed/medical/emergency{ dir = 4 @@ -41969,12 +41887,6 @@ "paD" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) -"paS" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Animal Pen B" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "pbb" = ( /obj/structure/table, /obj/machinery/microwave, @@ -42231,20 +42143,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"pfW" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageSort2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east{ - name = "Crate Security Door"; - req_access = list("shipping") - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) "pgD" = ( /obj/machinery/door/airlock/maintenance{ name = "Chapel Maintenance" @@ -42256,15 +42154,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"pgF" = ( -/obj/structure/railing/corner/end, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/rubble, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "pgJ" = ( /obj/structure/chair/stool/directional/north, /obj/machinery/camera/directional/west{ @@ -42697,6 +42586,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"poj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "pom" = ( /turf/open/floor/iron, /area/station/engineering/storage_shared) @@ -43090,14 +42986,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) -"puH" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Library Desk Door"; - req_access = list("library"); - pixel_x = 3 - }, -/turf/open/floor/wood, -/area/station/service/library) "puI" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -43261,14 +43149,6 @@ /obj/item/gavelhammer, /turf/open/floor/iron, /area/station/security/courtroom) -"pxY" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Monkey Pen"; - req_access = list("genetics") - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/grass, -/area/station/science/genetics) "pyh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43301,8 +43181,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research/glass{ - name = "Chemistry Lab" +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry" }, /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, /obj/machinery/door/firedoor, @@ -43480,10 +43360,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/medical/office) -"pCa" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/burnchamber) "pCh" = ( /obj/machinery/camera/directional/east{ c_tag = "Prison Laundry"; @@ -43497,6 +43373,12 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"pCk" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/power/port_gen/pacman/pre_loaded, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "pCl" = ( /obj/structure/chair/sofa/corp/left, /obj/effect/turf_decal/tile/neutral/opposingcorners{ @@ -43580,6 +43462,13 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, /area/station/maintenance/department/engine) +"pDR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/order_console/cook{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "pDU" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/structure/disposalpipe/segment{ @@ -43628,6 +43517,16 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"pEA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "pEB" = ( /obj/effect/landmark/start/botanist, /turf/open/floor/iron, @@ -43853,11 +43752,11 @@ /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) "pIz" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/wood, /area/station/commons/lounge) "pID" = ( @@ -44143,6 +44042,20 @@ "pOa" = ( /turf/closed/wall, /area/station/maintenance/port) +"pOb" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageExternal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/south{ + name = "Crate Security Door"; + req_access = list("shipping") + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "pOi" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -44274,6 +44187,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"pQu" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Danger: Conveyor Access"; + req_access = list("maint_tunnels") + }, +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "pQv" = ( /obj/machinery/light/small/directional/west, /obj/machinery/camera/directional/west{ @@ -44372,6 +44296,17 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"pRC" = ( +/obj/structure/cable, +/obj/structure/table, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/item/clothing/gloves/color/orange, +/obj/item/restraints/handcuffs, +/obj/item/reagent_containers/spray/pepper, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "pRM" = ( /obj/machinery/disposal/bin, /obj/machinery/camera/directional/east{ @@ -44392,11 +44327,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/security/prison) -"pSi" = ( -/obj/structure/cable, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) "pSl" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -44566,6 +44496,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/brig) +"pVV" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/spawner/random/entertainment/deck, +/obj/structure/table, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "pVZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -44641,6 +44585,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"pWY" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "pXh" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, @@ -44720,19 +44670,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"pYN" = ( -/obj/machinery/flasher/directional/north{ - id = "AI" - }, -/obj/structure/table/wood/fancy/blue, -/obj/effect/spawner/random/aimodule/neutral, -/obj/machinery/door/window/right/directional/east{ - name = "Core Modules"; - req_access = list("captain") - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) "pZc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44814,38 +44751,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/central) -"qaN" = ( -/obj/structure/table/wood, -/obj/machinery/button/ticket_machine{ - pixel_x = 32 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = 6; - pixel_y = -34 - }, -/obj/machinery/button/door/directional/south{ - id = "hop"; - name = "Privacy Shutters Control"; - pixel_x = -6; - req_access = list("hop") - }, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/stamp/head/hop{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "hopqueue"; - name = "Queue Shutters Control"; - pixel_x = -6; - pixel_y = -34; - req_access = list("hop") - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "qaP" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -44858,6 +44763,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"qaW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance) "qbr" = ( /obj/structure/bed/medical{ dir = 4 @@ -45007,6 +44918,22 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qeQ" = ( +/obj/machinery/turretid{ + icon_state = "control_stun"; + name = "AI Chamber turret control"; + pixel_x = 3; + pixel_y = -23 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Primary AI Core Access"; + req_access = list("ai_upload") + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "qeZ" = ( /obj/effect/decal/cleanable/oil, /obj/structure/cable, @@ -45235,7 +45162,6 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/mapping_helpers/airlock/access/any/medical/pharmacy, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) @@ -45817,28 +45743,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/holding_cell) -"quD" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = -8 - }, -/obj/item/radio/intercom/directional/west{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel"; - pixel_x = -8 - }, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) "qvl" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -45976,16 +45880,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space, /area/space/nearstation) -"qyf" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/west{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "qyo" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -46008,6 +45902,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"qyt" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ + id = "Cell 3"; + name = "Cell 3" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/security/brig) "qyC" = ( /turf/closed/wall, /area/station/engineering/atmos/pumproom) @@ -46104,6 +46011,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"qAf" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/mob/living/basic/bot/medbot/autopatrol, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/medical/medbay/lobby) "qAA" = ( /obj/machinery/newscaster/directional/east, /obj/machinery/computer/security/mining{ @@ -46476,6 +46392,15 @@ /obj/structure/sign/warning/docking, /turf/closed/wall, /area/station/hallway/secondary/entry) +"qHt" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "qHK" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -46585,6 +46510,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"qJi" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/left/directional/east, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/security/prison/visit) "qJn" = ( /obj/machinery/chem_master, /obj/structure/noticeboard/directional/east, @@ -46627,6 +46562,23 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"qKy" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "Disposals" + }, +/obj/structure/plasticflaps, +/obj/machinery/door/window/right/directional/south{ + name = "Delivery Door"; + req_access = list("cargo") + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "qKD" = ( /obj/structure/sign/poster/random/directional/east, /obj/effect/turf_decal/tile/bar, @@ -47262,23 +47214,19 @@ "qST" = ( /turf/open/floor/iron, /area/station/cargo/drone_bay) -"qTg" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "rdgene2"; - name = "Genetics Lab Shutters" +"qTf" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 }, -/obj/machinery/door/window/left/directional/east{ - name = "Genetics Desk"; - req_access = list("genetics") +/obj/machinery/conveyor{ + dir = 9; + id = "mining" + }, +/obj/structure/railing{ + dir = 8 }, -/obj/item/folder, -/obj/item/pen, -/obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, -/area/station/science/genetics) +/area/station/cargo/miningoffice) "qTx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47344,19 +47292,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"qTQ" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/button/door/directional/east{ - id = "Cabin2"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "qTR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -47575,17 +47510,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qXJ" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/machinery/door/window/left/directional/north{ - name = "Danger: Conveyor Access"; - req_access = list("maint_tunnels") - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "qXK" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -47641,14 +47565,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) -"qYS" = ( -/obj/machinery/meter, -/obj/machinery/door/window/left/directional/north{ - name = "Gas Ports" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "qZa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47656,16 +47572,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"qZe" = ( -/obj/machinery/door/window/left/directional/north{ - name = "MiniSat Walkway Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "qZg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47782,10 +47688,7 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "raJ" = ( -/obj/machinery/computer/security/wooden_tv{ - pixel_x = 1; - pixel_y = 6 - }, +/obj/structure/secure_safe/caps_spare, /obj/structure/table/glass, /turf/open/floor/iron/dark, /area/station/command/bridge) @@ -48186,11 +48089,6 @@ dir = 1 }, /area/station/commons/fitness) -"rjy" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/recharge_station, -/turf/open/floor/iron/white, -/area/station/medical/storage) "rjz" = ( /obj/machinery/power/shieldwallgen, /obj/structure/extinguisher_cabinet/directional/west, @@ -48436,18 +48334,6 @@ /obj/effect/spawner/random/trash/caution_sign, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"rop" = ( -/obj/machinery/computer/department_orders/science{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/explab) -"ror" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "roF" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -48677,10 +48563,6 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"rtj" = ( -/obj/machinery/igniter/incinerator_ordmix, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/burnchamber) "rtD" = ( /obj/effect/turf_decal/tile/purple, /obj/machinery/light/directional/east, @@ -49187,18 +49069,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"rAS" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Surgical Supplies"; - req_access = list("surgery") - }, -/obj/structure/table/reinforced, -/obj/item/stack/sticky_tape/surgical, -/obj/item/stack/medical/bone_gel, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) "rAW" = ( /turf/closed/wall, /area/station/security/prison/work) @@ -49256,6 +49126,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"rCx" = ( +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 5 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/science/explab) "rCW" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -49332,6 +49211,13 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"rEg" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Captain's Bedroom"; + req_access = list("captain") + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "rEj" = ( /obj/structure/sink/kitchen/directional/south{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -49522,13 +49408,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/station/service/theater) -"rHE" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/toy/figure/scientist, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/science/lab) "rHZ" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /obj/machinery/atmospherics/components/binary/valve/digital{ @@ -49857,8 +49736,8 @@ /area/station/engineering/gravity_generator) "rMT" = ( /obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 + capacity = 1.8e+008; + charge = 2e+005 }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -49879,18 +49758,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"rNj" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/door/window/right/directional/south{ - name = "MiniSat Walkway Access" - }, -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat Exterior - Aft Starboard"; - network = list("minisat") - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "rNs" = ( /obj/machinery/light/small/directional/east, /obj/structure/cable, @@ -50018,13 +49885,23 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"rQs" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Research Director Observation"; - req_access = list("rd") +"rQl" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "rdgene2"; + name = "Genetics Lab Shutters" }, -/turf/open/floor/engine, -/area/station/command/heads_quarters/rd) +/obj/machinery/door/window/left/directional/east{ + name = "Genetics Desk"; + req_access = list("genetics") + }, +/obj/item/folder, +/obj/item/pen, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron, +/area/station/science/genetics) "rQw" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) @@ -50192,7 +50069,7 @@ name = "Surgery C Maintenance" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "rTL" = ( @@ -50222,6 +50099,21 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"rUo" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + id = "Cabin7"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "rUp" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, @@ -50299,6 +50191,23 @@ "rVn" = ( /turf/open/floor/iron, /area/station/cargo/lobby) +"rVG" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Service Deliveries"; + req_access = list("service") + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "rVK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -50308,6 +50217,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/lobby) +"rVT" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 7 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/turf/open/floor/iron, +/area/station/science/lab) "rVY" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50328,6 +50259,14 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/engine/n2, /area/station/engineering/atmos) +"rWH" = ( +/obj/machinery/door/window/left/directional/south{ + name = "HoP's Desk"; + req_access = list("hop") + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "rWL" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -50487,19 +50426,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"rZC" = ( -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Primary AI Core Access"; - req_access = list("ai_upload") - }, -/obj/machinery/camera/directional/north{ - c_tag = "AI Chamber - Core"; - network = list("aicore") - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "rZT" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -50851,17 +50777,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/cryo) -"sfG" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" - }, -/obj/machinery/bouldertech/refinery/smelter, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "sfK" = ( /obj/structure/closet{ name = "evidence closet 1" @@ -51039,6 +50954,18 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/medical/storage) +"sje" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/door/window/left/directional/west{ + name = "MuleBot Access"; + req_access = list("shipping") + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Medbay" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "sjx" = ( /obj/structure/cable, /obj/item/kirbyplants/random, @@ -51176,6 +51103,22 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"snu" = ( +/obj/structure/table/wood, +/obj/machinery/door/window/right/directional/south{ + name = "Captain's Desk"; + req_access = list("captain") + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "snB" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51387,15 +51330,6 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/engineering/break_room) -"ssn" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "ssr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -51414,14 +51348,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) -"std" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Security Delivery"; - req_access = list("security") - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/security/office) "stl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51795,28 +51721,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/white, /area/station/science/cytology) -"syY" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Justice Chamber"; - req_access = list("armory") - }, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Justice Chamber"; - req_access = list("armory") - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "executionfireblast" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "sza" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51887,6 +51791,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) +"sBa" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/button/door/directional/east{ + id = "Cabin3"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "sBd" = ( /obj/structure/lattice, /obj/item/stack/cable_coil, @@ -52045,6 +51963,16 @@ /obj/effect/mapping_helpers/airlock/access/any/command/hop, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"sDJ" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "sDK" = ( /obj/machinery/flasher/portable, /obj/item/radio/intercom/directional/east, @@ -52084,6 +52012,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/warden) +"sDT" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/obj/structure/table/wood/fancy/royalblue, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "sEk" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/cable, @@ -52466,6 +52406,36 @@ dir = 4 }, /area/station/science/lab) +"sLN" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/north{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = 8 + }, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Common Channel" + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel"; + pixel_x = 8 + }, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai) +"sLU" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "sMb" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ @@ -52502,6 +52472,17 @@ /obj/structure/mirror/directional/north, /turf/open/floor/iron/white, /area/station/medical/virology) +"sMB" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ + id = "Cell 1"; + name = "Cell 1" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron, +/area/station/security/brig) "sMD" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -53076,9 +53057,7 @@ /turf/open/floor/plating, /area/station/cargo/sorting) "sVx" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -53306,15 +53285,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood/large, /area/station/service/theater) -"sZi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/modular_computer/preset/cargochat/service{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/east, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "sZo" = ( /obj/machinery/light/directional/north, /obj/structure/reagent_dispensers/watertank/high, @@ -53464,6 +53434,10 @@ /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood, /area/station/service/library) +"tcd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall, +/area/station/science/ordnance) "tck" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53692,26 +53666,12 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"tgn" = ( -/obj/machinery/vending/medical, -/obj/machinery/light/cold/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "tgo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"tgv" = ( -/obj/structure/cable, -/obj/machinery/door/window/right/directional/west{ - name = "Theater Stage" - }, -/turf/open/floor/carpet, -/area/station/service/theater) "tgC" = ( /obj/structure/noticeboard/directional/south, /obj/structure/table/wood, @@ -53801,6 +53761,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"tid" = ( +/obj/structure/railing/corner/end, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/rubble, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "tit" = ( /obj/structure/sink/directional/east, /obj/structure/sign/poster/contraband/random/directional/west, @@ -53829,32 +53798,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"tjd" = ( -/obj/structure/table/reinforced, -/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 = "Pharmacy Desk"; - req_access = list("medical") - }, -/obj/item/reagent_containers/cup/bottle/morphine, -/obj/item/reagent_containers/cup/bottle/toxin{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = 8 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = -5 - }, -/obj/item/reagent_containers/syringe/epinephrine, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "tjf" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -53865,12 +53808,6 @@ /obj/effect/spawner/random/food_or_drink/seed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"tjg" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/item/hand_labeler_refill, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "tjh" = ( /turf/closed/wall, /area/station/security/brig) @@ -53941,6 +53878,13 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/cargo/sorting) +"tkf" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/conveyor{ + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "tkg" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ dir = 4 @@ -54157,6 +54101,12 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"tnR" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance) "tot" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -54256,18 +54206,14 @@ /obj/effect/spawner/random/clothing/costume, /turf/open/floor/plating, /area/station/maintenance/port) -"tqP" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Arrivals Security Checkpoint"; - pixel_y = -8; - req_access = list("security") +"tqx" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Mass Driver Control Door"; + req_access = list("ordnance") }, -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "tqU" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -54976,22 +54922,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/science/research) -"tEx" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/machinery/door/window/left/directional/west{ - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/obj/machinery/light/directional/east, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/effect/spawner/random/decoration/statue{ - spawn_loot_chance = 50 - }, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/carpet/royalblue, -/area/station/service/library) "tEy" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/neutral{ @@ -55016,14 +54946,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tFP" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/item/circuitboard/machine/thermomachine, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) "tGI" = ( /obj/machinery/light_switch/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -55053,13 +54975,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) -"tHk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/department_orders/service{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "tHE" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -55366,18 +55281,24 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"tLF" = ( -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = -2; +"tLH" = ( +/obj/structure/table, +/obj/structure/cable, +/obj/item/disk/tech_disk{ + pixel_x = -6 + }, +/obj/item/disk/tech_disk{ + pixel_x = 6 + }, +/obj/item/disk/tech_disk{ pixel_y = 6 }, -/obj/item/pai_card, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/obj/item/pai_card, -/obj/item/pai_card, -/turf/open/floor/iron/white, -/area/station/science/lobby) +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/lab) "tLN" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -55557,28 +55478,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) -"tOx" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = 8 - }, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel"; - pixel_x = 8 - }, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) "tOK" = ( /obj/structure/rack, /obj/item/cane, @@ -55806,13 +55705,11 @@ /area/station/maintenance/port) "tTL" = ( /obj/structure/table/glass, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/folder/blue{ - pixel_y = 2 - }, /obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 1; + pixel_y = 6 + }, /turf/open/floor/iron/dark, /area/station/command/bridge) "tTP" = ( @@ -55910,6 +55807,19 @@ "tUA" = ( /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"tUF" = ( +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Primary AI Core Access"; + req_access = list("ai_upload") + }, +/obj/machinery/camera/directional/north{ + c_tag = "AI Chamber - Core"; + network = list("aicore") + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "tUH" = ( /obj/item/clothing/mask/gas, /turf/open/floor/plating, @@ -55952,6 +55862,24 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison/garden) +"tVr" = ( +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/obj/machinery/door/window/right/directional/east{ + layer = 3 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "tVt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55970,9 +55898,7 @@ /turf/open/floor/carpet, /area/station/service/chapel/funeral) "tVC" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/flasher/directional/north{ @@ -56690,6 +56616,11 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) +"uhI" = ( +/obj/structure/cable, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "uhP" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56708,6 +56639,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"uhW" = ( +/obj/structure/cable, +/obj/machinery/door/window/right/directional/west{ + name = "Theater Stage" + }, +/turf/open/floor/carpet, +/area/station/service/theater) "uid" = ( /obj/structure/table, /obj/item/stack/package_wrap{ @@ -57262,7 +57200,6 @@ pixel_y = -3 }, /obj/structure/table/glass, -/obj/structure/secure_safe/caps_spare/directional/west, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 }, @@ -57359,11 +57296,6 @@ dir = 8 }, /area/station/service/chapel) -"uul" = ( -/obj/structure/cable, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "uur" = ( /obj/effect/spawner/random/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57480,23 +57412,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"uwC" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/bluespace_vendor/directional/east, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "uwK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -57523,10 +57438,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) -"uxd" = ( -/obj/structure/railing, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "uxf" = ( /obj/machinery/conveyor_switch/oneway{ id = "packageSort2"; @@ -57765,15 +57676,6 @@ dir = 8 }, /area/station/medical/medbay/lobby) -"uBO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/west{ - name = "Shooting Range" - }, -/turf/open/floor/iron, -/area/station/security/range) "uCe" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/plumbing/input{ @@ -57939,6 +57841,21 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/checkpoint/customs) +"uFk" = ( +/obj/structure/cable, +/obj/structure/railing/corner/end/flip, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"uFq" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Mass Driver Door"; + req_access = list("ordnance") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "uFr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57969,28 +57886,6 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/station/engineering/break_room) -"uFK" = ( -/obj/structure/table, -/obj/item/clothing/under/rank/prisoner/skirt{ - pixel_x = -13; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/prisoner/skirt{ - pixel_x = 9; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/prisoner{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "uFQ" = ( /obj/machinery/computer/cargo/request{ dir = 8 @@ -58189,21 +58084,6 @@ "uIs" = ( /turf/closed/wall, /area/station/service/kitchen) -"uIw" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/west{ - id = "Cabin6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "uIM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -58532,17 +58412,6 @@ /obj/effect/spawner/random/trash/box, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"uNZ" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ - id = "Cell 2"; - name = "Cell 2" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron, -/area/station/security/brig) "uOd" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, @@ -58637,17 +58506,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"uPP" = ( -/obj/machinery/door/window/brigdoor/security/holding/left/directional/south{ - id = "Holding Cell"; - name = "Holding Cell" - }, -/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, -/turf/open/floor/iron, -/area/station/security/holding_cell) "uQe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58739,6 +58597,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"uRJ" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Atmospherics Access"; + req_access = list("atmospherics") + }, +/obj/effect/turf_decal/loading_area, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos/storage/gas) "uRL" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -59009,6 +58881,22 @@ /obj/effect/turf_decal/bot/left, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"uWA" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/machinery/door/window/left/directional/west{ + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/obj/machinery/light/directional/east, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/carpet/royalblue, +/area/station/service/library) "uWK" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59118,6 +59006,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"uYm" = ( +/obj/machinery/meter, +/obj/machinery/door/window/left/directional/north{ + name = "Gas Ports" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "uYp" = ( /turf/closed/wall, /area/station/medical/break_room) @@ -59376,17 +59272,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"vdm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "vdx" = ( /obj/machinery/rnd/experimentor, /turf/open/floor/engine, @@ -59437,6 +59322,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) +"vfh" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Research Test Chamber"; + req_access = list("science") + }, +/turf/open/floor/engine, +/area/station/science/explab) "vfk" = ( /obj/structure/cable, /turf/open/floor/engine, @@ -59454,11 +59346,11 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom) "vfO" = ( -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/engineering/break_room) "vfU" = ( @@ -59501,6 +59393,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/gateway) +"vgW" = ( +/obj/machinery/door/window/left/directional/west{ + name = "MiniSat Airlock Access" + }, +/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) "vgZ" = ( /obj/structure/table/glass, /obj/structure/cable, @@ -59522,16 +59422,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"vhg" = ( -/obj/machinery/door/window/left/directional/south{ - name = "MiniSat Walkway Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "vhj" = ( /obj/structure/chair{ name = "Judge" @@ -59614,6 +59504,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"viF" = ( +/obj/machinery/computer/upload/borg, +/obj/machinery/door/window/left/directional/south{ + layer = 3.1; + name = "Cyborg Upload Console Window"; + req_access = list("ai_upload") + }, +/obj/structure/window/reinforced/spawner/directional/west, +/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) "viH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/structure/window/reinforced, @@ -59795,13 +59697,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"vkM" = ( -/obj/machinery/door/window/right/directional/west{ - name = "Research Test Chamber"; - req_access = list("science") - }, -/turf/open/floor/engine, -/area/station/science/explab) "vkO" = ( /obj/structure/table, /obj/item/clothing/gloves/latex, @@ -60079,6 +59974,10 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/customs) +"vpv" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "vpM" = ( /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -60386,6 +60285,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/service/lawoffice) +"vud" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "vun" = ( /turf/closed/wall, /area/station/medical/storage) @@ -60505,10 +60409,6 @@ /obj/effect/spawner/random/bureaucracy/paper, /turf/open/floor/plating, /area/station/maintenance/port) -"vxa" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) "vxi" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -60838,6 +60738,18 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"vCR" = ( +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/explab) "vDc" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -60890,6 +60802,23 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"vEi" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/north{ + name = "Kitchen Window"; + req_access = list("kitchen") + }, +/obj/machinery/door/firedoor, +/obj/item/paper, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen_service"; + name = "Service Shutter" + }, +/obj/item/pen, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "vEk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61075,6 +61004,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"vGx" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Arrivals Security Checkpoint"; + pixel_y = -8; + req_access = list("security") + }, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "vGz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61243,6 +61184,18 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"vJs" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/machinery/airlock_sensor/incinerator_ordmix{ + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/ordnance) "vJy" = ( /obj/structure/rack, /obj/item/stack/sheet/cardboard, @@ -61265,6 +61218,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"vJN" = ( +/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior{ + name = "Burn Chamber Exterior Airlock" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance) "vJX" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -61465,6 +61426,10 @@ }, /turf/open/space, /area/space/nearstation) +"vOe" = ( +/obj/machinery/door/poddoor/incinerator_ordmix, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance) "vOh" = ( /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/airless, @@ -61584,6 +61549,14 @@ /obj/item/extinguisher, /turf/open/floor/plating, /area/station/maintenance/central) +"vPX" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Security Delivery"; + req_access = list("security") + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/security/office) "vQb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -62374,6 +62347,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"wcL" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Library Desk Door"; + req_access = list("library"); + pixel_x = 3 + }, +/turf/open/floor/wood, +/area/station/service/library) "wcN" = ( /obj/machinery/airalarm/directional/east, /obj/structure/disposalpipe/segment, @@ -62382,26 +62363,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"wcZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/drinkingglasses, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/spawner/random/food_or_drink/cups, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "wde" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -62489,23 +62450,6 @@ }, /turf/closed/wall, /area/station/science/ordnance/bomb) -"wet" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/north{ - name = "Kitchen Window"; - req_access = list("kitchen") - }, -/obj/machinery/door/firedoor, -/obj/item/paper, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_service"; - name = "Service Shutter" - }, -/obj/item/pen, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "wev" = ( /obj/structure/rack, /obj/item/storage/box, @@ -62689,13 +62633,12 @@ "whx" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research/glass{ +/obj/machinery/door/airlock/medical/glass{ name = "Pharmacy" }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/mapping_helpers/airlock/access/any/medical/pharmacy, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/effect/landmark/navigate_destination, @@ -62756,17 +62699,6 @@ /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"wiv" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/machinery/newscaster/directional/west, -/obj/item/pen/invisible, -/obj/item/storage/photo_album/library, -/turf/open/floor/engine/cult, -/area/station/service/library) "wiF" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, @@ -62973,6 +62905,18 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) +"wnT" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/door/window/left/directional/south{ + name = "MiniSat Walkway Access" + }, +/obj/machinery/camera/directional/east{ + c_tag = "MiniSat Exterior - Aft Port"; + network = list("minisat") + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "wnW" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -63032,6 +62976,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"woV" = ( +/obj/machinery/door/window/left/directional/north, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "woY" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -63096,20 +63044,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"wqd" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/spawner/random/bedsheet, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/button/door/directional/east{ - id = "Cabin3"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "wqh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -63126,6 +63060,16 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"wqH" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/photobooth/security, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "wqJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -63173,20 +63117,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"wrQ" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Atmospherics Access"; - req_access = list("atmospherics") - }, -/obj/effect/turf_decal/loading_area, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos/storage/gas) "wrZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -63622,6 +63552,17 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"wyP" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/obj/machinery/bouldertech/refinery/smelter, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "wzd" = ( /obj/item/radio/intercom/directional/west, /obj/structure/table, @@ -63936,17 +63877,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/medical/storage) -"wFb" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ - id = "Cell 1"; - name = "Cell 1" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron, -/area/station/security/brig) "wFe" = ( /obj/machinery/computer/teleporter{ dir = 4 @@ -64084,18 +64014,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) -"wIr" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 10 - }, -/obj/machinery/modular_computer/preset/cargochat/security{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) "wIB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, @@ -64245,6 +64163,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"wNp" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/landmark/start/hangover, +/obj/machinery/button/door/directional/west{ + id = "Cabin6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "wND" = ( /obj/effect/turf_decal/arrows/red{ dir = 4 @@ -64629,6 +64562,20 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"wSI" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Hydroponics Desk"; + req_access = list("hydroponics") + }, +/obj/structure/desk_bell{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/service/hydroponics) "wSP" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -64640,6 +64587,21 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"wTp" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Weapon Distribution"; + req_access = list("armory") + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/south{ + name = "Requests Window" + }, +/obj/item/pen, +/obj/item/papercutter, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "wTs" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/camera/directional/south{ @@ -64648,6 +64610,11 @@ /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/iron, /area/station/engineering/atmos) +"wTu" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "wTF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64668,14 +64635,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"wUq" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/mob/living/basic/bot/cleanbot/autopatrol, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "wUt" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -64890,6 +64849,33 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wYi" = ( +/obj/machinery/door/window/right/directional/north{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/toxin{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/west, +/obj/machinery/requests_console/directional/south{ + department = "Medbay"; + name = "Medbay Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "wYl" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, @@ -64945,6 +64931,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"wZo" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 10; + id = "mining" + }, +/obj/machinery/bouldertech/refinery, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "wZw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -65186,14 +65184,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port) -"xfe" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/machinery/conveyor_switch/oneway{ - id = "mining"; - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "xff" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65233,11 +65223,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/engine, /area/station/science/cytology) -"xfB" = ( -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "xfD" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -65445,6 +65430,32 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"xjb" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/north{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = -8 + }, +/obj/item/radio/intercom/directional/west{ + freerange = 1; + listening = 0; + name = "Common Channel" + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel"; + pixel_x = -8 + }, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai) +"xjg" = ( +/mob/living/basic/bot/cleanbot/medbay, +/turf/open/floor/iron/white, +/area/station/medical/storage) "xjh" = ( /turf/closed/wall, /area/station/security/checkpoint/customs) @@ -65488,20 +65499,6 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"xkb" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/effect/spawner/random/entertainment/deck, -/obj/structure/table, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "xko" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -66135,18 +66132,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/robotics/lab) -"xwu" = ( -/obj/structure/sign/poster/official/cleanliness/directional/east, -/obj/machinery/door/window/right/directional/north{ - name = "Hydroponics Delivery"; - req_access = list("hydroponics") - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron, -/area/station/service/hydroponics) "xww" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage/tech) @@ -66160,6 +66145,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/service/hydroponics) +"xwS" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Monkey Pen"; + req_access = list("genetics") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/grass, +/area/station/science/genetics) "xwV" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -66228,12 +66221,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"xxp" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/power/port_gen/pacman/pre_loaded, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "xxF" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -66330,6 +66317,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"xyI" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Animal Pen B" + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "xyM" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -66431,6 +66424,13 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron, /area/station/science/lab) +"xAt" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Fitness Ring" + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "xAR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66758,27 +66758,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"xFe" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/east{ - name = "Engineering Desk"; - req_access = list("engineering") - }, -/obj/item/folder/yellow{ - pixel_x = 4 - }, -/obj/item/pen{ - pixel_x = 5 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/structure/desk_bell{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/break_room) "xFx" = ( /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)."; @@ -66855,19 +66834,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"xGZ" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ - id = "Cell 3"; - name = "Cell 3" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/security/brig) "xIp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -67100,35 +67066,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"xNq" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "packageExternal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Aft"; - pixel_x = 14 - }, -/obj/machinery/light/directional/south, -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/east{ - name = "Crate to Shuttle"; - req_access = list("shipping") - }, -/obj/structure/plasticflaps/opaque{ - name = "Service Deliveries" - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron, -/area/station/cargo/storage) "xNv" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -67140,6 +67077,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"xNF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/mob/living/basic/bot/cleanbot/autopatrol, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "xNG" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -67553,18 +67498,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) -"xVS" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/door/window/left/directional/west{ - name = "MuleBot Access"; - req_access = list("shipping") - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - location = "Medbay" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "xWm" = ( /obj/structure/rack, /obj/item/restraints/handcuffs{ @@ -67901,18 +67834,6 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron, /area/station/engineering/main) -"yaH" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/explab) "yaO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68305,6 +68226,20 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"yhL" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageSort2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/east{ + name = "Crate Security Door"; + req_access = list("shipping") + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) "yhO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -68329,10 +68264,6 @@ /obj/structure/marker_beacon/purple, /turf/open/space/basic, /area/space/nearstation) -"yig" = ( -/obj/machinery/door/window/left/directional/north, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "yij" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -68435,6 +68366,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"ykR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/window/right/directional/west{ + name = "Jim Norton's Quebecois Coffee"; + req_one_access = list("service","maint_tunnels") + }, +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/dark, +/area/station/service/cafeteria) "ykS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68449,6 +68389,24 @@ }, /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/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) "ylt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79711,7 +79669,7 @@ aaa aaa tsd uBC -bEB +mRY ign oli jIR @@ -83263,7 +83221,7 @@ fcq uEw fcq rxP -pSi +uhI vrP hve dRH @@ -83521,7 +83479,7 @@ fxQ fcq bEW pBJ -tqP +vGx ngf pKB gcA @@ -84587,11 +84545,11 @@ riW cBc dqN dqN -kwq +aPx dqN sMS dqN -kwq +aPx jUb jUb njr @@ -84782,7 +84740,7 @@ paD paD paD hKg -bUm +iZC kRe qRa pnI @@ -84843,10 +84801,10 @@ lCb jUb bZW dqN -oKp +vpv bOH fkr -kwq +aPx cNS dqN jUb @@ -85545,7 +85503,7 @@ jfG jfG gYE lBm -hzV +qKy ybN dOe jXu @@ -85799,7 +85757,7 @@ qvJ nxi bWw hTn -erT +tVr iPE vfv cTQ @@ -85876,7 +85834,7 @@ vJy njc ctq hnv -xfB +vud qCK syh fRU @@ -86056,7 +86014,7 @@ qvJ nIj gYC xGm -qXJ +isO gYE uEC wgw @@ -86314,7 +86272,7 @@ kVR jCM teg wvR -ayG +pQu vEH jXu vVp @@ -86327,7 +86285,7 @@ nNk xyz kdC btt -aqx +poj shx uKZ fiC @@ -86578,13 +86536,13 @@ tiK qvl jXu beo -dJn +sLU aZj cSP cLj kRe -pgF -mFw +tid +qTf oor oor hDX @@ -86837,11 +86795,11 @@ jXu jXu jXu hKg -lJo +hzb cLj kRe -uxd -sfG +cBZ +wyP oor jqr wfU @@ -87086,19 +87044,19 @@ hZQ ybi twr gQg -xxp +pCk twr sHu xkX -ror +pWY twr fhn hKg -xfe -jRC -ssn -fed -iZt +jBp +uFk +qHt +dxo +hlE jXu tBU kOX @@ -87114,7 +87072,7 @@ aok aok bgx mmR -xNq +mgb kQP kQP kQP @@ -87348,14 +87306,14 @@ fUr fUr fUr aps -uul -fow +wTu +fMr hKg -xkb -feC -gcR -inW -mdW +pVV +cgk +iId +tkf +wZo jXu hvo cHN @@ -87372,7 +87330,7 @@ aok bgx mmR pyZ -lKe +pOb xOj sVp sVp @@ -87609,7 +87567,7 @@ xgB twr hKg hKg -mdM +jJu hKg hKg hKg @@ -87633,7 +87591,7 @@ dfk edN cSb hYx -pfW +yhL hYx vIt iev @@ -87930,7 +87888,7 @@ bNa ixv jml wRZ -rAS +mPF oap jUb oOZ @@ -88122,9 +88080,9 @@ bSm sHu bPM sHu -tjg +mkz jXu -iPw +atS rNP mgv mWE @@ -88195,7 +88153,7 @@ jUb jUb kYv jUb -xVS +sje jUb tck kHg @@ -88386,7 +88344,7 @@ jXu jXu jXu jXu -llh +kAI vEk jXu vmm @@ -88452,7 +88410,7 @@ iRy uLs wFa iov -iQq +nwl vun lyx tFr @@ -88709,7 +88667,7 @@ kcZ dMN ejg ehX -tgn +jei vun rtX tFr @@ -88904,8 +88862,8 @@ sxn mgv cUD cfv -vdm -eYy +jrx +pEA pQI puD vQs @@ -88913,7 +88871,7 @@ vQs pQD qxJ aXq -mtD +agQ fWU piB uid @@ -88966,7 +88924,7 @@ ver elb sja elb -ims +fev rvb jGt tFr @@ -89161,7 +89119,7 @@ jXu lJR jXu wtQ -cdm +nBI fDo xIZ bNU @@ -89191,7 +89149,7 @@ cWr ecO rFB tmB -puH +wcL yfT klf sVY @@ -89401,7 +89359,7 @@ jXu fTT sOP twr -dGT +fnJ jXu xVc fsQ @@ -89447,7 +89405,7 @@ knd cWr ecO mjr -jpn +inH flQ mjr eZf @@ -89477,10 +89435,10 @@ jGG agZ rvb mhm -eih +xjg foP sRm -rjy +dKm rvb myc tFr @@ -89658,7 +89616,7 @@ jXu uUu dEH pOi -bMp +bMu jXu loQ fsQ @@ -89710,8 +89668,8 @@ mjr wih sVY maB -hwy -wiv +oZj +haA sVY vXH sQY @@ -89954,7 +89912,7 @@ sXr ybn fLp sVY -kbg +sDT mjr mjr mjr @@ -89999,7 +89957,7 @@ rvb nsD tFr nMf -dub +gLJ uYp kbB cpR @@ -90023,7 +89981,7 @@ vQg gYU pIs gYU -fqI +kho gEk gYU aaa @@ -90212,7 +90170,7 @@ xOw iOc sVY vKt -tEx +uWA mjr mjr cWr @@ -90224,7 +90182,7 @@ sVY sVY sVY pJN -btQ +iWB uJm sVY pOa @@ -90251,12 +90209,12 @@ mWC uTj usC ehX -eWg +wYi vun gQG tFr oqi -luB +sDJ uYp pCl qOV @@ -90506,7 +90464,7 @@ pyU vun eFG cBH -qyf +hwe iZn rar vun @@ -90706,7 +90664,7 @@ vvH cFp guX saD -izs +ykR bLh pPH hSg @@ -91695,7 +91653,7 @@ bMM mRq dRE jUP -qYS +uYm grb tdW qNI @@ -91776,7 +91734,7 @@ oNP ehE rlw bTm -dWJ +ylf tzI bMY uET @@ -91948,11 +91906,11 @@ ehB hwz oEM ibH -syY +icb hnp nrV tzJ -cze +hxW cTp tdW lrh @@ -91998,7 +91956,7 @@ ipy bdP buj htd -wUq +xNF oIa gja wvo @@ -92007,7 +91965,7 @@ nMz pJR egp kfA -mda +rWH oOE aVd cKN @@ -92221,9 +92179,9 @@ lAM txg rGd lAM -oto +qJi mzL -cDf +hAL nRZ vkO jDf @@ -92790,9 +92748,9 @@ tYW tOh euj rnX -eBQ +fBo yfL -bRL +lPt dYb gqA tOh @@ -92811,7 +92769,7 @@ gQG tFr tar cOR -juO +aPH uyw pcM cNk @@ -92997,8 +92955,8 @@ wsX kDk sch acr -gAS -dVU +lvu +iom obl sch pHb @@ -93016,7 +92974,7 @@ qWF aaa aJS aJS -pYN +akF pQG wtB vyv @@ -93242,7 +93200,7 @@ aBL aBL aBL aBL -uFK +wqH cWI gYi eOs @@ -93262,7 +93220,7 @@ pHb vMX lsP lsP -wFb +sMB vYD uoM wkL @@ -93296,7 +93254,7 @@ gvl hip fJp wBu -hSW +jLQ fgS jrk dhX @@ -93497,9 +93455,9 @@ yey gnB jYD aDU -buw -kQz -iJx +nbS +kBg +pRC feY gYi wsX @@ -93531,7 +93489,7 @@ aaa aJS oOl rxx -hFv +viF aPv oWF eQg @@ -93552,9 +93510,9 @@ pJR lJn psy htG -qaN +bIq pJR -uwC +mQq ndS urA pFG @@ -93804,7 +93762,7 @@ aaf aaf dho dho -nMo +alI dho qBy qBy @@ -93837,7 +93795,7 @@ kWO rvE whx cIK -tjd +hoN eIO eIO eIO @@ -94015,7 +93973,7 @@ gYi gYi gYi cWI -akT +gCE lAM osw lAM @@ -94033,7 +93991,7 @@ iKj vQI mCJ lsP -uNZ +ekP xIp iPX wkL @@ -94045,7 +94003,7 @@ aaa aJS bpu wzH -mlY +nwL aPv iIQ aRV @@ -94075,7 +94033,7 @@ aks hux bbT ilq -oIN +kAp jnI ghK cky @@ -94088,7 +94046,7 @@ ceM axW xEX hYr -eaq +qAf lrR qwI xJI @@ -94558,7 +94516,7 @@ qWF aaa aJS aJS -eto +hlB vrJ fEO cFr @@ -94804,7 +94762,7 @@ nJW jKS oLK dyr -xGZ +qyt vYD axe wkL @@ -95569,7 +95527,7 @@ tJE kVU tJE fzi -nbL +wTp jxV ewj bkl @@ -95603,7 +95561,7 @@ dsQ mXj dUj gGy -bxS +cwX gGy nEC pJY @@ -95835,7 +95793,7 @@ hMy aZr rbw gnm -cAW +eVa rsI rCo oQg @@ -96344,7 +96302,7 @@ aeq jpj ewj ycM -hqQ +mMM bkl ycM bkl @@ -96440,7 +96398,7 @@ dKC dKC tXU dKC -mje +jVZ lYc tew iUm @@ -96668,7 +96626,7 @@ gVl usg fma ebV -jLm +dZb ebV fma xgi @@ -96682,7 +96640,7 @@ dPY xWJ oIg cId -qTg +rQl oIg wBq bEC @@ -97112,8 +97070,8 @@ ltb hXJ vQW ahj -jwg -wIr +hmu +duF cJj erx lsP @@ -97201,7 +97159,7 @@ sNS qXK xoa wal -pxY +xwS oCE svS dKC @@ -97704,7 +97662,7 @@ lhT cqT lhT iMG -cDl +dpg bBo gwf gfZ @@ -98145,7 +98103,7 @@ lvZ iMo qTH lsP -uPP +neO quA htb xdm @@ -98381,7 +98339,7 @@ aaa aaa gdb nMV -uBO +luV rqs dgD faW @@ -98690,7 +98648,7 @@ vFx tyY rZA uJa -mjI +njP gLe cSg uYl @@ -98715,7 +98673,7 @@ wHu igr ibw ibw -tLF +nIP gFQ aDm non @@ -98970,7 +98928,7 @@ saU uCq mvR dyw -jfI +mJT dyw dyw mvR @@ -99178,7 +99136,7 @@ eey aHr mhA xNo -yig +woV bkZ xNU iJd @@ -99204,7 +99162,7 @@ rDT syL rDT tZD -leN +snu ifM pdY pXA @@ -99226,7 +99184,7 @@ htd saU tgI mvR -iGT +jRO bPi gpB sky @@ -99456,7 +99414,7 @@ syo rUP hlD alg -nwx +rEg uGj tyY iDh @@ -99483,7 +99441,7 @@ htd saU ooP mvR -mME +rVT iQi fGv knY @@ -99740,11 +99698,11 @@ htd dhU dkW mvR -bgn -ofm -rHE -dbd -aBJ +bXc +tLH +lnu +otB +bdv jXK sQB gLU @@ -99778,11 +99736,11 @@ fhi uEo fiS gyQ -eRn -hqj -hqj -hqj -hqj +tcd +gyQ +gyQ +gyQ +gyQ lMJ uGg nFa @@ -100035,11 +99993,11 @@ fhi xEU iqx xYZ -gil -deY -oet -dXU -kgC +vJs +xYZ +qaW +fpM +vOe lMJ uGg nFa @@ -100292,11 +100250,11 @@ fhi fhi twy nJA -nZL -bEv -cgP -rtj -kgC +htN +vJN +dke +hsY +vOe lMJ uGg nFa @@ -100450,7 +100408,7 @@ mxn uta xQT rES -std +vPX rES ssr rES @@ -100516,7 +100474,7 @@ tUn tUn hKV wXF -eZm +kGJ sQB lqL psT @@ -100549,11 +100507,11 @@ jvo aHH iYE dTN -dEF -pCa -cOT -dXU -kgC +jrJ +dTN +tnR +fpM +vOe lMJ uGg wpn @@ -101287,10 +101245,10 @@ qOM tUn ftj wXF -fNE +doM tZo -cCx -rop +vCR +oFT gvS oYZ oYZ @@ -101535,8 +101493,8 @@ hcm fEg wYB kMG -oSM -iZB +wSI +oBM kCZ kMG tlK @@ -101544,11 +101502,11 @@ kMG tUn hKV wXF -luE +cjD dJo -cnu -yaH -gZQ +rCx +nBj +gYe vQb mdu xPm @@ -102045,7 +102003,7 @@ eQE oWH nBf eQE -amK +rVG kqZ wYB iji @@ -102575,7 +102533,7 @@ wXF kHN kHN jvL -vkM +vfh kHN tAg tcx @@ -102818,7 +102776,7 @@ wHL eQE rem eLI -kFu +ltW jyF gFL byW @@ -102838,7 +102796,7 @@ tAg xxh poq vYE -rQs +lAH eZR lAe tAg @@ -103011,7 +102969,7 @@ aaa aaa aaa nvn -meG +lLw ePA ilh gfe @@ -103299,7 +103257,7 @@ tTT vLA qsK dcF -atJ +cON jMo uUl anE @@ -103330,7 +103288,7 @@ ttF sRY wDh uIs -wcZ +btn gsr pUA wFM @@ -103843,7 +103801,7 @@ xqv rmj fWW rTQ -wet +vEi jER rMA ukv @@ -103888,7 +103846,7 @@ guG fJc dVX jsH -oSu +uFq hNA nsA nsA @@ -104051,10 +104009,10 @@ tgo lOU nmI lnc -wqd +sBa obw lnc -qTQ +avU cKC lnc crL @@ -104143,7 +104101,7 @@ oWk pIF qBF nCG -eCI +tqx bOm jPi uZM @@ -104299,11 +104257,11 @@ aag szp jjG ewf -lsi +jUH fMm fMm fMm -ouq +xAt iYG lOU eMG @@ -105375,7 +105333,7 @@ yks okX tZX ogb -tgv +uhW eSC obG jqd @@ -105401,7 +105359,7 @@ wqA ksT rAp tUn -iip +hFM ehG lYH cpU @@ -105593,19 +105551,19 @@ kZq gNh aTD lnc -jMX +oYv cKC lnc -aYn +lxf obw qXB icS qXB -uIw +wNp xej lnc obw -gaY +rUo lqQ fzr iCJ @@ -105865,11 +105823,11 @@ fDC qdy lqQ wRF -bxo +jzC oCO xUE jGE -paS +xyI wRF qXB kbo @@ -106420,7 +106378,7 @@ aLu unL xII ltX -xwu +kbR vOK pnx unL @@ -106928,8 +106886,8 @@ glP deX rJk ofe -nEf -kyt +bxO +nGo aBM unL lPy @@ -107443,8 +107401,8 @@ gIS xNG gYV lFo -sZi -tHk +dQy +pDR unL hLs enf @@ -108459,7 +108417,7 @@ fVF utM iep gKw -fWr +iKV tRE qRO tLd @@ -108717,7 +108675,7 @@ xrN hDa deb kkr -wrQ +uRJ eEx vEt jCk @@ -108970,7 +108928,7 @@ xgV iWU iWU dlc -xFe +isX dlc iWU peM @@ -109966,7 +109924,7 @@ qXB qXB kSE tCS -fGj +oxk voQ rlu pTw @@ -111019,7 +110977,7 @@ vSC eKw vPV qsv -lfd +aYk eup lwm xGa @@ -111276,7 +111234,7 @@ bDW bDW bDW fJy -msW +kDp ayr dRA wCe @@ -112096,7 +112054,7 @@ aaa aaa cXP mtu -vxa +aTs mtu jfS bQQ @@ -112106,7 +112064,7 @@ iWc ces elm mtu -vxa +aTs mtu cXP aaa @@ -112837,7 +112795,7 @@ nwK fFC uVf kRc -tFP +gDq ich jnQ tBM @@ -115701,7 +115659,7 @@ mtu kbz gva fff -vxa +aTs kbz fff mtu @@ -120784,13 +120742,13 @@ osz osz wQw pAD -kYt -bsD +fpd +vgW gCy gCy -qZe +eGd vyM -vhg +gey pAD gCy gCy @@ -121033,7 +120991,7 @@ gAu fHy gAu rYs -hoe +eLr xgZ xgZ xgZ @@ -121315,7 +121273,7 @@ xgZ xgZ xgZ xgZ -bwG +wnT sbG sbG sbG @@ -122322,7 +122280,7 @@ gfU aTV aTV aTV -quD +xjb aTV aTV aTV @@ -122579,7 +122537,7 @@ aTV aVl vmk phN -hBV +jEr lro aWN aVl @@ -123093,7 +123051,7 @@ aVn tIa aWN aTV -lMQ +qeQ aTV aTV aWN @@ -123607,7 +123565,7 @@ vnm xGF iCV aTV -rZC +tUF aTV aTV tfz @@ -123874,7 +123832,7 @@ bjQ kxq rNs tSP -bkE +mZW giA eBz hoY @@ -124121,7 +124079,7 @@ aTV aVr qDi oDc -jNI +hyZ rZy qDi aVr @@ -124378,7 +124336,7 @@ gfU aTV aTV aTV -tOx +sLN aTV aTV aTV @@ -125427,7 +125385,7 @@ xgZ xgZ xgZ xgZ -rNj +bWS xgZ xgZ xgZ @@ -125659,7 +125617,7 @@ nWS nWS nWS moI -icF +cQV xgZ xgZ xgZ diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index ddca03ffee4..712e555b878 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -295,6 +295,12 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/plating, /area/mine/maintenance/living/north) +"cg" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/maintenance/service) "ch" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -2864,14 +2870,6 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron/white, /area/mine/laborcamp/production) -"ps" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/maintenance/service) "pu" = ( /obj/item/chair/stool{ pixel_x = -2; @@ -4993,13 +4991,6 @@ /obj/effect/turf_decal/sand/plating/volcanic, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) -"Ee" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/maintenance/labor) "Eg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -5416,6 +5407,11 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/plating, /area/mine/maintenance/public/north) +"Hi" = ( +/obj/machinery/power/smes/full, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/maintenance/labor) "Hp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -28238,7 +28234,7 @@ Zt Zt Zt Zt -Ee +Hi ve RD RD @@ -38485,7 +38481,7 @@ Ue AA gB ON -ps +cg gq ER vc diff --git a/_maps/map_files/NSVBlueshift/Blueshift.dmm b/_maps/map_files/NSVBlueshift/Blueshift.dmm index 3df0ca0a6f4..eb57a4f7eee 100644 --- a/_maps/map_files/NSVBlueshift/Blueshift.dmm +++ b/_maps/map_files/NSVBlueshift/Blueshift.dmm @@ -3048,7 +3048,7 @@ /turf/open/floor/iron/dark, /area/station/science/genetics) "aFb" = ( -/obj/machinery/modular_computer/preset/cargochat, +/obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) "aFd" = ( @@ -4801,9 +4801,6 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 9 }, -/obj/machinery/computer/department_orders/science{ - dir = 1 - }, /turf/open/floor/iron, /area/station/science/lab) "aXj" = ( @@ -30066,6 +30063,7 @@ /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 8 }, +/obj/item/storage/toolbox/mechanical, /turf/open/floor/iron/dark, /area/station/command/bridge) "fJu" = ( @@ -36364,7 +36362,6 @@ /obj/effect/turf_decal/bot, /obj/effect/turf_decal/loading_area, /obj/structure/disposalpipe/segment, -/obj/machinery/computer/department_orders/security, /turf/open/floor/iron/dark/corner{ dir = 4 }, @@ -50162,9 +50159,6 @@ /area/station/security/brig) "jDW" = ( /obj/structure/window/spawner/directional/south, -/obj/machinery/computer/department_orders/service{ - dir = 1 - }, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/service) "jEg" = ( @@ -51559,7 +51553,7 @@ /area/station/science/ordnance) "jQV" = ( /obj/machinery/light/small/directional/north, -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "jQX" = ( @@ -62016,6 +62010,7 @@ pixel_x = -1; pixel_y = 12 }, +/obj/item/piggy_bank/vault, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) "lQH" = ( @@ -63931,10 +63926,10 @@ /area/station/hallway/secondary/service) "mjA" = ( /obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 1 }, +/obj/structure/secure_safe/caps_spare, /turf/open/floor/iron/dark, /area/station/command/bridge) "mjB" = ( @@ -65863,9 +65858,6 @@ /turf/open/floor/iron/dark, /area/station/science/cytology) "mER" = ( -/obj/machinery/computer/department_orders/engineering{ - dir = 8 - }, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/break_room) @@ -67148,7 +67140,7 @@ /obj/structure/closet/athletic_mixed, /obj/item/clothing/mask/animal/frog, /obj/item/clothing/head/helmet/skull, -/obj/item/clothing/head/costume/jester/alt, +/obj/item/clothing/head/costume/jesteralt, /obj/item/clothing/head/costume/ushanka, /obj/item/clothing/mask/gas/soviet, /obj/item/clothing/mask/luchador/rudos, @@ -81386,7 +81378,7 @@ /area/station/hallway/primary/upper) "pCC" = ( /obj/machinery/light/small/directional/south, -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "pCO" = ( @@ -87364,6 +87356,17 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/station/maintenance/department/science/upper) +"qHD" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/modular_computer/preset/cargochat/security, +/obj/effect/turf_decal/stripes/blue/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/security/office) "qHE" = ( /obj/structure/rack, /obj/item/clothing/shoes/winterboots, @@ -117803,7 +117806,6 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 6 }, -/obj/machinery/computer/department_orders/medical, /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/medical/break_room) @@ -121658,9 +121660,7 @@ /obj/machinery/computer/records/security, /obj/machinery/light/directional/north, /obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/stripes/blue/line{ - dir = 5 - }, +/obj/effect/turf_decal/stripes/blue/line, /turf/open/floor/iron/dark, /area/station/security/office) "xhc" = ( @@ -159684,7 +159684,7 @@ tdv tdv cnP nOi -xTt +qHD xTt kRU ugJ diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 6ec8209c0f4..2e62e13527d 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -24,11 +24,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"aav" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "aaw" = ( /obj/structure/railing/corner{ dir = 8 @@ -221,6 +216,10 @@ }, /turf/open/space/openspace, /area/space) +"acp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "acq" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -284,6 +283,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"acK" = ( +/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/pod/light, +/area/station/maintenance/floor3/starboard/fore) "acL" = ( /obj/structure/table/wood, /obj/item/clothing/mask/cigarette/cigar/cohiba, @@ -459,6 +465,21 @@ /obj/effect/turf_decal/trimline/purple, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"afv" = ( +/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/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "afz" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -466,6 +487,19 @@ /obj/machinery/computer/rdconsole, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"afD" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ + id = "cell-2"; + name = "2nd Floor Prisoner Tube" + }, +/obj/machinery/disposal/delivery_chute{ + name = "prisoner transport" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "afE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -520,13 +554,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"agJ" = ( -/obj/machinery/modular_computer/preset/cargochat/science, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "agK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -677,6 +704,15 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) +"ait" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/item/pillow, +/obj/effect/turf_decal/box, +/obj/machinery/flasher/directional/west{ + id = "drunktank" + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "aiw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -764,6 +800,16 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) +"ajz" = ( +/obj/structure/railing/corner, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "ajB" = ( /obj/effect/spawner/random/trash/mopbucket, /obj/effect/spawner/random/trash/soap, @@ -897,10 +943,6 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) -"alz" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "alK" = ( /obj/machinery/modular_computer/preset/id{ dir = 4 @@ -908,6 +950,12 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"alL" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/fore) "amg" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -1077,6 +1125,10 @@ dir = 4 }, /area/station/medical/pharmacy) +"aoh" = ( +/obj/structure/chair/plastic, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "aom" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1107,21 +1159,6 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) -"aoF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/security/brig) "aoG" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -1251,40 +1288,32 @@ }, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) -"aqa" = ( -/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/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) +"apX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "aqd" = ( /obj/structure/spider/stickyweb, /obj/structure/table, /obj/item/clothing/mask/facehugger/toy, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) -"aqh" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ - id = "cell-2"; - name = "2nd Floor Prisoner Tube" - }, -/obj/machinery/disposal/delivery_chute{ - name = "prisoner transport" - }, -/obj/structure/disposalpipe/trunk{ +"aqm" = ( +/obj/machinery/door/firedoor/border_only, +/obj/structure/railing, +/obj/effect/turf_decal/box/red, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) +"aqu" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "aqx" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 1 @@ -1306,6 +1335,15 @@ dir = 1 }, /area/station/cargo/sorting) +"aqQ" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "aqR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1434,14 +1472,6 @@ "asL" = ( /turf/closed/wall/r_wall, /area/station/construction) -"asN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "asS" = ( /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) @@ -1516,6 +1546,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood/large, /area/station/service/library/lounge) +"atA" = ( +/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/catwalk_floor, +/area/station/maintenance/floor3/port) "atB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -1743,23 +1782,11 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"avY" = ( -/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/science/robotics/lab) "awb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/plating, /area/station/engineering/atmos) -"awc" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/west, -/obj/item/book/granter/action/spell/smoke/lesser, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) "awf" = ( /obj/structure/girder, /turf/open/floor/pod/light, @@ -1781,19 +1808,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/kitchen/diner) -"awu" = ( -/obj/structure/table, -/obj/item/disk/data{ - pixel_x = 5 - }, -/obj/item/disk/data{ - pixel_x = -6 - }, -/obj/item/disk/data{ - pixel_y = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "awA" = ( /obj/structure/table/reinforced, /obj/item/screwdriver, @@ -1847,6 +1861,15 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"axK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/hatch{ + name = "Emergency Ladder Access" + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "axP" = ( /obj/structure/closet/crate/large, /obj/effect/decal/cleanable/dirt, @@ -1994,12 +2017,6 @@ /obj/item/ammo_casing/shotgun/dart, /turf/open/floor/iron/checker, /area/station/service/bar) -"azC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/station/hallway/floor1/fore) "azI" = ( /obj/machinery/camera/autoname/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2017,10 +2034,6 @@ /obj/structure/bookcase/random/religion, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"aAd" = ( -/obj/effect/spawner/structure/window/hollow/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/fore) "aAj" = ( /turf/open/floor/iron/dark/side{ dir = 4 @@ -2050,6 +2063,19 @@ /obj/effect/turf_decal/trimline/purple/warning, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"aAM" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/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/access/any/medical/morgue, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "aAZ" = ( /obj/effect/turf_decal/siding/thinplating_new, /obj/structure/cable, @@ -2080,16 +2106,13 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) +"aBo" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "aBK" = ( /turf/closed/wall/r_wall, /area/station/medical/virology) -"aBP" = ( -/obj/machinery/light/floor, -/obj/machinery/bluespace_vendor/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor4/aft) "aBR" = ( /obj/item/wrench, /obj/structure/rack, @@ -2393,14 +2416,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/lab) -"aFI" = ( -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white/textured, -/area/station/medical/break_room) "aFJ" = ( /obj/machinery/button/door/directional/north{ id = "sm_bolt"; @@ -2410,6 +2425,14 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"aFM" = ( +/obj/machinery/light/directional/east, +/obj/machinery/disposal/bin/tagger, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/office) "aFQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/delivery, @@ -2422,13 +2445,6 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) -"aGj" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/bci_implanter, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "aGm" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -2474,13 +2490,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"aGG" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/turf/open/floor/iron/half{ - dir = 1 - }, -/area/station/engineering/lobby) "aGH" = ( /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/fore) @@ -2532,15 +2541,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) -"aHc" = ( -/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/pod/light, -/area/station/maintenance/floor3/starboard/fore) "aHk" = ( /turf/closed/wall, /area/station/medical/medbay/lobby) @@ -2550,6 +2550,20 @@ }, /turf/open/floor/plating, /area/station/construction) +"aHo" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/office) "aHs" = ( /obj/structure/table, /obj/item/storage/belt/utility/full, @@ -2607,6 +2621,13 @@ }, /turf/open/floor/iron, /area/station/science/auxlab) +"aHW" = ( +/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/floor1/port) "aHX" = ( /obj/machinery/light/red/dim/directional/north, /turf/open/water/beach{ @@ -2659,20 +2680,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor2/aft) -"aIN" = ( -/obj/machinery/status_display/door_timer{ - id = "cell-3"; - name = "Floor 3 Cell"; - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "aIU" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/pod/light, @@ -2710,6 +2717,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"aJD" = ( +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "aJE" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, @@ -2772,17 +2782,20 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"aKj" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "aKq" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/commons/storage/primary) +"aKr" = ( +/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/catwalk_floor, +/area/station/maintenance/floor3/port) "aKt" = ( /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/light, @@ -2890,6 +2903,10 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet) +"aLO" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "aLP" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -2921,6 +2938,24 @@ dir = 4 }, /area/station/hallway/floor3/aft) +"aMo" = ( +/obj/machinery/door/window/right/directional/south{ + name = "Gateway Access"; + req_access = list("gateway") + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/corner, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/arrows/white{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/command/gateway) "aMA" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/engine, @@ -2931,9 +2966,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"aNi" = ( -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard/fore) "aNm" = ( /obj/structure/chair{ dir = 1 @@ -2941,10 +2973,6 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) -"aNo" = ( -/obj/machinery/bluespace_vendor/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "aNs" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor4/starboard/fore) @@ -3021,15 +3049,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) -"aOQ" = ( -/obj/machinery/door/firedoor/border_only, -/obj/structure/railing, -/obj/effect/turf_decal/box/red, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "aOV" = ( /obj/structure/railing{ dir = 4 @@ -3114,21 +3133,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"aQf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "aQk" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/table/wood, @@ -3169,6 +3173,31 @@ "aQK" = ( /turf/closed/wall, /area/station/cargo/drone_bay) +"aQL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/brig) +"aQM" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "aQR" = ( /obj/effect/turf_decal/trimline/yellow/line, /obj/structure/railing, @@ -3222,6 +3251,12 @@ /obj/machinery/telecomms/server/presets/command, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"aRd" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "aRl" = ( /obj/machinery/door/airlock/highsecurity{ name = "AI Upload" @@ -3299,12 +3334,6 @@ "aRU" = ( /turf/closed/wall, /area/station/security/mechbay) -"aRV" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "aRX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3368,12 +3397,7 @@ /area/station/maintenance/floor2/starboard/aft) "aSI" = ( /obj/machinery/shower/directional/west, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) @@ -3389,13 +3413,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"aSP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "aSQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3465,6 +3482,12 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"aTJ" = ( +/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/science/robotics/lab) "aTO" = ( /obj/machinery/power/shuttle_engine/propulsion/burst{ dir = 4 @@ -3554,6 +3577,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"aVc" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/directional/south, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port/aft) "aVk" = ( /obj/machinery/door/airlock/freezer{ name = "Rec Room Showers" @@ -3820,6 +3848,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/abandoned) +"aXW" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor3/port) "aYa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, @@ -3949,12 +3981,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"aYY" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor3/fore) "aZd" = ( /obj/machinery/reagentgrinder, /obj/structure/table, @@ -3984,6 +4010,21 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"aZq" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "aZs" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -4064,16 +4105,6 @@ /obj/item/storage/medkit/regular, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"bal" = ( -/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/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/floor3/fore) "bam" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4189,15 +4220,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) -"bci" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Science Maintenance" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "bcr" = ( /obj/item/shard, /turf/open/floor/iron/dark/textured, @@ -4228,6 +4250,14 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/meeting_room) +"bcH" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "bcK" = ( /obj/structure/railing{ dir = 4 @@ -4460,6 +4490,15 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) +"bfx" = ( +/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/pod/light, +/area/station/maintenance/floor4/starboard/fore) "bfA" = ( /obj/effect/turf_decal/bot, /obj/structure/table/reinforced, @@ -4478,14 +4517,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) -"bfG" = ( -/obj/machinery/door/airlock/hatch{ - name = "Elevator Shaft Access" - }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/turf/open/floor/plating, -/area/station/hallway/floor1/fore) "bfM" = ( /obj/structure/railing{ dir = 8 @@ -4617,6 +4648,20 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) +"bhh" = ( +/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/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "bho" = ( /obj/item/statuebust, /turf/open/misc/beach/sand, @@ -4652,13 +4697,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"bhO" = ( -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/obj/machinery/door/airlock/hatch{ - name = "Science Maintenance" - }, -/turf/open/floor/plating, -/area/station/science/cytology) "bhW" = ( /obj/machinery/conveyor{ dir = 4; @@ -5212,6 +5250,22 @@ /obj/structure/chair/office, /turf/open/floor/iron/white/side, /area/station/science/robotics/lab) +"bmN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "bmO" = ( /obj/effect/turf_decal/trimline/neutral, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -5242,6 +5296,12 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/science/robotics/lab) +"bnt" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/aft) "bnz" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -5258,12 +5318,6 @@ /obj/item/clothing/glasses/hud/health, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) -"bnF" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) "bnI" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -5309,12 +5363,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/carpet/red, /area/station/service/theater) -"bod" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "bof" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -5394,11 +5442,6 @@ /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"boV" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "boY" = ( /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, @@ -5572,13 +5615,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"bro" = ( -/obj/effect/spawner/random/structure/grille, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/port) "brs" = ( /obj/machinery/door/airlock/science/glass{ name = "Laboratory A" @@ -5593,20 +5629,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"bry" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/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/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/starboard) "brA" = ( /obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, @@ -5932,21 +5954,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"buZ" = ( -/obj/structure/sign/poster/contraband/random/directional/south, -/obj/machinery/door/window/brigdoor/security/cell/left/directional/north{ - id = "cell-1"; - name = "1st Floor Prisoner Tube" - }, -/obj/machinery/disposal/delivery_chute{ - dir = 1; - name = "prisoner transport" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "bvc" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -6150,16 +6157,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"bwR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/marker_beacon/jade, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "bwS" = ( /obj/effect/turf_decal/trimline/red/filled/end{ dir = 4 @@ -6246,6 +6243,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) +"bxE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "bxG" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/smooth, @@ -6270,6 +6275,14 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"byc" = ( +/obj/machinery/door/airlock/hatch{ + name = "Elevator Shaft Access" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "byi" = ( /obj/machinery/status_display/evac/directional, /obj/effect/spawner/structure/window, @@ -6352,6 +6365,10 @@ /obj/structure/sink/kitchen/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) +"bzB" = ( +/mob/living/basic/slime, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "bzF" = ( /obj/effect/turf_decal/delivery, /obj/structure/table/reinforced, @@ -6464,13 +6481,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"bAC" = ( -/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/floor2/port) "bAG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6566,6 +6576,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) +"bCr" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "bCz" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, @@ -6576,6 +6592,14 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"bCR" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 8 + }, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, +/turf/open/floor/plating, +/area/station/cargo/bitrunning/den) "bCT" = ( /obj/structure/railing/corner{ dir = 8 @@ -6641,11 +6665,6 @@ "bDL" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint) -"bDP" = ( -/obj/effect/spawner/structure/electrified_grille, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard/aft) "bDU" = ( /obj/effect/turf_decal/delivery, /obj/structure/table/reinforced, @@ -6716,10 +6735,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) -"bFw" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) +"bFq" = ( +/obj/machinery/light/red/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "bFD" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, @@ -6806,24 +6825,11 @@ dir = 8 }, /area/station/ai_monitored/command/storage/eva) -"bHb" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Fitness Room" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) +"bGV" = ( +/obj/machinery/door/window/brigdoor/left/directional/north, +/mob/living/basic/pet/fox, +/turf/open/floor/noslip, +/area/station/maintenance/floor1/port) "bHw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6834,12 +6840,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"bHS" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 4 - }, -/turf/open/openspace, -/area/station/maintenance/floor2/port) "bHU" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -6913,21 +6913,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) -"bIS" = ( -/obj/structure/sign/directions/medical/directional/north{ - dir = 2 - }, -/obj/structure/sign/directions/science/directional/north{ - dir = 2; - pixel_y = 24 - }, -/obj/structure/sign/directions/upload/directional/north{ - dir = 2; - pixel_y = 40 - }, -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) "bIW" = ( /obj/machinery/door/airlock/maintenance/external{ name = "Ports To Supermatter" @@ -6970,15 +6955,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"bJn" = ( -/obj/structure/table/wood/fancy/green, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/spawner/random/contraband/permabrig_weapon, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/station/hallway/floor3/fore) "bJo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6992,15 +6968,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) -"bJB" = ( -/obj/effect/turf_decal/trimline/white/corner{ - dir = 1 +"bJA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ + dir = 8 }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/entry) +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "bJQ" = ( /obj/structure/railing/corner{ dir = 1 @@ -7077,21 +7051,6 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/wood, /area/station/service/theater) -"bKN" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor/preopen{ - elevator_mode = 1; - transport_linked_id = "com_vator" - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "bKP" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -7145,6 +7104,12 @@ }, /turf/open/floor/plating, /area/station/medical/virology) +"bLq" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "bLt" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -7277,13 +7242,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"bNl" = ( -/obj/structure/chair/sofa/bench, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "bNp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7402,10 +7360,17 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 }, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"bPq" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/port) "bPv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7470,6 +7435,18 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"bQn" = ( +/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 = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "bQv" = ( /obj/machinery/power/terminal{ dir = 4 @@ -7477,15 +7454,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/station/maintenance/solars/starboard/fore) -"bQy" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/bitrunning/den) "bQz" = ( /obj/machinery/camera{ c_tag = "Supermatter Foyer Cam #1"; @@ -7592,6 +7560,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) +"bRP" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "bRR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7677,6 +7652,17 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/iron/white, /area/station/maintenance/floor3/starboard/aft) +"bSU" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "bSV" = ( /obj/machinery/door/airlock/medical{ name = "Psychologist's Office" @@ -7861,6 +7847,15 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"bVg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "bVj" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7960,13 +7955,6 @@ /obj/structure/sign/poster/official/cleanliness/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/entry) -"bWZ" = ( -/obj/structure/sign/poster/contraband/hacking_guide/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "bXd" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8124,22 +8112,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"bZt" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/port) "bZA" = ( /obj/structure/table, /obj/item/plate{ @@ -8329,6 +8301,18 @@ /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) +"cbT" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "cca" = ( /obj/structure/transport/linear/public, /obj/effect/landmark/transport/transport_id{ @@ -8711,15 +8695,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/storage) -"cgv" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/station/security/office) "cgw" = ( /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt, @@ -8780,6 +8755,17 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"che" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "chk" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -8850,6 +8836,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"cil" = ( +/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/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "cim" = ( /obj/structure/stairs/north, /obj/structure/sign/departments/cargo/directional/east, @@ -8956,10 +8954,6 @@ }, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) -"ciV" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor4/aft) "ciW" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -9195,6 +9189,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) +"clU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "clV" = ( /obj/structure/closet{ name = "Evidence Closet 4" @@ -9269,23 +9278,6 @@ dir = 10 }, /area/station/hallway/floor3/aft) -"cmJ" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Security - Office Fore" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "cmM" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -9320,12 +9312,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) -"cnt" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard/fore) "cnx" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/machinery/light_switch/directional/west, @@ -9354,19 +9340,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"cnU" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) -"coc" = ( -/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/catwalk_floor, -/area/station/maintenance/floor3/port) "col" = ( /obj/effect/turf_decal/tile/blue/half{ dir = 8 @@ -9415,6 +9388,15 @@ /obj/machinery/holopad, /turf/open/floor/carpet, /area/station/hallway/secondary/entry) +"cpg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/machinery/door/airlock/hatch{ + name = "Genetics Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "cpk" = ( /obj/vehicle/ridden/janicart, /obj/machinery/power/apc/auto_name/directional/east, @@ -9504,17 +9486,17 @@ /obj/item/healthanalyzer, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) -"cqH" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 4 +"cqz" = ( +/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/item/pen, -/obj/effect/turf_decal/trimline/red/filled, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "cqP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9528,20 +9510,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_edge, /area/station/science/robotics/mechbay) -"cqS" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "cqT" = ( /obj/machinery/recycler{ dir = 8 @@ -9600,14 +9568,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"crx" = ( -/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/south, -/obj/machinery/bluespace_vendor/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) "crK" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -9792,6 +9752,20 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"ctY" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "cub" = ( /obj/structure/rack, /obj/item/clothing/under/trek/command/voy, @@ -9800,6 +9774,17 @@ dir = 8 }, /area/station/command/teleporter) +"cuc" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "cuf" = ( /obj/structure/sign/poster/contraband/eat/directional/east, /turf/open/floor/pod/light, @@ -10027,16 +10012,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"cww" = ( -/obj/effect/turf_decal/tile/purple/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/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "cwz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10088,6 +10063,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/lockers) +"cxc" = ( +/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 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/office) "cxg" = ( /obj/machinery/door/airlock/security/glass{ name = "Gen Pop" @@ -10169,11 +10155,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/dorms/apartment1) -"cye" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port) "cyx" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10249,6 +10230,19 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"cAi" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "cAt" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -10258,6 +10252,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"cAJ" = ( +/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/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/security/mechbay) "cAO" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -10408,14 +10410,6 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"cCL" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/robotics/lab) "cCO" = ( /obj/structure/railing{ dir = 8 @@ -10497,16 +10491,6 @@ dir = 4 }, /area/station/service/hydroponics/garden) -"cEf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/structure/cable, -/obj/machinery/door/airlock/hatch{ - name = "Science Maintenance" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor3/starboard/fore) "cEt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10604,6 +10588,11 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"cGn" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "cGt" = ( /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 @@ -10678,6 +10667,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"cHb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "cHd" = ( /obj/effect/turf_decal/siding/white, /obj/effect/turf_decal/trimline/purple/line{ @@ -10718,6 +10714,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor2/port/fore) +"cHy" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Second Deck Outpost" + }, +/obj/effect/mapping_helpers/airlock/access/any/security/brig, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "cHz" = ( /obj/structure/railing{ dir = 8 @@ -10768,6 +10775,20 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"cIo" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/west{ + name = "Outer Window" + }, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Security Desk"; + req_access = list("security") + }, +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "cIr" = ( /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/wood, @@ -11004,15 +11025,6 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input, /turf/open/floor/engine/o2, /area/station/engineering/atmos) -"cLn" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "cLt" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -11030,6 +11042,20 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/commons/dorms/room1) +"cLF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/brig) "cLG" = ( /obj/structure/chair/e_chair, /obj/effect/decal/cleanable/dirt, @@ -11059,6 +11085,14 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"cMb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/small/red/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "cMg" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -11098,6 +11132,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"cMz" = ( +/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/south, +/obj/machinery/bluespace_vendor/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "cMA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11129,10 +11171,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/floor1/aft) -"cNe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "cNf" = ( /obj/item/stack/tile/pod/light, /turf/open/floor/plating, @@ -11144,6 +11182,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"cNm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "cNx" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -11295,6 +11342,10 @@ dir = 8 }, /area/station/engineering/atmos) +"cPT" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "cQa" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -11398,8 +11449,9 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "cRe" = ( -/obj/structure/reagent_dispensers/water_cooler, /obj/machinery/status_display/ai/directional/north, +/obj/structure/secure_safe/caps_spare, +/obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/command/bridge) "cRs" = ( @@ -11483,11 +11535,6 @@ /obj/effect/landmark/start/janitor, /turf/open/floor/eighties, /area/station/service/janitor) -"cSd" = ( -/obj/machinery/door/window/brigdoor/left/directional/north, -/mob/living/basic/pet/fox, -/turf/open/floor/noslip, -/area/station/maintenance/floor1/port) "cSe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11721,6 +11768,12 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"cVJ" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/floor2/aft) "cVK" = ( /obj/machinery/vending/cigarette, /obj/structure/sign/poster/official/random/directional/west, @@ -12117,13 +12170,20 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"cZT" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/machinery/computer/order_console/cook{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "daa" = ( /obj/machinery/camera/motion/directional/north{ c_tag = "Minisat North" }, -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/service) @@ -12165,6 +12225,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/aft) +"daT" = ( +/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/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "daY" = ( /obj/machinery/door/poddoor/shutters{ id = "survhang"; @@ -12337,6 +12407,15 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"ddA" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "ddH" = ( /obj/effect/turf_decal/tile/neutral/full, /obj/machinery/portable_atmospherics/scrubber, @@ -12408,12 +12487,6 @@ /obj/machinery/door/airlock/shuttle, /turf/open/floor/mineral/plastitanium, /area/station/maintenance/floor2/starboard/aft) -"dem" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "deu" = ( /obj/structure/railing{ dir = 1 @@ -12424,14 +12497,6 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"dex" = ( -/obj/structure/railing, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "deF" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, @@ -12447,20 +12512,6 @@ "deM" = ( /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"deN" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/starboard) "dfa" = ( /obj/item/flashlight/lamp/green, /obj/structure/table/wood, @@ -12513,6 +12564,15 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/light/colour_cycle/dancefloor_a, /area/station/medical/abandoned) +"dfs" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor3/port) "dfw" = ( /obj/machinery/status_display/ai/directional/west, /turf/open/openspace, @@ -12604,6 +12664,16 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment2) +"dgA" = ( +/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/pods/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "dgU" = ( /obj/structure/cable, /obj/machinery/light/red/dim/directional/north, @@ -12629,16 +12699,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/science/cytology) -"dhn" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=2-13"; - location = "2-12" - }, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/hallway/floor2/aft) "dhs" = ( /obj/structure/table/wood/fancy/royalblack, /obj/item/modular_computer/laptop/preset/civilian, @@ -12741,6 +12801,10 @@ /obj/machinery/recharger, /turf/open/floor/iron/white/small, /area/station/security/execution/education) +"djs" = ( +/obj/structure/railing, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port/fore) "djv" = ( /obj/effect/landmark/start/research_director, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -12779,14 +12843,6 @@ /obj/effect/turf_decal/trimline/green/warning, /turf/open/floor/pod, /area/station/maintenance/floor3/starboard) -"djG" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "djH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12938,13 +12994,6 @@ "dmU" = ( /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/entry) -"dmZ" = ( -/obj/machinery/modular_computer/preset/cargochat/medical{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/textured, -/area/station/medical/break_room) "dnx" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -13130,11 +13179,6 @@ /obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) -"dqh" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/turf/open/floor/carpet/black, -/area/station/hallway/secondary/service) "dqm" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -13191,15 +13235,6 @@ /obj/machinery/light/broken/directional/south, /turf/open/floor/plating, /area/station/medical/abandoned) -"dqG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/starboard/fore) "dqM" = ( /obj/effect/turf_decal/trimline/brown/line{ dir = 1 @@ -13269,12 +13304,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"drz" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor3/fore) "drA" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/structure/cable, @@ -13458,6 +13487,20 @@ /obj/machinery/space_heater, /turf/open/floor/iron, /area/station/engineering/atmos) +"dtU" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/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/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "dtX" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -13541,18 +13584,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"dvy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/security/mechbay) "dvA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13731,6 +13762,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/office) +"dya" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/table, +/turf/open/floor/iron/white, +/area/station/science/circuits) "dyk" = ( /obj/structure/transit_tube/station/dispenser{ dir = 8 @@ -13994,12 +14030,6 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/station/commons/locker) -"dAS" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 1 - }, -/turf/open/openspace, -/area/station/maintenance/floor3/starboard/fore) "dAU" = ( /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plating, @@ -14225,13 +14255,6 @@ "dEt" = ( /turf/closed/wall, /area/station/maintenance/floor2/starboard/aft) -"dEu" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) "dED" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 5 @@ -14306,6 +14329,16 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"dFn" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "dFq" = ( /obj/structure/cable, /obj/machinery/power/terminal, @@ -14388,6 +14421,19 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"dGE" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard) "dGF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -14435,6 +14481,11 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"dHq" = ( +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "dHD" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -14528,11 +14579,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"dIW" = ( -/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/first) "dIX" = ( /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark, @@ -14547,18 +14593,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/bar/atrium) -"dJn" = ( -/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/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "dJo" = ( /obj/effect/landmark/navigate_destination/gateway, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -14738,19 +14772,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"dLK" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port/fore) "dLL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14926,12 +14947,6 @@ /obj/structure/frame/machine, /turf/open/floor/engine, /area/station/maintenance/floor1/port/aft) -"dNU" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "dOa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15114,6 +15129,11 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) +"dQX" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/quantumpad, +/turf/open/floor/iron, +/area/station/science/auxlab) "dRb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/ash, @@ -15211,6 +15231,16 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"dSm" = ( +/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/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "dSn" = ( /obj/structure/closet{ name = "Evidence Closet 5" @@ -15282,35 +15312,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"dSQ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/machinery/door/poddoor{ - elevator_mode = 1; - transport_linked_id = "com_vator" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "dSS" = ( /obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle, /obj/structure/girder/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"dSW" = ( -/obj/structure/chair/sofa/bench/left, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "dTe" = ( /obj/structure/chair/wood/wings{ dir = 4 @@ -15333,22 +15340,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"dTq" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) -"dTz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/airlock/hatch{ - name = "Science Maintenance" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "dTB" = ( /obj/structure/table/wood, /obj/item/newspaper{ @@ -15360,16 +15351,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"dTC" = ( -/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/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "dTF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -15754,10 +15735,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"dXs" = ( -/obj/effect/spawner/structure/window/hollow/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard) "dXy" = ( /obj/effect/turf_decal/tile/blue/full, /obj/structure/closet/secure_closet/medical1, @@ -15771,6 +15748,12 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"dXA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/floor2/aft) "dXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15888,17 +15871,6 @@ /obj/structure/hedge, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"dZX" = ( -/obj/effect/turf_decal/trimline/blue/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "eac" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16027,12 +15999,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/fore) -"eca" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "ecf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -16094,11 +16060,6 @@ /obj/machinery/light/red/dim/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"ecW" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/quantumpad, -/turf/open/floor/iron/smooth, -/area/station/science/robotics/mechbay) "ede" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -16198,15 +16159,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/hallway/floor1/fore) -"eel" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "eem" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -16351,13 +16303,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) -"egj" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "egx" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, @@ -16657,6 +16602,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"ejN" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port/aft) "ejP" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) @@ -16704,35 +16655,11 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"ekD" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard) "ekI" = ( /turf/open/floor/iron/half{ dir = 1 }, /area/station/engineering/atmos/hfr_room) -"ekJ" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/robotics/lab) "ekY" = ( /obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ dir = 4 @@ -16848,6 +16775,21 @@ /obj/item/reagent_containers/cup/blastoff_ampoule, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) +"emr" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "emu" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -16947,11 +16889,11 @@ /area/station/maintenance/floor4/starboard/aft) "enl" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/machinery/airalarm/directional/east, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "enp" = ( @@ -16964,6 +16906,11 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"enB" = ( +/obj/machinery/door/window/brigdoor/left/directional/north, +/mob/living/basic/mothroach, +/turf/open/floor/noslip, +/area/station/maintenance/floor1/port) "enE" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -16989,14 +16936,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) -"enP" = ( -/obj/machinery/module_duplicator, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/circuits) "enX" = ( /obj/effect/turf_decal/weather/dirt{ dir = 5 @@ -17120,6 +17059,14 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"epz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "epB" = ( /obj/machinery/destructive_scanner, /turf/open/floor/iron/white, @@ -17182,6 +17129,10 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/construction) +"eqV" = ( +/obj/structure/disposalpipe/trunk/multiz/down, +/turf/open/openspace, +/area/station/maintenance/floor4/port/aft) "erp" = ( /turf/open/floor/iron/smooth, /area/station/hallway/floor4/aft) @@ -17679,24 +17630,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/storage/primary) -"ezj" = ( -/obj/effect/turf_decal/trimline/brown/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark/smooth_half, -/area/station/cargo/bitrunning/den) "ezm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -17709,6 +17642,15 @@ /obj/machinery/shower/directional/west, /turf/open/floor/catwalk_floor/iron, /area/station/hallway/secondary/entry) +"ezy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "ezC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17803,13 +17745,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/entry) -"eAs" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "eAv" = ( /obj/effect/turf_decal/bot, /obj/machinery/hydroponics/constructable, @@ -17818,17 +17753,6 @@ "eAE" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/fore) -"eAJ" = ( -/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 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/office) "eAP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18063,11 +17987,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/openspace, /area/station/medical/pharmacy) -"eDW" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet/any, -/turf/open/floor/wood, -/area/station/medical/psychology) "eEd" = ( /obj/machinery/door/airlock/command/glass{ name = "Ancient Office" @@ -18199,6 +18118,14 @@ /obj/machinery/light/dim/directional/east, /turf/open/floor/carpet/red, /area/station/service/theater) +"eFz" = ( +/obj/structure/chair/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/chapel/office) "eFC" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -18298,16 +18225,6 @@ dir = 5 }, /area/station/hallway/floor4/fore) -"eHv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "eHD" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -18509,6 +18426,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/auxlab) +"eKe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "eKf" = ( /obj/item/radio/intercom/directional/east, /obj/structure/disposalpipe/segment{ @@ -18656,6 +18584,12 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/lobby) +"eLS" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/item/radio/intercom/directional/south, +/obj/machinery/bci_implanter, +/turf/open/floor/iron/white, +/area/station/science/circuits) "eMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -18716,6 +18650,12 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) +"eNw" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "eNM" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/misc/snow/actually_safe{ @@ -18735,17 +18675,6 @@ /obj/structure/sign/departments/restroom/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) -"eNV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/official/random/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/checkpoint) "eNX" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -18758,14 +18687,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) -"eOc" = ( -/obj/structure/table, -/obj/item/toy/cards/deck/wizoff, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "eOf" = ( /obj/structure/chair/office{ dir = 8 @@ -18797,6 +18718,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) +"eOC" = ( +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "eOP" = ( /turf/closed/wall/r_wall, /area/station/hallway/floor4/aft) @@ -18817,23 +18742,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"ePq" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/office) +"ePs" = ( +/obj/structure/railing/corner, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port/fore) "ePv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18912,6 +18824,18 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"eQi" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/obj/machinery/flasher/directional/east{ + name = "drunktank" + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "eQm" = ( /obj/structure/chair/sofa/left{ dir = 8 @@ -18998,6 +18922,14 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"eSq" = ( +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "eSw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/south, @@ -19012,12 +18944,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"eSH" = ( -/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/floor2/fore) "eSI" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/directional, @@ -19033,6 +18959,15 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"eSP" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/carpet, +/area/station/cargo/miningdock) "eSX" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -19154,12 +19089,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"eUA" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "eUJ" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -19176,6 +19105,14 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"eUT" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "eUU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19277,14 +19214,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"eWv" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "eWC" = ( /obj/machinery/airalarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -19394,6 +19323,13 @@ /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"eYm" = ( +/obj/machinery/door/airlock/hatch{ + name = "Psych Office Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/psychology, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "eYp" = ( /obj/structure/railing/corner{ dir = 1 @@ -19496,16 +19432,6 @@ /obj/effect/landmark/start/psychologist, /turf/open/floor/iron/white, /area/station/medical/psychology) -"fah" = ( -/obj/effect/turf_decal/trimline/green/warning{ - dir = 4 - }, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/port) "faq" = ( /obj/effect/turf_decal/trimline/purple/end, /obj/machinery/shower/directional/south, @@ -19544,20 +19470,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) -"faG" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/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/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "faL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/freezer, @@ -19757,6 +19669,17 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) +"feH" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "feP" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -19789,12 +19712,6 @@ /obj/item/clothing/glasses/science, /turf/open/floor/iron/white, /area/station/science/cytology) -"ffs" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/openspace, -/area/station/maintenance/floor3/port) "ffv" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -19803,6 +19720,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) +"ffz" = ( +/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, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "ffA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -19843,11 +19768,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/janitor) -"fgh" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/quantumpad, -/turf/open/floor/iron, -/area/station/science/auxlab) "fgr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes{ @@ -19879,13 +19799,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/office) -"fgZ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Ladder Access" - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor1/fore) "fhl" = ( /obj/structure/bed{ dir = 1 @@ -19974,6 +19887,10 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) +"fhX" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "fhZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20081,19 +19998,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"fjt" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/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/access/any/medical/morgue, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port) "fjv" = ( /obj/machinery/light/red/dim/directional/south, /turf/open/floor/plating, @@ -20254,6 +20158,11 @@ /obj/machinery/recharger, /turf/open/floor/iron/dark, /area/station/command/gateway) +"fkW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "flf" = ( /obj/machinery/button/door/directional/east{ id = "psy"; @@ -20297,6 +20206,13 @@ /obj/structure/table/wood, /turf/open/floor/wood/tile, /area/station/service/library) +"flx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "flD" = ( /obj/machinery/smartfridge, /obj/machinery/door/firedoor/heavy, @@ -20325,13 +20241,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor1/port) -"fmd" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/machinery/bluespace_vendor/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "fmg" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -20422,6 +20331,15 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"fnF" = ( +/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/floor3/port) "fnL" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/power/terminal{ @@ -20482,6 +20400,24 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/office) +"foa" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Fitness Room" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "fod" = ( /obj/structure/table/wood/fancy/red, /obj/item/flashlight/flare/candle, @@ -20585,16 +20521,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/plating, /area/station/hallway/floor1/aft) -"fpv" = ( -/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/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "fpD" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -20629,6 +20555,12 @@ "fpU" = ( /turf/open/floor/glass, /area/station/service/library) +"fpW" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard/fore) "fqe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20696,13 +20628,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) -"fqR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "frw" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 8 @@ -20791,6 +20716,17 @@ "fsJ" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload) +"fsK" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "fsR" = ( /obj/item/kirbyplants/random, /obj/machinery/light/directional/east, @@ -20805,6 +20741,17 @@ dir = 1 }, /area/station/hallway/floor4/fore) +"ftl" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "ftp" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/antiweed, @@ -20946,22 +20893,6 @@ dir = 8 }, /area/station/cargo/drone_bay) -"fuY" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "fvb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21140,14 +21071,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) -"fyl" = ( -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/floor2/aft) "fyQ" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 1 @@ -21191,17 +21114,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/lobby) -"fzF" = ( -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor/border_only, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "fzG" = ( /obj/structure/railing/corner{ dir = 8 @@ -21273,6 +21185,13 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/escape_pod) +"fAy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port/aft) "fAz" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -21355,6 +21274,12 @@ dir = 1 }, /area/station/command/bridge) +"fBJ" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "fBM" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -21371,6 +21296,20 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"fBT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "fBX" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/trash/mess, @@ -21570,6 +21509,14 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"fDZ" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/south, +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/break_room) "fEj" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -21616,13 +21563,6 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"fEI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/grille/broken, -/obj/structure/ladder, -/turf/open/floor/plating, -/area/station/hallway/floor1/fore) "fES" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -21690,15 +21630,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/qm) -"fFJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "fFT" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/side{ @@ -21965,21 +21896,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"fJd" = ( -/obj/machinery/computer/upload/borg, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/door/window/left/directional/south{ - layer = 3.1; - name = "Cyborg Upload Console Window"; - req_access = list("ai_upload") - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "fJl" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, @@ -22126,10 +22042,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron, /area/station/hallway/floor4/fore) -"fLe" = ( -/obj/structure/chair/plastic, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "fLf" = ( /obj/structure/window/spawner/directional/south, /turf/open/floor/iron/dark/textured, @@ -22343,6 +22255,16 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) +"fOl" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "fOq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22352,15 +22274,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"fOs" = ( -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor/border_only, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port) "fOu" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -22397,6 +22310,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/maintenance/floor2/starboard/aft) +"fOR" = ( +/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/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/floor3/fore) "fOS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ @@ -22813,6 +22736,12 @@ /obj/structure/sign/poster/official/report_crimes/directional/west, /turf/open/floor/wood, /area/station/hallway/floor4/fore) +"fUv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "fUM" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -22826,6 +22755,11 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) +"fUZ" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/corner, +/area/station/security/brig) "fVe" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -22844,6 +22778,14 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics/garden/abandoned) +"fVi" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/light/cold/no_nightlight/directional/north, +/obj/machinery/module_duplicator, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "fVq" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -22870,23 +22812,6 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/hallway/floor2/aft) -"fVM" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/comfy{ - dir = 8 - }, -/obj/effect/landmark/start/depsec/medical, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) -"fVQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/fore) "fVV" = ( /turf/closed/wall, /area/station/service/chapel/funeral) @@ -22931,10 +22856,6 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"fWp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "fWr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22958,13 +22879,21 @@ /obj/structure/emergency_shield/regenerating, /turf/open/floor/plating, /area/station/cargo/miningdock) -"fWH" = ( +"fWY" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/aft) +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/fore) "fWZ" = ( /obj/structure/table, /obj/item/stack/sheet/plasteel/fifty, @@ -23128,15 +23057,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) -"fYn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/checkpoint) "fYr" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, @@ -23180,6 +23100,14 @@ }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"fYJ" = ( +/obj/structure/chair/sofa/bench/left, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "fYM" = ( /obj/structure/table/wood/fancy/red, /obj/item/flashlight/flare/candle{ @@ -23361,6 +23289,17 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"gbh" = ( +/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 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/aft) "gbj" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/pod/light, @@ -23376,6 +23315,18 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"gby" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gbR" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/sunny/style_random, @@ -23548,6 +23499,22 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) +"geh" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/port) "gej" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/green/half, @@ -23659,14 +23626,6 @@ dir = 8 }, /area/station/engineering/storage/tech) -"ggc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "ggd" = ( /obj/structure/railing{ dir = 8 @@ -23746,6 +23705,13 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"gha" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/iron/dark, +/area/station/maintenance/floor2/starboard/aft) "ghg" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 10 @@ -23777,9 +23743,13 @@ /turf/open/floor/iron, /area/station/hallway/floor3/aft) "ghX" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor3/starboard) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/port/fore) "ghZ" = ( /obj/structure/table, /obj/item/inspector{ @@ -23941,12 +23911,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/side, /area/station/security/prison) -"gjK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "gjP" = ( /obj/effect/turf_decal/trimline/white/filled/corner, /turf/open/floor/iron/dark, @@ -23958,13 +23922,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"gjZ" = ( -/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/pod/light, -/area/station/maintenance/floor3/starboard/fore) "gkq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -24005,12 +23962,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/brig) -"gln" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "glo" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 5 @@ -24110,18 +24061,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"gmy" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "gmA" = ( /obj/structure/railing/corner{ dir = 4 @@ -24200,15 +24139,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/pumproom) -"gnC" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/obj/effect/turf_decal/caution{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "gnL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/blood/old, @@ -24325,14 +24255,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) -"gpp" = ( -/obj/effect/turf_decal/trimline/red/filled/end{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/closet/bombcloset/security, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "gpt" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -24365,6 +24287,32 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/printer) +"gpW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/marker_beacon/jade, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) +"gpZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/directional/south, +/obj/machinery/lift_indicator/directional/south{ + linked_elevator_id = "com_vator"; + pixel_y = -36 + }, +/obj/machinery/button/elevator/directional/south{ + id = "com_vator" + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor1/fore) "gqi" = ( /turf/open/floor/iron/white/side{ dir = 4 @@ -24383,12 +24331,17 @@ /obj/effect/turf_decal/stripes/full, /turf/open/floor/noslip, /area/station/engineering/supermatter/room) -"gqx" = ( -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 +"gqs" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 }, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/floor2/aft) +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "gqF" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -24409,13 +24362,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/smooth_large, /area/station/maintenance/floor2/starboard/aft) -"gqN" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "gqO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24506,29 +24452,6 @@ "grN" = ( /turf/closed/wall/r_wall, /area/station/medical/paramedic) -"grO" = ( -/obj/structure/table, -/obj/item/key/security, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/item/key/security, -/obj/machinery/button/flasher{ - id = "drunktank"; - name = "Drunk Tank Flasher" - }, -/turf/open/floor/iron/dark, -/area/station/security/warden) -"grU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/obj/machinery/door/airlock/hatch{ - name = "Genetics Maintenance" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "grW" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24545,6 +24468,11 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"gsh" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "gsn" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/chair/stool/bar/directional/east, @@ -24582,6 +24510,15 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/hallway/floor2/aft) +"gsx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard/fore) "gsy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -24713,12 +24650,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, /area/station/science/cytology) -"guC" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "guF" = ( /obj/machinery/camera/autoname/directional/west, /obj/machinery/newscaster/directional/west, @@ -24821,6 +24752,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plastic, /area/station/security/prison/shower) +"gvV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "gvX" = ( /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark/side{ @@ -24864,6 +24801,20 @@ dir = 6 }, /area/station/hallway/floor2/aft) +"gwE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "gwH" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -25171,31 +25122,11 @@ /obj/machinery/vending/wallmed/directional/south, /turf/open/floor/iron/white, /area/station/security/medical) -"gAN" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/starboard) "gAP" = ( /obj/item/reagent_containers/spray/syndicate, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"gAR" = ( -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor4/aft) "gAT" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -25259,14 +25190,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"gBB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "gBG" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -25404,6 +25327,16 @@ "gDy" = ( /turf/closed/wall, /area/station/maintenance/floor4/starboard) +"gDL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gDM" = ( /obj/effect/turf_decal/siding/wideplating, /obj/effect/turf_decal/siding/wideplating{ @@ -25437,6 +25370,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) +"gEe" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Third Deck Outpost" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/security/brig, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "gEf" = ( /turf/closed/wall, /area/station/solars/port/aft) @@ -25496,6 +25443,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) +"gET" = ( +/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/floor2/fore) "gEW" = ( /obj/machinery/computer/communications{ dir = 1 @@ -25536,6 +25489,17 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) +"gFT" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Security - Office Aft" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/office) "gGe" = ( /obj/machinery/telecomms/bus/preset_one, /turf/open/floor/circuit/telecomms, @@ -25616,6 +25580,17 @@ }, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain) +"gGX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "gHi" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26023,6 +25998,12 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"gLD" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "gLE" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -26125,16 +26106,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/pod/light, /area/station/maintenance/department/engine/atmos) -"gNg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/office) "gNi" = ( /obj/machinery/conveyor{ dir = 4; @@ -26151,6 +26122,21 @@ /obj/item/reagent_containers/spray/cleaner, /turf/open/floor/carpet/royalblue, /area/station/medical/break_room) +"gNL" = ( +/obj/item/radio/intercom/directional/east, +/obj/machinery/button/door/directional/south{ + id = "secmechbay"; + name = "Security Mech Garage Door Controls"; + req_access = list("security") + }, +/obj/effect/turf_decal/trimline/brown/filled/end{ + dir = 8 + }, +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/office) "gNN" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard) @@ -26175,14 +26161,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"gOm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/small/red/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "gOp" = ( /obj/effect/turf_decal/stripes, /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, @@ -26298,14 +26276,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) -"gQr" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/simple/purple, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "gQx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -26454,21 +26424,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/hallway/secondary/entry) -"gSm" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "gSn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -26595,6 +26550,11 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"gUc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/engine/cult, +/area/station/service/library/private) "gUp" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 @@ -26614,21 +26574,6 @@ /obj/effect/spawner/random/armory/laser_gun, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"gUL" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/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/unres{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor3/starboard/fore) "gUO" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/purple, @@ -26656,6 +26601,10 @@ }, /turf/open/floor/iron/textured_large, /area/station/cargo/warehouse) +"gUT" = ( +/mob/living/basic/slime, +/turf/open/floor/grass, +/area/station/maintenance/floor3/starboard) "gUX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -26683,17 +26632,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/fore) -"gVz" = ( -/obj/structure/sign/directions/medical/directional/north, -/obj/structure/sign/directions/science/directional/north{ - pixel_y = 24 - }, -/obj/structure/sign/directions/upload/directional/north{ - pixel_y = 40 - }, -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "gVA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -26876,17 +26814,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor2/port/aft) -"gYg" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Mass Driver"; - req_access = list("chapel_office") - }, -/obj/effect/turf_decal/siding/white, -/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ - pixel_x = 24 - }, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/funeral) "gYh" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -26929,12 +26856,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "gYI" = ( -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/machinery/duct, /turf/open/floor/iron/showroomfloor{ name = "bathroom tiles" @@ -26957,6 +26879,21 @@ "gYS" = ( /turf/closed/wall/r_wall, /area/station/hallway/floor4/fore) +"gYX" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/door/poddoor{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "gZf" = ( /obj/machinery/camera/autoname/directional/west, /obj/structure/table, @@ -26997,11 +26934,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) -"gZN" = ( -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/directional/south, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port/aft) "gZQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible/layer1{ dir = 6 @@ -27062,6 +26994,11 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/wood/tile, /area/station/service/library) +"hax" = ( +/obj/machinery/photobooth, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "haB" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/iv_drip, @@ -27077,6 +27014,10 @@ /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/grass, /area/station/science/genetics) +"haM" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "haS" = ( /obj/structure/fluff/paper/stack{ desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; @@ -27213,6 +27154,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) +"hch" = ( +/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/border_only{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "hci" = ( /obj/machinery/power/terminal{ dir = 1 @@ -27226,6 +27180,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/fore) +"hcr" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/firealarm/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/smooth_edge{ + dir = 1 + }, +/area/station/science/robotics/mechbay) "hct" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, @@ -27400,6 +27364,12 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/iron, /area/station/service/hydroponics) +"heI" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "heR" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -27481,13 +27451,6 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/dark/smooth_large, /area/station/service/library/printer) -"hfV" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "hge" = ( /turf/open/floor/engine, /area/station/command/heads_quarters/rd) @@ -27513,6 +27476,15 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) +"hgD" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "hgE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/autoname/directional/east, @@ -27562,34 +27534,10 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/engine/airless, /area/station/engineering/supermatter/waste) -"hhc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "hhf" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/aft) -"hhi" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "hhk" = ( /obj/structure/foamedmetal, /turf/open/floor/plating, @@ -27702,6 +27650,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"hiU" = ( +/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/blue/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "hjd" = ( /obj/effect/turf_decal/tile/blue/half{ dir = 8 @@ -27728,16 +27686,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"hjl" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "hjr" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -28348,6 +28296,20 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"hrW" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) +"hsa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "hse" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -28496,26 +28458,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/fore) -"htL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/random/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) -"htN" = ( -/obj/machinery/door/airlock/hatch{ - name = "Elevator Shaft Access" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "htW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron, @@ -28618,6 +28560,12 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark, /area/station/security/evidence) +"hvC" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "hvD" = ( /obj/machinery/camera{ c_tag = "Atmos Tank #2 - O2"; @@ -28729,6 +28677,22 @@ }, /turf/open/openspace, /area/station/ai_monitored/turret_protected/aisat/service) +"hwP" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/starboard) "hwQ" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, @@ -28890,6 +28854,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/science/lab) +"hzq" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/fore) "hzu" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -29000,6 +28969,13 @@ /obj/structure/flora/bush/style_random, /turf/open/floor/grass, /area/station/security/courtroom) +"hAH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "hAI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -29050,6 +29026,26 @@ /obj/structure/stairs/west, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"hAV" = ( +/obj/structure/table, +/obj/machinery/button/ticket_machine{ + pixel_x = -24; + pixel_y = -6 + }, +/obj/item/stamp/head/hop{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/flashlight/lamp{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/machinery/button/photobooth{ + pixel_y = 6; + pixel_x = -24 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "hBe" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -29083,19 +29079,6 @@ dir = 1 }, /area/station/hallway/floor2/aft) -"hBL" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard/aft) "hBN" = ( /obj/structure/railing{ dir = 1 @@ -29196,10 +29179,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/science/genetics) -"hCZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/fore) "hDa" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/plating/elevatorshaft, @@ -29252,6 +29231,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) +"hDU" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard) "hDZ" = ( /obj/structure/table/wood, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -29265,22 +29249,18 @@ /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) "hEm" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/holopad, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 9 }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "hEo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/fore) -"hEr" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/fore) "hEu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29319,6 +29299,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit) +"hFb" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port/fore) "hFc" = ( /obj/structure/table/wood, /obj/item/chisel, @@ -29436,6 +29429,14 @@ /obj/effect/landmark/blobstart, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) +"hGC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ + dir = 1 + }, +/obj/effect/spawner/structure/window/hollow/plasma/middle, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance/freezerchamber) "hGL" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -29594,10 +29595,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"hIq" = ( -/obj/structure/hedge, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "hIB" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -29700,21 +29697,6 @@ /obj/machinery/light/red/dim/directional/east, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) -"hJS" = ( -/obj/structure/table/wood, -/obj/item/camera_film{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/camera_film{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/camera, -/obj/machinery/light/directional/east, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/engine/cult, -/area/station/service/library/private) "hJU" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes, @@ -29987,6 +29969,13 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/station/science/ordnance/storage) +"hNr" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "hNz" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -30023,10 +30012,20 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"hNL" = ( -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) +"hNO" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ + id = "cell-3"; + name = "3rd Floor Prisoner Tube" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/delivery_chute{ + name = "prisoner transport"; + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "hNU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/neutral/warning{ @@ -30049,10 +30048,6 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) -"hOz" = ( -/obj/structure/disposalpipe/trunk/multiz, -/turf/open/openspace, -/area/station/maintenance/floor2/port) "hOF" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -30420,6 +30415,17 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) +"hTD" = ( +/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/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "hTJ" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, @@ -30428,6 +30434,24 @@ /obj/machinery/medical_kiosk, /turf/open/floor/plating, /area/station/medical/abandoned) +"hTP" = ( +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark/smooth_half, +/area/station/cargo/bitrunning/den) "hUc" = ( /obj/structure/railing{ dir = 8 @@ -30722,20 +30746,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"hXE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/machinery/door/poddoor/shutters{ - id = "secmechbay"; - name = "Security Mech Bay Shutters" - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/box, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/mechbay) "hXI" = ( /obj/structure/chair/wood{ dir = 1 @@ -30871,13 +30881,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/chapel, /area/station/service/chapel) -"ial" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "iaq" = ( /obj/machinery/light/cold/no_nightlight/directional/north, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -30945,6 +30948,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/medbay/aft) +"ibo" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor4/starboard/fore) "ibs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30963,6 +30972,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"ibF" = ( +/obj/structure/table/wood/fancy/green, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/spawner/random/contraband/permabrig_weapon, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "ibJ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -31078,16 +31096,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/white, /area/station/medical/psychology) -"icF" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "icY" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -31226,6 +31234,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"ifk" = ( +/obj/structure/sign/directions/dorms/directional/north{ + dir = 2 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "ifo" = ( /obj/structure/tank_holder/emergency_oxygen, /obj/effect/turf_decal/stripes/line{ @@ -31241,6 +31256,16 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) +"ifw" = ( +/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/door/airlock/hatch{ + name = "Emergency Ladder Access" + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor4/aft) "ifx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_empty/crate/with_loot, @@ -31263,6 +31288,20 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"ifF" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Briefing Room" + }, +/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/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/office) "ifG" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/side{ @@ -31274,13 +31313,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/gravity_generator) -"ifZ" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/stripes/white/line, +"ifV" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/medical, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, -/area/station/science/circuits) +/area/station/security/checkpoint/second) "igd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -31288,17 +31332,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"ige" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard) "igw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31327,10 +31360,15 @@ "igE" = ( /turf/closed/wall, /area/station/science/robotics/mechbay) -"igN" = ( -/obj/machinery/bluespace_vendor/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"igI" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "igQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31351,15 +31389,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) -"ihd" = ( -/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/catwalk_floor, -/area/station/maintenance/floor3/port) "ihj" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/landmark/start/chemist, @@ -31407,12 +31436,6 @@ /obj/structure/closet/crate/engineering, /turf/open/floor/plating, /area/station/engineering/lobby) -"ihv" = ( -/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/hallway/floor3/fore) "ihC" = ( /obj/item/stack/sheet/iron, /turf/open/floor/plating, @@ -31432,6 +31455,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"ihQ" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "ihV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31554,6 +31581,26 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/auxlab) +"ijT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "ijX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/directional, @@ -31905,16 +31952,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/carpet, /area/station/medical/psychology) -"ios" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/fore) "iot" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -31937,6 +31974,10 @@ /obj/machinery/computer/records/medical/laptop, /turf/open/floor/carpet, /area/station/security/detectives_office) +"ioG" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "ioL" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/plating/foam, @@ -32098,6 +32139,10 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"iqL" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "iqR" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -32173,12 +32218,6 @@ dir = 1 }, /area/station/science/robotics/mechbay) -"irE" = ( -/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/hallway/floor2/fore) "irI" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/machinery/status_display/ai/directional/east, @@ -32195,11 +32234,6 @@ dir = 6 }, /area/station/hallway/floor1/fore) -"irO" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "irS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -32248,6 +32282,15 @@ /obj/effect/landmark/navigate_destination/dockaux, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"isz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "isA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -32420,10 +32463,13 @@ /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /turf/open/floor/engine, /area/station/science/cytology) -"ive" = ( -/obj/machinery/holopad, +"iva" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) +/area/station/security/checkpoint/second) "ivg" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/decal/cleanable/confetti, @@ -32455,6 +32501,13 @@ dir = 8 }, /area/station/hallway/floor3/fore) +"ivz" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "ivD" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 6 @@ -32692,15 +32745,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"izo" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/airalarm/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/security/mechbay) "izq" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -32882,6 +32926,18 @@ }, /turf/open/floor/plastic, /area/station/security/prison/shower) +"iBn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port) "iBo" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/folder/white, @@ -32933,6 +32989,11 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"iCg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "iCh" = ( /obj/machinery/light/directional/south, /obj/machinery/newscaster/directional/south, @@ -33003,6 +33064,18 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"iCK" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "iCP" = ( /obj/structure/sign/poster/random/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -33144,6 +33217,13 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) +"iEW" = ( +/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/floor2/port) "iFi" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/cable, @@ -33183,6 +33263,28 @@ /obj/structure/table/wood, /turf/open/floor/glass/reinforced, /area/station/service/library) +"iFy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) +"iGd" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard) "iGh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33479,17 +33581,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/service/lawoffice) -"iKu" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "iKw" = ( /obj/effect/turf_decal/stripes{ dir = 9 @@ -33510,14 +33601,16 @@ "iKD" = ( /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) -"iKG" = ( -/obj/structure/cable, +"iKJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/hangover, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor4/aft) +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "iKR" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, @@ -33559,6 +33652,12 @@ }, /turf/open/floor/noslip, /area/station/medical/virology) +"iLM" = ( +/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) "iLR" = ( /obj/structure/window/reinforced/tinted/spawner/directional/south, /obj/structure/mirror/directional/west, @@ -33706,20 +33805,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/hallway/floor1/aft) -"iNI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/security/brig) "iNK" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/textured_corner, @@ -33816,6 +33901,25 @@ "iOA" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/starboard) +"iOD" = ( +/obj/machinery/computer/upload/ai, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "AI Upload Chamber - Fore"; + network = list("aiupload") + }, +/obj/machinery/door/window/right/directional/south{ + name = "Upload Console Window"; + req_access = list("ai_upload"); + layer = 3 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "iOL" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -33825,6 +33929,13 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"iOQ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "iOV" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -33972,11 +34083,30 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"iQy" = ( +/obj/structure/railing, +/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/pod/light, +/area/station/maintenance/floor4/starboard/fore) "iQB" = ( /obj/machinery/space_heater, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"iQC" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor/preopen{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "iQF" = ( /obj/machinery/hydroponics/soil, /obj/item/plant_analyzer, @@ -34225,7 +34355,6 @@ /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "iUP" = ( -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 1 }, @@ -34233,6 +34362,7 @@ dir = 1 }, /obj/machinery/newscaster/directional/south, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark/side{ dir = 10 }, @@ -34320,6 +34450,10 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) +"iWi" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "iWm" = ( /obj/structure/closet/l3closet/janitor, /turf/open/floor/iron, @@ -34364,6 +34498,17 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"iWQ" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Mass Driver"; + req_access = list("chapel_office") + }, +/obj/effect/turf_decal/siding/white, +/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ + pixel_x = 24 + }, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/funeral) "iWT" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -34402,17 +34547,6 @@ /obj/item/restraints/legcuffs/beartrap/prearmed, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"iXf" = ( -/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/side{ - dir = 4 - }, -/area/station/hallway/floor2/aft) "iXk" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34458,6 +34592,14 @@ "iXF" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) +"iXK" = ( +/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/disposalpipe/segment, +/turf/open/floor/iron/dark/side, +/area/station/security/office) "iXQ" = ( /obj/structure/railing{ dir = 1 @@ -34569,6 +34711,20 @@ /obj/item/weaponcrafting/receiver, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"iZD" = ( +/obj/structure/transport/linear/public, +/obj/machinery/lift_indicator/directional/east{ + linked_elevator_id = "com_vator"; + pixel_x = 38; + pixel_y = -7 + }, +/obj/machinery/elevator_control_panel/directional/east{ + linked_elevator_id = "com_vator"; + pixel_x = 24; + preset_destination_names = list("2" = "CargEngi", "3" = "Medsci", "4" = "Service", "5" = "Command") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/floor1/fore) "iZE" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -34651,6 +34807,14 @@ /obj/structure/table, /turf/open/floor/iron/dark/side, /area/station/security/brig) +"jam" = ( +/obj/effect/turf_decal/trimline/red/filled/end{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/closet/bombcloset/security, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "jas" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34694,14 +34858,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"jaB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/item/stack/sheet/mineral/coal, -/obj/effect/spawner/random/engineering/flashlight, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "jaI" = ( /obj/structure/railing{ dir = 8 @@ -34811,16 +34967,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/engine, /area/station/engineering/lobby) -"jcL" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/structure/chair/comfy/beige{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/hallway/floor3/fore) "jcN" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -34866,6 +35012,9 @@ /obj/structure/sign/poster/contraband/grey_tide/directional/north, /turf/open/floor/iron/dark/corner, /area/station/commons/storage/primary) +"jdc" = ( +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard/fore) "jdo" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -34909,6 +35058,15 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos/pumproom) +"jdM" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "jdP" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -34949,17 +35107,6 @@ "jdW" = ( /turf/closed/wall, /area/station/engineering/atmos) -"jeg" = ( -/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/iron/dark/side{ - dir = 1 - }, -/area/station/security/checkpoint) "jek" = ( /obj/structure/chair/stool/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -34981,13 +35128,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jeN" = ( -/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/floor4/starboard/fore) "jeQ" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/south{ @@ -35026,29 +35166,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"jff" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/starboard/fore) -"jfj" = ( -/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/maintenance, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "jfr" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance-aft" @@ -35092,12 +35209,6 @@ /obj/effect/turf_decal/trimline/green/line, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"jfU" = ( -/obj/effect/turf_decal/trimline/red/line, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/engineering/lobby) "jgd" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -35156,6 +35267,18 @@ /obj/structure/sign/departments/holy/directional/north, /turf/open/floor/grass, /area/station/hallway/floor3/aft) +"jgU" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "jgY" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/turf_decal/stripes/line{ @@ -35387,6 +35510,17 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"jlr" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/lobby) "jlx" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 4 @@ -35418,13 +35552,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"jlF" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) "jlI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35632,6 +35759,16 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) +"joA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/starboard/fore) "joE" = ( /obj/structure/railing{ dir = 1 @@ -35693,6 +35830,10 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) +"jpq" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "jpy" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, @@ -35785,12 +35926,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"jqv" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ +"jqq" = ( +/obj/effect/turf_decal/trimline/green/line{ dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/fore) +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "jqy" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -36100,13 +36245,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/fore) -"jvw" = ( -/obj/structure/sign/directions/dorms/directional/north{ - dir = 2 - }, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor4/aft) "jvM" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain/private) @@ -36189,6 +36327,12 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"jwD" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "jwG" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -36234,6 +36378,12 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"jxf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "jxi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36264,14 +36414,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) -"jxr" = ( -/obj/item/bedsheet/double, -/obj/structure/bed/double, -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/chaplain, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood/tile, -/area/station/service/chapel/office) "jxy" = ( /obj/structure/table, /obj/item/taperecorder/empty{ @@ -36342,17 +36484,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) -"jxL" = ( -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor/border_only, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "jxM" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -36430,6 +36561,18 @@ dir = 1 }, /area/station/hallway/floor2/aft) +"jyL" = ( +/obj/structure/sign/poster/official/random/directional/east, +/obj/structure/sign/directions/dorms/directional/north, +/obj/structure/sign/directions/security/directional/north{ + pixel_y = 40 + }, +/obj/structure/sign/directions/command/directional/north{ + pixel_y = 24 + }, +/obj/structure/rack, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "jyP" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/catwalk_floor, @@ -36704,20 +36847,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) -"jCp" = ( -/obj/structure/transport/linear/public, -/obj/machinery/lift_indicator/directional/east{ - linked_elevator_id = "com_vator"; - pixel_x = 38; - pixel_y = -7 - }, -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "com_vator"; - pixel_x = 24; - preset_destination_names = list("2" = "CargEngi", "3" = "Medsci", "4" = "Service", "5" = "Command") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/floor1/fore) "jCz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36815,6 +36944,12 @@ }, /turf/open/floor/pod/dark, /area/station/hallway/secondary/entry) +"jEa" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "jEc" = ( /obj/effect/mapping_helpers/airlock/access/any/supply/mining, /obj/structure/cable, @@ -36861,19 +36996,6 @@ /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"jEw" = ( -/obj/machinery/computer/department_orders/engineering{ - department_delivery_areas = list(/area/station/engineering/lobby) - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/lobby) "jEO" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -37046,6 +37168,22 @@ /obj/item/storage/dice, /turf/open/floor/iron/white, /area/station/medical/psychology) +"jGz" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "jGF" = ( /turf/closed/wall, /area/station/service/kitchen/kitchen_backroom) @@ -37146,6 +37284,16 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) +"jHS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/security/checkpoint) "jHT" = ( /obj/structure/chair/wood{ dir = 1 @@ -37156,16 +37304,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"jHV" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/machinery/firealarm/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/smooth_edge{ - dir = 1 - }, -/area/station/science/robotics/mechbay) "jHW" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/stripes, @@ -37315,6 +37453,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) +"jJM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "jJP" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/engine, @@ -37341,11 +37484,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"jKp" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white/textured, -/area/station/medical/storage) "jKt" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/computer) @@ -37412,16 +37550,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) -"jLD" = ( -/obj/structure/sign/poster/random/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "jLF" = ( /obj/structure/chair{ dir = 8 @@ -37533,10 +37661,17 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) -"jNk" = ( -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) +"jNl" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard) "jNr" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, @@ -37745,10 +37880,6 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/shipping, /turf/open/floor/iron/smooth_large, /area/station/maintenance/disposal) -"jPQ" = ( -/obj/structure/disposalpipe/segment, -/turf/open/openspace, -/area/station/maintenance/floor4/port/aft) "jPR" = ( /obj/machinery/vending/boozeomat, /turf/open/floor/carpet/royalblack, @@ -37770,6 +37901,13 @@ dir = 8 }, /area/station/medical/chemistry) +"jQu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "jQw" = ( /turf/open/floor/iron/dark/textured_corner{ dir = 8 @@ -37910,20 +38048,6 @@ /obj/machinery/vending/wardrobe/sec_wardrobe, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"jSa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "jSj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, @@ -37997,10 +38121,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/carpet/red, /area/station/service/theater) -"jTB" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "jTE" = ( /obj/effect/turf_decal/delivery, /obj/structure/sign/departments/medbay/alt/directional/south, @@ -38052,28 +38172,6 @@ "jUg" = ( /turf/open/floor/iron/half, /area/station/command/gateway) -"jUi" = ( -/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/floor1/port) -"jUn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/end{ - dir = 8 - }, -/obj/item/storage/toolbox/emergency, -/obj/machinery/bluespace_vendor/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "jUo" = ( /turf/open/floor/iron/corner{ dir = 4 @@ -38226,10 +38324,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"jWs" = ( -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "jWv" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 10 @@ -38303,6 +38397,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"jXB" = ( +/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/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port) "jXE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38340,10 +38444,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"jYn" = ( -/obj/structure/railing, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/fore) "jYo" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -38423,13 +38523,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) -"jZv" = ( -/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/catwalk_floor, -/area/station/hallway/floor3/fore) "jZA" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/side{ @@ -38454,12 +38547,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics/garden/abandoned) -"kaf" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "kak" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/plating, @@ -38644,6 +38731,12 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"kbZ" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "kca" = ( /turf/closed/wall/r_wall, /area/station/service/library/lounge) @@ -38743,6 +38836,10 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"kcI" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "kcK" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/effect/turf_decal/trimline/purple/line{ @@ -38806,6 +38903,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/engineering/gravity_generator) +"kdw" = ( +/obj/structure/table/wood, +/obj/item/camera_film{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/camera_film{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/item/camera, +/obj/machinery/light/directional/east, +/turf/open/floor/engine/cult, +/area/station/service/library/private) "kdx" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -38832,6 +38943,13 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/grimy, /area/station/science/xenobiology/hallway) +"kdE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/storage) "kdK" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -38912,11 +39030,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/departure_lounge) -"keI" = ( -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/machinery/vending/wardrobe/gene_wardrobe, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "keJ" = ( /obj/structure/railing/corner{ dir = 8 @@ -38949,12 +39062,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/aft) -"keO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/floor2/aft) "keP" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, @@ -39043,11 +39150,6 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"kfU" = ( -/obj/structure/chair/wood, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/office) "kga" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39062,6 +39164,11 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"kgn" = ( +/obj/structure/sign/departments/security/directional/east, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "kgK" = ( /obj/structure/railing/corner{ dir = 8 @@ -39222,10 +39329,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet/royalblack, /area/station/service/theater) -"khU" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) "khX" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/box, @@ -39267,10 +39370,6 @@ /obj/machinery/suit_storage_unit/medical, /turf/open/floor/iron/white/textured, /area/station/medical/storage) -"kiZ" = ( -/obj/structure/ladder, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "kjb" = ( /obj/effect/decal/cleanable/blood/splatter, /obj/machinery/light/small/red/directional/east, @@ -39282,6 +39381,39 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/science/lobby) +"kjd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) +"kjk" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Briefing Room" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "kjo" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/genetics, @@ -39317,14 +39449,6 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/iron/textured_large, /area/station/engineering/lobby) -"kjR" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 8 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, -/turf/open/floor/plating, -/area/station/cargo/bitrunning/den) "kjW" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -39497,6 +39621,13 @@ "kmR" = ( /turf/closed/wall, /area/station/science/lab) +"kmV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port/aft) "knd" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/catwalk_floor, @@ -39527,15 +39658,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"knz" = ( -/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/dark/side, -/area/station/hallway/floor1/aft) "knH" = ( /turf/open/openspace, /area/station/ai_monitored/turret_protected/aisat/service) @@ -39574,6 +39696,11 @@ icon_state = "textured_dark" }, /area/station/science/robotics/lab) +"knW" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "knY" = ( /obj/structure/showcase/cyborg/old{ dir = 4; @@ -39634,10 +39761,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"koI" = ( -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/port/aft) "koJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39648,13 +39771,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"koM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/purple, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "koN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39710,6 +39826,12 @@ /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"kpi" = ( +/obj/structure/sign/poster/official/terragov/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor3/aft) "kpl" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -39759,12 +39881,6 @@ /obj/structure/foamedmetal, /turf/open/floor/plating/foam, /area/station/maintenance/floor1/port/aft) -"kpW" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 1 - }, -/turf/open/openspace, -/area/station/maintenance/floor3/port/aft) "kpX" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -39829,22 +39945,6 @@ /obj/structure/filingcabinet/employment, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"kqY" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig Fore Entrance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint) "krf" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -39874,6 +39974,15 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) +"kro" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/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/side, +/area/station/hallway/floor1/fore) "krq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -40166,10 +40275,6 @@ dir = 1 }, /area/station/hallway/floor2/aft) -"kuN" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port) "kuW" = ( /obj/structure/firelock_frame, /turf/open/floor/plating/foam, @@ -40187,26 +40292,10 @@ }, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) -"kvr" = ( -/obj/machinery/computer/security, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "kvw" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"kvA" = ( -/obj/structure/railing, -/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/pod/light, -/area/station/maintenance/floor4/starboard/fore) "kvB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40217,6 +40306,32 @@ "kvE" = ( /turf/open/floor/light/colour_cycle/dancefloor_b, /area/station/maintenance/floor2/port/fore) +"kvH" = ( +/obj/machinery/door/poddoor/shutters/window{ + dir = 8; + id = "armory"; + name = "Armoury Shutters" + }, +/obj/machinery/door/poddoor/preopen{ + id = "armblast"; + name = "Armory Blast Door" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/office) +"kvO" = ( +/obj/item/wrench/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/structure/table/glass, +/obj/item/gun/syringe, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "kvR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -40479,6 +40594,14 @@ dir = 4 }, /area/station/hallway/floor3/aft) +"kzT" = ( +/obj/item/bedsheet/double, +/obj/structure/bed/double, +/obj/machinery/light/directional/south, +/obj/effect/landmark/start/chaplain, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood/tile, +/area/station/service/chapel/office) "kzU" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/side{ @@ -40524,6 +40647,15 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) +"kAw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/floor3/port) "kAE" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 4 @@ -40940,6 +41072,20 @@ "kFP" = ( /turf/open/floor/iron/textured_half, /area/station/cargo/office) +"kGa" = ( +/obj/structure/table, +/obj/item/key/security, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/key/security, +/obj/machinery/button/flasher{ + id = "drunktank"; + name = "Drunk Tank Flasher" + }, +/turf/open/floor/iron/dark, +/area/station/security/warden) "kGe" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/carpet, @@ -41032,19 +41178,6 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"kHd" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard) "kHl" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -41057,11 +41190,6 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"kHw" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/aft) "kHx" = ( /obj/structure/closet/firecloset/full, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -41175,33 +41303,12 @@ dir = 1 }, /area/station/engineering/lobby) -"kHU" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/office) "kHV" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark/side{ dir = 4 }, /area/station/hallway/floor3/fore) -"kIc" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/spawner/random/contraband/landmine, -/turf/open/floor/iron/dark, -/area/station/maintenance/floor2/starboard/aft) "kIe" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible/layer2, /turf/open/floor/iron, @@ -41220,13 +41327,6 @@ /obj/effect/turf_decal/trimline/dark_blue/end, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) -"kIx" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "kIG" = ( /obj/machinery/button/door/directional/north{ id = "Secure Storage"; @@ -41285,11 +41385,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"kJp" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/circuits) "kJq" = ( /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) @@ -41548,10 +41643,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) -"kMq" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "kMv" = ( /obj/machinery/plumbing/receiver, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -41671,6 +41762,16 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"kOc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/office) "kOk" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, @@ -41689,16 +41790,19 @@ dir = 8 }, /area/station/service/bar/atrium) +"kOx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/stack/sheet/mineral/coal, +/obj/effect/spawner/random/engineering/flashlight, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "kOA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron, /area/station/service/hydroponics) -"kOE" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "kON" = ( /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -41801,6 +41905,16 @@ /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/security/detectives_office) +"kQu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/office) "kQF" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -42000,6 +42114,14 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) +"kSR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/starboard/fore) "kSU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -42077,15 +42199,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"kTS" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "kTV" = ( /obj/structure/bookcase/random/religion, /obj/machinery/light/small/directional/north, @@ -42449,28 +42562,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lower) -"kYi" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/security/checkpoint/first) -"kYl" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "kYm" = ( /obj/effect/spawner/random/trash/janitor_supplies, /obj/effect/turf_decal/trimline/green/end{ @@ -42479,13 +42570,6 @@ /obj/structure/rack, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"kYr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/bluespace_vendor/directional/north, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) "kYt" = ( /obj/structure/chair/comfy/carp, /turf/open/floor/carpet/neon/simple/pink/nodots, @@ -42527,6 +42611,10 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) +"kYV" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "kZe" = ( /obj/machinery/camera/autoname/directional/west, /obj/machinery/light_switch/directional/west, @@ -42663,6 +42751,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) +"lax" = ( +/obj/structure/table, +/obj/item/storage/dice, +/obj/effect/turf_decal/tile/red/anticorner, +/obj/machinery/flasher/directional/east{ + name = "drunktank" + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "laC" = ( /obj/structure/table/wood, /turf/open/floor/carpet/green, @@ -42865,14 +42962,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/escape_pod) -"lcH" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/security/checkpoint/third) "lcJ" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -42884,16 +42973,6 @@ }, /turf/open/floor/carpet/orange, /area/station/service/chapel/office) -"lcR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "lcT" = ( /obj/structure/railing{ dir = 1 @@ -42993,16 +43072,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"ldN" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "ldO" = ( /obj/structure/chair/stool/bar/directional/east, /obj/structure/disposalpipe/segment{ @@ -43015,14 +43084,6 @@ /obj/machinery/holopad, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"ldZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint) "lem" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43094,6 +43155,11 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"leR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "leY" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -43121,16 +43187,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) -"lfs" = ( -/obj/machinery/newscaster/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "lft" = ( /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/pod/light, @@ -43176,6 +43232,13 @@ /obj/structure/disposalpipe/segment, /turf/open/openspace, /area/station/maintenance/floor4/starboard/fore) +"lfQ" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "lfU" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) @@ -43357,6 +43420,15 @@ }, /turf/open/space/basic, /area/space/nearstation) +"lhU" = ( +/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 = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port) "lhW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43379,26 +43451,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"lic" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "lif" = ( /obj/effect/turf_decal/trimline/blue/corner{ dir = 8 @@ -43411,11 +43463,10 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) -"lih" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard) +"lij" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "lik" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43424,6 +43475,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"liu" = ( +/obj/machinery/atmospherics/components/unary/bluespace_sender, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "liL" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -43435,21 +43490,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"liZ" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "ljf" = ( /obj/machinery/rnd/production/techfab/department/service, /obj/effect/turf_decal/bot, @@ -43481,6 +43521,14 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/smooth, /area/station/cargo/office) +"ljx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "ljE" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -43502,6 +43550,20 @@ /obj/structure/sign/poster/contraband/moffuchis_pizza, /turf/closed/wall, /area/station/maintenance/floor3/port/aft) +"lkc" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/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/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/starboard) "lkh" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -43514,21 +43576,13 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"lku" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 +"lkA" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/machinery/computer/department_orders/security{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/button/door/directional/south{ - id = "secmechbay"; - name = "Security Mech Garage Door Controls"; - req_access = list("security") - }, -/turf/open/floor/iron, -/area/station/security/office) +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "lkB" = ( /obj/machinery/shower/directional/west, /obj/structure/sign/poster/official/random/directional/east, @@ -43542,6 +43596,10 @@ dir = 1 }, /area/station/medical/chemistry) +"lkI" = ( +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "lkP" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -43807,14 +43865,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"lod" = ( -/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/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/security/mechbay) "lof" = ( /turf/open/floor/wood/parquet, /area/station/commons/dorms/room2) @@ -43835,15 +43885,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"loB" = ( -/obj/machinery/door/poddoor/preopen{ - id = "secure-gate"; - name = "Brig Shutters" - }, -/obj/machinery/prisongate, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "loF" = ( /obj/machinery/suit_storage_unit/security, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -43891,11 +43932,9 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"loR" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) +"loS" = ( +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/port/aft) "lpc" = ( /obj/structure/railing{ dir = 10 @@ -43996,17 +44035,6 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) -"lqH" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/oil/streak, -/obj/machinery/byteforge, -/obj/effect/turf_decal/box, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/cargo/bitrunning/den) "lqI" = ( /obj/machinery/light/small/directional/east, /obj/structure/toilet{ @@ -44022,28 +44050,17 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"lqZ" = ( -/obj/structure/cable, +"lrp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/starboard) -"lrs" = ( -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/light/directional/south, +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/light/directional/west, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 6 }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "lrA" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -44175,12 +44192,6 @@ }, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) -"ltH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "ltI" = ( /obj/effect/spawner/random/trash/graffiti{ pixel_y = -32 @@ -44243,12 +44254,35 @@ dir = 9 }, /area/station/security/prison) -"luq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/grille, -/turf/open/floor/plating, -/area/station/hallway/floor1/fore) +"luo" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/obj/structure/railing{ + layer = 3.1 + }, +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/bitrunning/den) +"luv" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "luw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/furniture_parts, @@ -44394,6 +44428,14 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/cargo/office) +"lwo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/third) "lwu" = ( /obj/structure/closet/secure_closet/engineering_chief, /turf/open/floor/wood, @@ -44446,6 +44488,15 @@ dir = 4 }, /area/station/hallway/floor1/aft) +"lxr" = ( +/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/dark/side, +/area/station/hallway/floor1/aft) "lxs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44577,6 +44628,11 @@ /obj/machinery/chem_dispenser, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"lzd" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "lzf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44626,14 +44682,6 @@ "lAh" = ( /turf/open/openspace, /area/station/service/kitchen/abandoned) -"lAl" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "lAm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -44741,12 +44789,7 @@ "lBR" = ( /obj/machinery/shower/directional/east, /obj/item/bikehorn/rubberducky, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) "lCf" = ( @@ -44773,16 +44816,6 @@ /obj/structure/emergency_shield/regenerating, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"lCq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/sign/poster/random/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "lCs" = ( /turf/open/floor/carpet/red, /area/station/maintenance/floor3/port/aft) @@ -44846,6 +44879,21 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"lDo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "lDs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44855,6 +44903,15 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"lDA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "lDD" = ( /obj/structure/rack, /obj/item/chair/plastic, @@ -44907,6 +44964,12 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"lDX" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "lDY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45005,15 +45068,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/kitchen/abandoned) -"lFt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "lFw" = ( /obj/structure/railing{ dir = 8 @@ -45226,6 +45280,12 @@ /obj/effect/mapping_helpers/airlock/access/any/service/theatre, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/aft) +"lIC" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor2/fore) "lIJ" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp{ @@ -45293,12 +45353,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/side, /area/station/cargo/miningdock) -"lJs" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Xenobio - Holding Pen" - }, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "lJu" = ( /mob/living/carbon/human/species/monkey{ name = "Kong" @@ -45427,21 +45481,19 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) -"lKJ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"lKE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/pod/dark, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) +"lKF" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) "lKQ" = ( /obj/effect/turf_decal/stripes/line{ @@ -45537,12 +45589,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"lLY" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "lMj" = ( /obj/effect/turf_decal/trimline/white/arrow_ccw, /obj/machinery/camera/autoname/directional/south, @@ -45658,6 +45704,16 @@ dir = 8 }, /area/station/hallway/floor1/fore) +"lNW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/cargo/bitrunning/den) "lNX" = ( /obj/structure/railing{ dir = 4 @@ -45766,14 +45822,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) -"lOR" = ( -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/floor2/aft) "lPb" = ( /obj/structure/railing{ dir = 1 @@ -46008,16 +46056,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) -"lRq" = ( -/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/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "lRu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/flora/bush/flowers_yw/style_random, @@ -46062,6 +46100,13 @@ "lRY" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) +"lSd" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "lSt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grime, @@ -46088,6 +46133,21 @@ /obj/effect/decal/cleanable/plastic, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) +"lSI" = ( +/obj/machinery/computer/upload/borg, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/left/directional/south{ + layer = 3.1; + name = "Cyborg Upload Console Window"; + req_access = list("ai_upload") + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "lSJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -46206,20 +46266,10 @@ /obj/effect/decal/cleanable/blood/footprints, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"lUl" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/brig) +"lUd" = ( +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/openspace, +/area/station/maintenance/floor2/port) "lUo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/table_or_rack, @@ -46382,16 +46432,21 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"lWT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 +"lWY" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 1; + name = "Prisoner Dispenser" + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/flasher/directional/west{ + id = "drunktank" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) +/area/station/security/holding_cell) "lXb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/gym/mirrored{ @@ -46562,6 +46617,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) +"lYE" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "lYL" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -46632,19 +46696,6 @@ /obj/item/experi_scanner, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) -"lZD" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "lZH" = ( /obj/effect/turf_decal/trimline/neutral/filled/end, /obj/machinery/newscaster/directional/south, @@ -46690,6 +46741,13 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) +"maK" = ( +/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/floor4/starboard/fore) "maL" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -46712,6 +46770,14 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"maS" = ( +/obj/effect/turf_decal/siding/thinplating_new, +/obj/machinery/door/window/right/directional/south{ + name = "Bunny Containment"; + req_access = list("hydroponics") + }, +/turf/open/misc/beach/sand, +/area/station/hallway/secondary/entry) "maW" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -46804,16 +46870,6 @@ /obj/structure/sign/warning/vacuum/external, /turf/closed/wall, /area/station/maintenance/floor1/starboard) -"mcd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "mcf" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -46877,6 +46933,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"mcA" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "mcB" = ( /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 @@ -46936,6 +47007,12 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/corner, /area/station/cargo/miningdock) +"mdi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "mdl" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -47171,6 +47248,21 @@ }, /turf/open/floor/iron/textured, /area/station/command/heads_quarters/qm) +"mfU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "mge" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 4 @@ -47391,13 +47483,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"miz" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/storage) "miF" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/effect/turf_decal/trimline/purple/line{ @@ -47517,6 +47602,13 @@ dir = 4 }, /area/station/hallway/floor3/fore) +"mlg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "mlh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47524,14 +47616,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) -"mlp" = ( -/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/disposalpipe/segment, -/turf/open/floor/iron/dark/side, -/area/station/security/office) "mlx" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/electrical{ @@ -47626,17 +47710,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/smooth_edge, /area/station/medical/abandoned) -"mmt" = ( -/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/side{ - dir = 1 - }, -/area/station/security/checkpoint) "mmv" = ( /obj/machinery/door/airlock/public/glass{ name = "Public Mining & Aux Base" @@ -47685,10 +47758,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"mmN" = ( -/obj/machinery/bluespace_vendor/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "mmR" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -47858,25 +47927,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/white/small, /area/station/security/execution/education) -"mpm" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 1 - }, -/turf/open/openspace, -/area/station/maintenance/floor3/port) -"mpo" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port/fore) "mpp" = ( /obj/structure/stairs/south, /turf/open/floor/wood/parquet, @@ -48307,20 +48357,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/aft) -"muH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/brig) "muI" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -48436,6 +48472,19 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) +"mwz" = ( +/obj/structure/table, +/obj/item/disk/data{ + pixel_x = 5 + }, +/obj/item/disk/data{ + pixel_x = -6 + }, +/obj/item/disk/data{ + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "mwB" = ( /obj/structure/railing{ dir = 4 @@ -48478,18 +48527,6 @@ /obj/item/toy/crayon/spraycan, /turf/open/floor/wood/large, /area/station/service/library/lounge) -"mwW" = ( -/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 = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "mwZ" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -48561,6 +48598,13 @@ }, /turf/open/floor/plating, /area/station/medical/abandoned) +"mxS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/sign/poster/contraband/hacking_guide/directional/north, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "mxT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48624,20 +48668,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"myU" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/west{ - name = "Outer Window" - }, -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "Security Desk"; - req_access = list("security") - }, -/obj/item/folder/red, -/obj/item/pen, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "myV" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/purple/line{ @@ -48695,9 +48725,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"mzi" = ( -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "mzk" = ( /obj/structure/sign/warning/no_smoking/directional/east, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -48790,20 +48817,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"mAB" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/aft) "mAD" = ( /obj/effect/spawner/random/trash/mess, /obj/effect/decal/cleanable/dirt, @@ -48965,6 +48978,13 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/lounge) +"mCU" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance/freezerchamber) "mDe" = ( /obj/structure/lattice, /turf/open/openspace, @@ -49198,6 +49218,13 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/red, /area/station/commons/dorms/apartment1) +"mFJ" = ( +/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/hallway/floor4/aft) "mFP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49229,6 +49256,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"mGt" = ( +/obj/structure/chair/sofa/bench/right, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "mGy" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/mining, @@ -49465,6 +49499,11 @@ dir = 8 }, /area/station/hallway/floor2/fore) +"mJr" = ( +/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/first) "mJt" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/smooth, @@ -49494,26 +49533,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"mJR" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Third Deck Outpost" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/security/brig, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) -"mKe" = ( -/obj/effect/spawner/structure/window/hollow/plasma/middle{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/freezerchamber) "mKf" = ( /obj/item/radio/intercom/directional/west, /obj/structure/chair/sofa/corner/maroon{ @@ -49569,6 +49588,11 @@ /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"mKZ" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/rack, +/turf/open/floor/iron/white, +/area/station/science/circuits) "mLb" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 1 @@ -49614,13 +49638,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/catwalk_floor/iron_dark, /area/station/hallway/secondary/exit/escape_pod) -"mLt" = ( -/obj/machinery/door/airlock/hatch{ - name = "Psych Office Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/psychology, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "mLH" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/pod/light, @@ -49641,6 +49658,20 @@ }, /turf/open/floor/wood/large, /area/station/service/library/artgallery) +"mLS" = ( +/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/maintenance, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "mLY" = ( /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/dark, @@ -49716,14 +49747,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/dorms/room3) -"mMp" = ( -/obj/effect/turf_decal/siding/thinplating_new, -/obj/machinery/door/window/right/directional/south{ - name = "Bunny Containment"; - req_access = list("hydroponics") - }, -/turf/open/misc/beach/sand, -/area/station/hallway/secondary/entry) "mMq" = ( /turf/open/floor/engine, /area/station/engineering/supermatter) @@ -49811,6 +49834,10 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"mNr" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "mNI" = ( /obj/machinery/vending/snack/orange, /obj/effect/turf_decal/siding/wood{ @@ -49825,6 +49852,10 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lab) +"mNW" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/hallway/floor3/fore) "mNY" = ( /obj/structure/railing{ dir = 8 @@ -49844,6 +49875,10 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard) +"mOe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "mOh" = ( /obj/structure/reagent_dispensers/watertank/high, /obj/effect/turf_decal/tile/green/full, @@ -49943,6 +49978,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) +"mPH" = ( +/obj/structure/weightmachine, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "mPJ" = ( /obj/machinery/gibber, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, @@ -50044,12 +50086,6 @@ "mRc" = ( /turf/closed/wall/r_wall, /area/station/science/breakroom) -"mRe" = ( -/obj/structure/closet/secure_closet/security, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "mRm" = ( /turf/open/floor/iron/textured_half{ dir = 1 @@ -50209,6 +50245,14 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/aft) +"mTK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "mTQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -50336,13 +50380,22 @@ /turf/open/floor/plating, /area/station/engineering/supermatter) "mVh" = ( -/obj/effect/spawner/random/structure/table_or_rack, -/obj/effect/spawner/random/trash/soap, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/office) "mVj" = ( /obj/effect/turf_decal/tile/green/half, /turf/open/floor/iron/dark/side, @@ -50482,12 +50535,6 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"mWV" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/openspace, -/area/station/maintenance/floor4/port/aft) "mWW" = ( /obj/item/stack/sheet/iron, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50699,10 +50746,10 @@ /area/station/holodeck/rec_center) "mZS" = ( /obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "mZT" = ( @@ -50770,13 +50817,6 @@ }, /turf/open/floor/plating, /area/station/medical/abandoned) -"naW" = ( -/obj/machinery/computer/department_orders/service{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "nba" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -51008,21 +51048,6 @@ }, /turf/open/floor/engine, /area/station/maintenance/floor1/port/aft) -"nef" = ( -/obj/machinery/door/poddoor/shutters/window{ - dir = 8; - id = "armory"; - name = "Armoury Shutters" - }, -/obj/machinery/door/poddoor/preopen{ - id = "armblast"; - name = "Armory Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) "neh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51157,6 +51182,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"nfI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/bitrunning/den) "nfR" = ( /obj/machinery/shower/directional/west, /turf/open/floor/noslip, @@ -51195,31 +51229,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) -"ngb" = ( -/obj/item/wrench/medical, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/structure/table/glass, -/obj/item/gun/syringe, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white/textured, -/area/station/medical/storage) -"nge" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port) "ngf" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -51286,6 +51295,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"ngL" = ( +/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/hatch{ + name = "Maintenance Access" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port/fore) "ngT" = ( /obj/structure/dresser, /turf/open/floor/wood/tile, @@ -51394,17 +51414,6 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"nhH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "nhJ" = ( /obj/machinery/chem_master, /obj/structure/noticeboard/directional/west, @@ -51439,6 +51448,17 @@ dir = 5 }, /area/station/hallway/floor4/aft) +"nhX" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "nhZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table, @@ -51454,21 +51474,12 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"nio" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ +"nik" = ( +/obj/structure/railing{ dir = 4 }, -/obj/structure/table/reinforced, -/obj/item/assembly/flash, -/obj/item/restraints/handcuffs, -/obj/machinery/camera/directional/east{ - name = "Checkpoint - Engineering Deck" - }, -/obj/machinery/recharger, -/obj/machinery/light/small/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "nir" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 @@ -51594,13 +51605,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) -"njy" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "njB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/effect/turf_decal/tile/red{ @@ -51656,6 +51660,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"njU" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "nkh" = ( /obj/machinery/power/tracker, /obj/structure/cable, @@ -51726,14 +51736,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) -"nlq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) +"nln" = ( +/obj/effect/turf_decal/trimline/red/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron, +/area/station/engineering/lobby) "nlu" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -51755,13 +51763,6 @@ /obj/structure/chair/sofa/bench, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"nlx" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "nlG" = ( /obj/structure/dresser, /turf/open/floor/wood/parquet, @@ -51777,6 +51778,14 @@ "nlN" = ( /turf/closed/wall, /area/station/maintenance/floor2/port/aft) +"nmk" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "nmq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -51850,11 +51859,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/bitrunning/den) -"nnx" = ( -/obj/structure/table/wood, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/wood/tile, -/area/station/service/chapel/office) "nnJ" = ( /obj/structure/filingcabinet, /turf/open/floor/iron/dark/smooth_large, @@ -51979,10 +51983,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"npj" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "nps" = ( /obj/structure/rack, /obj/item/soulstone/anybody/chaplain, @@ -52006,29 +52006,6 @@ name = "lab floor" }, /area/station/science/genetics) -"npy" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Briefing Room" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "briglockdown"; - name = "Brig Lockdown" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "npD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -52076,6 +52053,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"npT" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "npZ" = ( /obj/effect/turf_decal/trimline/green/warning, /turf/open/floor/pod/light, @@ -52545,6 +52529,12 @@ /obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) +"nwf" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/abandoned) "nwh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner{ @@ -52710,10 +52700,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/fore) -"nyt" = ( -/obj/machinery/door/window/brigdoor/left/directional/south, -/turf/open/misc/sandy_dirt, -/area/station/maintenance/floor1/starboard) "nyv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/painting/library{ @@ -52833,6 +52819,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"nzO" = ( +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "nzV" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -53021,12 +53011,6 @@ }, /turf/open/floor/iron/corner, /area/station/command/gateway) -"nCV" = ( -/obj/structure/sign/poster/official/terragov/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor3/aft) "nDf" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -53055,9 +53039,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor3/port) -"nDl" = ( -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "nDn" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/turf_decal/stripes/line{ @@ -53293,6 +53274,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"nGD" = ( +/obj/structure/rack, +/obj/machinery/light/small/directional/west, +/obj/item/book/granter/action/spell/smoke/lesser, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "nGG" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/beebox, @@ -53441,6 +53428,11 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) +"nIl" = ( +/obj/structure/table/wood, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/wood/tile, +/area/station/service/chapel/office) "nIr" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -53501,6 +53493,20 @@ }, /turf/open/floor/engine/airless, /area/station/engineering/supermatter/waste) +"nIN" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"nIO" = ( +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "nIQ" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -53613,7 +53619,8 @@ "nKc" = ( /obj/structure/cable, /obj/machinery/conveyor/inverted{ - dir = 10 + dir = 10; + id = "mining" }, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) @@ -53632,6 +53639,22 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"nKs" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard/fore) "nKA" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -53718,6 +53741,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/garden) +"nLM" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "nLY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -53733,6 +53762,15 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/secondary/exit/escape_pod) +"nMu" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "nMz" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -53953,30 +53991,11 @@ }, /turf/open/floor/iron/smooth, /area/station/tcommsat/computer) -"nPO" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "nPS" = ( /obj/structure/mirror/directional/south, /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/service/chapel) -"nPW" = ( -/obj/structure/chair/plastic{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 4 - }, -/obj/machinery/flasher/directional/east{ - name = "drunktank" - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "nPZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold/pink/visible/layer2{ dir = 1 @@ -53989,6 +54008,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) +"nQl" = ( +/obj/machinery/light/cold/no_nightlight/directional/west, +/obj/machinery/vending/wardrobe/gene_wardrobe, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "nQo" = ( /obj/structure/table, /obj/item/storage/pill_bottle/lsd{ @@ -54029,6 +54053,15 @@ /obj/machinery/shower/directional/west, /turf/open/floor/noslip, /area/station/commons/fitness) +"nQR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port) "nQS" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, @@ -54073,6 +54106,17 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"nRe" = ( +/obj/structure/transport/linear/public, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "com_vator" + }, +/obj/effect/abstract/elevator_music_zone{ + linked_elevator_id = "com_vator"; + range = 2 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/floor1/fore) "nRn" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54100,10 +54144,46 @@ /obj/item/paper_bin, /turf/open/floor/iron/smooth, /area/station/cargo/office) -"nRJ" = ( +"nRF" = ( +/obj/structure/rack, +/obj/effect/spawner/random/engineering/tool, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) +"nRI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine/cult, -/area/station/service/library/private) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/office) +"nRK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Emergency Ladder Access" + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/fore) +"nRL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "nRP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54113,6 +54193,28 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) +"nRQ" = ( +/obj/item/storage/medkit/fire{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/storage/medkit/regular, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/right/directional/east{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "nRU" = ( /obj/structure/chair{ dir = 1 @@ -54484,17 +54586,13 @@ dir = 1 }, /area/station/command/gateway) -"nWV" = ( -/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/hatch{ - name = "Maintenance Access" +"nWS" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/fore) +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "nWW" = ( /turf/closed/wall, /area/station/hallway/floor4/aft) @@ -54552,6 +54650,14 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"nXs" = ( +/obj/structure/rack, +/obj/item/stack/sheet/leather, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "nXw" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/machinery/camera/directional/south{ @@ -54569,14 +54675,6 @@ /obj/machinery/photocopier, /turf/open/floor/iron/white, /area/station/science/lower) -"nXL" = ( -/obj/effect/turf_decal/tile/red/half, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "nXO" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2, /obj/machinery/igniter/incinerator_atmos, @@ -54613,6 +54711,15 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) +"nYt" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "nYE" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/royalblack, @@ -54742,15 +54849,6 @@ "oaE" = ( /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"oaP" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor{ - elevator_mode = 1; - transport_linked_id = "com_vator" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "oaS" = ( /obj/item/toy/crayon/spraycan, /obj/structure/table, @@ -54816,6 +54914,13 @@ }, /turf/open/floor/plating, /area/station/security/brig) +"obV" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Ladder Access" + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor1/fore) "obX" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/door/window/brigdoor/right/directional/east{ @@ -54827,15 +54932,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/storage) -"occ" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/robotics/lab) "oce" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/north, @@ -54996,6 +55092,16 @@ /obj/effect/mapping_helpers/airlock/access/any/service/general, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"oee" = ( +/obj/effect/turf_decal/trimline/green/warning{ + dir = 4 + }, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/port) "oet" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55056,21 +55162,6 @@ /obj/machinery/light/red/dim/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"ofr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/security/brig) "ofx" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -55207,6 +55298,20 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lobby) +"ohu" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor4/fore) +"ohz" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/floor2/aft) "ohF" = ( /obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -55296,10 +55401,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"oiH" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/grass, -/area/station/maintenance/floor3/starboard) "oiJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, @@ -55388,6 +55489,20 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/lounge) +"ojB" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Fore Entrance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/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/red/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint) "ojM" = ( /obj/structure/chair/comfy{ dir = 4 @@ -55396,10 +55511,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"ojS" = ( -/obj/machinery/atmospherics/components/unary/bluespace_sender, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "ojU" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -55458,6 +55569,21 @@ dir = 8 }, /area/station/medical/chemistry) +"okN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor/preopen{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "okT" = ( /obj/structure/railing{ dir = 1 @@ -55477,10 +55603,6 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"old" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "olj" = ( /obj/item/cultivator/rake, /obj/structure/flora/bush/sparsegrass/style_random, @@ -55866,12 +55988,7 @@ }, /area/station/hallway/floor1/fore) "oqc" = ( -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/machinery/shower/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/command/heads_quarters/qm) @@ -55881,6 +55998,21 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) +"oqk" = ( +/obj/structure/sign/directions/medical/directional/north{ + dir = 2 + }, +/obj/structure/sign/directions/science/directional/north{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/sign/directions/upload/directional/north{ + dir = 2; + pixel_y = 40 + }, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "oqq" = ( /obj/structure/table, /obj/item/stamp, @@ -55891,22 +56023,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/cargo/office) -"oqr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "oqv" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -55932,6 +56048,14 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/textured_large, /area/station/maintenance/solars/starboard/fore) +"oqH" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "oqK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55996,16 +56120,6 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/security/lockers) -"orx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Mail Sorting" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "orD" = ( /obj/effect/turf_decal/trimline/white/filled/line, /obj/structure/cable, @@ -56033,6 +56147,16 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/carpet/red, /area/station/service/theater) +"osq" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard/fore) "osu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56045,6 +56169,12 @@ /obj/effect/mapping_helpers/mail_sorting/engineering/general, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"osC" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "osI" = ( /obj/machinery/light/red/dim/directional/east, /turf/open/floor/pod/dark, @@ -56053,6 +56183,10 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"osS" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard) "osX" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -56064,10 +56198,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/circuits) -"otg" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "otr" = ( /obj/structure/mirror/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -56124,16 +56254,6 @@ }, /turf/open/floor/iron/white/textured, /area/station/medical/cryo) -"otY" = ( -/obj/machinery/door/airlock/hatch{ - name = "Elevator Shaft Access" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/turf/open/floor/plating, -/area/station/hallway/floor1/fore) "otZ" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -56240,15 +56360,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat) -"ovX" = ( -/obj/structure/table, -/obj/item/storage/dice, -/obj/effect/turf_decal/tile/red/anticorner, -/obj/machinery/flasher/directional/east{ - name = "drunktank" - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "ovY" = ( /obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/box/white, @@ -56256,6 +56367,15 @@ /obj/item/reagent_containers/dropper, /turf/open/floor/iron/white, /area/station/medical/virology) +"ovZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/checkpoint) "owb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -56276,10 +56396,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"owq" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor3/port) +"owr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/security/mechbay) "owB" = ( /turf/open/floor/catwalk_floor, /area/station/science/xenobiology/hallway) @@ -56392,10 +56520,11 @@ "oyh" = ( /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"oym" = ( -/obj/structure/railing/corner, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/fore) +"oyt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "oyv" = ( /obj/machinery/light_switch/directional/east, /obj/effect/turf_decal/siding/purple{ @@ -56514,6 +56643,16 @@ /obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) +"ozA" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "ozJ" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 8 @@ -56531,6 +56670,13 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/office) +"ozM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "ozO" = ( /turf/closed/wall, /area/station/security/prison) @@ -56613,13 +56759,6 @@ }, /turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) -"oBg" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "oBj" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -56669,6 +56808,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"oBP" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "oBQ" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -56682,14 +56831,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) -"oBV" = ( -/obj/structure/rack, -/obj/item/stack/sheet/leather, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "oCb" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 8 @@ -57266,15 +57407,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) -"oKC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "oKD" = ( /obj/machinery/photocopier, /obj/machinery/requests_console/directional/west{ @@ -57334,15 +57466,6 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/storage) -"oKV" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "oKY" = ( /turf/open/floor/grass, /area/station/hallway/floor4/fore) @@ -57389,20 +57512,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"oLD" = ( -/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/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "oLG" = ( /obj/structure/beebox, /turf/open/floor/grass, @@ -57534,6 +57643,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"oNK" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "oNP" = ( /turf/open/floor/iron/dark/side{ dir = 10 @@ -57673,11 +57786,6 @@ /obj/machinery/light/dim/directional/west, /turf/open/floor/wood/large, /area/station/security/prison/safe) -"oPv" = ( -/obj/machinery/component_printer, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/circuits) "oPA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -57691,19 +57799,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/white, /area/station/medical/psychology) -"oPG" = ( -/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/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "oPH" = ( /obj/structure/table, /obj/item/folder/yellow, @@ -58125,21 +58220,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"oUz" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 1; - name = "Prisoner Dispenser" - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/flasher/directional/west{ - id = "drunktank" - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "oUE" = ( /obj/machinery/vending/wallmed/directional/north, /obj/structure/disposalpipe/segment{ @@ -58156,6 +58236,12 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) +"oUW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "oVa" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -58165,6 +58251,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"oVg" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "oVj" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 5 @@ -58295,6 +58390,16 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/space/nearstation) +"oXp" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "oXE" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, @@ -58546,6 +58651,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/cytology) +"pbm" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "pbr" = ( /obj/machinery/light/directional/east, /obj/machinery/deepfryer, @@ -58684,6 +58801,14 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/fore) +"pdK" = ( +/obj/structure/railing, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "pdO" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 4 @@ -58863,15 +58988,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) -"pgX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/hatch{ - name = "Emergency Ladder Access" - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "phd" = ( /turf/open/misc/sandy_dirt, /area/station/maintenance/floor3/starboard) @@ -58964,6 +59080,10 @@ /obj/effect/turf_decal/trimline/neutral/end, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"pix" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "piz" = ( /obj/machinery/door/firedoor/heavy, /obj/structure/table/reinforced, @@ -59341,19 +59461,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/janitor) -"pnP" = ( -/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/border_only{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "pnV" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4; @@ -59436,13 +59543,6 @@ /obj/structure/table, /turf/open/floor/wood/large, /area/station/security/prison/safe) -"ppn" = ( -/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/hallway/floor4/aft) "ppo" = ( /obj/structure/railing{ dir = 8 @@ -59472,11 +59572,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"ppx" = ( -/obj/structure/sign/warning/biohazard/directional/east, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "ppN" = ( /obj/machinery/door/airlock/engineering{ name = "Tech Storage" @@ -59571,18 +59666,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) -"pqw" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, +"pqt" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) +/obj/structure/sign/poster/official/love_ian/directional/south, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "pqy" = ( /obj/machinery/camera{ c_tag = "Power Storage"; @@ -59601,6 +59691,12 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) +"pqB" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor3/fore) "pqH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -59639,6 +59735,20 @@ /obj/item/clothing/suit/toggle/labcoat, /turf/open/floor/iron, /area/station/maintenance/floor3/starboard/aft) +"prd" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "pre" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor2/fore) @@ -59703,6 +59813,16 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) +"prS" = ( +/obj/effect/turf_decal/tile/purple/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/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "prZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -59737,10 +59857,19 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"psn" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "psq" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"psF" = ( +/obj/structure/chair/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/office) "psJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -59783,22 +59912,12 @@ dir = 1 }, /area/station/hallway/floor4/aft) -"pto" = ( -/obj/structure/disposalpipe/segment{ - dir = 1 +"ptl" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 }, -/obj/structure/cable, -/obj/machinery/door/airlock/mining/glass{ - name = "Mail Sorting" - }, -/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/any/supply/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/turf/open/floor/iron/smooth, -/area/station/cargo/storage) +/turf/open/openspace, +/area/station/maintenance/floor2/port) "ptu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59908,21 +60027,6 @@ }, /turf/open/floor/carpet/blue, /area/station/maintenance/floor3/port/aft) -"pvr" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "pvs" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/plating, @@ -59966,6 +60070,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) +"pvX" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "pvZ" = ( /obj/structure/chair/sofa/bench/left, /obj/structure/flora/bush/sparsegrass/style_random, @@ -60035,6 +60145,10 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"pwY" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "pxb" = ( /obj/machinery/grill, /turf/open/floor/pod/light, @@ -60050,22 +60164,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/cargo/lobby) -"pxo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera/directional/south, -/obj/machinery/lift_indicator/directional/south{ - linked_elevator_id = "com_vator"; - pixel_y = -36 - }, -/obj/machinery/button/elevator/directional/south{ - id = "com_vator" - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor1/fore) "pxt" = ( /obj/item/restraints/handcuffs, /obj/structure/table/optable, @@ -60182,14 +60280,6 @@ dir = 5 }, /area/station/hallway/floor3/fore) -"pyo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/port/fore) "pyt" = ( /obj/effect/spawner/random/structure/table_fancy, /obj/machinery/door/window/brigdoor/right/directional/north{ @@ -60197,6 +60287,16 @@ }, /turf/open/floor/wood/large, /area/station/service/library/artgallery) +"pyE" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "pyL" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -60311,19 +60411,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"pzS" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "pzT" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/iron/dark, @@ -60361,6 +60448,15 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) +"pAk" = ( +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "pAn" = ( /obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/machinery/door/airlock/medical{ @@ -60382,6 +60478,17 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/misc/dirt/jungle, /area/station/service/hydroponics/garden/abandoned) +"pAK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/north, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port) "pAL" = ( /obj/machinery/light_switch/directional/east, /obj/machinery/space_heater, @@ -60411,16 +60518,29 @@ dir = 4 }, /area/station/service/bar/atrium) -"pBo" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 +"pBg" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 }, -/obj/machinery/door/window/right/directional/north{ - name = "Butterfly Garden"; - req_access = list("hydroponics") +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) +"pBv" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" }, -/turf/open/misc/sandy_dirt, -/area/station/hallway/secondary/entry) +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard/fore) "pBJ" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=1-7"; @@ -60428,6 +60548,16 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/fore) +"pBQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "pBS" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/kitchen, @@ -60502,12 +60632,6 @@ }, /turf/open/floor/carpet/purple, /area/station/maintenance/floor1/port/aft) -"pCA" = ( -/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/science/robotics/lab) "pCC" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/yellow{ @@ -60628,6 +60752,12 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) +"pEu" = ( +/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/hallway/floor2/fore) "pEv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -60668,6 +60798,17 @@ dir = 8 }, /area/station/hallway/floor2/fore) +"pEO" = ( +/obj/effect/turf_decal/trimline/blue/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "pEQ" = ( /obj/structure/closet/firecloset, /turf/open/floor/pod/dark, @@ -60708,6 +60849,22 @@ /obj/structure/closet/crate/trashcart, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) +"pFT" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/quantumpad, +/turf/open/floor/iron/smooth, +/area/station/science/robotics/mechbay) +"pFW" = ( +/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/side{ + dir = 4 + }, +/area/station/hallway/floor2/aft) "pGb" = ( /obj/structure/table/glass, /obj/item/camera_film{ @@ -60783,12 +60940,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"pGU" = ( -/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) "pGW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -60879,6 +61030,13 @@ name = "bathroom tiles" }, /area/station/security/lockers) +"pIm" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "pIq" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/pod/light, @@ -60889,6 +61047,12 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor3/starboard) +"pIv" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/station/maintenance/floor4/port/aft) "pIG" = ( /obj/effect/turf_decal/tile/red/half, /turf/open/floor/iron/dark/side, @@ -60921,15 +61085,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"pJa" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/carpet/blue, -/area/station/cargo/miningdock) "pJb" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/trimline/purple/warning{ @@ -61263,24 +61418,26 @@ /obj/effect/turf_decal/trimline/green/end, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"pNe" = ( +/obj/structure/chair/plastic, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "pNj" = ( /turf/open/floor/carpet/red, /area/station/service/library) -"pNo" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" +"pNs" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/aft) +"pNA" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/dark, +/turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) "pNH" = ( /turf/open/floor/carpet, @@ -61331,12 +61488,6 @@ dir = 1 }, /area/station/hallway/floor4/fore) -"pNZ" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "pOi" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -61646,6 +61797,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"pSp" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "pSz" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -61722,18 +61881,6 @@ "pUe" = ( /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"pUf" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "pUl" = ( /obj/effect/turf_decal/trimline/brown/line, /obj/machinery/air_sensor/mix_tank, @@ -61773,9 +61920,7 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "pUB" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/service) @@ -61809,18 +61954,23 @@ /obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/commons/dorms/room2) +"pUK" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/starboard) "pUV" = ( /turf/open/floor/plating/airless, /area/station/solars/port/aft) -"pUX" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "pUY" = ( /obj/machinery/quantum_server, /obj/effect/turf_decal/bot/left, @@ -61851,6 +62001,21 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark, /area/station/service/library/lounge) +"pVj" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "pVk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -61868,6 +62033,13 @@ /obj/effect/mapping_helpers/airlock/access/any/service/kitchen, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) +"pVD" = ( +/obj/structure/chair/sofa/bench, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "pVK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -61910,6 +62082,13 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"pWA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/storage) "pWD" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/item/beacon, @@ -61939,6 +62118,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"pXg" = ( +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/science/cytology) "pXh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -61946,24 +62132,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) -"pXj" = ( -/obj/structure/chair/sofa/bench/right, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "pXr" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating/airless, /area/station/solars/port/aft) -"pXs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "pXG" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -62154,6 +62326,19 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) +"pZK" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard/aft) "pZL" = ( /obj/effect/spawner/random/trash/garbage{ spawn_loot_count = 3; @@ -62169,6 +62354,16 @@ /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) +"pZV" = ( +/obj/machinery/door/airlock/hatch{ + name = "Elevator Shaft Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "pZW" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/second) @@ -62226,6 +62421,16 @@ dir = 1 }, /area/station/cargo/sorting) +"qaJ" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Security - Cell" + }, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "qaS" = ( /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/iron/dark/side, @@ -62459,12 +62664,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"qdA" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor4/aft) "qdB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62484,6 +62683,21 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"qdF" = ( +/obj/machinery/bluespace_vendor/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"qdS" = ( +/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/blue/opposingcorners, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "qdV" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) @@ -62541,12 +62755,6 @@ }, /turf/open/floor/carpet/green, /area/station/commons/dorms/apartment2) -"qeq" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor2/fore) "qeu" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/middle/brown{ @@ -62600,6 +62808,16 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) +"qfm" = ( +/obj/machinery/newscaster/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "qfn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -62613,10 +62831,6 @@ "qfv" = ( /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"qfy" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "qfz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red/half{ @@ -62718,6 +62932,16 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold, /turf/open/space/basic, /area/space/nearstation) +"qgU" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "qgV" = ( /obj/structure/railing{ dir = 1 @@ -62730,15 +62954,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"qhg" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/carpet, -/area/station/cargo/miningdock) "qhp" = ( /obj/machinery/camera/directional/east{ c_tag = "MiniSAT Access Staircase" @@ -62862,17 +63077,6 @@ /obj/structure/sign/departments/restroom/directional/west, /turf/open/openspace, /area/station/hallway/floor3/aft) -"qkp" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "qkr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -63050,17 +63254,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"qmq" = ( -/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 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/aft) "qmu" = ( /obj/structure/closet/emcloset, /turf/open/floor/pod/dark, @@ -63086,6 +63279,11 @@ /obj/structure/cable, /turf/open/floor/carpet/neon/simple/white, /area/station/commons/dorms/room3) +"qmN" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet/any, +/turf/open/floor/wood, +/area/station/medical/psychology) "qnc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -63154,6 +63352,13 @@ /obj/machinery/chem_heater/withbuffer, /turf/open/floor/circuit, /area/station/science/xenobiology) +"qnO" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "qnS" = ( /obj/machinery/door/airlock/highsecurity, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -63175,6 +63380,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"qoq" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "qos" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -63253,11 +63462,34 @@ /obj/machinery/light/directional/west, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"qpa" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/machinery/camera/directional/north, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "qpb" = ( /obj/structure/window/reinforced/plasma/spawner/directional/south, /obj/structure/foamedmetal, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) +"qpp" = ( +/obj/machinery/atmospherics/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/science/robotics/lab) "qpt" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -63501,12 +63733,6 @@ /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/dark/corner, /area/station/command/teleporter) -"qsQ" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "qsR" = ( /obj/effect/turf_decal/tile/blue/full, /obj/machinery/power/floodlight, @@ -63516,6 +63742,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/medical/abandoned) +"qsW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "qtf" = ( /obj/effect/turf_decal/siding/thinplating_new, /obj/machinery/door/airlock/external, @@ -63549,6 +63783,10 @@ }, /turf/open/floor/iron, /area/station/science/genetics) +"qtw" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard) "qty" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -63569,14 +63807,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) -"qtA" = ( -/obj/structure/railing/corner, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "qtH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/filingcabinet/chestdrawer{ @@ -63621,14 +63851,24 @@ dir = 1 }, /area/station/hallway/floor3/fore) -"quf" = ( -/obj/structure/chair/plastic, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 +"qtW" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) +/obj/machinery/disposal/delivery_chute{ + dir = 8; + name = "Space Chute" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external/directional/south{ + name = "WARNING: CHUTE LEADS DIRECTLY TO SPACE" + }, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/deathsposal/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "qun" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) @@ -63664,13 +63904,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"quG" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "quO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63934,6 +64167,17 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) +"qxN" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/cargo/bitrunning/den) "qxQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, @@ -63962,27 +64206,26 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) +"qxY" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "qxZ" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/computer/crew, /turf/open/floor/iron/white, /area/station/security/medical) -"qya" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/sign/directions/evac/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) -"qyb" = ( -/obj/effect/spawner/structure/window/hollow/middle{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor3/port/aft) "qyk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64102,12 +64345,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"qzj" = ( -/obj/machinery/computer/records/security, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "qzm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -64134,15 +64371,6 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/aft) -"qzF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port) "qzH" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64168,10 +64396,6 @@ dir = 9 }, /area/station/security/prison/garden) -"qzS" = ( -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "qzX" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/turf_decal/stripes/line{ @@ -64250,15 +64474,6 @@ "qAG" = ( /turf/closed/wall, /area/station/science/lobby) -"qAH" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor/preopen{ - elevator_mode = 1; - transport_linked_id = "com_vator" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "qAI" = ( /obj/structure/chair/comfy, /obj/machinery/power/apc/auto_name/directional/east, @@ -64325,6 +64540,11 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/science/genetics) +"qBk" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/turf/open/floor/carpet/black, +/area/station/hallway/secondary/service) "qBm" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64344,6 +64564,12 @@ "qBx" = ( /turf/closed/wall, /area/station/service/hydroponics) +"qBJ" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "qBP" = ( /obj/effect/turf_decal/tile/green/half, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64639,16 +64865,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"qEP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/security/checkpoint) "qFa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64883,16 +65099,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) -"qHV" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Security - Cell" - }, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "qHW" = ( /turf/closed/wall/r_wall, /area/station/medical/pharmacy) @@ -64928,6 +65134,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"qIH" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "qIM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64980,15 +65190,6 @@ /obj/structure/railing/corner/end/flip, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) -"qJH" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "qJT" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -65183,6 +65384,13 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/science/genetics) +"qNI" = ( +/obj/machinery/light/floor, +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor4/aft) "qNK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65350,6 +65558,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"qPG" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "qPM" = ( /obj/effect/turf_decal/tile/green/full, /obj/machinery/camera/autoname/directional/west, @@ -65419,22 +65633,6 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/iron/white, /area/station/maintenance/floor3/starboard/aft) -"qQq" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/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 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard/fore) "qQr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65699,6 +65897,14 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"qUC" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/iron/white, +/area/station/science/circuits) "qUL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -65742,6 +65948,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"qVh" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/floor2/aft) "qVl" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -66070,10 +66284,6 @@ dir = 6 }, /area/station/hallway/floor1/aft) -"qZd" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "qZh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66148,18 +66358,6 @@ "rac" = ( /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"rae" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "rag" = ( /obj/machinery/atmospherics/pipe/layer_manifold/purple/visible, /obj/machinery/camera{ @@ -66342,9 +66540,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/machinery/light/directional/east, /turf/open/floor/plating, /area/station/tcommsat/computer) @@ -66396,12 +66592,6 @@ "rcO" = ( /turf/open/floor/plating/airless, /area/space/nearstation) -"rcQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "rcT" = ( /obj/effect/turf_decal/trimline/white/arrow_ccw{ dir = 1 @@ -66550,6 +66740,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) +"rek" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/corner, +/area/station/security/office) "rem" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office" @@ -66621,10 +66819,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) -"rfm" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "rfn" = ( /turf/open/floor/iron/showroomfloor{ name = "lab floor" @@ -66719,13 +66913,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos) -"rgw" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/south, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "rgy" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -66794,10 +66981,6 @@ /obj/structure/closet/secure_closet/bar, /turf/open/floor/iron/checker, /area/station/service/bar) -"rhn" = ( -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/fore) "rho" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/chemistry, @@ -66826,6 +67009,14 @@ /obj/machinery/light/cold/no_nightlight/directional/east, /turf/open/floor/engine, /area/station/command/heads_quarters/rd) +"rhI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/marker_beacon/jade, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "rhJ" = ( /obj/structure/railing{ dir = 4 @@ -66920,41 +67111,10 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) -"riO" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) -"riR" = ( -/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/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port) "riT" = ( /obj/effect/decal/cleanable/ash/large, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) -"rje" = ( -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) -"rjg" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "rjh" = ( /turf/open/floor/iron/dark/textured_edge{ dir = 4 @@ -66979,6 +67139,11 @@ /obj/structure/railing/corner/end, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) +"rjB" = ( +/obj/structure/sign/warning/biohazard/directional/east, +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "rjD" = ( /turf/closed/wall, /area/station/hallway/floor1/aft) @@ -67031,21 +67196,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) -"rla" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "rlf" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -67204,11 +67354,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"rnm" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor3/starboard/fore) "rns" = ( /obj/structure/railing{ dir = 1 @@ -67254,17 +67399,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment2) -"rnX" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "roa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -67282,6 +67416,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) +"rof" = ( +/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/floor3/port/aft) "rog" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67291,6 +67434,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"roj" = ( +/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/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "rom" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/stripes/line{ @@ -67457,15 +67609,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"rqG" = ( -/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/pod/light, -/area/station/maintenance/floor4/starboard/fore) "rqK" = ( /obj/effect/turf_decal/stripes/full, /obj/structure/window/reinforced/spawner/directional/west, @@ -67610,18 +67753,6 @@ "rsW" = ( /turf/open/floor/carpet/blue, /area/station/maintenance/floor3/port/aft) -"rsX" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "rsY" = ( /obj/machinery/button/door/directional/north{ id = "aband_armour"; @@ -67643,13 +67774,6 @@ /obj/effect/spawner/structure/window/hollow/end, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"rtd" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/storage) "rti" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 1 @@ -67736,33 +67860,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/hydroponics) -"rvc" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, +"ruU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, +/obj/structure/cable, +/obj/structure/sign/poster/random/directional/west, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard/fore) +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "rve" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 8 }, /turf/open/floor/plating, /area/station/cargo/storage) -"rvw" = ( -/obj/structure/sign/departments/security/directional/east, -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor4/aft) "rvD" = ( /obj/structure/sink/directional/south, /obj/structure/mirror/directional/north, @@ -67774,25 +67887,6 @@ "rvL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/port/fore) -"rwa" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/siding/white, -/obj/structure/cable, -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/storage/pill_bottle/mannitol, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/wrench/medical, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "rwc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/moisture_trap, @@ -67873,13 +67967,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"rwS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/official/love_ian/directional/south, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) "rwY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/modular_computer/preset/civilian{ @@ -67916,6 +68003,15 @@ "rxn" = ( /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"rxq" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/entry) "rxu" = ( /obj/item/radio/intercom/directional/north{ broadcasting = 1; @@ -67952,6 +68048,14 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/science/genetics) +"rxS" = ( +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/trash/soap, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "rxZ" = ( /obj/item/storage/toolbox/maint_kit, /obj/item/ammo_casing/shotgun/improvised, @@ -68131,15 +68235,6 @@ /obj/effect/turf_decal/trimline/red/filled, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"rAF" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "rAP" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -68241,6 +68336,12 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos) +"rCc" = ( +/obj/machinery/computer/records/security, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "rCe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68302,6 +68403,19 @@ }, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"rCM" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port/fore) "rCN" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{ dir = 4 @@ -68338,11 +68452,6 @@ dir = 8 }, /area/station/hallway/floor1/aft) -"rDw" = ( -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/office) "rDD" = ( /obj/structure/transit_tube/curved/flipped{ dir = 8 @@ -68362,11 +68471,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"rDH" = ( -/obj/effect/spawner/random/structure/crate, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "rDK" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -68399,6 +68503,11 @@ }, /turf/open/floor/plating, /area/station/security/brig) +"rEa" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "rEm" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=1-2"; @@ -68415,14 +68524,6 @@ }, /turf/open/floor/iron/white/textured, /area/station/medical/cryo) -"rEA" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "rES" = ( /obj/effect/turf_decal/trimline/blue/warning{ dir = 1 @@ -68573,6 +68674,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/engineering/atmos/office) +"rHr" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "rHy" = ( /obj/machinery/vending/wardrobe/atmos_wardrobe, /turf/open/floor/iron, @@ -68735,12 +68844,6 @@ dir = 1 }, /area/station/hallway/secondary/exit) -"rKd" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "rKg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68809,6 +68912,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) +"rKV" = ( +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "rKX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -68835,15 +68942,16 @@ /obj/structure/bookcase/random, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"rLp" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ +"rLl" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/robotics/lab) +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "rLs" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, @@ -68902,15 +69010,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) -"rMf" = ( -/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/floor3/port/aft) "rMo" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/west, @@ -69089,6 +69188,14 @@ "rPi" = ( /turf/closed/wall, /area/station/cargo/office) +"rPr" = ( +/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/landmark/start/hangover, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor4/aft) "rPw" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -69121,6 +69228,13 @@ dir = 1 }, /area/station/hallway/floor4/fore) +"rPG" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "rPK" = ( /obj/machinery/camera/directional/south{ c_tag = "Security - Showers" @@ -69214,12 +69328,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/science/cytology) -"rQJ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/aft) "rQV" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -69459,10 +69567,6 @@ /obj/structure/railing/corner, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) -"rTR" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor3/port/aft) "rTV" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -69606,6 +69710,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) +"rWa" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "rWm" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, @@ -69696,10 +69807,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/theater) -"rXy" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "rXC" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 6 @@ -69802,16 +69909,6 @@ }, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) -"rZd" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/cargo/bitrunning/den) "rZe" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/trashcart/filled, @@ -69840,20 +69937,6 @@ /obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/iron, /area/station/service/janitor) -"rZp" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/arrows{ - dir = 4 - }, -/obj/structure/railing{ - layer = 3.1 - }, -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/landmark/start/bitrunner, -/turf/open/floor/iron/dark/textured_large, -/area/station/cargo/bitrunning/den) "rZC" = ( /obj/structure/showcase/cyborg/old{ dir = 4; @@ -69920,6 +70003,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"sav" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "saA" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 1 @@ -69985,16 +70072,6 @@ dir = 1 }, /area/station/cargo/drone_bay) -"sbG" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "sbI" = ( /obj/structure/flora/bush/snow/style_random, /turf/open/misc/snow/actually_safe{ @@ -70090,6 +70167,15 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) +"sda" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/aft) "sdh" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/grille, @@ -70120,15 +70206,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood/parquet, /area/station/hallway/floor4/aft) -"sdv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/aft) "sdA" = ( /obj/effect/turf_decal/trimline/white/filled/corner, /turf/open/floor/iron, @@ -70162,6 +70239,21 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/ai_monitored/command/storage/eva) +"sdI" = ( +/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/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "sdL" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering" @@ -70212,17 +70304,6 @@ }, /turf/open/floor/carpet/orange, /area/station/service/chapel/funeral) -"sec" = ( -/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/dark/side{ - dir = 1 - }, -/area/station/security/checkpoint) "see" = ( /obj/effect/turf_decal/tile/green/full, /obj/effect/decal/cleanable/dirt, @@ -70334,21 +70415,6 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) -"sgk" = ( -/obj/structure/sign/directions/evac/directional/north{ - dir = 2; - pixel_y = 40 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 2 - }, -/obj/structure/sign/directions/supply/directional/north{ - dir = 2; - pixel_y = 24 - }, -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) "sgm" = ( /obj/structure/chair/office{ dir = 1 @@ -70419,12 +70485,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lower) -"sht" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "shu" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 @@ -70453,14 +70513,6 @@ }, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"shN" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "shV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70482,15 +70534,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/lab) -"sig" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port) "sih" = ( /obj/structure/table, /obj/item/clothing/glasses/welding, @@ -70715,6 +70758,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/treatment_center) +"slQ" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=2-13"; + location = "2-12" + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/hallway/floor2/aft) "smi" = ( /turf/open/floor/grass, /area/station/service/hydroponics) @@ -70791,21 +70844,6 @@ dir = 8 }, /area/station/security/courtroom) -"snA" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "snI" = ( /obj/effect/turf_decal/trimline/green/arrow_ccw, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -71010,6 +71048,16 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"srl" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/north{ + name = "Butterfly Garden"; + req_access = list("hydroponics") + }, +/turf/open/misc/sandy_dirt, +/area/station/hallway/secondary/entry) "srz" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics" @@ -71180,10 +71228,6 @@ }, /turf/open/floor/iron, /area/station/science/auxlab) -"stv" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/fore) "stx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, @@ -71201,6 +71245,13 @@ /obj/structure/girder/displaced, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"stZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/south, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "sua" = ( /obj/machinery/light/red/dim/directional/north, /obj/effect/decal/cleanable/dirt, @@ -71251,6 +71302,15 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"suu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "suv" = ( /obj/machinery/processor/slime, /obj/structure/cable, @@ -71267,13 +71327,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"suC" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/freezerchamber) "suD" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, @@ -71302,6 +71355,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"suT" = ( +/obj/machinery/status_display/door_timer{ + id = "cell-3"; + name = "Floor 3 Cell"; + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "suZ" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -71418,6 +71485,15 @@ "swT" = ( /turf/closed/wall/r_wall, /area/station/science/circuits) +"sxb" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/bitrunning/den) "sxe" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -71628,6 +71704,12 @@ /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"szC" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/station/maintenance/floor2/port) "szD" = ( /obj/structure/table, /obj/item/storage/box/evidence{ @@ -71884,6 +71966,14 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"sCO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/diagonal_edge, +/obj/structure/cable, +/obj/machinery/photobooth/security, +/turf/open/floor/iron/dark, +/area/station/security/prison/visit) "sDg" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -71994,7 +72084,9 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"sEC" = ( +"sEE" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/directional/south, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -72066,6 +72158,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"sFJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "sFQ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -72091,6 +72189,19 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron, /area/station/hallway/floor2/aft) +"sGw" = ( +/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/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "sGB" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/tile, @@ -72100,23 +72211,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"sGQ" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/machinery/camera/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/item/modular_computer/laptop/preset/civilian, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "sGR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -72224,6 +72318,17 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron/dark, /area/station/engineering/supermatter) +"sHN" = ( +/obj/structure/sign/directions/medical/directional/north, +/obj/structure/sign/directions/science/directional/north{ + pixel_y = 24 + }, +/obj/structure/sign/directions/upload/directional/north{ + pixel_y = 40 + }, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "sHP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -72434,12 +72539,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"sJV" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/openspace, -/area/station/maintenance/floor2/port) "sKa" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -72685,16 +72784,10 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) -"sMH" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) +"sMD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "sMI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -72704,11 +72797,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"sMJ" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "sMS" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -72813,6 +72901,20 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/office) +"sOO" = ( +/obj/structure/sign/directions/security/directional/north{ + pixel_y = 40 + }, +/obj/structure/sign/directions/command/directional/north{ + pixel_y = 24 + }, +/obj/structure/sign/directions/vault/directional/north, +/obj/structure/chair/comfy/beige, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "sOT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/camera/autoname/directional/north, @@ -72893,6 +72995,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"sPR" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port) "sPZ" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -72952,17 +73068,6 @@ }, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) -"sQJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "sQT" = ( /obj/effect/turf_decal/stripes, /obj/effect/decal/cleanable/dirt, @@ -72981,6 +73086,20 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) +"sRf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "sRh" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -73054,23 +73173,12 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/science/circuits) -"sSA" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/medical/abandoned) "sSB" = ( /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/floor3/starboard) -"sSI" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/corner, -/area/station/security/brig) "sSK" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -73106,6 +73214,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/library/lounge) +"sSY" = ( +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "sTq" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -73127,6 +73239,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) +"sTE" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "sTG" = ( /obj/machinery/chem_dispenser/drinks, /obj/structure/table/glass, @@ -73196,28 +73318,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/floor2/aft) -"sUB" = ( -/obj/item/storage/medkit/fire{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/storage/medkit/regular, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/right/directional/east{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/obj/structure/sign/poster/official/random/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/white/textured, -/area/station/medical/storage) "sUC" = ( /obj/machinery/disposal/delivery_chute{ dir = 1 @@ -73375,6 +73475,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/range) +"sWp" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "sWs" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy, @@ -73512,17 +73616,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/station/security/checkpoint) -"sXQ" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Second Deck Outpost" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/brig, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "sXR" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, @@ -73633,6 +73726,21 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/printer) +"sYK" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "sYN" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -73663,8 +73771,8 @@ /area/station/commons/toilet) "sZb" = ( /obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, /obj/machinery/firealarm/directional/north, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/corner{ dir = 8 }, @@ -73753,17 +73861,6 @@ dir = 8 }, /area/station/hallway/floor1/fore) -"sZK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port) "sZL" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -73774,6 +73871,15 @@ dir = 4 }, /area/station/commons/storage/primary) +"sZN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/airalarm/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/security/mechbay) "sZO" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -73830,25 +73936,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) -"taE" = ( -/obj/machinery/computer/upload/ai, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "AI Upload Chamber - Fore"; - network = list("aiupload") - }, -/obj/machinery/door/window/right/directional/south{ - name = "Upload Console Window"; - req_access = list("ai_upload"); - layer = 3 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "taM" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -73861,11 +73948,17 @@ /turf/open/floor/wood/tile, /area/station/commons/fitness/recreation) "tbb" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/security/general, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/security/checkpoint/first) "tbd" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -73898,7 +73991,8 @@ /obj/structure/cable, /obj/machinery/bouldertech/refinery/smelter, /obj/machinery/conveyor/inverted{ - dir = 10 + dir = 10; + id = "mining" }, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) @@ -73936,20 +74030,6 @@ }, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) -"tbS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "tbX" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -73976,9 +74056,12 @@ /obj/effect/landmark/start/warden, /turf/open/floor/iron/dark, /area/station/security/warden) -"tco" = ( -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/port/aft) +"tcs" = ( +/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/hallway/floor3/fore) "tcA" = ( /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/telecomms, @@ -74010,11 +74093,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"tcX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "tda" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side{ @@ -74050,6 +74128,11 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/office) +"tdt" = ( +/obj/machinery/light/directional/south, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "tdz" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/effect/turf_decal/trimline/brown/filled/mid_joiner, @@ -74121,6 +74204,22 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/science/lower) +"tdN" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/port/aft) "tec" = ( /obj/machinery/door/airlock/public{ id_tag = "public_toilets_b"; @@ -74164,12 +74263,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"teL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "teN" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark, @@ -74207,16 +74300,6 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/iron, /area/station/service/hydroponics) -"tfk" = ( -/obj/machinery/computer/department_orders/science{ - department_delivery_areas = list(/area/station/science/lobby,/area/station/science/robotics/lab) - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "tfo" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 8 @@ -74323,14 +74406,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/station/science/cytology) -"tgK" = ( -/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, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "tgP" = ( /obj/effect/turf_decal/tile/green/full, /obj/effect/decal/cleanable/dirt, @@ -74438,16 +74513,6 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/circuit/green/telecomms, /area/station/tcommsat/server) -"tis" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard/fore) "tiX" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 10 @@ -74596,7 +74661,8 @@ "tkZ" = ( /obj/structure/cable, /obj/machinery/conveyor/inverted{ - dir = 6 + dir = 6; + id = "mining" }, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) @@ -74667,15 +74733,6 @@ }, /turf/open/floor/circuit, /area/station/science/xenobiology) -"tlX" = ( -/obj/machinery/modular_computer/preset/civilian{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/lobby) "tlZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -74690,6 +74747,10 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/carpet, /area/station/service/lawoffice) +"tmk" = ( +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/floor4/port/aft) "tml" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -74718,20 +74779,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"tmA" = ( -/obj/structure/sign/directions/security/directional/north{ - pixel_y = 40 - }, -/obj/structure/sign/directions/command/directional/north{ - pixel_y = 24 - }, -/obj/structure/sign/directions/vault/directional/north, -/obj/structure/chair/comfy/beige, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/hallway/floor3/fore) +"tmH" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "tmM" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -74847,6 +74898,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"tnR" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Fore Entrance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint) "tnS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74938,6 +75005,11 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) +"toM" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "toO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -74960,12 +75032,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/garden) -"tpb" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 1 - }, -/turf/open/openspace, -/area/station/maintenance/floor4/starboard/fore) "tpi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74975,6 +75041,12 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/storage) +"tpw" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "tpy" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/red{ @@ -75002,6 +75074,16 @@ /obj/effect/mapping_helpers/requests_console/announcement, /turf/open/floor/iron/smooth, /area/station/cargo/office) +"tpD" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "tpS" = ( /obj/effect/turf_decal/tile/green/full, /obj/structure/table/reinforced, @@ -75060,6 +75142,17 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"tqu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "tqw" = ( /turf/open/openspace, /area/station/maintenance/floor2/starboard/fore) @@ -75146,10 +75239,29 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"trF" = ( +/obj/machinery/door/airlock/hatch{ + name = "Elevator Shaft Access" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "trH" = ( /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"trM" = ( +/obj/machinery/door/poddoor/preopen{ + id = "secure-gate"; + name = "Brig Shutters" + }, +/obj/machinery/prisongate, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "trP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75166,16 +75278,6 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"trX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "tsi" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -75196,16 +75298,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"tsQ" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "ttb" = ( /turf/closed/wall, /area/station/hallway/floor2/aft) @@ -75758,10 +75850,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"tzK" = ( -/obj/machinery/light/red/dim/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "tzU" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, @@ -75859,6 +75947,12 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/service/theater) +"tBq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "tBr" = ( /obj/machinery/camera/autoname/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -75961,14 +76055,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"tDc" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard) "tDf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76036,6 +76122,15 @@ dir = 1 }, /area/station/engineering/atmos/office) +"tDO" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "tDV" = ( /obj/machinery/rnd/production/circuit_imprinter/department/science, /obj/effect/turf_decal/bot, @@ -76083,6 +76178,14 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"tEv" = ( +/obj/effect/turf_decal/tile/red/half, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "tEG" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) @@ -76205,18 +76308,6 @@ dir = 4 }, /area/station/science/robotics/lab) -"tGw" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/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/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/floor4/port/fore) "tGz" = ( /obj/item/storage/box/teargas{ pixel_x = 3; @@ -76260,6 +76351,18 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) +"tHk" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "tHn" = ( /obj/machinery/atmospherics/components/binary/pump/layer4{ dir = 1 @@ -76278,10 +76381,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"tHB" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "tHH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -76313,6 +76412,21 @@ }, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) +"tIe" = ( +/obj/structure/sign/directions/evac/directional/north{ + dir = 2; + pixel_y = 40 + }, +/obj/structure/sign/directions/engineering/directional/north{ + dir = 2 + }, +/obj/structure/sign/directions/supply/directional/north{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "tIj" = ( /obj/structure/railing, /obj/structure/chair, @@ -76429,16 +76543,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tJC" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/carpet/green, -/area/station/cargo/miningdock) "tJE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -76665,15 +76769,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) -"tMy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Emergency Ladder Access" - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/fore) "tMK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -76844,20 +76939,6 @@ dir = 1 }, /area/station/hallway/floor1/fore) -"tOp" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/security/brig) "tOr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, /obj/effect/turf_decal/tile/blue{ @@ -76867,11 +76948,6 @@ dir = 1 }, /area/station/hallway/floor1/aft) -"tOv" = ( -/obj/effect/spawner/random/structure/grille, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "tOE" = ( /obj/machinery/duct, /obj/machinery/light/directional/south, @@ -76935,6 +77011,15 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"tPy" = ( +/obj/structure/cable, +/obj/machinery/brm, +/obj/machinery/conveyor{ + dir = 4; + id = "mining" + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "tPB" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -76945,6 +77030,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) +"tPI" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "tPK" = ( /obj/structure/sign/warning{ pixel_y = 32 @@ -76954,6 +77049,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard) +"tPL" = ( +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/floor3/port/aft) "tPO" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -77180,15 +77279,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"tTx" = ( -/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/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "tTy" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/dark/side{ @@ -77242,15 +77332,6 @@ /obj/effect/turf_decal/tile/red/anticorner, /turf/open/floor/iron/dark, /area/station/security/eva) -"tUb" = ( -/obj/structure/cable, -/obj/machinery/brm, -/obj/machinery/conveyor{ - dir = 4; - id = "mining" - }, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "tUc" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -77266,15 +77347,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron/white, /area/station/science/lab) -"tUl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "tUq" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/purple/corner{ @@ -77308,6 +77380,23 @@ }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"tUW" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Security - Office Fore" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "tVa" = ( /obj/structure/table, /obj/item/folder/red{ @@ -77344,6 +77433,8 @@ "tVp" = ( /obj/machinery/light_switch/directional/north, /obj/machinery/status_display/ai/directional/east, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/piggy_bank/vault, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) "tVq" = ( @@ -77356,12 +77447,6 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"tVr" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port) "tVz" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/north, @@ -77644,6 +77729,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"tZO" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "tZX" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Visitation" @@ -77856,6 +77946,16 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"udw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/structure/cable, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/fore) "udx" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine, @@ -77992,29 +78092,10 @@ dir = 8 }, /area/station/maintenance/floor1/starboard/aft) -"ufp" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "ufs" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) -"ufI" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Security - Office Aft" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/item/kirbyplants/organic/plant10, -/turf/open/floor/iron/dark, -/area/station/security/office) "ufL" = ( /obj/structure/railing/corner{ dir = 1 @@ -78122,6 +78203,21 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"uhj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/end{ + dir = 8 + }, +/obj/item/storage/toolbox/emergency, +/obj/machinery/bluespace_vendor/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "uhl" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/structure/crate, @@ -78326,6 +78422,12 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"ujt" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/station/security/office) "ujv" = ( /obj/docking_port/stationary/mining_home/common/northstar{ dir = 2 @@ -78352,15 +78454,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) -"ujS" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "ujT" = ( /obj/item/cigbutt/cigarbutt, /obj/machinery/camera/autoname/directional/north, @@ -78427,16 +78520,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"uln" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard) "ulo" = ( /obj/structure/closet/emcloset, /obj/effect/landmark/start/hangover/closet, @@ -78464,6 +78547,16 @@ dir = 8 }, /area/station/service/chapel) +"ulv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Mail Sorting" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/turf/open/floor/iron/textured_large, +/area/station/cargo/storage) "ulB" = ( /obj/structure/hedge, /turf/open/floor/carpet/green, @@ -78721,6 +78814,18 @@ "uqc" = ( /turf/closed/wall/r_wall, /area/station/command/teleporter) +"uqd" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor2/aft) "uqi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78765,21 +78870,6 @@ /obj/machinery/vending/wallmed/directional/west, /turf/open/floor/iron/white, /area/station/hallway/floor2/fore) -"uqF" = ( -/obj/structure/table, -/obj/machinery/button/ticket_machine{ - pixel_x = -32 - }, -/obj/item/stamp/head/hop{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/item/flashlight/lamp{ - pixel_x = -4; - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "uqT" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -78787,6 +78877,11 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"ure" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/aft) "urf" = ( /obj/effect/turf_decal/tile/blue/anticorner{ dir = 8 @@ -78795,6 +78890,12 @@ dir = 10 }, /area/station/ai_monitored/turret_protected/ai) +"urv" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Xenobio - Holding Pen" + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "urO" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible/layer2{ @@ -78880,15 +78981,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"usz" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/crowbar, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "usB" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -79025,12 +79117,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) -"uuj" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 4 - }, -/turf/open/openspace, -/area/station/maintenance/floor3/port) "uuu" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -79103,6 +79189,15 @@ /obj/structure/sign/departments/medbay/alt/directional/east, /turf/open/openspace, /area/station/hallway/floor2/fore) +"uvG" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port) "uvJ" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -79191,14 +79286,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"uwY" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/trimline/blue, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "uxf" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional, /obj/structure/cable, @@ -79292,6 +79379,11 @@ dir = 8 }, /area/station/hallway/floor3/fore) +"uyg" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "uyh" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, @@ -79315,6 +79407,17 @@ "uyD" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"uyH" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "uyK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -79329,17 +79432,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"uyM" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "uyQ" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/reinforced{ @@ -79436,6 +79528,17 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/atmos) +"uAg" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/obj/effect/turf_decal/trimline/red/filled, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "uAi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green/half{ @@ -79447,12 +79550,32 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) +"uAo" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/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 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard/fore) "uAW" = ( /obj/structure/closet/secure_closet/medical2, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) +"uBi" = ( +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/port/aft) "uBr" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -79479,10 +79602,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 4 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark/side{ dir = 4 }, @@ -79504,14 +79627,6 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) -"uCd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/marker_beacon/jade, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "uCe" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 4; @@ -79640,15 +79755,6 @@ "uDE" = ( /turf/open/openspace, /area/station/maintenance/floor4/starboard) -"uDG" = ( -/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 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "uDH" = ( /obj/machinery/door/airlock/hatch{ name = "Escape Pods" @@ -79693,9 +79799,7 @@ /area/station/maintenance/solars/starboard/fore) "uDR" = ( /obj/machinery/firealarm/directional/west, -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -79735,16 +79839,6 @@ }, /turf/open/floor/engine/airless, /area/station/engineering/supermatter/waste) -"uEz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/office) "uED" = ( /obj/effect/turf_decal/tile/yellow/half, /obj/machinery/light/small/directional/east, @@ -79792,20 +79886,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) -"uFa" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Briefing Room" - }, -/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/mapping_helpers/airlock/access/all/security/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/office) "uFc" = ( /obj/machinery/vending/coffee, /turf/open/floor/pod/light, @@ -79886,6 +79966,22 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) +"uGO" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south{ + name = "Access Queue" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hopblast"; + name = "HoP Blast Door" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Access Desk"; + req_access = list("hop") + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "uGP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -79907,6 +80003,13 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"uGS" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/machinery/bluespace_vendor/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "uHa" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark/side, @@ -79980,6 +80083,15 @@ /obj/structure/table, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"uHR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/modular_computer/preset/cargochat/science{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/lobby) "uHT" = ( /obj/structure/chair/office/light, /obj/structure/sink/directional/west, @@ -80078,13 +80190,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/textured_large, /area/station/ai_monitored/command/nuke_storage) -"uIA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/aft) "uID" = ( /obj/structure/railing/corner{ dir = 1 @@ -80255,6 +80360,20 @@ /obj/structure/stairs/north, /turf/open/floor/plating, /area/station/science/lobby) +"uKs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "uKt" = ( /obj/structure/cable/multilayer/multiz, /obj/machinery/digital_clock/directional/north, @@ -80423,14 +80542,6 @@ }, /turf/open/floor/carpet/red, /area/station/service/library/lounge) -"uME" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ - dir = 1 - }, -/obj/effect/spawner/structure/window/hollow/plasma/middle, -/obj/machinery/atmospherics/pipe/smart/simple/purple, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/freezerchamber) "uMK" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -80510,6 +80621,10 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/machinery/status_display/ai/directional/west, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/maneki_neko{ + pixel_y = 4 + }, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) "uNp" = ( @@ -80637,18 +80752,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/first) -"uOI" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/hatch{ - name = "Science Maintenance" - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "uOL" = ( /obj/structure/sign/painting{ pixel_x = 32 @@ -81041,21 +81144,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/office) -"uUa" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "uUg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, @@ -81152,17 +81240,6 @@ /obj/structure/cable, /turf/open/floor/iron/chapel, /area/station/service/chapel) -"uVq" = ( -/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/blue/opposingcorners, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "uVz" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 1 @@ -81212,6 +81289,15 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"uVU" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard/fore) "uVV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -81534,6 +81620,16 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron/white, /area/station/cargo/miningdock) +"vaz" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/carpet/green, +/area/station/cargo/miningdock) "vaA" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -81700,6 +81796,21 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/cafeteria, /area/station/service/theater) +"vcy" = ( +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/machinery/door/window/brigdoor/security/cell/left/directional/north{ + id = "cell-1"; + name = "1st Floor Prisoner Tube" + }, +/obj/machinery/disposal/delivery_chute{ + dir = 1; + name = "prisoner transport" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "vcM" = ( /obj/machinery/duct, /obj/structure/sink/kitchen/directional/west, @@ -81716,6 +81827,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"vcY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "vdb" = ( /obj/effect/turf_decal/trimline/white/arrow_cw{ dir = 8 @@ -81763,20 +81884,6 @@ /obj/machinery/vending/assist, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/storage/primary) -"vdE" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig Fore Entrance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/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/red/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint) "vdP" = ( /obj/structure/railing/corner{ dir = 1 @@ -81834,6 +81941,13 @@ dir = 4 }, /area/station/hallway/floor2/fore) +"veI" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "veQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82159,24 +82273,6 @@ "vjv" = ( /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) -"vjA" = ( -/obj/machinery/door/window/right/directional/south{ - name = "Gateway Access"; - req_access = list("gateway") - }, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/corner, -/obj/effect/turf_decal/stripes/white/corner{ - dir = 8 - }, -/obj/effect/turf_decal/arrows/white{ - dir = 1 - }, -/turf/open/floor/iron/large, -/area/station/command/gateway) "vjC" = ( /obj/machinery/chem_dispenser/drinks/beer, /obj/structure/table/glass, @@ -82292,12 +82388,7 @@ }, /area/station/security/prison) "vlh" = ( -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/effect/turf_decal/trimline/neutral, /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, @@ -82408,15 +82499,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"vmS" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/item/pillow, -/obj/effect/turf_decal/box, -/obj/machinery/flasher/directional/west{ - id = "drunktank" - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "vmX" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -82728,6 +82810,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/hydroponics) +"vqv" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "vqx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -82835,14 +82926,6 @@ /obj/effect/turf_decal/tile/red/diagonal_edge, /turf/open/floor/iron/dark/textured_large, /area/station/security/checkpoint/escape) -"vrl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard/fore) "vrn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -82955,14 +83038,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"vsu" = ( -/obj/structure/chair/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/wood/tile, -/area/station/service/chapel/office) "vsv" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -83008,6 +83083,14 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/grass, /area/station/service/hydroponics/garden/abandoned) +"vsO" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard) "vsP" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -83126,13 +83209,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"vuC" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/order_console/cook{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "vuD" = ( /obj/effect/turf_decal/trimline/white/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83168,16 +83244,18 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) -"vuQ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 +"vuU" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/modular_computer/preset/cargochat/security{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/security/office) +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) +"vuW" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "vuZ" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ dir = 8 @@ -83283,10 +83361,6 @@ /mob/living/basic/crab, /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) -"vwl" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) "vwn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -83380,10 +83454,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/explab) -"vxP" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port) "vxT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83431,20 +83501,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/psychology) -"vyr" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/security/office) "vyu" = ( /obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/door/firedoor, @@ -83493,11 +83549,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"vyJ" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "vyK" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white/textured_large, @@ -83578,6 +83629,15 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) +"vzM" = ( +/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/pod/light, +/area/station/maintenance/floor4/starboard/fore) "vzN" = ( /obj/structure/chair/sofa/middle/brown{ dir = 1 @@ -83676,13 +83736,6 @@ /obj/effect/decal/cleanable/wrapping, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"vAP" = ( -/obj/machinery/modular_computer/preset/cargochat/service{ - dir = 8 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "vAS" = ( /obj/effect/mapping_helpers/airlock/access/any/supply/mining, /obj/machinery/door/airlock/multi_tile/public/glass{ @@ -83725,6 +83778,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"vBw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "vBA" = ( /obj/machinery/door/airlock/medical{ name = "Safe Habitation B" @@ -83773,16 +83830,6 @@ dir = 1 }, /area/station/hallway/secondary/exit) -"vCi" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "vCy" = ( /obj/effect/spawner/random/structure/table_fancy, /obj/structure/sign/painting/large/library_private{ @@ -83810,6 +83857,21 @@ /obj/machinery/door/window/right/directional/west, /turf/open/floor/grass, /area/station/security/courtroom) +"vCP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "vDf" = ( /obj/effect/spawner/random/trash/grille_or_waste, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83935,6 +83997,19 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/security/brig) +"vFw" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "vFC" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -84138,6 +84213,22 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"vIn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) +"vIo" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/security/office) "vIp" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -84196,18 +84287,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor4/fore) -"vIT" = ( -/obj/structure/sign/poster/official/random/directional/east, -/obj/structure/sign/directions/dorms/directional/north, -/obj/structure/sign/directions/security/directional/north{ - pixel_y = 40 - }, -/obj/structure/sign/directions/command/directional/north{ - pixel_y = 24 - }, -/obj/structure/rack, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) "vIZ" = ( /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/iron/white, @@ -84345,6 +84424,10 @@ /obj/effect/decal/cleanable/xenoblood, /turf/open/floor/engine, /area/station/science/cytology) +"vLv" = ( +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "vLx" = ( /obj/machinery/ai_slipper{ uses = 8 @@ -84387,13 +84470,6 @@ dir = 4 }, /area/station/medical/chemistry) -"vLO" = ( -/obj/structure/weightmachine/weightlifter, -/obj/effect/turf_decal/bot, -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "vLP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -84683,12 +84759,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating, /area/station/service/chapel/office) -"vPC" = ( -/obj/effect/turf_decal/arrows{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "vPE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -84748,6 +84818,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) +"vQi" = ( +/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 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "vQs" = ( /obj/effect/turf_decal/siding/white/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -84768,26 +84847,19 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) -"vQP" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ - id = "cell-3"; - name = "3rd Floor Prisoner Tube" - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/delivery_chute{ - name = "prisoner transport"; - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "vQR" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark/side{ dir = 1 }, /area/station/ai_monitored/command/nuke_storage) +"vQY" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/component_printer, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "vQZ" = ( /obj/machinery/door/airlock{ id_tag = "dorms_lux_2_bolts"; @@ -84900,6 +84972,16 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) +"vSB" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "vSE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/blue/line{ @@ -84916,15 +84998,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) -"vSN" = ( -/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/pod/light, -/area/station/maintenance/floor4/starboard/fore) "vSQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -85010,6 +85083,12 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"vTV" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "vTY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -85019,15 +85098,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"vUa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "vUc" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -85046,21 +85116,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/psychology) -"vUh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "vUt" = ( /obj/machinery/atmospherics/pipe/layer_manifold/dark/visible{ dir = 4 @@ -85204,15 +85259,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"vWm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/floor3/port) "vWn" = ( /obj/structure/table, /obj/effect/turf_decal/tile/green/half/contrasted, @@ -85540,12 +85586,34 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"vZJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/sign/directions/evac/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "vZK" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"vZU" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/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/mapping_helpers/airlock/unres, +/turf/open/floor/plating, +/area/station/maintenance/floor4/port/fore) "wat" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 8 @@ -85915,10 +85983,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/wood/tile, /area/station/service/library) -"weh" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "wet" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -86017,13 +86081,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"wfz" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "wfD" = ( /obj/machinery/light/directional/east, /obj/structure/disposalpipe/segment{ @@ -86068,6 +86125,15 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/smooth_half, /area/station/engineering/storage/tech) +"wgr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "wgu" = ( /obj/structure/cable, /obj/machinery/conveyor{ @@ -86111,6 +86177,10 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"whj" = ( +/obj/machinery/door/window/brigdoor/left/directional/south, +/turf/open/misc/sandy_dirt, +/area/station/maintenance/floor1/starboard) "whw" = ( /obj/structure/railing{ dir = 8 @@ -86351,11 +86421,6 @@ /obj/item/clothing/head/helmet/old, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"wjZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/purple, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "wkf" = ( /obj/structure/chair/comfy/brown, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -86431,6 +86496,9 @@ /obj/item/book/manual/chef_recipes, /turf/open/floor/iron, /area/station/security/prison) +"wkX" = ( +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "wll" = ( /obj/effect/turf_decal/delivery, /obj/structure/sign/departments/science/alt/directional/north, @@ -86449,12 +86517,6 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/grass, /area/station/service/hydroponics/garden/abandoned) -"wls" = ( -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/openspace, -/area/station/maintenance/floor3/port) "wlu" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -86471,18 +86533,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) -"wlD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port) "wlF" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -86490,11 +86540,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) -"wlI" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "wlK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -86506,11 +86551,6 @@ dir = 10 }, /area/station/command/bridge) -"wlO" = ( -/obj/structure/rack, -/obj/effect/spawner/random/engineering/tool, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "wlP" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Atmospherics-Supermatter Connection" @@ -86564,6 +86604,10 @@ /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /turf/open/floor/iron, /area/station/security/brig) +"wms" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "wmt" = ( /obj/machinery/status_display/ai/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -86585,17 +86629,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"wmy" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/robotics/lab) "wmz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -86790,16 +86823,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/paramedic) -"woF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "woH" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, @@ -87008,6 +87031,12 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/engineering/atmos) +"wsb" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "wsh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -87267,12 +87296,6 @@ "wuL" = ( /turf/closed/wall, /area/station/commons/dorms/apartment2) -"wuM" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/science/circuits) "wuZ" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -87320,9 +87343,9 @@ /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 }, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/machinery/light/cold/no_nightlight/directional/west, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white, /area/station/science/lobby) "wvw" = ( @@ -87342,15 +87365,6 @@ dir = 6 }, /area/station/command/bridge) -"wvP" = ( -/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/floor3/port) "wvR" = ( /obj/effect/spawner/random/structure/table_or_rack, /obj/effect/spawner/random/maintenance, @@ -87366,15 +87380,6 @@ /obj/item/pneumatic_cannon/pie, /turf/open/floor/carpet/red, /area/station/service/theater) -"wwg" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/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/side, -/area/station/hallway/floor1/fore) "wwi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -87400,10 +87405,6 @@ "wwu" = ( /turf/closed/wall, /area/station/maintenance/floor2/starboard/fore) -"wwx" = ( -/obj/structure/disposalpipe/segment, -/turf/open/openspace, -/area/station/maintenance/floor3/port/aft) "wwz" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -87681,12 +87682,6 @@ /obj/item/camera_film, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"wzl" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "wzm" = ( /obj/effect/turf_decal/trimline/brown/warning, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -87694,6 +87689,14 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"wzp" = ( +/obj/structure/table, +/obj/item/toy/cards/deck/wizoff, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "wzt" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/white/textured_large, @@ -87839,6 +87842,13 @@ /obj/structure/closet/secure_closet/courtroom, /turf/open/floor/iron, /area/station/security/courtroom) +"wBG" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "wBO" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 10 @@ -87878,16 +87888,6 @@ "wCn" = ( /turf/closed/wall/r_wall, /area/station/medical/chemistry) -"wCq" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "wCu" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -87972,6 +87972,11 @@ /obj/structure/table, /turf/open/floor/iron/checker, /area/station/commons/dorms/apartment1) +"wDf" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/turf/open/floor/iron/white/textured, +/area/station/medical/break_room) "wDh" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -88011,13 +88016,6 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/iron/dark, /area/station/security/brig) -"wDO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "wDS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -88028,12 +88026,22 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/medical/abandoned) -"wEH" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ +"wEN" = ( +/obj/structure/disposalpipe/segment{ dir = 1 }, -/area/station/hallway/floor4/fore) +/obj/structure/cable, +/obj/machinery/door/airlock/mining/glass{ + name = "Mail Sorting" + }, +/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/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/turf/open/floor/iron/smooth, +/area/station/cargo/storage) "wEQ" = ( /obj/structure/stairs/east, /turf/open/floor/pod/dark, @@ -88387,17 +88395,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron, /area/station/service/janitor) -"wIF" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "wIG" = ( /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -88652,24 +88649,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/red, /area/station/service/theater) -"wKG" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/disposal/delivery_chute{ - dir = 8; - name = "Space Chute" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/warning/vacuum/external/directional/south{ - name = "WARNING: CHUTE LEADS DIRECTLY TO SPACE" - }, -/obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/deathsposal/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "wKL" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -88840,12 +88819,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"wMZ" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "wNb" = ( /obj/structure/railing{ dir = 8 @@ -89105,11 +89078,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"wQW" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "wQX" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -89212,11 +89180,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"wSl" = ( -/obj/machinery/door/window/brigdoor/left/directional/north, -/mob/living/basic/mothroach, -/turf/open/floor/noslip, -/area/station/maintenance/floor1/port) "wSm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -89460,16 +89423,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) -"wVx" = ( -/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/pods/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "wVz" = ( /obj/machinery/newscaster/directional/east, /turf/open/floor/wood, @@ -89560,16 +89513,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/lobby) -"wWx" = ( -/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/door/airlock/hatch{ - name = "Emergency Ladder Access" - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor4/aft) "wWE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grille_or_waste, @@ -89592,6 +89535,24 @@ /obj/item/storage/briefcase/secure, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"wWY" = ( +/obj/effect/spawner/structure/window/hollow/plasma/middle{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance/freezerchamber) +"wXc" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) +"wXg" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor4/aft) "wXi" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -89844,13 +89805,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"xbw" = ( -/obj/structure/weightmachine, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "xbx" = ( /obj/structure/table/wood, /obj/item/storage/wallet/random, @@ -89942,15 +89896,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/port) -"xcD" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/arrows{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/cargo/bitrunning/den) "xcG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90038,6 +89983,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"xdC" = ( +/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/iron/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "xdE" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/stripes/end{ @@ -90128,6 +90084,12 @@ /obj/structure/sign/departments/rndserver/directional/west, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"xeF" = ( +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "xeM" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -90168,27 +90130,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"xfq" = ( -/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/blue/opposingcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) -"xfu" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "xfv" = ( /obj/machinery/atmospherics/components/binary/pump/layer2{ dir = 1; @@ -90263,6 +90204,12 @@ dir = 1 }, /area/station/service/library/private) +"xgD" = ( +/obj/machinery/photocopier, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/engineering/lobby) "xgH" = ( /turf/closed/wall, /area/station/maintenance/floor1/port) @@ -90273,14 +90220,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"xgS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "xgV" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 8 @@ -90350,6 +90289,13 @@ dir = 1 }, /area/station/command/teleporter) +"xhx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "xhz" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -90468,16 +90414,11 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"xja" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) +"xiW" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard/aft) "xjc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/red/anticorner{ @@ -90696,18 +90637,18 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/grass, /area/station/maintenance/floor1/starboard) -"xmd" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "xmh" = ( /obj/structure/table, /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/hallway/floor2/aft) +"xmi" = ( +/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/catwalk_floor, +/area/station/hallway/floor3/fore) "xmk" = ( /obj/structure/railing/corner{ dir = 1 @@ -90779,6 +90720,16 @@ }, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) +"xnY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "xob" = ( /obj/structure/frame/computer{ dir = 4 @@ -91042,10 +90993,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"xrR" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating, -/area/station/hallway/floor3/fore) "xrY" = ( /obj/machinery/button/door/directional/north{ id = "survshop"; @@ -91085,10 +91032,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"xsr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "xst" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -91540,10 +91483,19 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) -"xyo" = ( -/obj/structure/disposalpipe/trunk/multiz/down, -/turf/open/openspace, -/area/station/maintenance/floor4/port/aft) +"xyi" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) +"xyw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint) "xyz" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/light, @@ -91644,7 +91596,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) "xzS" = ( -/obj/structure/secure_safe/caps_spare/directional/south, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) @@ -91944,6 +91895,15 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"xDM" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/crowbar, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "xDQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -92120,17 +92080,6 @@ "xEP" = ( /turf/closed/wall/r_wall, /area/station/security/warden) -"xES" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "xEY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/north, @@ -92253,12 +92202,6 @@ "xGx" = ( /turf/open/floor/plating, /area/station/medical/abandoned) -"xGy" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) "xGI" = ( /turf/closed/wall, /area/station/command/heads_quarters/ce) @@ -92376,6 +92319,15 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"xIx" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/carpet/blue, +/area/station/cargo/miningdock) "xID" = ( /obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -92413,6 +92365,20 @@ }, /turf/open/floor/plating, /area/station/security/brig) +"xIR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard) "xJk" = ( /obj/machinery/seed_extractor, /obj/effect/turf_decal/tile/green/full, @@ -92595,6 +92561,21 @@ dir = 1 }, /area/station/service/chapel) +"xLy" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/assembly/flash, +/obj/item/restraints/handcuffs, +/obj/machinery/camera/directional/east{ + name = "Checkpoint - Engineering Deck" + }, +/obj/machinery/recharger, +/obj/machinery/light/small/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "xLG" = ( /obj/machinery/door/airlock/hatch{ name = "Elevator Shaft Access" @@ -92630,15 +92611,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"xMc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "xMd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, @@ -92716,14 +92688,6 @@ dir = 4 }, /area/station/engineering/atmos/office) -"xNu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/corner, -/area/station/security/office) "xNx" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -92734,6 +92698,10 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"xNC" = ( +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "xND" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -92799,6 +92767,12 @@ /obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/engine, /area/station/science/explab) +"xOr" = ( +/obj/structure/closet/secure_closet/security, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "xOs" = ( /obj/structure/railing{ dir = 8 @@ -92819,10 +92793,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/security/prison) -"xOH" = ( -/obj/effect/spawner/structure/window/hollow/middle, -/turf/open/floor/plating, -/area/station/maintenance/floor3/starboard/aft) +"xOI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/machinery/door/poddoor/shutters{ + id = "secmechbay"; + name = "Security Mech Bay Shutters" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/box, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/mechbay) "xOY" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -92911,6 +92895,12 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"xPZ" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "xQg" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/bot, @@ -93187,6 +93177,12 @@ }, /turf/open/space/openspace, /area/space) +"xUB" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor3/fore) "xUI" = ( /obj/structure/cable, /obj/structure/chair/sofa/bench/left, @@ -93215,6 +93211,12 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) +"xUT" = ( +/obj/machinery/computer/security, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "xUU" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -93275,18 +93277,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"xVK" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor2/aft) "xVR" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/cable, @@ -93845,6 +93835,25 @@ "ydm" = ( /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"ydn" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/siding/white, +/obj/structure/cable, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/pill_bottle/mannitol, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/wrench/medical, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "ydt" = ( /turf/closed/wall/r_wall, /area/station/cargo/miningoffice) @@ -93939,17 +93948,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) -"yeF" = ( -/obj/structure/transport/linear/public, -/obj/effect/landmark/transport/transport_id{ - specific_transport_id = "com_vator" - }, -/obj/effect/abstract/elevator_music_zone{ - linked_elevator_id = "com_vator"; - range = 2 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/floor1/fore) "yeR" = ( /obj/structure/chair/sofa/bench/left, /obj/effect/landmark/start/janitor, @@ -94083,6 +94081,12 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) +"ygw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "ygH" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -94142,15 +94146,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"yhN" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor3/port) "yhO" = ( /obj/machinery/suit_storage_unit/engine, /obj/structure/window/spawner/directional/east, @@ -94177,12 +94172,6 @@ "yhZ" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/service/library/printer) -"yik" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "yil" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -94317,6 +94306,15 @@ dir = 4 }, /area/station/hallway/floor3/aft) +"ykw" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "ykC" = ( /obj/structure/closet/crate/internals, /obj/effect/turf_decal/trimline/dark_blue/end{ @@ -94357,22 +94355,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment1) -"yla" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south{ - name = "Access Queue" - }, -/obj/machinery/door/poddoor/preopen{ - id = "hopblast"; - name = "HoP Blast Door" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Access Desk"; - req_access = list("hop") - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "ylb" = ( /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) @@ -94420,6 +94402,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"ylD" = ( +/obj/effect/spawner/structure/window/hollow/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor3/port/aft) "ylE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -94438,21 +94426,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/textured, /area/station/engineering/lobby) -"ylI" = ( -/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/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "ylK" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=3-4"; @@ -110540,7 +110513,7 @@ mDZ xYo inq mha -myU +cIo ehR wBR dbe @@ -112595,7 +112568,7 @@ aYd nBn rUH rUH -fmd +uGS rNO tSK hJy @@ -113094,7 +113067,7 @@ ala ala ala gCH -faG +dtU pRl pJO fnT @@ -113853,7 +113826,7 @@ kKd vga oic tVq -riO +osq oic twL uzN @@ -116164,12 +116137,12 @@ oic nUj uNF vnp -aNi -aNi -aNi -aNi -aNi -aNi +jdc +jdc +jdc +jdc +jdc +jdc sBT oic gdt @@ -116421,7 +116394,7 @@ oic mlC laR oic -aNi +jdc oic oic oic @@ -116675,10 +116648,10 @@ owI owI oic oic -djG -aRV -rgw -cnt +eUT +osC +stZ +fpW oic ekj ekj @@ -116932,11 +116905,11 @@ owI owI tXe tXe -kjR +bCR tXe tXe -mVh -oBV +rxS +nXs oic oic oic @@ -117193,7 +117166,7 @@ dPx pUY tXe tXe -bQy +nfI tXe gUS nOj @@ -117450,7 +117423,7 @@ iCP nnu hnb jdQ -lqH +qxN tXe eps yiZ @@ -117704,10 +117677,10 @@ owI tXe tXe cOT -xcD -rZp -ezj -rZd +sxb +luo +hTP +lNW qZU dQo qWJ @@ -119793,7 +119766,7 @@ qGk srC cez clb -mMp +maS jbu usB rtV @@ -120546,7 +120519,7 @@ cMA mnR acv hNz -pto +wEN nlu aAZ iRK @@ -120560,7 +120533,7 @@ gqU imJ jFZ brj -vCi +oXp xVX tML wQe @@ -121089,7 +121062,7 @@ vdb cMi vIb xgH -rfm +apX rLU xgH xcA @@ -121319,7 +121292,7 @@ tHL tHL cUL ggO -orx +ulv ncc jhV pAb @@ -121589,8 +121562,8 @@ tqE tfo brj hVZ -bJB -pBo +rxq +srl owS tCq bKp @@ -121842,7 +121815,7 @@ xHA xHA uKC gqU -ios +pBQ wdL wdL wdL @@ -121860,7 +121833,7 @@ xgH xgH xgH xgH -rfm +apX uFQ xgH fmb @@ -122105,13 +122078,13 @@ nCi svW luJ faA -nlx +pBg lem wdL -eca -eca -eca -yik +nik +nik +nik +fBJ xgH hnz dyS @@ -122356,13 +122329,13 @@ pdU xHA jZA gqU -wwg +kro qvl kbp -lWT -ujS +tpD +nMu qot -otg +pwY bnN wdL xfT @@ -122616,10 +122589,10 @@ gqU imJ bwS uOx -dTq -gjK -ive -otg +rPG +jxf +qIH +pwY xjS wdL ema @@ -122873,11 +122846,11 @@ gqU imJ wdL wdL -asN -dIW -teL -irO -njy +mTK +mJr +ygw +cGn +wBG wdL dyS wDr @@ -123129,12 +123102,12 @@ rpj gqU uOT wdL -gpp -iKu -rnX -nio -rEA -buZ +jam +uyH +bSU +xLy +epz +vcy wdL dyS xgH @@ -123388,7 +123361,7 @@ irK wdL wdL wdL -kYi +tbb wdL wdL wdL @@ -123636,7 +123609,7 @@ ybL xHA gCv hiD -wKG +qtW xHA vOK vOK @@ -123644,15 +123617,15 @@ dtY pRG vOK xgH -kiZ -ggc -dem -dem -dem -dem -dem -tOv -gBB +mNr +qsW +jwD +jwD +jwD +jwD +jwD +uyg +ljx dxS xgH xgH @@ -123898,7 +123871,7 @@ xHA kyR oOK dJV -pxo +gpZ kyR kyR kyR @@ -123909,7 +123882,7 @@ kyR xgH xgH onC -nlq +vIn nEb dyS dyS @@ -124147,17 +124120,17 @@ llR pEv iKb dpH -gVz -npj -rje +sHN +fhX +nIO kyR vOK mgl grg jnp vLP -rhn -qAH +oNK +iQC rpj mXx mXx @@ -124166,7 +124139,7 @@ kyR rTt xgH xgH -nlq +vIn xgH xgH xgH @@ -124404,26 +124377,26 @@ qly pEv hWF dpH -wlO +nRF mnQ -rje -fgZ +nIO +obV pyL qIz jYY ptd -pqw -wCq -bKN -wCq +cbT +qgU +okN +qgU mXx -yeF +nRe mXx kyR eVk twx twx -nlq +vIn xgH vfY qRz @@ -124654,15 +124627,15 @@ dpH dpH dpH dpH -pJa +xIx eAY ehG sYa pGW dts dpH -qzS -npj +ihQ +fhX rMq kyR bSE @@ -124670,21 +124643,21 @@ hVG bBx jnp vLP -hEr -qAH +tmH +iQC rpj mXx -jCp +iZD mXx kyR tCB twx twx -nlq +vIn xgH bvi eVk -cSd +bGV xgH wVn xgH @@ -124929,7 +124902,7 @@ dJV nwi kyR kyR -otY +trF kyR kyR kyR @@ -124937,7 +124910,7 @@ kyR eVk twx twx -nlq +vIn uls twx eky @@ -124946,7 +124919,7 @@ xgH wVn xgH ttF -eDW +qmN lJN cmG sWt @@ -125185,20 +125158,20 @@ vOK dtY pRG vOK -bfG -azC -luq -azC -fEI +byc +sFJ +mdi +sFJ +cHb kyR -jaB +kOx xgH xgH -nlq +vIn xgH pxb cuf -wSl +enB xgH wVn xgH @@ -125443,7 +125416,7 @@ lLy jau rjD kzE -htN +pZV kzE xgH xgH @@ -125451,7 +125424,7 @@ xgH xgH xgH qOp -nlq +vIn xgH xgH xgH @@ -125682,7 +125655,7 @@ rJy aWr vkW ehG -tJC +vaz xEK ehG mMn @@ -125708,16 +125681,16 @@ wVn wVn wVn wVn -xMc -jUi -jUi -jUi -jUi -jUi -jUi -rDH -tcX -fFJ +wgr +aHW +aHW +aHW +aHW +aHW +aHW +vuW +fkW +lYE xgH uXf ofy @@ -125974,10 +125947,10 @@ kzE kzE kzE lUo -eel +nRL xgH qGp -eDW +qmN lVR eQm cmG @@ -126231,7 +126204,7 @@ kOR kOR kzE dQi -eel +nRL xgH xgH xgH @@ -126488,7 +126461,7 @@ cUb xyD kzE tCB -eel +nRL xsX hIQ hIQ @@ -126720,7 +126693,7 @@ njk viG cGM wgu -tUb +tPy jXW jwr sAK @@ -126745,11 +126718,11 @@ hLX lkE kzE lJk -shN -dex -qZd -aav -rcQ +rHr +pdK +haM +gsh +wsb njQ xgH xgH @@ -127006,7 +126979,7 @@ eOY mEa xfT xrB -bod +jEa njQ xgH xgH @@ -127481,7 +127454,7 @@ gAT gAT csT ehG -qhg +eSP cui ehG bBV @@ -127496,8 +127469,8 @@ mUw rjD dMO cqY -knz -qkp +lxr +cuc wVn aDM kGq @@ -128252,7 +128225,7 @@ jft whV uNU kBn -nyt +whj axS qzX gNN @@ -128264,7 +128237,7 @@ erU erU erU erU -kHd +dGE jrV cKC mhr @@ -130300,7 +130273,7 @@ whV fBX kjb foI -uln +pyE uSN eFY wJB @@ -136744,7 +136717,7 @@ bJU pYs uyu kbu -kYr +ozM eeQ mdR gpf @@ -137773,7 +137746,7 @@ wfT wfT wRe wmU -jEw +jlr nDw bhp jPh @@ -138798,7 +138771,7 @@ tCC art hKq psJ -jfU +nln hAn loN dej @@ -139063,7 +139036,7 @@ fXd pLJ eLQ rBP -aGG +xgD wKT rBP uMl @@ -141366,7 +141339,7 @@ qEw qEw qEw sAH -igN +rKV kfo iZP kcB @@ -142411,7 +142384,7 @@ tyQ tyQ lhh dEc -uIA +fAy vcr kdQ khc @@ -143145,7 +143118,7 @@ owI owI css lwc -ojS +liu vEN tGq vmr @@ -143185,7 +143158,7 @@ aHt klO klO uov -fWH +kmV qdB uov uov @@ -143707,7 +143680,7 @@ vcr uov qwj lEI -gZN +aVc dEc dFq fbl @@ -143961,7 +143934,7 @@ odS hAO mGN vcr -uIA +fAy uov uov wQC @@ -178119,7 +178092,7 @@ kEI wwu sbI jtJ -mmN +qdF hat qfv lXq @@ -180445,7 +180418,7 @@ aQt etV shi tqW -jTB +iWi wRN dHa gtO @@ -180680,7 +180653,7 @@ wwu wwu cNf cBb -wQW +iCg wpa roe roe @@ -180962,10 +180935,10 @@ lPz shi wic fRd -xbw +mPH hLz uXA -fVQ +leR jly hLz hLz @@ -181217,10 +181190,10 @@ rrm rrm kIR atU -bHb -oBg -eSH -nWV +foa +iOQ +gET +ngL uXA hLz jVu @@ -181476,7 +181449,7 @@ qKp shi sKG fVe -vLO +npT hLz uXA hLz @@ -181974,7 +181947,7 @@ hgn xuv qVV qaW -fgh +dQX vds stp vlm @@ -181987,7 +181960,7 @@ bjf qia shi dsb -jTB +iWi ugv jxP gXo @@ -182217,9 +182190,9 @@ kyM xWf xuv xuv -enP -oPv -kJp +qUC +dya +mKZ sxl naI lNN @@ -182468,22 +182441,22 @@ ucA ucA wwu wwu -guC +pvX bDr bDr ctI xuv -agJ +hNr hKm sSz sSz sSz kik sSz -wuM +eLS xuv jBm -bci +cNm hnS oHw ijS @@ -182725,12 +182698,12 @@ ucA ucA wwu wwu -kaf +fUv wwu -tzK +bFq ctI xuv -tfk +fVi hKm qgQ gsn @@ -182766,8 +182739,8 @@ hLz uXA nnK hLz -jqv -jqv +lDX +lDX hLz irV jly @@ -182982,12 +182955,12 @@ ucA ucA wwu wwu -lLY -tHB -wzl +wXc +hrW +gLD ctI xuv -aGj +vQY hKm qTK ifA @@ -183244,7 +183217,7 @@ rua rua cwq xuv -ifZ +hNr hKm qTK qTK @@ -184828,7 +184801,7 @@ uXA txQ uXA uXA -hCZ +aBo uKl uXA avM @@ -185085,7 +185058,7 @@ uXA irV rwN uXA -hCZ +aBo uXA mta lQI @@ -185811,7 +185784,7 @@ gqP gqP sxK uVj -wQW +iCg cwq cwq wwu @@ -185848,7 +185821,7 @@ hbz xSb hSH ilV -dqh +qBk jjF mOK hLz @@ -186080,7 +186053,7 @@ hMV lIL fFu kEF -tlX +uHR ngk jFJ fko @@ -186357,8 +186330,8 @@ uXA hLz enl ljf -naW -gqN +qnO +cZT qbr nNT bMJ @@ -186374,7 +186347,7 @@ btq xXv vsU kvE -stv +kYV fRm hLz hLz @@ -186845,7 +186818,7 @@ nOZ wwu cja cwq -dTz +isz pUr nVB sYD @@ -187131,7 +187104,7 @@ jKB uJn ppX uXA -aAd +sWp uXA uXA uXA @@ -187145,7 +187118,7 @@ xYC ucB cOM bKq -stv +kYV lzf hLz hLz @@ -187643,7 +187616,7 @@ mJg mJg ket hLz -oym +ePs vXT vXT vXT @@ -187900,7 +187873,7 @@ gqi pVK hkw hLz -jYn +djs lQI lQI lQI @@ -188665,9 +188638,9 @@ rtv miF jvv aUl -nDl -alz -mLt +wkX +iqL +eYm dTn tyi tyi @@ -188923,7 +188896,7 @@ iRg aYA fNT fNT -nDl +wkX qGm ion mdU @@ -189432,7 +189405,7 @@ dpL dpL dpL fNT -xGy +alL tjP jVt fNT @@ -189683,9 +189656,9 @@ mGd shk wbS dpL -sgk -khU -cnU +tIe +psn +aLO fNT lZS idn @@ -189693,7 +189666,7 @@ shi miF nWz nIh -oaP +nYt rtv feX feX @@ -189711,7 +189684,7 @@ wVY sIH hWV kpR -aFI +fDZ lcv aal ydS @@ -189940,18 +189913,18 @@ oOR kvB eao ktM -irE -aSP -irE -pgX +pEu +flx +pEu +axK lPj uPQ mge loK umC -icF -dSQ -icF +nIN +gYX +nIN feX feX feX @@ -189968,7 +189941,7 @@ iGY stS wzJ fXb -dmZ +wDf lcv cKs cMh @@ -190197,9 +190170,9 @@ ueO puG eep dpL -vIT -khU -hNL +jyL +psn +nzO fNT fqo iNz @@ -190207,7 +190180,7 @@ shi siq nWz xXU -oaP +nYt rtv feX feX @@ -190460,7 +190433,7 @@ qun qun qun fNT -qeq +lIC uKW gEa fNT @@ -190693,7 +190666,7 @@ ucA vnK vnK sUj -bhO +pXg ivo txu uHZ @@ -192536,13 +192509,13 @@ sKw mxN mxN isG -sUB -jKp -jKp -cye +nRQ +tZO +tZO +knW hAg lrA -bHS +ptl biS aal aal @@ -192793,13 +192766,13 @@ kZl sEA oVa mjA -miz +pWA lcr tIu lcv hAg -hOz -sJV +lUd +szC jHr aal aal @@ -193015,7 +192988,7 @@ dYq rkM rkM rkM -uOI +jgU rkM rkM rkM @@ -193050,7 +193023,7 @@ wNu ldr byW yls -rtd +kdE lbu sgF lcv @@ -193282,9 +193255,9 @@ wtw tUq hFL maW -awu -keI -hIq +mwz +nQl +vLv ibw ehh xYM @@ -193307,7 +193280,7 @@ mjA mjA kBk rJv -ngb +kvO qno mxN lcv @@ -193787,7 +193760,7 @@ hvf kRS kRS kRS -grU +cpg sjf aIY vvs @@ -196865,7 +196838,7 @@ fdr vnK oHr iBv -kOE +oyt jUJ iDh vnK @@ -197122,7 +197095,7 @@ wJI okI oHr uyL -kOE +oyt uhu iDh vnK @@ -198189,7 +198162,7 @@ aHK wdd bwE wat -rwa +ydn tfX iux cuL @@ -200232,11 +200205,11 @@ xmQ gfD tLq wYp -hhc -pXs -tgK -fjt -sig +iFy +xhx +ffz +aAM +lhU lcv lcv lcv @@ -200489,18 +200462,18 @@ xmQ rBm ttb acq -iXf +pFW jZS sFQ aal -qzF -bAC -bAC -bAC -bAC -bAC -bAC -sig +nQR +iEW +iEW +iEW +iEW +iEW +iEW +lhU nnf gmp lDY @@ -200746,7 +200719,7 @@ ttb ttb ttb ttb -mAB +ctY muB ttb aal @@ -200757,16 +200730,16 @@ aal aal aal qtm -qzF -bAC -bAC -bAC -bAC -bAC -bAC -fOs -kuN -tVr +nQR +iEW +iEW +iEW +iEW +iEW +iEW +uvG +kcI +bCr aal aal ucA @@ -201002,8 +200975,8 @@ aIJ ibW aEW wau -xES -qmq +lrp +gbh hoj oFT tsy @@ -201516,10 +201489,10 @@ xmQ xmQ aEW dqX -tUl -bFw -dhn -fyl +bVg +qoq +slQ +qVh xYM gyy gIo @@ -201775,17 +201748,17 @@ aEW ldI gCD gyy -lOR -gqx +ohz +cVJ xYM gyy pMe -cCL -rLp -occ -cCL -wmy -ekJ +bcH +aqQ +oVg +bcH +gqs +feH iVN bUh uXl @@ -202030,19 +202003,19 @@ iMU iMU nvv lGw -woF +vcY vNM -sdv -sdv +sda +sda vNM wdC bbK -ial -ial -oKC -avY -pGU -pGU +jQu +jQu +ezy +qpp +iLM +iLM buu jtC raz @@ -202275,7 +202248,7 @@ amt pBW pBW kca -qzj +rCc oZz nQO cfa @@ -202287,19 +202260,19 @@ bFH jhw kzK hoB -keO +dXA pqg jZS ftT jZS ifG iAb -xfu -pUX -pzS -cww +nhX +hgD +vFw +prS wcT -gmy +pbm iVN kHJ eYL @@ -202532,7 +202505,7 @@ aPc sPu ucm kca -kvr +xUT shd hjH yfU @@ -202544,7 +202517,7 @@ kzK gCD kzK xcW -dEu +ivz igE aYy aYy @@ -202554,8 +202527,8 @@ iAb iVN iVN iAb -pCA -rXy +aTJ +pix iAb iAb iAb @@ -202789,19 +202762,19 @@ nmF pXG jmu kca -mRe +xOr fsD -tsQ -sXQ -xVK -pXs -xgS -pXs -pXs -dTC -pXs -dTC -jlF +fOl +cHy +uqd +xhx +bxE +xhx +xhx +daT +xhx +daT +pIm igE hlP nIQ @@ -203046,9 +203019,9 @@ dEt uZF pZW pZW -sGQ -usz -hEm +qpa +xDM +ddA pZW wCG oZB @@ -203061,7 +203034,7 @@ hoB pGS aWH hAR -ecW +pFT ewz bfl bhZ @@ -203301,11 +203274,11 @@ pJs rif dGe uZF -uyM -boV -kIx -fVM -quG +aQM +xyi +iva +ifV +lkA pZW nyE nyE @@ -203317,7 +203290,7 @@ bFH ckk ifG igE -jHV +hcr jbR cqR bfA @@ -203558,8 +203531,8 @@ edO awA jBf uZF -aqh -loR +afD +rEa itc sBb ybB @@ -203828,7 +203801,7 @@ wzS nyE aOp oqv -crx +cMz igE aWR aZn @@ -204072,8 +204045,8 @@ fkD dEt lYb uZF -bDP -bDP +xiW +xiW uZF svu svu @@ -204620,7 +204593,7 @@ rzA gFz tez jBu -vxP +ioG ybG aal aal @@ -204848,7 +204821,7 @@ mPw uZF svu uZF -fJd +lSI biR vLx vpA @@ -205105,7 +205078,7 @@ mPw uZF svu uZF -taE +iOD biR nqb xAu @@ -205605,7 +205578,7 @@ dEt dEt xOC hjP -kIc +gha nBO fIM fXq @@ -207940,12 +207913,12 @@ uiF tPm nlN hjx -rQJ +bnt nlN nlN nlN nlN -rQJ +bnt nlN nlN qEe @@ -208195,7 +208168,7 @@ maq aGE qtj nlN -tco +loS xui xui xui @@ -208452,7 +208425,7 @@ nlN iIm nlN nlN -tco +loS xap nRv pJH @@ -208700,18 +208673,18 @@ sBp oAz etA mPw -kHw +ure oFu xNE sGZ -kHw +ure xui xui hgS nlN -rQJ +bnt nlN -rQJ +bnt nlN nlN dUT @@ -243136,14 +243109,14 @@ saG eAE fnM ixf -rae -rnm -dAS +gby +hzq +pNA nVq nVq cyX wRJ -aNo +eOC mUs oJo oJo @@ -243393,7 +243366,7 @@ saG nNM gAt eAE -oPG +sGw wRJ wRJ wRJ @@ -243650,7 +243623,7 @@ wRJ eCP wrh wPF -dJn +cil ooF wRJ rxg @@ -243904,10 +243877,10 @@ ucA ucA wRJ wRJ -htL -gjZ -gjZ -aHc +gDL +acK +acK +hEm jNQ wRJ oVY @@ -243931,7 +243904,7 @@ gwL fqE oQS lYL -pyo +ghX rSY uhK uhK @@ -244161,7 +244134,7 @@ ucA ucA wRJ wRJ -pNo +pBv wRJ wRJ wRJ @@ -244418,10 +244391,10 @@ ucA ucA wRJ wRJ -tis -vrl -gUL -bal +joA +kSR +fWY +fOR fry gfr eJs @@ -244678,7 +244651,7 @@ wRJ iwu ccH ccH -mJR +gEe uIN ltq ltq @@ -244935,7 +244908,7 @@ wRJ iwu ccH jRV -mwW +bQn otZ rAE aCx @@ -245192,7 +245165,7 @@ wRJ iwu ccH muX -sQJ +gGX kAb lmu aHP @@ -245449,7 +245422,7 @@ wRJ iwu ccH qdz -xja +lKE iia jat aCx @@ -245706,8 +245679,8 @@ wRJ iwu ccH ccH -sbG -vyJ +rLl +lzd uIN ltq eDe @@ -245963,8 +245936,8 @@ kpT iwu uFR ccH -aIN -qfy +suT +lij uIN vUv rHg @@ -246220,9 +246193,9 @@ kpT igy btC ccH -jLD -tbb -lcH +dFn +bLq +lwo sJO fjo wdb @@ -246477,8 +246450,8 @@ igy igy niE ccH -vQP -cqH +hNO +uAg kWf bGn rec @@ -250609,7 +250582,7 @@ gBr sRh tUG ris -vuC +tdt gyr sng iHx @@ -251392,7 +251365,7 @@ xvN fWl bQG vZF -owq +aXW dKb rxi ajs @@ -251894,7 +251867,7 @@ wxM sVv ogg wuC -vAP +wms gyr vwc gMz @@ -252632,7 +252605,7 @@ uhr abx uHV ktG -cEf +udw igy wRJ wRJ @@ -253930,7 +253903,7 @@ dzQ bmf wIN iHm -oiH +gUT ljh yjU iHm @@ -254968,7 +254941,7 @@ liQ liQ liQ eDe -aYY +pqB bdR cKS eDe @@ -254979,7 +254952,7 @@ eDe eDe eDe uZc -sSA +nwf uZc uZc uZc @@ -255219,9 +255192,9 @@ sSB sSB sSB qrd -tmA -bJn -jcL +sOO +ibF +oBP eDe ybQ gzc @@ -255234,7 +255207,7 @@ fjo oZx oZx oZx -xrR +mNW ufs ufs xGx @@ -255476,18 +255449,18 @@ ejP gMQ sSB iom -ihv -jZv -ihv -tMy +tcs +xmi +tcs +nRK sMg cXK kZH uNx hkV -ldN +jqq viX -ldN +jqq oZx oZx oZx @@ -255733,9 +255706,9 @@ iKT sSB dIv qrd -bIS -vwl -jNk +oqk +jpq +xNC eDe rYq nKn @@ -255748,7 +255721,7 @@ fjo oZx oZx oZx -xrR +mNW xGx diU ufs @@ -255996,7 +255969,7 @@ qrd qrd qrd eDe -drz +xUB bdR mZI eDe @@ -256233,11 +256206,11 @@ otR nqi pep yhT -eUA -weh -rKd +aRd +bzB +kbZ iHm -lih +hDU iHm iHm iHm @@ -256275,7 +256248,7 @@ kil qfT oZp ykr -owq +aXW tDf aGQ aGQ @@ -256490,9 +256463,9 @@ bTy nqi pep yhT -mzi -weh -mzi +aJD +bzB +aJD iHm sSB sSB @@ -256747,9 +256720,9 @@ hrL nqi hjN yhT -mzi -weh -lJs +aJD +bzB +urv iHm sSB ccV @@ -257004,9 +256977,9 @@ umb nqi fXR yhT -qsQ -ppx -kMq +vTV +rjB +sav iHm sSB ccV @@ -257522,7 +257495,7 @@ sSB sSB sSB sSB -qrd +sSB qrd qrd sNE @@ -257780,7 +257753,7 @@ qrd qrd qrd qrd -bWZ +qrd vTf gvO boP @@ -257819,7 +257792,7 @@ dgZ kQN jPG ewA -uuj +xPZ aGQ aGQ cnq @@ -258037,8 +258010,8 @@ qrd mcU xCX nWe -ltH -qtA +mxS +ajz lGo lNX lNX @@ -258075,8 +258048,8 @@ xWn gZm tGn hnZ -jxL -wls +che +qBJ nVP fIz kcl @@ -258332,9 +258305,9 @@ mYK uZc tGn nbi -fzF -ffs -mpm +ftl +tpw +qPG aGQ cnq tGn @@ -258589,8 +258562,8 @@ uwG kVM tGn mwg -pUf -aqa +iCK +afv oxJ wNH geL @@ -258847,7 +258820,7 @@ dqF tGn tGn ueX -yhN +dfs tGn tGn jPG @@ -259065,7 +259038,7 @@ qrd oeQ xgb nWe -mkl +gvV hwr oWt wJH @@ -259104,7 +259077,7 @@ hTK tGn fRy nUU -fah +oee iFv tGn qPl @@ -259361,7 +259334,7 @@ uZc tGn jPG jPG -ihd +aKr jPG jPG jPG @@ -259618,7 +259591,7 @@ yfN tGn tbq tGn -bro +bPq tGn eJU tGn @@ -259875,8 +259848,8 @@ tkJ tGn jPG jPG -wvP -coc +fnF +atA ajs vRm mUA @@ -260133,7 +260106,7 @@ tGn tGn tGn tGn -bZt +geh tGn tGn tGn @@ -260390,7 +260363,7 @@ tGn aoM tGn sxZ -vWm +kAw gaU tGn tGn @@ -260647,7 +260620,7 @@ tGn aoM tGn tLF -vWm +kAw ogM tGn tGn @@ -260858,7 +260831,7 @@ qrd qrd oEh hVI -ghX +qtw sSB dcw qrd @@ -260904,7 +260877,7 @@ tGn aoM tGn tGn -vWm +kAw bKY tGn tGn @@ -261161,7 +261134,7 @@ tGn aoM aoM tGn -lKJ +tdN piR piR piR @@ -261418,7 +261391,7 @@ tGn tGn tGn tGn -tTx +roj llr hiQ hiQ @@ -261667,15 +261640,15 @@ ilk eLw piR npZ -vUa +lDA uqi -uCd +rhI uqi uqi uqi uqi uqi -uDG +vQi ddj piR piR @@ -261924,7 +261897,7 @@ vRn fYH piR jlC -bwR +gpW piR rbz piR @@ -262181,7 +262154,7 @@ kSU yjm piR piR -tTx +roj piR piR piR @@ -262438,7 +262411,7 @@ piR piR piR npZ -tTx +roj piR alf cMU @@ -262695,8 +262668,8 @@ jRM ebn piR tnX -bwR -rTR +gpW +lKF msu iUQ wSP @@ -262951,8 +262924,8 @@ piR xyz tKq vjK -vUa -uDG +lDA +vQi piR uAi mVj @@ -263208,7 +263181,7 @@ piR jAU tUc vER -tTx +roj ojx piR iwZ @@ -263449,7 +263422,7 @@ ryx qwc tqi kDB -nCV +kpi ftv kbR iCQ @@ -263465,7 +263438,7 @@ piR piR tUc vZK -tTx +roj tUc piR uAi @@ -263722,7 +263695,7 @@ piR trH uIp cJi -tTx +roj ozS piR hrc @@ -263979,7 +263952,7 @@ piR piR piR piR -oqr +bmN piR piR wUy @@ -264236,7 +264209,7 @@ syH wMX vrw piR -bwR +gpW myO tto anH @@ -264493,7 +264466,7 @@ nHW nlf rKM piR -qya +vZJ myO vMm yaK @@ -264750,7 +264723,7 @@ gwb cFM mwK piR -tTx +roj uDH qRE qQr @@ -265007,7 +264980,7 @@ pCr fwb qFz piR -wVx +dgA myO udF vSW @@ -265264,7 +265237,7 @@ joL tmq tfD piR -tTx +roj piR piR myO @@ -265521,14 +265494,14 @@ wkH uRQ bCk piR -rMf +rof uqi uqi uqi uqi -gOm +cMb uqi -lCq +ruU vXv sOq uuH @@ -265785,7 +265758,7 @@ piR biO piR rtc -tTx +roj wCH hcT kwm @@ -266042,7 +266015,7 @@ piR aMJ piR qPU -tTx +roj piR piR piR @@ -266299,10 +266272,10 @@ jNg hyx kdK wza -rMf -lFt -wwx -kpW +rof +suu +tPL +ejN piR piR ucA @@ -266559,7 +266532,7 @@ fHE piR mom hcT -koI +uBi piR piR ucA @@ -269104,7 +269077,7 @@ faS fXB quO cgm -jUn +uhj frW frW chn @@ -269638,7 +269611,7 @@ aMJ piR pOn gSS -rTR +lKF gRI gcf hXI @@ -270371,7 +270344,7 @@ snd snd snd snd -bnF +nLM snd cIM eNi @@ -271176,7 +271149,7 @@ hcT piR piR piR -qyb +ylD piR kEe mPZ @@ -271922,7 +271895,7 @@ kRw pZL cIM mSa -xOH +pNs jOX hcR aKx @@ -308673,8 +308646,8 @@ xJo uxw xHe qhQ -kvA -tpb +iQy +ibo qox qox aNs @@ -308928,9 +308901,9 @@ xHe xHe yjN uxw -sMH +ozA eGK -lZD +cAi gEB cmw cHz @@ -309187,7 +309160,7 @@ xHe xHe xHe rNL -mcd +kjd yiI uxw pkm @@ -309444,7 +309417,7 @@ ioM gja xjQ iqD -vSN +vzM xJp uxw xjX @@ -309699,10 +309672,10 @@ xHe xHe lRc lVV -nhH +tqu hdL -lcR -rqG +iKJ +bfx eGK onE aNs @@ -309959,7 +309932,7 @@ xHe xHe xHe xHe -rvc +nKs xHe xHe aNs @@ -309979,7 +309952,7 @@ uIx uIx voT voT -mpo +rCM voT voT voT @@ -310216,11 +310189,11 @@ dzY lJp lJp lJp -jff -jeN -jeN -jeN -jeN +gsx +maK +maK +maK +maK prD boS aNs @@ -310478,7 +310451,7 @@ vLW vLW vLW cCV -dqG +uVU gGB aNs sRO @@ -310735,7 +310708,7 @@ qhC vDN vLW snU -dqG +uVU gho aNs pZp @@ -310992,7 +310965,7 @@ eWS kha vLW aNs -qQq +uAo aNs aNs jcS @@ -311249,7 +311222,7 @@ wnO bxc vLW mqi -xfq +hiU hJF rEU rlC @@ -311262,7 +311235,7 @@ vIS tuy qDD qyo -tGw +vZU brT brT nBV @@ -311506,7 +311479,7 @@ jZL kWx nZg iPY -uVq +qdS iPY wbr agK @@ -311521,7 +311494,7 @@ qTn dKJ voT voT -dLK +hFb voT voT voT @@ -311763,12 +311736,12 @@ wnO keg vLW geA -eWv -wlI -sht -wEH -cqS -aKj +oqH +toM +eNw +ohu +prd +njU rEU gxn hbN @@ -312025,7 +311998,7 @@ gYS gYS bmD lgD -kTS +ykw hIb fKZ hbW @@ -312282,7 +312255,7 @@ kHl hJF gxn rlP -sEC +tBq czp czp wgO @@ -312539,7 +312512,7 @@ pmo wtt gxn dfm -eHv +hsa czp tAE jjs @@ -312796,7 +312769,7 @@ bJV hWp mdE dfm -sEC +tBq czp sFa sFa @@ -313053,7 +313026,7 @@ dWL oKY cfu dfm -sEC +tBq wgO apT aGm @@ -313310,7 +313283,7 @@ cWf cWf cfu dfm -sEC +tBq wgO xYS eYh @@ -313567,7 +313540,7 @@ oKY cWf cfu rti -rjg +vuU wgO rZb acL @@ -313824,7 +313797,7 @@ cWf vlD qND dfm -sEC +tBq wgO xYS ltC @@ -314081,7 +314054,7 @@ jCA jCA xEB dfm -sEC +tBq wgO xwx tIc @@ -314338,7 +314311,7 @@ kti jCA jib dfm -sEC +tBq czp rAe sFa @@ -314576,7 +314549,7 @@ sJm sJm sJm nPE -gAN +hwP nPE nPE nPE @@ -314595,7 +314568,7 @@ pUn dVk gxn dfm -lrs +sEE czp uIL nSS @@ -314852,7 +314825,7 @@ wMM nvs ixZ dfm -uwY +nmk uqc uqc uqc @@ -315087,13 +315060,13 @@ xpL qRI mKO rDL -pNZ +heI jha nPE xVV gsy uwf -deN +pUK moL hMp gDy @@ -315109,7 +315082,7 @@ lKn dVk gxn ePJ -dZX +pEO hUR aId aId @@ -315344,7 +315317,7 @@ wFa eIs wFa tYV -gln +oUW xwL nPE nPE @@ -315366,7 +315339,7 @@ ngX jCA gxn dfm -rAF +pAk lgX wFA cKq @@ -315601,7 +315574,7 @@ mSG aSX aSX pqH -fqR +bJA mKu hHi fMc @@ -315623,7 +315596,7 @@ lKn bOE gxn dfm -nPO +veI uqc uqc uqc @@ -315858,7 +315831,7 @@ dWz lYx unQ wMU -gln +oUW rDL jjj dIJ @@ -315880,7 +315853,7 @@ hQQ kVZ dmc ePJ -qJH +jdM fUq jzF nFH @@ -316111,12 +316084,12 @@ ucA vyc vPP rrs -suC -uME -wjZ -koM -gQr -rsX +mCU +hGC +jJM +hAH +eSq +tHk bDn gwe eoI @@ -316137,7 +316110,7 @@ rmZ bOE gxn dfm -egj +aqu kbI oAe uOh @@ -316368,11 +316341,11 @@ ucA lYx oRh lYx -mKe +wWY lYx ngD wMU -aOQ +aqm kFy xTG xxA @@ -316394,7 +316367,7 @@ sdB jCA yeq dfm -egj +aqu raq vIr iow @@ -316651,7 +316624,7 @@ gYS gYS rPF dfm -lAl +pSp tLk vIr kQp @@ -316908,7 +316881,7 @@ gBU tYW lui dfm -egj +aqu raq vIr nJT @@ -317165,7 +317138,7 @@ pNW oCx oCx dfm -egj +aqu hbg oAe iWT @@ -317422,7 +317395,7 @@ dJo wJT wJT pwI -cLn +tDO oAe oAe oAe @@ -317669,7 +317642,7 @@ nPE dUY axF jUg -vjA +aMo sUt sUt fLz @@ -317679,7 +317652,7 @@ hRP euu euu rti -eAs +lSd bDL dHD dHD @@ -317936,7 +317909,7 @@ eHr wGb mvw dfm -ufp +nWS bDL ebK ebK @@ -318174,7 +318147,7 @@ xQg nPE jNM xZu -dXs +osS dvc eMg gDy @@ -318193,7 +318166,7 @@ gYS gYS gir tnj -nXL +tEv cBl xFp dGF @@ -318441,7 +318414,7 @@ nPE qPv pJV iag -uqF +hAV iqy mKs ryE @@ -318450,12 +318423,12 @@ wwT aBV kyj dfm -trX -vdE -ldZ -ldZ -kqY -sec +xnY +ojB +xyw +xyw +tnR +hTD rRU cwX apg @@ -318687,7 +318660,7 @@ blj tvY nPE pDq -ige +jNl iPs rfM lXj @@ -318700,9 +318673,9 @@ ipn ipn ipn fpn -yla +uGO mCJ -dNU +hax btT hIb uSW @@ -318712,7 +318685,7 @@ bDL jgG jgG bDL -jeg +xdC raN lXx rYf @@ -318969,7 +318942,7 @@ jgG bUW mvO bDL -eNV +eKe owh lXx lXx @@ -319226,7 +319199,7 @@ buI nVW efz val -mmt +cqz uVh auJ pGy @@ -319238,8 +319211,8 @@ eOy exp lnl uYM -eOy -cgv +vIo +ujt eNj ftt eNj @@ -319483,26 +319456,26 @@ jgG sTs ocR bDL -qEP -fYn -fYn -uFa -eAJ -xNu -uEz -uEz -uEz -gNg -ePq -kHU -vyr -mlp -hXE -lod -izo -lod -dvy -wlD +jHS +ovZ +ovZ +ifF +cxc +rek +kOc +kOc +kOc +kQu +nRI +aHo +mVh +iXK +xOI +cAJ +sZN +cAJ +owr +iBn jbV fXs fXs @@ -319719,7 +319692,7 @@ moL moL moL moL -bry +lkc spI rLM nPE @@ -319744,7 +319717,7 @@ lvT meV lvT vWw -vUh +lDo eBy eQN dXX @@ -319752,14 +319725,14 @@ aQS vko mBg dPf -rDw +mBg pse oQu odH jsL myp eNj -nge +sPR fXs fXs fXs @@ -320001,7 +319974,7 @@ kcv xKs rsh vWw -liZ +pVj lAm fQA chF @@ -320009,14 +319982,14 @@ fQA fQA fNA ebz -vuQ -lku +aFM +gNL eNj kcw hvb vRF eNj -riR +jXB kHx fXs fXs @@ -320258,14 +320231,14 @@ hvB peg gta vWw -cmJ +tUW eBy sMB sMB sMB aEh fNA -ufI +gFT dnU dnU aRU @@ -320273,7 +320246,7 @@ eNj eNj eNj eNj -sZK +pAK vPu fXs fXs @@ -320486,7 +320459,7 @@ tAW gDy lIS uIr -tDc +vsO rAy hGB fTu @@ -320504,7 +320477,7 @@ liQ liQ liQ nWW -qdA +wXg nQX bgI eOP @@ -320515,7 +320488,7 @@ eOP eOP eOP vWw -gSm +luv kIO rGZ kPr @@ -320530,7 +320503,7 @@ rVi vEa owb fXs -riR +jXB bMP fXs fXs @@ -320750,14 +320723,14 @@ gts gDy cek hKS -bry +lkc moL moL hMp gDy -jvw +ifk vMg -ciV +cPT nWW tEh bVy @@ -320772,7 +320745,7 @@ vRO vRO eOP vWw -lic +ijT kIO tVa qDM @@ -320787,7 +320760,7 @@ dvJ vEa owb fXs -nge +sPR fXs fXs fXs @@ -321011,25 +320984,25 @@ gDy bpF khX whI -lqZ -ppn -iKG -ppn -wWx +xIR +mFJ +rPr +mFJ +ifw nMz jgd kpl tFp gQh -wIF +fsK weB -hjl +sTE vRO vRO vRO eOP vWw -tbS +uKs kIO qXn sMp @@ -321044,7 +321017,7 @@ jye vEa owb fXs -oLD +bhh sOU ncB ncB @@ -321269,8 +321242,8 @@ bpF bpF bpF gDy -gAR -rvw +lkI +kgn erp nWW uIk @@ -321286,7 +321259,7 @@ vRO vRO eOP vWw -tbS +uKs kIO ghZ wiR @@ -321301,7 +321274,7 @@ duZ vEa fXs fXs -oLD +bhh sOU ncB ncB @@ -321532,7 +321505,7 @@ txa txa txa nWW -aBP +qNI nQX kQk eOP @@ -321543,7 +321516,7 @@ eOP eOP eOP vWw -liZ +pVj woK pnJ pnJ @@ -321558,7 +321531,7 @@ pnw ycM sOU sOU -oLD +bhh sOU ncB ncB @@ -321771,7 +321744,7 @@ jid goe goe gDy -ekD +iGd gDy gDy gDy @@ -321800,7 +321773,7 @@ lFg qCs qCs vWw -tbS +uKs wQY rsi axX @@ -321815,7 +321788,7 @@ sWo ycM sOU sOU -oLD +bhh jjG ncB ncB @@ -322057,12 +322030,12 @@ dPH dPH dPH vWw -npy +kjk gnW vWw vWw ljH -nef +kvH cfD vWw vWw @@ -322072,7 +322045,7 @@ sWo ycM sOU sOU -jfj +mLS nXQ ncB ncB @@ -322314,7 +322287,7 @@ dPH tbX bTX wYW -iNI +gwE sHY dPH jlW @@ -322329,7 +322302,7 @@ wyv ycM sOU sOU -pnP +hch bzM ncB ncB @@ -322571,7 +322544,7 @@ aCB vBa bsV adT -lUl +aQL sHY dPH rAP @@ -322586,7 +322559,7 @@ wyv ycM nXQ nXQ -fpv +dSm bzM ncB ncB @@ -322828,7 +322801,7 @@ uiv neR mZH jIV -jSa +fBT sHY rDZ cbw @@ -322843,7 +322816,7 @@ qjr ycM ncB ncB -lRq +vSB ncB ncB ncB @@ -323085,7 +323058,7 @@ wmr hHq ntR nyZ -jSa +fBT sHY xIP cbw @@ -323100,7 +323073,7 @@ sPs ycM dmR vRa -pvr +sYK pze ncB ncB @@ -323342,7 +323315,7 @@ dPH neR jwG gAi -tOp +sRf sHY hAP qtQ @@ -323355,9 +323328,9 @@ xCR iXF sPs ycM -xyo -jPQ -mWV +eqV +tmk +pIv gWN ncB ncB @@ -323599,7 +323572,7 @@ dPH xjc pyQ fCE -muH +cLF sHY cAt cbw @@ -323856,7 +323829,7 @@ xEP sct mlN dPH -ylI +sdI soP glN lKQ @@ -324113,7 +324086,7 @@ skQ hED bNg dPH -uUa +emr oDd dPH vuf @@ -324370,7 +324343,7 @@ gEh qlo jXj dPH -hhi +aZq sHY dqQ dqQ @@ -324627,7 +324600,7 @@ oRY mgS xPw dPH -snA +mcA sHY eoL hSJ @@ -324855,7 +324828,7 @@ csF csF psc dlW -hBL +pZK dlW dlW eEd @@ -324877,14 +324850,14 @@ bVy vOE aUR xEP -grO +kGa wyY mra gLy vkZ cgZ dPH -rla +qxY eUU dDR iTd @@ -325141,7 +325114,7 @@ ffe ffe xEP dPH -fuY +jGz rIa bsI oOi @@ -325391,14 +325364,14 @@ tnT fIs aUR ffe -vmS -vPC -wfz -oUz +ait +xeF +rWa +lWY ffe lPf jOA -aQf +mfU tNd qxZ uHT @@ -325648,14 +325621,14 @@ bVy vOE aUR wrj -pXj -gnC -wMZ -lfs +mGt +igI +hvC +qfm ffe sfB oQn -aoF +vCP rGb qFI qFI @@ -325905,14 +325878,14 @@ tzV vOE aUR wrj -bNl -fWp -cNe -xmd -loB -kYl -sSI -ofr +pVD +vBw +mOe +bRP +trM +tPI +fUZ +clU jak amm oYW @@ -326162,10 +326135,10 @@ xWF fIs wDy wrj -dSW -sMJ +fYJ +dHq wmo -wDO +mlg cxg vBa kxP @@ -326395,12 +326368,12 @@ kTV wlX sxo nps -awc +nGD cOz mqd sxo -vsu -nnx +eFz +nIl dlW oGD oGD @@ -326419,10 +326392,10 @@ qxb vOE aUR wrj -oKV -old -xsr -jWs +vqv +sMD +acp +sSY wrj vTj fhv @@ -326657,7 +326630,7 @@ fvD fxI oBD eem -jxr +kzT dlW oGD qCr @@ -326676,10 +326649,10 @@ fNL vOE aUR wrj -eOc +wzp iCG -fLe -hfV +aoh +lfQ ffe emV uwA @@ -326693,7 +326666,7 @@ gDx iIb ftZ tBk -qTA +sCO wKi akt rbr @@ -326933,10 +326906,10 @@ bVy vOE oct ffe -nPW -qHV -quf -ovX +eQi +qaJ +pNe +lax ffe nxU iYC @@ -327163,7 +327136,7 @@ ucA sxo sxo boq -kfU +psF uOS vyW dje @@ -327681,7 +327654,7 @@ sSl lcN vyW jjo -rwS +pqt sxo xiA xiA @@ -332317,7 +332290,7 @@ psh fVV iGG wRL -nRJ +gUc rVQ rVQ rVQ @@ -332573,7 +332546,7 @@ tVU qku fVV lIn -hJS +kdw rVQ rVQ rVQ @@ -332823,7 +332796,7 @@ ooQ nxV gbZ pqe -gYg +iWQ xeQ fVV cRL diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index b90f92a8473..35c6b42f083 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -462,7 +462,7 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/aft) "agX" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/circuit/green, /area/station/science/xenobiology) "aha" = ( @@ -698,6 +698,16 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) +"ajR" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sink/directional/west, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "ajT" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 @@ -908,6 +918,14 @@ /obj/machinery/holopad, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"anI" = ( +/obj/structure/chair/sofa/corp/right{ + color = "#DE3A3A"; + dir = 4 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "anM" = ( /obj/machinery/door/airlock/cmo{ name = "Chief Medical Officer's Quarters" @@ -2020,20 +2038,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"aDQ" = ( -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, -/obj/item/storage/fancy/candle_box, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 - }, -/turf/open/floor/cult, -/area/station/service/library) "aDR" = ( /turf/closed/wall/r_wall, /area/station/security/warden) @@ -2208,15 +2212,6 @@ "aFY" = ( /turf/closed/wall, /area/station/engineering/atmos/storage/gas) -"aGa" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/obj/machinery/door/window/survival_pod/left/directional/east{ - name = "Fitness Ring" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/fitness/recreation/entertainment) "aGq" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -2818,18 +2813,6 @@ }, /turf/open/floor/wood/large, /area/station/hallway/primary/central/fore) -"aPG" = ( -/obj/machinery/computer/order_console/cook, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/mid_joiner, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/service) "aPJ" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Base Airlock" @@ -3409,6 +3392,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"aXm" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/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/diagonal, +/area/station/hallway/secondary/service) "aXr" = ( /obj/structure/table/wood, /obj/item/paper_bin/carbon{ @@ -3706,11 +3699,6 @@ /obj/machinery/power/smes, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/solars/port/fore) -"bbB" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "bbN" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -3909,6 +3897,24 @@ /obj/effect/turf_decal/bot, /turf/open/floor/wood/large, /area/station/commons/fitness/recreation) +"bdX" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/item/clothing/mask/gas, +/obj/item/clothing/head/utility/chefhat, +/obj/item/cultivator, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "beb" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -3926,29 +3932,6 @@ }, /turf/open/floor/iron/large, /area/station/security/courtroom) -"beg" = ( -/obj/item/plate/oven_tray{ - pixel_x = -2; - pixel_y = 1 - }, -/obj/item/plate/oven_tray{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/clothing/suit/apron/chef{ - pixel_y = 11 - }, -/obj/item/book/manual/wiki/cooking_to_serve_man{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/structure/table, -/obj/item/knife/kitchen{ - pixel_x = -13; - pixel_y = 3 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "bem" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4649,13 +4632,6 @@ /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/fore) -"brg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "bri" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /obj/effect/turf_decal/stripes/white/line{ @@ -4931,6 +4907,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/security/prison/work) +"bvE" = ( +/obj/structure/table/wood, +/obj/item/documents/syndicate, +/turf/open/floor/wood, +/area/station/maintenance/rus_gambling) "bvI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -5545,15 +5526,6 @@ dir = 1 }, /area/station/hallway/primary/fore) -"bGF" = ( -/obj/effect/turf_decal/weather/snow, -/obj/machinery/camera/directional/west{ - c_tag = "Service - Kitchen Coldroom"; - dir = 5; - name = "service camera" - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "bGJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5729,23 +5701,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"bJQ" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/service/glass{ - name = "Service Hall" - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/large, -/area/station/service/cafeteria) "bJW" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -5902,6 +5857,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/science/xenobiology) +"bMB" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/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/iron/cafeteria, +/area/station/service/cafeteria) "bMJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -6089,6 +6057,19 @@ }, /turf/open/floor/iron/smooth_large, /area/station/construction/mining/aux_base) +"bOI" = ( +/obj/structure/table, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "bOJ" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, @@ -6136,6 +6117,12 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"bPG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "bPI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6267,6 +6254,19 @@ dir = 4 }, /area/station/engineering/atmos) +"bRS" = ( +/obj/structure/table, +/obj/machinery/requests_console/directional/west{ + department = "Kitchen"; + name = "Kitchen Requests Console" + }, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -2; + pixel_y = 5 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "bSd" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ dir = 8 @@ -6301,10 +6301,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal/incinerator) -"bSL" = ( -/obj/machinery/griddle, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "bSM" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, @@ -6351,18 +6347,6 @@ /obj/machinery/digital_clock, /turf/closed/wall/r_wall, /area/station/command/heads_quarters/qm) -"bTv" = ( -/obj/structure/plasticflaps/opaque{ - name = "Medical Deliveries" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - location = "Medbay" - }, -/obj/effect/turf_decal/delivery/blue, -/turf/open/floor/iron/white/smooth_large, -/area/station/maintenance/department/medical) "bTF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/status_display/ai/directional/south, @@ -6489,11 +6473,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/supermatter/room) -"bVv" = ( -/obj/structure/flora/bush/jungle, -/obj/structure/window/fulltile, -/turf/open/floor/grass, -/area/station/service/hydroponics) "bVB" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -6833,6 +6812,10 @@ }, /turf/open/floor/iron/smooth_large, /area/station/security/checkpoint/engineering) +"cbP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "cbV" = ( /obj/effect/landmark/start/hangover, /obj/machinery/camera/directional/west{ @@ -6917,6 +6900,15 @@ "cdo" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/cmo) +"cdr" = ( +/obj/machinery/newscaster/directional/east, +/obj/effect/spawner/random/bedsheet/any, +/obj/structure/bed, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) "cdz" = ( /obj/effect/turf_decal/trimline/neutral/filled/warning, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -7171,9 +7163,6 @@ /turf/closed/wall, /area/station/maintenance/port/greater) "chg" = ( -/obj/structure/secure_safe/caps_spare{ - pixel_x = -24 - }, /obj/structure/table/reinforced/rglass, /obj/item/storage/photo_album, /obj/item/camera{ @@ -7612,6 +7601,33 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/security/office) +"coJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + desc = "Salt. From space oceans, presumably. A staple of modern medicine."; + pixel_x = -8; + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/peppermill{ + desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; + pixel_x = -8; + pixel_y = 2 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets/donkpocketpizza{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets/donkpocketteriyaki{ + pixel_x = 5; + pixel_y = 9 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "coN" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/mug/britcup{ @@ -7852,16 +7868,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/engineering/atmos/pumproom) -"crV" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sink/directional/west, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "csd" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -8071,6 +8077,10 @@ /obj/effect/mapping_helpers/mail_sorting/science/experimentor_lab, /turf/open/floor/iron/white/diagonal, /area/station/science/research) +"cvp" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "cvG" = ( /obj/structure/sign/warning/biohazard/directional/east, /turf/open/space/basic, @@ -8121,15 +8131,6 @@ dir = 1 }, /area/station/medical/medbay/lobby) -"cwy" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/cold/directional/east, -/obj/machinery/gibber, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "cwE" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, @@ -8158,17 +8159,6 @@ /obj/effect/turf_decal/delivery/blue, /turf/open/floor/iron/textured, /area/station/maintenance/department/science/xenobiology) -"cwP" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/plasticflaps/opaque{ - name = "Kitchen Deliveries" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "Kitchen" - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/greater) "cxw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -8396,6 +8386,28 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white, /area/station/medical/surgery) +"cAR" = ( +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/window/right/directional/west{ + name = "Supply Storage"; + req_access = list("medical") + }, +/obj/effect/turf_decal/trimline/dark_red/filled, +/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner, +/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/storage) "cBb" = ( /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/iron/smooth, @@ -8697,16 +8709,6 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/iron/large, /area/station/science/lab) -"cGb" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/table, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -2; - pixel_y = 5 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "cGp" = ( /obj/machinery/light/small/directional/east, /obj/structure/closet/firecloset, @@ -9004,6 +9006,20 @@ /obj/effect/turf_decal/box, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) +"cIT" = ( +/obj/effect/turf_decal/trimline/green/filled/warning{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light_switch/directional/north{ + pixel_x = 14 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/service/hydroponics) "cIZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9840,6 +9856,17 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/aft/upper) +"cXD" = ( +/obj/machinery/computer/security/mining{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/window/spawner/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/miningdock) "cXX" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, @@ -9964,17 +9991,6 @@ /obj/structure/transit_tube/horizontal, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/fore) -"cZL" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Service - Cafeteria Aft"; - name = "service camera" - }, -/obj/structure/chair/sofa/corp/left{ - color = "#DE3A3A"; - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "cZW" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/smooth_edge{ @@ -10539,17 +10555,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"dgV" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/mod/module/plasma_stabilizer{ - pixel_y = 16 - }, -/obj/item/inspector, -/obj/item/mod/module/thermal_regulator{ - pixel_y = 16 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/office) "dhd" = ( /obj/machinery/camera/directional/north{ c_tag = "Atmospherics - Plasma Cell"; @@ -10771,18 +10776,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/common/night_club) -"dju" = ( -/obj/structure/table, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/item/plate, -/obj/item/holosign_creator/robot_seat/restaurant, -/turf/open/floor/iron/large, -/area/station/service/kitchen) "djy" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/item/radio/intercom/directional/south, @@ -11544,11 +11537,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/medical/central) -"dva" = ( -/obj/effect/turf_decal/weather/snow, -/obj/structure/kitchenspike, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "dve" = ( /obj/structure/rack, /obj/item/clothing/head/utility/welding, @@ -11817,6 +11805,15 @@ /mob/living/basic/pet/cat/cak, /turf/open/floor/iron/smooth_large, /area/station/maintenance/starboard/greater) +"dzq" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/machinery/door/window/survival_pod/left/directional/east{ + name = "Fitness Ring" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/fitness/recreation/entertainment) "dzx" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -11866,11 +11863,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/psychology) -"dAb" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/office) "dAf" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -11894,6 +11886,16 @@ /obj/effect/mapping_helpers/airlock/access/any/service/crematorium, /turf/open/floor/catwalk_floor/iron_dark, /area/station/service/chapel/office) +"dAy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/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/diagonal, +/area/station/hallway/secondary/service) "dAz" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -12141,10 +12143,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/science/research/abandoned) -"dDt" = ( -/obj/structure/sign/poster/contraband/mothic_rations, -/turf/closed/wall, -/area/station/service/kitchen) "dDD" = ( /obj/effect/turf_decal/trimline/dark_red/arrow_cw{ dir = 8 @@ -12283,18 +12281,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) -"dFF" = ( -/obj/effect/turf_decal/bot, -/obj/structure/disposaloutlet{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/iron/large, -/area/station/hallway/secondary/service) "dFG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12397,6 +12383,21 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/station/service/library) +"dGT" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/box, +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "dGU" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -12457,23 +12458,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/engine/atmos) -"dHg" = ( -/obj/structure/table, -/obj/item/plate/large, -/obj/item/plate, -/obj/item/plate/small{ - pixel_y = 1 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = 10; - pixel_y = 18 - }, -/obj/item/knife/butcher{ - pixel_x = 5 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "dHm" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -12570,6 +12554,12 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/freezer, /area/station/medical/treatment_center) +"dIL" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/maintenance/department/science/xenobiology) "dIM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12904,11 +12894,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/solars/starboard/fore) -"dMN" = ( -/obj/machinery/chem_mass_spec, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/freezer, -/area/station/medical/pharmacy) "dMS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -12989,21 +12974,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/wood/parquet, /area/station/common/night_club) -"dNS" = ( -/obj/structure/table, -/obj/item/storage/bag/plants{ - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/watering_can{ - pixel_y = 3 - }, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "dNV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13360,18 +13330,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/greater) -"dSY" = ( -/obj/structure/chair/stool/directional/west{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - 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/cafeteria, -/area/station/service/cafeteria) "dTb" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -13590,6 +13548,26 @@ /obj/structure/trash_pile, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) +"dWg" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/taperecorder{ + pixel_x = -10; + pixel_y = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/turf/open/floor/cult, +/area/station/service/library) "dWs" = ( /obj/item/banner/command/mundane, /turf/open/floor/iron/airless{ @@ -13684,22 +13662,6 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"dXQ" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/plasticflaps/opaque{ - name = "Engineering Deliveries" - }, -/obj/machinery/door/poddoor/preopen{ - id = "engielock"; - name = "Engineering Lockdown Blast Door" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - location = "Engineering" - }, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/starboard/aft) "dXU" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating/airless, @@ -14020,6 +13982,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod, /area/station/service/chapel/funeral) +"ebp" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/bottle/morphine, +/obj/item/reagent_containers/cup/bottle/toxin{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = 8 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -5 + }, +/obj/item/reagent_containers/syringe/epinephrine, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistry_shutters"; + name = "Pharmacy Shutters" + }, +/obj/machinery/door/window/right/directional/east, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/pharmacy) "ebz" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -14554,6 +14539,11 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/pod/dark, /area/station/service/chapel) +"eil" = ( +/obj/machinery/chem_mass_spec, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/freezer, +/area/station/medical/pharmacy) "ein" = ( /obj/structure/displaycase/forsale/kitchen{ pixel_y = 8 @@ -14733,6 +14723,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) +"ekG" = ( +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "ekQ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -14806,6 +14800,15 @@ /obj/structure/cable/layer3, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) +"ely" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/cold/directional/east, +/obj/machinery/gibber, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "elB" = ( /obj/effect/turf_decal/tile/dark/opposingcorners{ dir = 1 @@ -14815,10 +14818,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/mess) -"elX" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "emc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/garbage, @@ -14945,6 +14944,12 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/freezer, /area/station/medical/treatment_center) +"enC" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/carpet, +/area/station/commons/dorms) "enJ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -15084,30 +15089,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"epE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/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/cafeteria, -/area/station/service/cafeteria) -"epX" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/box, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - dir = 4; - location = "QM #2" - }, -/turf/open/floor/iron/smooth_edge, -/area/station/cargo/storage) "epZ" = ( /obj/structure/table/glass, /obj/effect/turf_decal/bot, @@ -15306,8 +15287,26 @@ "esP" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/dark_blue/anticorner, +/obj/structure/secure_safe/caps_spare, /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) +"esZ" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/service/glass{ + name = "Service Hall" + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/large, +/area/station/service/cafeteria) "etd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15552,11 +15551,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_large, /area/station/engineering/lobby) -"exp" = ( -/obj/structure/table/wood, -/obj/item/documents/syndicate, -/turf/open/floor/wood, -/area/station/maintenance/rus_gambling) "exx" = ( /obj/structure/chair/comfy{ color = "#596479"; @@ -15766,6 +15760,15 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/engine, /area/station/science/ordnance/storage) +"eAO" = ( +/obj/structure/table/reinforced, +/obj/item/folder/red, +/obj/item/storage/box/prisoner, +/obj/item/restraints/handcuffs, +/obj/effect/turf_decal/tile/dark_red/diagonal_centre, +/obj/effect/turf_decal/tile/neutral/diagonal_centre, +/turf/open/floor/iron/dark/diagonal, +/area/station/security/execution/transfer) "eBa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15958,6 +15961,11 @@ "eDt" = ( /turf/closed/wall/r_wall, /area/station/science/research) +"eDx" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "eDF" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/power/apc/auto_name/directional/south, @@ -16003,6 +16011,14 @@ /obj/effect/turf_decal/tile/neutral/diagonal_centre, /turf/open/floor/iron/dark/diagonal, /area/station/security/execution/transfer) +"eEd" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/service) "eEi" = ( /obj/effect/turf_decal/tile/dark_red/anticorner, /obj/structure/sign/poster/official/twelve_gauge/directional/east, @@ -16274,6 +16290,37 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/large, /area/station/hallway/primary/central/fore) +"eGw" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/box, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + dir = 4; + location = "QM #2" + }, +/turf/open/floor/iron/smooth_edge, +/area/station/cargo/storage) +"eGy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/fake_stairs/directional/north, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"eGT" = ( +/obj/effect/turf_decal/weather/snow, +/obj/machinery/firealarm/directional/north, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "eGZ" = ( /obj/structure/hedge, /obj/effect/turf_decal/trimline/green/arrow_cw{ @@ -16537,14 +16584,6 @@ }, /turf/open/floor/iron/smooth_edge, /area/station/engineering/storage) -"eLr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hydroponics/glass{ - name = "Hydroponics" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, -/turf/open/floor/iron/large, -/area/station/service/hydroponics) "eLz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -16889,15 +16928,6 @@ dir = 4 }, /area/station/medical/surgery) -"eQJ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/camera/directional/west{ - c_tag = "Cargo - Mining" - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "eQQ" = ( /obj/effect/turf_decal/trimline/dark_red/filled/warning{ dir = 9 @@ -16984,6 +17014,14 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) +"eSB" = ( +/obj/machinery/door/window/left/directional/west{ + req_access = list("morgue") + }, +/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/medical/morgue) "eSD" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/engineering/vending_restock, @@ -17267,6 +17305,13 @@ }, /turf/open/floor/iron/smooth_edge, /area/station/science/ordnance/testlab) +"eWX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "eXd" = ( /obj/effect/turf_decal/trimline/green/filled/warning, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17429,6 +17474,18 @@ /obj/structure/railing/corner, /turf/open/floor/iron/smooth, /area/station/command/cc_dock) +"eYX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/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/cafeteria, +/area/station/service/cafeteria) "eYY" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -17469,6 +17526,11 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/ordnance_maint) +"fam" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "faq" = ( /turf/open/floor/iron/smooth_large, /area/station/maintenance/disposal/incinerator) @@ -17794,20 +17856,6 @@ /obj/effect/turf_decal/tile/red/diagonal_centre, /turf/open/floor/iron/dark/diagonal, /area/station/security/office) -"ffI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/railing{ - dir = 9; - layer = 3.1 - }, -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) "ffN" = ( /obj/structure/chair/comfy/carp{ dir = 4 @@ -17970,14 +18018,6 @@ "fiN" = ( /turf/closed/wall/r_wall, /area/station/medical/chemistry) -"fiO" = ( -/obj/structure/sign/poster/random/directional/north, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/large, -/area/station/hallway/secondary/service) "fiT" = ( /obj/effect/turf_decal/skyrat_decals/enclave/middle/left{ color = "#52B4E9" @@ -18039,18 +18079,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/security/prison/garden) -"fky" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "fkF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18324,14 +18352,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/kitchen, /area/station/security/prison/mess) -"fnO" = ( -/obj/machinery/door/window/left/directional/west{ - req_access = list("morgue") - }, -/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/medical/morgue) "fnQ" = ( /obj/structure/closet/firecloset/wall{ pixel_y = 32 @@ -18660,6 +18680,12 @@ dir = 1 }, /area/station/hallway/primary/aft) +"fsk" = ( +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/newscaster/directional/east, +/obj/structure/bed/double/pod, +/turf/open/floor/carpet/cyan, +/area/station/commons/dorms) "fst" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod, @@ -18739,23 +18765,6 @@ /obj/structure/window/reinforced/plasma/spawner/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/lesser) -"fty" = ( -/obj/machinery/light/warm/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Cafeteria Fore"; - name = "service camera" - }, -/obj/machinery/firealarm/directional/north{ - pixel_x = 8 - }, -/obj/item/radio/intercom/directional/north{ - pixel_x = -6 - }, -/obj/structure/table, -/obj/item/plate, -/obj/item/food/sausage, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "ftA" = ( /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/siding/wood/end{ @@ -18802,6 +18811,24 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/crew_quarters/bar) +"fva" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + desc = "Salt. From space oceans, presumably. A staple of modern medicine."; + pixel_x = 8; + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/peppermill{ + desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; + pixel_x = 8; + pixel_y = 2 + }, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/obj/item/kitchen/rollingpin{ + pixel_x = -4 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "fve" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -18950,6 +18977,18 @@ /obj/item/toy/cards/deck/tarot, /turf/open/floor/iron/grimy, /area/station/commons/lounge) +"fxo" = ( +/obj/structure/table, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/item/plate, +/obj/item/holosign_creator/robot_seat/restaurant, +/turf/open/floor/iron/large, +/area/station/service/kitchen) "fxD" = ( /obj/structure/sign/warning/chem_diamond/directional/north, /obj/structure/rack/shelf, @@ -18996,6 +19035,10 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/carpet/stellar, /area/station/service/chapel/funeral) +"fye" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/cargo/office) "fys" = ( /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 1 @@ -19080,6 +19123,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/small, /area/station/hallway/primary/central) +"fzg" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 1; + location = "Janitor" + }, +/obj/structure/plasticflaps/opaque{ + name = "Janitorial Deliveries" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/large, +/area/station/service/janitor) "fzm" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -19191,22 +19246,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/carpet/cyan, /area/station/commons/dorms) -"fBe" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - dir = 4; - location = "QM #1" - }, -/obj/effect/turf_decal/box, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, -/turf/open/floor/iron/smooth_edge, -/area/station/cargo/storage) "fBi" = ( /obj/structure/table/wood/fancy, /obj/item/flashlight/lantern, @@ -19436,20 +19475,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood/large, /area/station/commons/fitness/recreation/entertainment) -"fEU" = ( -/obj/structure/table, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/structure/desk_bell{ - pixel_x = 7; - pixel_y = 10 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "fEX" = ( /obj/structure/window/reinforced/plasma/spawner/directional/south, /obj/structure/window/reinforced/plasma/spawner/directional/west, @@ -19465,6 +19490,11 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/smooth_large, /area/station/command/cc_dock) +"fFf" = ( +/obj/effect/mapping_helpers/broken_floor, +/mob/living/basic/trooper/syndicate/melee, +/turf/open/floor/wood, +/area/station/maintenance/rus_gambling) "fFg" = ( /obj/item/crowbar/large, /obj/structure/rack, @@ -19484,15 +19514,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth_edge, /area/station/construction/mining/aux_base) -"fFu" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/right/directional/west{ - name = "Kitchen Deliveries"; - req_access = list("kitchen") - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "fGb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19681,6 +19702,10 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood/large, /area/station/hallway/secondary/exit/departure_lounge) +"fJV" = ( +/obj/machinery/door/window/left/directional/west, +/turf/open/floor/carpet/purple, +/area/station/common/night_club) "fKb" = ( /turf/open/floor/iron/smooth, /area/station/command/cc_dock) @@ -19780,16 +19805,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/upper) -"fLI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"fLC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/medical/pharmacy) "fLX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19823,6 +19846,21 @@ dir = 4 }, /area/station/cargo/storage) +"fMm" = ( +/obj/machinery/button/door/directional/south{ + id = "kitchen_counter"; + name = "Counter Shutters Control" + }, +/obj/structure/table, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/processor{ + pixel_y = 12 + }, +/obj/structure/railing, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "fMy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19897,6 +19935,14 @@ }, /turf/open/floor/wood/large, /area/station/security/courtroom) +"fNX" = ( +/obj/machinery/bouldertech/refinery/smelter, +/obj/machinery/conveyor/inverted{ + dir = 5; + id = "mining" + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "fNY" = ( /obj/structure/closet/l3closet/virology, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -20446,26 +20492,6 @@ dir = 6 }, /area/station/service/chapel) -"fWO" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/taperecorder{ - pixel_x = -10; - pixel_y = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 - }, -/turf/open/floor/cult, -/area/station/service/library) "fXl" = ( /obj/docking_port/stationary/random{ name = "lavaland"; @@ -20577,24 +20603,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/maintenance/rus_gambling) -"fYA" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/reagent_containers/cup/glass/shaker, -/obj/item/clothing/mask/gas, -/obj/item/clothing/head/utility/chefhat, -/obj/item/cultivator, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "fYF" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 6 @@ -20616,6 +20624,17 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/maintenance/department/electrical) +"fZg" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/mid_joiner, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/service) "fZo" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 6 @@ -20868,10 +20887,6 @@ /obj/structure/girder, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"gdc" = ( -/obj/structure/cable, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "gdk" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron/stairs/right{ @@ -21393,6 +21408,19 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"gjG" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/fake_stairs/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "gjJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21513,28 +21541,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"gkH" = ( -/obj/machinery/button/door/directional/east{ - id = "chemistry_shutters_south"; - name = "Shutters Control"; - req_access = list("pharmacy") - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/chem_heater/withbuffer, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) "gkI" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -21647,11 +21653,6 @@ "gmd" = ( /turf/closed/wall, /area/station/science/lab) -"gmo" = ( -/obj/structure/flora/bush/jungle/a/style_3, -/obj/structure/window/fulltile, -/turf/open/floor/grass, -/area/station/service/kitchen) "gms" = ( /obj/structure/table/wood/fancy, /obj/item/storage/box/matches{ @@ -21750,16 +21751,6 @@ /obj/structure/closet/crate/solarpanel_small, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/solars/starboard/fore) -"gof" = ( -/obj/structure/chair/stool/directional/west{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) "got" = ( /turf/closed/wall/r_wall, /area/station/maintenance/eva_shed/port) @@ -21769,18 +21760,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/medical/morgue) -"goA" = ( -/obj/structure/cable, -/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/effect/turf_decal/siding/dark/corner{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "goF" = ( /obj/structure/sign/poster/official/wtf_is_co2, /turf/closed/wall, @@ -22142,6 +22121,18 @@ /obj/effect/turf_decal/trimline/dark_red/arrow_ccw, /turf/open/floor/iron/small, /area/station/hallway/secondary/exit/departure_lounge) +"gtJ" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Cargo Deliveries" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/service) "gtM" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/closet/secure_closet/cytology, @@ -22214,14 +22205,6 @@ }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) -"guv" = ( -/obj/structure/chair/sofa/corp/right{ - color = "#DE3A3A"; - dir = 4 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "guE" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -22497,6 +22480,18 @@ /obj/structure/window/reinforced/plasma/spawner/directional/east, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) +"gyK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "gzn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22914,19 +22909,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) -"gFi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/biogenerator, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "hydroponics_counter"; - name = "Hydroponics Counter Shutters" - }, -/obj/machinery/door/firedoor, -/obj/structure/window/spawner/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/large, -/area/station/service/hydroponics) "gFm" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north{ @@ -22974,6 +22956,12 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/carpet, /area/station/service/library) +"gFG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/weather/snow, +/mob/living/basic/goat/pete, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "gFW" = ( /obj/effect/turf_decal/trimline/dark/filled/line{ dir = 1 @@ -23178,6 +23166,14 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"gIO" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "gIT" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/barman_recipes, @@ -23297,17 +23293,15 @@ }, /turf/open/floor/carpet/black, /area/station/service/chapel/office) -"gKM" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +"gKB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/mid_joiner, -/obj/machinery/computer/department_orders/service, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/smooth_large, +/turf/open/floor/iron/diagonal, /area/station/hallway/secondary/service) "gKO" = ( /turf/open/floor/catwalk_floor/iron_smooth, @@ -23865,13 +23859,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"gSF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/sorting) "gSI" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/cable, @@ -24305,13 +24292,6 @@ /obj/effect/turf_decal/tile/dark/opposingcorners, /turf/open/floor/iron/kitchen, /area/station/security/prison/mess) -"gYw" = ( -/obj/structure/chair/stool/directional/north{ - pixel_y = 6 - }, -/mob/living/basic/trooper/syndicate/melee, -/turf/open/floor/wood, -/area/station/maintenance/rus_gambling) "gYG" = ( /obj/structure/table/reinforced/rglass, /obj/structure/window/reinforced/spawner/directional/south, @@ -24449,23 +24429,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) -"haI" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - dir = 4; - location = "QM #4" - }, -/obj/effect/turf_decal/box, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, -/turf/open/floor/iron/smooth_edge, -/area/station/cargo/storage) "haU" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -24513,14 +24476,6 @@ /obj/structure/grille, /turf/open/floor/iron/smooth, /area/station/maintenance/port/greater) -"hbs" = ( -/obj/machinery/door/airlock/security{ - name = "Isolation Cell" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/security/execution/transfer) "hbE" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/box/white{ @@ -24533,6 +24488,16 @@ /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /turf/open/floor/iron/showroomfloor, /area/station/medical/coldroom) +"hbG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/window/right/directional/north{ + name = "Jim Norton's Quebecois Coffee"; + req_one_access = list("service","maint_tunnels") + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/entry) "hbJ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -24635,6 +24600,30 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) +"hcH" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 4; + location = "Atmospherics" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/poddoor/preopen{ + id = "atmoslock"; + name = "Atmospherics Lockdown Blast Door" + }, +/obj/machinery/door/window/left/directional/east{ + name = "Atmospherics Deliveries"; + req_access = list("atmospherics") + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/plasticflaps{ + name = "Atmospherics Deliveries" + }, +/turf/open/floor/iron/smooth_large, +/area/station/engineering/atmos/storage/gas) "hcK" = ( /obj/structure/table/wood/poker, /turf/open/floor/iron/grimy, @@ -25100,38 +25089,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/tcommsat/computer) -"hjt" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistry_shutters"; - name = "Pharmacy Shutters" - }, -/obj/machinery/door/window/left/directional/south, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/pharmacy) "hjy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25395,14 +25352,6 @@ }, /turf/open/floor/wood, /area/station/security/prison/garden) -"hnu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing/corner, -/obj/effect/turf_decal/siding/dark, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "hnJ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/vending/wardrobe/hydro_wardrobe, @@ -25478,14 +25427,6 @@ /obj/item/stack/sheet/iron/five, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"hpB" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "mining"; - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "hpE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25504,6 +25445,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"hqe" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "hqf" = ( /obj/machinery/digital_clock, /turf/closed/wall/r_wall, @@ -25642,15 +25591,6 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/dark, /area/station/security/range) -"hsx" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red, -/obj/item/storage/box/prisoner, -/obj/item/restraints/handcuffs, -/obj/effect/turf_decal/tile/dark_red/diagonal_centre, -/obj/effect/turf_decal/tile/neutral/diagonal_centre, -/turf/open/floor/iron/dark/diagonal, -/area/station/security/execution/transfer) "hsN" = ( /obj/machinery/computer/teleporter{ dir = 4 @@ -25998,6 +25938,19 @@ "hxy" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) +"hxA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/chem_master/condimaster, +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "hxC" = ( /obj/machinery/door/airlock/mining{ name = "Drone Bay" @@ -26357,19 +26310,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth, /area/station/maintenance/department/engine/atmos/lesser) -"hBD" = ( -/obj/structure/table, -/obj/machinery/requests_console/directional/west{ - department = "Kitchen"; - name = "Kitchen Requests Console" - }, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -2; - pixel_y = 5 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "hBH" = ( /obj/machinery/status_display/ai/directional/east, /obj/structure/dresser, @@ -26382,6 +26322,16 @@ }, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) +"hBP" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/machinery/status_display/ai/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/box, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "hBQ" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -26680,6 +26630,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/glass/reinforced, /area/station/hallway/secondary/exit/departure_lounge) +"hFu" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Service Hall"; + dir = 9; + name = "service camera" + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/mid_joiner, +/obj/machinery/modular_computer/preset/cargochat/service, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/service) "hFA" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 10 @@ -27499,6 +27462,10 @@ dir = 1 }, /area/station/command/gateway) +"hTj" = ( +/obj/machinery/deepfryer, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "hTl" = ( /obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -28097,14 +28064,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/grimy, /area/station/service/library) -"ibU" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/vending/dinnerware, -/obj/item/toy/figure/chef{ - pixel_y = 16 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "ibV" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -28382,6 +28341,15 @@ dir = 4 }, /area/station/medical/virology) +"ihS" = ( +/obj/machinery/light/directional/north, +/obj/machinery/bouldertech/refinery, +/obj/machinery/conveyor{ + id = "mining"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "ihT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28576,6 +28544,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white/smooth_edge, /area/station/medical/storage) +"ikN" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/maintenance/rus_gambling) "ila" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -28827,6 +28801,22 @@ /obj/effect/mapping_helpers/airlock/access/all/command/hop, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) +"iog" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 4; + pixel_y = 18 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = -8; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = -8; + pixel_y = 4 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "iom" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -29282,14 +29272,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"itc" = ( -/obj/structure/chair/sofa/corp/right{ - color = "#DE3A3A"; - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) +"itf" = ( +/obj/structure/noticeboard/directional/north, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/service) "iti" = ( /obj/structure/table/wood, /obj/machinery/fax{ @@ -29980,14 +29968,10 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"iCQ" = ( -/obj/structure/chair/sofa/corp/right{ - color = "#DE3A3A"; - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) +"iCW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/heads_quarters/qm) "iCZ" = ( /obj/machinery/computer/communications, /obj/machinery/keycard_auth{ @@ -30103,13 +30087,6 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics/garden) -"iFk" = ( -/obj/structure/chair/sofa/corp/left{ - color = "#DE3A3A"; - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "iFo" = ( /obj/structure/bed/maint, /obj/effect/spawner/random/contraband/prison, @@ -30137,6 +30114,13 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/fore) +"iFV" = ( +/obj/machinery/conveyor{ + id = "mining"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "iFY" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -30360,6 +30344,16 @@ dir = 1 }, /area/station/security/prison) +"iIG" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/table, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -2; + pixel_y = 5 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "iJg" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 @@ -30401,6 +30395,14 @@ dir = 8 }, /area/station/engineering/atmos) +"iJt" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/vending/dinnerware, +/obj/item/toy/figure/chef{ + pixel_y = 16 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "iJB" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -30565,21 +30567,6 @@ "iMs" = ( /turf/closed/wall/r_wall, /area/station/security/holding_cell) -"iMu" = ( -/obj/machinery/button/door/directional/south{ - id = "kitchen_counter"; - name = "Counter Shutters Control" - }, -/obj/structure/table, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/processor{ - pixel_y = 12 - }, -/obj/structure/railing, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "iMv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30627,6 +30614,15 @@ dir = 1 }, /area/station/hallway/secondary/command) +"iNa" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/directional/west{ + c_tag = "Cargo - Mining" + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "iNk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30681,14 +30677,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/construction) -"iOr" = ( -/obj/structure/sign/warning/vacuum/directional/north, -/obj/machinery/conveyor/inverted{ - dir = 6; - id = "mining" - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "iOx" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/dark_blue{ @@ -30926,19 +30914,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"iRY" = ( -/obj/structure/table, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "iSa" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31056,17 +31031,6 @@ "iTA" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) -"iTD" = ( -/obj/machinery/computer/security/mining{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/miningdock) "iTJ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -31105,6 +31069,12 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/grimy, /area/station/commons/lounge) +"iUy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/service/kitchen) "iUz" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -31497,12 +31467,6 @@ }, /turf/open/floor/carpet/blue, /area/station/command/bridge) -"iYY" = ( -/obj/effect/spawner/random/bedsheet/double, -/obj/machinery/newscaster/directional/east, -/obj/structure/bed/double/pod, -/turf/open/floor/carpet/cyan, -/area/station/commons/dorms) "iYZ" = ( /obj/structure/chair{ dir = 8 @@ -31798,6 +31762,16 @@ /obj/machinery/door/airlock/external, /turf/open/floor/catwalk_floor, /area/station/engineering/main) +"jdH" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/light/directional/north, +/obj/structure/table, +/obj/machinery/light_switch/directional/north{ + pixel_x = 13 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "jdN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -32088,6 +32062,18 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/smooth_edge, /area/station/hallway/primary/aft) +"jio" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/dark/half, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/mid_joiner{ + dir = 1 + }, +/obj/machinery/door/window/survival_pod/left/directional/north, +/turf/open/floor/iron/half, +/area/station/service/hydroponics) "jir" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -32318,24 +32304,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) -"jlb" = ( -/obj/structure/table, -/obj/item/reagent_containers/condiment/saltshaker{ - desc = "Salt. From space oceans, presumably. A staple of modern medicine."; - pixel_x = 8; - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/peppermill{ - desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; - pixel_x = 8; - pixel_y = 2 - }, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/obj/item/kitchen/rollingpin{ - pixel_x = -4 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "jlf" = ( /obj/structure/chair/sofa/bench, /turf/open/floor/wood/large, @@ -32861,14 +32829,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"jsJ" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/dark, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "jtc" = ( /turf/open/floor/carpet, /area/station/commons/dorms) @@ -33728,6 +33688,15 @@ /obj/effect/spawner/random/trash/caution_sign, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) +"jDX" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/right/directional/west{ + name = "Kitchen Deliveries"; + req_access = list("kitchen") + }, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "jDY" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/suit_storage_unit/ce, @@ -34702,7 +34671,6 @@ /area/station/science/xenobiology) "jSl" = ( /obj/effect/turf_decal/bot, -/obj/machinery/computer/department_orders/science, /obj/effect/turf_decal/trimline/brown/filled/mid_joiner, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 @@ -34861,6 +34829,23 @@ dir = 8 }, /area/station/command/gateway) +"jUL" = ( +/obj/machinery/light/warm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Cafeteria Fore"; + name = "service camera" + }, +/obj/machinery/firealarm/directional/north{ + pixel_x = 8 + }, +/obj/item/radio/intercom/directional/north{ + pixel_x = -6 + }, +/obj/structure/table, +/obj/item/plate, +/obj/item/food/sausage, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "jUZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -35164,12 +35149,6 @@ /obj/effect/turf_decal/bot/left, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/atmos/hfr_room) -"jZf" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/carpet/black, -/area/station/commons/dorms) "jZS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35205,10 +35184,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"kaD" = ( -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "kaN" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -35309,15 +35284,6 @@ dir = 8 }, /area/station/engineering/atmos) -"kbp" = ( -/obj/machinery/brm, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/conveyor{ - id = "mining"; - dir = 1 - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "kbv" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -35334,13 +35300,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/cargo/storage) -"kbz" = ( -/obj/machinery/conveyor{ - id = "mining"; - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "kbD" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/warning, @@ -36005,15 +35964,6 @@ }, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) -"kkV" = ( -/obj/structure/chair/stool/directional/west{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "klx" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -36292,6 +36242,20 @@ }, /turf/open/space/basic, /area/space/nearstation) +"koZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/pollution_scrubber{ + pixel_x = -7; + pixel_y = 1 + }, +/obj/structure/table, +/turf/open/floor/iron/large, +/area/station/service/kitchen) "kpg" = ( /obj/effect/mapping_helpers/airlock/access/any/supply/shipping, /obj/structure/disposalpipe/segment{ @@ -36403,6 +36367,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/construction) +"krz" = ( +/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/brown/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/miningdock) "krA" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 @@ -36898,25 +36871,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"kyy" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 4 - }, -/obj/machinery/requests_console/directional/south{ - department = "Pharmacy"; - name = "Pharmacy Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/turf_decal/bot_red, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) "kyC" = ( /obj/effect/turf_decal/siding/thinplating/corner, /obj/structure/cable, @@ -36937,9 +36891,6 @@ /turf/open/floor/iron/smooth, /area/station/cargo/lobby) "kyH" = ( -/obj/machinery/computer/department_orders/medical{ - dir = 4 - }, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 }, @@ -37225,12 +37176,6 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/port/upper) -"kBr" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/dark/corner, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "kBs" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -37405,18 +37350,6 @@ dir = 1 }, /area/station/service/hydroponics) -"kDK" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/box, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - dir = 4; - location = "QM #3" - }, -/turf/open/floor/iron/smooth_edge, -/area/station/cargo/storage) "kDR" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -37462,17 +37395,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/common/night_club) -"kEd" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/smooth_edge, -/area/station/cargo/miningdock) "kEm" = ( /turf/closed/wall, /area/station/maintenance/aft/upper) @@ -38223,6 +38145,18 @@ dir = 8 }, /area/station/medical/storage) +"kOq" = ( +/obj/structure/plasticflaps/opaque{ + name = "Medical Deliveries" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + location = "Medbay" + }, +/obj/effect/turf_decal/delivery/blue, +/turf/open/floor/iron/white/smooth_large, +/area/station/maintenance/department/medical) "kOs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -38555,18 +38489,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/wood/large, /area/station/hallway/secondary/entry) -"kTz" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - dir = 1; - location = "Janitor" - }, -/obj/structure/plasticflaps/opaque{ - name = "Janitorial Deliveries" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/large, -/area/station/service/janitor) "kTB" = ( /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 @@ -38939,18 +38861,6 @@ dir = 1 }, /area/station/hallway/primary/central) -"kYg" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/plasticflaps/opaque{ - name = "Robotics Deliveries" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 4; - location = "Robotics" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "kYz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -39373,6 +39283,14 @@ }, /turf/open/floor/iron/freezer, /area/station/medical/chemistry) +"lej" = ( +/obj/structure/chair/sofa/corp/right{ + color = "#DE3A3A"; + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "leB" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/service/bar, @@ -39562,6 +39480,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"lgZ" = ( +/obj/machinery/door/airlock/security{ + name = "Isolation Cell" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "lhb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -39775,6 +39701,13 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/pod/dark, /area/station/service/chapel/funeral) +"lkz" = ( +/obj/structure/chair/sofa/corp/left{ + color = "#DE3A3A"; + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "lkG" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/disposalpipe/segment, @@ -39785,6 +39718,10 @@ "lkJ" = ( /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"lkM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/cargo/sorting) "lkR" = ( /obj/effect/spawner/random/structure/table_fancy, /obj/item/flashlight/lamp/green{ @@ -39919,6 +39856,14 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"lmY" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "mining"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "lnc" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -40038,15 +39983,6 @@ }, /turf/open/floor/iron/grimy, /area/station/commons/lounge) -"lnT" = ( -/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/brown/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/miningdock) "lnU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40146,11 +40082,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/freezer, /area/station/medical/treatment_center) -"lpj" = ( -/obj/effect/decal/cleanable/blood/old, -/mob/living/basic/trooper/syndicate/melee/sword, -/turf/open/floor/wood, -/area/station/maintenance/rus_gambling) "lpz" = ( /obj/effect/turf_decal/delivery, /obj/machinery/space_heater, @@ -40485,11 +40416,6 @@ "luV" = ( /turf/closed/wall, /area/station/engineering/atmos) -"luY" = ( -/obj/effect/turf_decal/weather/snow, -/obj/structure/closet/secure_closet/freezer/meat, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "lva" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/infections, @@ -41003,19 +40929,6 @@ dir = 8 }, /area/station/security/checkpoint/supply) -"lCf" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/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/iron/cafeteria, -/area/station/service/cafeteria) "lCg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/green, @@ -41245,22 +41158,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"lFj" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder{ - pixel_x = 4; - pixel_y = 18 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = -8; - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = -8; - pixel_y = 4 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "lFl" = ( /obj/effect/spawner/random/trash/garbage, /obj/effect/decal/cleanable/dirt, @@ -42866,14 +42763,6 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/security/greater) -"lZQ" = ( -/obj/machinery/bouldertech/refinery/smelter, -/obj/machinery/conveyor/inverted{ - dir = 5; - id = "mining" - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "lZS" = ( /obj/effect/turf_decal/trimline/green/filled/warning, /obj/structure/cable, @@ -43612,6 +43501,18 @@ }, /turf/open/floor/iron/smooth_edge, /area/station/hallway/primary/aft) +"mkD" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/edge, +/area/station/service/hydroponics) "mkK" = ( /obj/effect/turf_decal/trimline/dark_red/filled/corner{ dir = 8 @@ -43901,23 +43802,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/range) -"mpw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south{ - pixel_x = 3; - pixel_y = -32 - }, -/obj/machinery/chem_master, -/obj/effect/turf_decal/bot_red, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) "mpF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44155,6 +44039,15 @@ dir = 8 }, /area/station/cargo/storage) +"muX" = ( +/obj/machinery/button/curtain{ + id = "russianbar"; + pixel_y = 24 + }, +/obj/effect/mapping_helpers/broken_floor, +/mob/living/basic/trooper/syndicate/melee, +/turf/open/floor/wood, +/area/station/maintenance/rus_gambling) "muZ" = ( /obj/structure/closet/bombcloset, /obj/effect/turf_decal/trimline/dark_red/filled/line{ @@ -44211,10 +44104,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"mvH" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "mwd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44450,30 +44339,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"mzX" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/item/pen{ - pixel_y = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/window/left/directional/south{ - name = "Hydroponics Desk"; - req_access = list("hydroponics") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "hydroponics_counter"; - name = "Hydroponics Counter Shutters" - }, -/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, -/area/station/service/hydroponics) "mAj" = ( /obj/machinery/power/shuttle_engine/huge{ dir = 4 @@ -44893,19 +44758,6 @@ dir = 8 }, /area/station/security/prison) -"mFr" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Service Hall"; - dir = 9; - name = "service camera" - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/mid_joiner, -/obj/machinery/modular_computer/preset/cargochat/service, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/service) "mFz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -44930,6 +44782,23 @@ /obj/structure/sign/poster/contraband/communist_state/directional/east, /turf/open/floor/wood, /area/station/maintenance/rus_gambling) +"mFX" = ( +/obj/structure/table, +/obj/item/plate/large, +/obj/item/plate, +/obj/item/plate/small{ + pixel_y = 1 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = 10; + pixel_y = 18 + }, +/obj/item/knife/butcher{ + pixel_x = 5 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "mGv" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -45181,19 +45050,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/smooth_large, /area/station/security/checkpoint/engineering) -"mJT" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/fake_stairs/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "mJV" = ( /obj/structure/sign/warning/explosives/alt/directional/south, /obj/effect/turf_decal/stripes/line, @@ -46018,18 +45874,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) -"mVk" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/edge, -/area/station/service/hydroponics) "mVl" = ( /obj/effect/landmark/event_spawn, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -46058,6 +45902,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth_large, /area/station/engineering/atmos) +"mVt" = ( +/obj/effect/turf_decal/weather/snow, +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "mVv" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -46355,6 +46204,28 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/station/security/office) +"mYW" = ( +/obj/machinery/button/door/directional/east{ + id = "chemistry_shutters_south"; + name = "Shutters Control"; + req_access = list("pharmacy") + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/bot_red, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/chem_heater/withbuffer, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "mZe" = ( /obj/effect/turf_decal/trimline/dark_red/arrow_cw{ dir = 8 @@ -47001,6 +46872,38 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/smooth_edge, /area/station/security/interrogation) +"njQ" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistry_shutters_south"; + name = "Pharmacy Shutters" + }, +/obj/machinery/door/window/left/directional/west, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/pharmacy) "njV" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 5 @@ -47099,18 +47002,6 @@ /obj/item/kirbyplants/monkey, /turf/open/floor/iron/white/smooth_edge, /area/station/science/lab) -"nkL" = ( -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/machinery/light_switch/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Service Hallway"; - name = "Service Fax Machine"; - pixel_y = 3 - }, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "nkQ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -47214,11 +47105,6 @@ }, /turf/open/floor/grass, /area/station/hallway/secondary/command) -"nmv" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "nmw" = ( /obj/effect/turf_decal/bot, /obj/machinery/computer/atmos_alert, @@ -47382,15 +47268,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white/smooth_large, /area/station/commons/fitness/recreation/entertainment) -"noQ" = ( -/obj/machinery/light/directional/north, -/obj/machinery/bouldertech/refinery, -/obj/machinery/conveyor{ - id = "mining"; - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "noU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47453,16 +47330,6 @@ }, /turf/closed/wall/r_wall, /area/station/command/heads_quarters/nt_rep) -"npO" = ( -/obj/structure/table, -/obj/item/storage/bag/tray{ - pixel_y = 3 - }, -/obj/item/food/dough{ - pixel_y = 5 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "npP" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -48100,6 +47967,10 @@ /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) +"nyf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) "nyh" = ( /obj/structure/window/reinforced/spawner/directional/west{ layer = 2.9 @@ -48155,6 +48026,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_edge, /area/station/engineering/atmos) +"nzv" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "nzw" = ( /obj/structure/rack, /obj/item/poster/random_contraband, @@ -48214,9 +48089,6 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 }, -/obj/machinery/computer/department_orders/security{ - dir = 1 - }, /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ dir = 8 @@ -48366,12 +48238,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"nDH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/station/service/kitchen) "nDN" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 @@ -48622,17 +48488,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/grimy, /area/station/service/library) -"nHb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "nHf" = ( /obj/structure/railing, /turf/open/floor/iron/smooth, @@ -48683,15 +48538,28 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth, /area/station/science/ordnance) +"nIJ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south{ + pixel_x = 3; + pixel_y = -32 + }, +/obj/machinery/chem_master, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "nIK" = ( /obj/structure/table/reinforced/rglass, /obj/item/book/manual/wiki/security_space_law, /turf/open/floor/carpet/blue, /area/station/command/bridge) -"nIM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/office) "nIO" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -48736,12 +48604,6 @@ /obj/effect/turf_decal/tile/neutral/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/commons/dorms) -"nIX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "nJe" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/freezer, @@ -48858,13 +48720,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"nKx" = ( -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "nKV" = ( /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 1 @@ -48946,6 +48801,11 @@ /obj/effect/spawner/random/maintenance/eight, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"nMk" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "nMr" = ( /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/aft) @@ -49269,6 +49129,12 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/bar) +"nQh" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/carpet/black, +/area/station/commons/dorms) "nQj" = ( /obj/machinery/cryopod{ dir = 1 @@ -49369,6 +49235,13 @@ dir = 4 }, /area/station/science/xenobiology) +"nRy" = ( +/obj/effect/turf_decal/weather/snow, +/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/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "nRz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -49589,6 +49462,13 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/fitness/recreation/entertainment) +"nTI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "nTS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49621,9 +49501,6 @@ /turf/closed/wall, /area/station/medical/medbay/central) "nUc" = ( -/obj/machinery/computer/department_orders/engineering{ - dir = 1 - }, /obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ dir = 1 }, @@ -49802,9 +49679,6 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, -/obj/machinery/modular_computer/preset/cargochat/cargo{ - dir = 4 - }, /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth_edge{ dir = 4 @@ -49992,6 +49866,18 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"nYG" = ( +/obj/machinery/computer/order_console/cook, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/mid_joiner, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/service) "nYI" = ( /obj/effect/landmark/secequipment, /obj/structure/sign/poster/official/random/directional/north, @@ -50127,6 +50013,18 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/large, /area/station/hallway/secondary/entry) +"obz" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sink/directional/south, +/obj/effect/turf_decal/siding/green, +/obj/machinery/firealarm/directional/north{ + pixel_x = -6 + }, +/turf/open/floor/iron/edge, +/area/station/service/hydroponics) "ocb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -50197,6 +50095,16 @@ dir = 4 }, /area/station/medical/surgery) +"ocK" = ( +/obj/structure/table, +/obj/item/storage/bag/tray{ + pixel_y = 3 + }, +/obj/item/food/dough{ + pixel_y = 5 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "ocV" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -50775,11 +50683,37 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/crew_quarters/bar) +"okY" = ( +/obj/structure/cable, +/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/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "olf" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/maintenance/port/greater) +"olm" = ( +/obj/structure/table, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 10 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "olo" = ( /obj/structure/chair/office{ dir = 8 @@ -50811,6 +50745,13 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/parquet, /area/station/common/night_club) +"olG" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "olS" = ( /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel" @@ -50866,6 +50807,20 @@ }, /turf/open/floor/iron/corner, /area/station/hallway/primary/central) +"omI" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Old Bar" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/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{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/rus_gambling) "omT" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Mining Maintenance" @@ -51642,33 +51597,6 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"oxT" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table, -/obj/item/reagent_containers/condiment/saltshaker{ - desc = "Salt. From space oceans, presumably. A staple of modern medicine."; - pixel_x = -8; - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/peppermill{ - desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; - pixel_x = -8; - pixel_y = 2 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets/donkpocketpizza{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/storage/box/donkpockets/donkpocketteriyaki{ - pixel_x = 5; - pixel_y = 9 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "oxW" = ( /obj/structure/closet/firecloset/wall{ pixel_y = 32 @@ -51764,11 +51692,6 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/iron/smooth, /area/station/maintenance/department/engine/atmos) -"ozm" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "ozn" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/suit_storage_unit/standard_unit, @@ -51960,6 +51883,14 @@ "oCl" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"oCm" = ( +/obj/structure/sign/warning/vacuum/directional/north, +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "mining" + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "oCo" = ( /obj/structure/railing/corner{ dir = 4 @@ -52224,6 +52155,7 @@ c_tag = "Vault"; network = list("vault") }, +/obj/item/piggy_bank/vault, /turf/open/floor/engine, /area/station/ai_monitored/command/nuke_storage) "oFU" = ( @@ -52915,10 +52847,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/medical/central) -"oQq" = ( -/obj/machinery/deepfryer, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "oQw" = ( /obj/structure/chair/office/light, /turf/open/floor/carpet/blue, @@ -53164,36 +53092,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/station/service/chapel) -"oTP" = ( -/obj/effect/turf_decal/trimline/green/filled/warning{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/light_switch/directional/north{ - pixel_x = 14 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/hydroponics) "oTX" = ( /obj/machinery/status_display/evac/directional/south, /obj/machinery/firealarm/directional/east, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) -"oUa" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/fake_stairs/directional/north, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "oUb" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53682,12 +53585,6 @@ /obj/structure/table/glass, /turf/open/floor/wood/large, /area/station/hallway/secondary/exit/departure_lounge) -"oZO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "oZR" = ( /obj/structure/trash_pile, /turf/open/floor/iron/smooth, @@ -53751,16 +53648,6 @@ dir = 1 }, /area/station/engineering/lobby) -"paE" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/door/window/right/directional/north{ - name = "Jim Norton's Quebecois Coffee"; - req_one_access = list("service","maint_tunnels") - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/entry) "paM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_large, @@ -54048,6 +53935,10 @@ /obj/item/folder/white, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/morgue) +"pei" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "pep" = ( /obj/structure/table/glass, /obj/item/paper_bin{ @@ -54551,29 +54442,6 @@ "pjG" = ( /turf/open/floor/engine, /area/station/security/execution/education) -"pjI" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/bottle/morphine, -/obj/item/reagent_containers/cup/bottle/toxin{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = 8 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = -5 - }, -/obj/item/reagent_containers/syringe/epinephrine, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistry_shutters"; - name = "Pharmacy Shutters" - }, -/obj/machinery/door/window/right/directional/east, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/pharmacy) "pjL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -54991,6 +54859,18 @@ }, /turf/open/floor/iron/white/smooth_edge, /area/station/science/research) +"pqc" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/box, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + dir = 4; + location = "QM #3" + }, +/turf/open/floor/iron/smooth_edge, +/area/station/cargo/storage) "pqh" = ( /turf/closed/wall, /area/station/cargo/warehouse) @@ -55431,18 +55311,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/command/heads_quarters/captain) -"pwV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/freezer{ - critical_machine = 1; - name = "Coldroom" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/structure/fans/tiny, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "pwX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55693,6 +55561,20 @@ dir = 1 }, /area/station/engineering/atmos) +"pAK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9; + layer = 3.1 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "pAZ" = ( /obj/effect/turf_decal/weather/sand{ dir = 1 @@ -56919,10 +56801,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"pTr" = ( -/obj/machinery/door/window/left/directional/west, -/turf/open/floor/carpet/purple, -/area/station/common/night_club) "pTx" = ( /obj/structure/table, /obj/item/clothing/gloves/color/fyellow{ @@ -57307,6 +57185,18 @@ /obj/structure/grille/broken, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/bar) +"pYe" = ( +/obj/structure/chair/stool/directional/west{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + 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/cafeteria, +/area/station/service/cafeteria) "pYi" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -57437,15 +57327,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/pod/dark, /area/station/service/chapel) -"pZt" = ( -/obj/machinery/button/curtain{ - id = "russianbar"; - pixel_y = 24 - }, -/obj/effect/mapping_helpers/broken_floor, -/mob/living/basic/trooper/syndicate/melee, -/turf/open/floor/wood, -/area/station/maintenance/rus_gambling) "pZx" = ( /obj/structure/closet/crate/solarpanel_small, /turf/open/floor/catwalk_floor/iron_smooth, @@ -58526,6 +58407,16 @@ }, /turf/open/floor/vault, /area/station/ai_monitored/turret_protected/ai) +"qmI" = ( +/obj/machinery/flasher/directional/south{ + id = "Cell 6" + }, +/obj/machinery/light/small/broken/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "qmM" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -58616,6 +58507,29 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/lesser) +"qor" = ( +/obj/item/plate/oven_tray{ + pixel_x = -2; + pixel_y = 1 + }, +/obj/item/plate/oven_tray{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/clothing/suit/apron/chef{ + pixel_y = 11 + }, +/obj/item/book/manual/wiki/cooking_to_serve_man{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/structure/table, +/obj/item/knife/kitchen{ + pixel_x = -13; + pixel_y = 3 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "qoE" = ( /obj/machinery/digital_clock{ pixel_y = 5 @@ -58789,6 +58703,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/morgue) +"qpX" = ( +/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/brown/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/miningdock) "qqa" = ( /obj/effect/spawner/random/structure/barricade, /turf/open/floor/iron/smooth, @@ -58961,6 +58884,17 @@ /obj/effect/turf_decal/bot_red, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/education) +"qtr" = ( +/obj/machinery/computer/shuttle/mining{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/window/spawner/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/smooth_edge, +/area/station/cargo/miningdock) "qts" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/item/kirbyplants/random, @@ -59069,11 +59003,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"qui" = ( -/obj/effect/mapping_helpers/broken_floor, -/mob/living/basic/trooper/syndicate/melee, -/turf/open/floor/wood, -/area/station/maintenance/rus_gambling) "quy" = ( /obj/structure/railing{ dir = 8 @@ -59133,6 +59062,15 @@ }, /turf/open/floor/wood/parquet, /area/station/common/night_club) +"qwy" = ( +/obj/structure/chair/stool/directional/west{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "qwH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59418,6 +59356,13 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/fore) +"qAn" = ( +/obj/effect/turf_decal/weather/snow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "qAt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -59729,21 +59674,6 @@ /obj/item/robot_suit, /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/lab) -"qFa" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/box, -/obj/structure/railing{ - dir = 10 - }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "qFh" = ( /obj/structure/table/wood/fancy/royalblack, /obj/item/toy/figure/mime, @@ -59819,20 +59749,6 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible, /turf/open/floor/iron/smooth_large, /area/station/engineering/atmos) -"qGy" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/machinery/pollution_scrubber{ - pixel_x = -7; - pixel_y = 1 - }, -/obj/structure/table, -/turf/open/floor/iron/large, -/area/station/service/kitchen) "qGO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -60256,6 +60172,11 @@ /obj/effect/turf_decal/tile/dark_green/diagonal_centre, /turf/open/floor/iron/white/smooth_large, /area/station/medical/virology) +"qLu" = ( +/obj/effect/decal/cleanable/blood/old, +/mob/living/basic/trooper/syndicate/melee/sword, +/turf/open/floor/wood, +/area/station/maintenance/rus_gambling) "qLy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60450,11 +60371,6 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/station/security/brig) -"qPy" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/sorting) "qPI" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, @@ -61990,19 +61906,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/maintenance/disposal) -"rkW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/chem_master/condimaster, -/obj/structure/railing{ - dir = 6 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "rli" = ( /turf/closed/wall, /area/station/cargo/office) @@ -62165,16 +62068,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth_edge, /area/station/science/ordnance/testlab) -"rnk" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/structure/table, -/obj/machinery/light_switch/directional/north{ - pixel_x = 13 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "rnF" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -62286,38 +62179,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/hallway/primary/aft) -"rpe" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistry_shutters_south"; - name = "Pharmacy Shutters" - }, -/obj/machinery/door/window/left/directional/west, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/pharmacy) "rpg" = ( /obj/structure/transit_tube/horizontal{ dir = 1 @@ -62776,12 +62637,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"rwK" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/station/maintenance/department/science/xenobiology) "rwT" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -63096,14 +62951,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/prison) -"rCd" = ( -/obj/effect/turf_decal/stripes/box, -/obj/machinery/rnd/production/techfab/department/service, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/hallway/secondary/service) "rCi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63366,19 +63213,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/engineering/atmos/storage) -"rFd" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/landmark/start/assistant, -/obj/machinery/light_switch/directional/north{ - pixel_x = 13 - }, -/obj/structure/window/spawner/directional/west, -/obj/structure/chair/sofa/corp/left{ - color = "#DE3A3A"; - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "rFe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63470,6 +63304,12 @@ }, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) +"rGx" = ( +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "rGH" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -63658,6 +63498,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/large, /area/station/hallway/primary/central/fore) +"rJs" = ( +/obj/structure/flora/bush/fullgrass, +/obj/structure/flora/bush/ferny, +/obj/structure/window/fulltile, +/turf/open/floor/grass, +/area/station/service/kitchen) "rJK" = ( /obj/structure/flora/ocean/longseaweed, /obj/effect/spawner/liquids_spawner{ @@ -63716,6 +63562,18 @@ dir = 1 }, /area/station/hallway/primary/aft) +"rKK" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/machinery/light_switch/directional/west, +/obj/machinery/light/directional/west, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Service Hallway"; + name = "Service Fax Machine"; + pixel_y = 3 + }, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "rKM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -63809,27 +63667,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/large, /area/station/commons/fitness/recreation) -"rLL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/table, -/obj/item/serviette_pack{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - desc = "Salt. From space oceans, presumably. A staple of modern medicine."; - pixel_x = -8; - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/peppermill{ - desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; - pixel_x = -8; - pixel_y = 2 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "rLZ" = ( /obj/structure/frame/computer{ anchored = 1; @@ -63882,18 +63719,6 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/medical/treatment_center) -"rMz" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/dark/half, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/mid_joiner{ - dir = 1 - }, -/obj/machinery/door/window/survival_pod/left/directional/north, -/turf/open/floor/iron/half, -/area/station/service/hydroponics) "rMB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64130,28 +63955,6 @@ /obj/machinery/light/floor, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"rQn" = ( -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/obj/structure/table, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/right/directional/west{ - name = "Supply Storage"; - req_access = list("medical") - }, -/obj/effect/turf_decal/trimline/dark_red/filled, -/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner, -/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/storage) "rQr" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -64283,6 +64086,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port) +"rSO" = ( +/obj/structure/chair/sofa/corp/right{ + color = "#DE3A3A"; + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "rSZ" = ( /obj/item/kirbyplants/random, /obj/item/radio/intercom/directional/west, @@ -64569,13 +64380,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"rVH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "rWc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -64846,6 +64650,19 @@ }, /turf/open/floor/iron, /area/station/commons/lounge) +"sbx" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/landmark/start/assistant, +/obj/machinery/light_switch/directional/north{ + pixel_x = 13 + }, +/obj/structure/window/spawner/directional/west, +/obj/structure/chair/sofa/corp/left{ + color = "#DE3A3A"; + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "sbH" = ( /obj/effect/turf_decal/skyrat_decals/enclave/bottom/middle{ color = "#52B4E9" @@ -65417,18 +65234,6 @@ }, /turf/open/floor/iron/white, /area/station/science/explab) -"skr" = ( -/obj/structure/plasticflaps/opaque{ - name = "Research Deliveries" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - location = "Medbay" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/white/smooth_large, -/area/station/maintenance/department/crew_quarters/bar) "skC" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -65711,17 +65516,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) -"soN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "soS" = ( /obj/structure/dresser, /obj/item/toy/figure/hos{ @@ -65977,6 +65771,14 @@ /obj/effect/landmark/navigate_destination/research, /turf/open/floor/iron/white/smooth_large, /area/station/science/research) +"ssw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hydroponics/glass{ + name = "Hydroponics" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, +/turf/open/floor/iron/large, +/area/station/service/hydroponics) "ssL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -66043,6 +65845,17 @@ /obj/effect/turf_decal/siding/wood/end, /turf/open/floor/wood, /area/station/commons/dorms) +"stM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "stN" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -66053,29 +65866,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"stX" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin{ - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/rag{ - pixel_y = 4 - }, -/obj/machinery/requests_console/directional/south{ - department = "Service Hall"; - name = "Service Hall Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/item/radio/headset/headset_srv{ - pixel_x = -11; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "sud" = ( /obj/structure/table, /obj/machinery/computer/records/medical/laptop, @@ -66163,6 +65953,13 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) +"svj" = ( +/obj/structure/chair/stool/directional/north{ + pixel_y = 6 + }, +/mob/living/basic/trooper/syndicate/melee, +/turf/open/floor/wood, +/area/station/maintenance/rus_gambling) "svC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -66364,14 +66161,6 @@ }, /turf/open/floor/pod/dark, /area/station/engineering/storage/tech) -"syv" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/storage/toolbox/mechanical, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson/engine, -/turf/open/floor/iron/dark/smooth_large, -/area/station/engineering/main) "syE" = ( /turf/closed/wall, /area/station/commons/vacant_room/commissary) @@ -66610,6 +66399,38 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/security/brig) +"sCO" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistry_shutters"; + name = "Pharmacy Shutters" + }, +/obj/machinery/door/window/left/directional/south, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/pharmacy) "sCQ" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -67135,6 +66956,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/security/prison) +"sIs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "sIy" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -67221,6 +67048,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/large, /area/station/hallway/primary/fore) +"sJb" = ( +/obj/effect/turf_decal/weather/snow, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/tlv_cold_room, +/obj/structure/kitchenspike, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "sJd" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) @@ -67271,10 +67105,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/greater) -"sJE" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/command/heads_quarters/qm) "sJK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -68669,6 +68499,14 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/security/courtroom) +"tbw" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson/engine, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/main) "tbD" = ( /obj/effect/turf_decal/trimline/dark_red/arrow_ccw, /obj/structure/disposalpipe/junction{ @@ -68814,6 +68652,30 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/station/maintenance/port) +"tdO" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/paper_bin{ + pixel_y = 4 + }, +/obj/item/pen{ + pixel_y = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/window/left/directional/south{ + name = "Hydroponics Desk"; + req_access = list("hydroponics") + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "hydroponics_counter"; + name = "Hydroponics Counter Shutters" + }, +/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, +/area/station/service/hydroponics) "tdY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69004,6 +68866,12 @@ }, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) +"tge" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "tgh" = ( /obj/structure/table, /obj/item/wirecutters, @@ -69183,6 +69051,19 @@ dir = 8 }, /area/station/hallway/primary/central/aft) +"tiJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/biogenerator, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "hydroponics_counter"; + name = "Hydroponics Counter Shutters" + }, +/obj/machinery/door/firedoor, +/obj/structure/window/spawner/directional/east, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/large, +/area/station/service/hydroponics) "tiL" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -69222,6 +69103,16 @@ }, /turf/open/floor/iron/large, /area/station/commons/fitness/recreation) +"tja" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/weather/snow, +/obj/machinery/light_switch/directional/west{ + pixel_x = -24 + }, +/obj/structure/cable, +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "tjr" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/hfr_room) @@ -69336,6 +69227,17 @@ /obj/structure/transit_tube/curved/flipped, /turf/open/space/basic, /area/space/nearstation) +"tlk" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/plasticflaps/opaque{ + name = "Kitchen Deliveries" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "Kitchen" + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard/greater) "tlq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -69643,6 +69545,18 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/solars/starboard/aft) +"tpR" = ( +/obj/structure/plasticflaps/opaque{ + name = "Research Deliveries" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + location = "Medbay" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white/smooth_large, +/area/station/maintenance/department/crew_quarters/bar) "tpS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69822,6 +69736,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/greater) +"trR" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/icecream_vat, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "tsb" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -70819,15 +70742,20 @@ }, /turf/open/floor/plating, /area/station/science/ordnance/storage) -"tEE" = ( -/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/brown/filled/corner{ +"tEH" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/miningdock) +/obj/machinery/firealarm/directional/north, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + dir = 4; + location = "QM #4" + }, +/obj/effect/turf_decal/box, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/iron/smooth_edge, +/area/station/cargo/storage) "tEI" = ( /obj/structure/table, /obj/item/food/ready_donk/mac_n_cheese{ @@ -71197,16 +71125,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth_edge, /area/station/engineering/break_room) -"tKu" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/structure/table, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "tKA" = ( /obj/machinery/conveyor{ dir = 1; @@ -71443,16 +71361,6 @@ /obj/effect/turf_decal/tile/purple/diagonal_centre, /turf/open/floor/iron/white/diagonal, /area/station/science/research) -"tND" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "tNN" = ( /obj/structure/window/spawner/directional/east, /turf/open/floor/grass, @@ -71552,11 +71460,6 @@ }, /turf/open/floor/wood/large, /area/station/hallway/secondary/exit/departure_lounge) -"tPk" = ( -/obj/structure/railing/corner, -/obj/structure/sink/kitchen/directional/west, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "tPr" = ( /turf/open/floor/iron/small, /area/station/commons/dorms) @@ -71668,13 +71571,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"tRd" = ( -/obj/effect/turf_decal/weather/snow, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/tlv_cold_room, -/obj/structure/kitchenspike, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "tRr" = ( /obj/structure/bed/double, /obj/item/bedsheet/captain/double, @@ -71755,6 +71651,11 @@ dir = 4 }, /area/station/hallway/secondary/command) +"tSE" = ( +/obj/structure/flora/bush/jungle/a/style_3, +/obj/structure/window/fulltile, +/turf/open/floor/grass, +/area/station/service/kitchen) "tSH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/green{ @@ -71808,6 +71709,11 @@ "tTx" = ( /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"tTC" = ( +/obj/structure/railing/corner, +/obj/structure/sink/kitchen/directional/west, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "tTI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71872,6 +71778,15 @@ /obj/effect/mapping_helpers/mail_sorting/service/kitchen, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/fore) +"tUw" = ( +/obj/effect/turf_decal/weather/snow, +/obj/machinery/camera/directional/west{ + c_tag = "Service - Kitchen Coldroom"; + dir = 5; + name = "service camera" + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "tUB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -72017,14 +71932,6 @@ }, /turf/open/floor/iron/white/smooth_edge, /area/station/medical/medbay/central) -"tXu" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/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/freezer, -/area/station/medical/pharmacy) "tXw" = ( /obj/effect/turf_decal/tile/green/half{ dir = 4 @@ -74344,16 +74251,6 @@ }, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"uCw" = ( -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/machinery/status_display/ai/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/box, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "uCz" = ( /obj/item/plate_shard, /obj/machinery/power/apc/auto_name/directional/north, @@ -74475,6 +74372,17 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"uEb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "uEg" = ( /obj/structure/filingcabinet, /obj/item/folder/documents, @@ -74881,15 +74789,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/fore) -"uKk" = ( -/obj/machinery/newscaster/directional/east, -/obj/effect/spawner/random/bedsheet/any, -/obj/structure/bed, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) "uKp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -74899,18 +74798,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/fore) -"uKq" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sink/directional/south, -/obj/effect/turf_decal/siding/green, -/obj/machinery/firealarm/directional/north{ - pixel_x = -6 - }, -/turf/open/floor/iron/edge, -/area/station/service/hydroponics) "uKy" = ( /obj/structure/railing, /turf/open/floor/circuit, @@ -74954,6 +74841,16 @@ /obj/structure/window/fulltile, /turf/open/floor/grass, /area/station/hallway/primary/fore) +"uKZ" = ( +/obj/structure/chair/stool/directional/west{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "uLe" = ( /turf/open/floor/iron/smooth_large, /area/station/cargo/office) @@ -75096,6 +74993,29 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/wood/large, /area/station/command/heads_quarters/blueshield) +"uNs" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin{ + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 4 + }, +/obj/machinery/requests_console/directional/south{ + department = "Service Hall"; + name = "Service Hall Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/item/radio/headset/headset_srv{ + pixel_x = -11; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "uNu" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ @@ -75320,6 +75240,18 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"uPU" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/plasticflaps/opaque{ + name = "Robotics Deliveries" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 4; + location = "Robotics" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/robotics/lab) "uQf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, @@ -75499,6 +75431,13 @@ }, /turf/open/floor/vault, /area/station/ai_monitored/turret_protected/ai_upload) +"uTk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/cargo/sorting) "uTs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, @@ -76005,6 +75944,21 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"vaJ" = ( +/obj/structure/table, +/obj/item/storage/bag/plants{ + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/watering_can{ + pixel_y = 3 + }, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/diagonal, +/area/station/hallway/secondary/service) "vaL" = ( /obj/structure/table/reinforced, /obj/structure/sign/calendar/directional/west, @@ -76738,17 +76692,6 @@ dir = 4 }, /area/station/science/genetics) -"vmO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/closet/secure_closet/chemical, -/obj/item/storage/box/syringes, -/obj/item/storage/box/beakers, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/freezer, -/area/station/medical/pharmacy) "vmX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock{ @@ -77066,6 +77009,14 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) +"vrL" = ( +/obj/effect/turf_decal/stripes/box, +/obj/machinery/rnd/production/techfab/department/service, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/service) "vrU" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 @@ -77101,6 +77052,11 @@ /obj/machinery/space_heater, /turf/open/floor/iron/smooth, /area/station/maintenance/department/engine/atmos/lesser) +"vsK" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/cargo/office) "vsS" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -77186,10 +77142,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/port/fore) -"vtM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/miningoffice) "vtT" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/turf_decal/box, @@ -77211,15 +77163,6 @@ dir = 1 }, /area/station/security/lockers) -"vuc" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/icecream_vat, -/turf/open/floor/iron/diagonal, -/area/station/hallway/secondary/service) "vud" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/aft) @@ -77586,6 +77529,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"vyb" = ( +/obj/machinery/light/warm/directional/east, +/obj/machinery/status_display/ai/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/delivery/red, +/obj/machinery/restaurant_portal/restaurant, +/turf/open/floor/iron/smooth_large, +/area/station/service/cafeteria) "vyc" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -77685,15 +77638,6 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"vAg" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/machinery/door/window/survival_pod/left/directional/west{ - name = "Fitness Ring" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/fitness/recreation/entertainment) "vAk" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -78008,20 +77952,6 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) -"vEV" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Old Bar" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/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{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/rus_gambling) "vEX" = ( /obj/structure/cable, /turf/open/floor/circuit, @@ -78117,14 +78047,6 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/command/heads_quarters/nt_rep) -"vGn" = ( -/obj/effect/turf_decal/weather/snow, -/obj/machinery/firealarm/directional/north, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "vGs" = ( /obj/effect/turf_decal/arrows/white, /turf/open/floor/iron/dark/smooth_large, @@ -78142,6 +78064,11 @@ }, /turf/open/floor/carpet, /area/station/service/library) +"vGE" = ( +/obj/structure/flora/bush/jungle, +/obj/structure/window/fulltile, +/turf/open/floor/grass, +/area/station/service/hydroponics) "vGO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78327,12 +78254,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/smooth_large, /area/station/cargo/storage) -"vJv" = ( -/obj/structure/noticeboard/directional/north, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/large, -/area/station/hallway/secondary/service) "vJA" = ( /obj/structure/chair{ dir = 8 @@ -78515,11 +78436,6 @@ /obj/item/stack/sheet/iron/five, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/lesser) -"vLq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/pod, -/turf/open/floor/wood, -/area/station/maintenance/rus_gambling) "vLz" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -78566,6 +78482,11 @@ /obj/structure/flora/bush/flowers_pp, /turf/open/floor/grass, /area/station/hallway/primary/central) +"vMc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/pod, +/turf/open/floor/wood, +/area/station/maintenance/rus_gambling) "vMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -78790,10 +78711,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"vPt" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/sorting) "vPx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -78834,14 +78751,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/hallway/primary/central/fore) -"vQt" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "vQB" = ( /obj/structure/bed/maint, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -78902,10 +78811,6 @@ }, /turf/open/floor/carpet/black, /area/station/commons/dorms) -"vQX" = ( -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "vRf" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_smooth, @@ -79138,12 +79043,6 @@ }, /turf/open/floor/carpet/blue, /area/station/command/bridge) -"vUi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "vUo" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 @@ -79156,6 +79055,11 @@ dir = 4 }, /area/station/engineering/atmos) +"vUt" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/cargo/sorting) "vUB" = ( /obj/machinery/incident_display/delam, /turf/closed/wall/r_wall, @@ -79338,6 +79242,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/lesser) +"vWH" = ( +/obj/machinery/brm, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + id = "mining"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "vWI" = ( /obj/machinery/firealarm/directional/south, /obj/structure/closet/secure_closet/engineering_welding, @@ -79524,6 +79437,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/brig) +"vZc" = ( +/obj/structure/cable, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "vZk" = ( /obj/machinery/cryopod, /obj/effect/turf_decal/siding/white, @@ -79602,12 +79519,38 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) +"vZM" = ( +/obj/structure/rack{ + icon = 'icons/obj/fluff/general.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/storage/fancy/candle_box, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 + }, +/turf/open/floor/cult, +/area/station/service/library) "vZV" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/box, /obj/structure/sign/poster/official/wtf_is_co2/directional/west, /turf/open/floor/engine, /area/station/science/ordnance/storage) +"vZY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/freezer{ + critical_machine = 1; + name = "Coldroom" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/structure/fans/tiny, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "wab" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/bottle/holywater{ @@ -79775,16 +79718,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"wcc" = ( -/obj/effect/turf_decal/tile/green/diagonal_centre, -/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/diagonal, -/area/station/hallway/secondary/service) "wck" = ( /turf/closed/wall, /area/station/commons/fitness/recreation/entertainment) @@ -80083,12 +80016,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/eva, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/greater) -"whc" = ( -/obj/structure/flora/bush/fullgrass, -/obj/structure/flora/bush/ferny, -/obj/structure/window/fulltile, -/turf/open/floor/grass, -/area/station/service/kitchen) "whl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -80101,16 +80028,11 @@ /obj/structure/table/wood/fancy, /turf/open/floor/pod/dark, /area/station/service/chapel) -"whr" = ( -/obj/machinery/flasher/directional/south{ - id = "Cell 6" - }, -/obj/machinery/light/small/broken/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/security/execution/transfer) +"whq" = ( +/obj/structure/table, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "whu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -80409,16 +80331,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth_large, /area/station/cargo/storage) -"wmc" = ( -/obj/machinery/light/warm/directional/east, -/obj/machinery/status_display/ai/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/delivery/red, -/obj/machinery/restaurant_portal/restaurant, -/turf/open/floor/iron/smooth_large, -/area/station/service/cafeteria) "wme" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -80551,6 +80463,27 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/iron/smooth_large, /area/station/engineering/atmos) +"woE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/table, +/obj/item/serviette_pack{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + desc = "Salt. From space oceans, presumably. A staple of modern medicine."; + pixel_x = -8; + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/peppermill{ + desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; + pixel_x = -8; + pixel_y = 2 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "woG" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -81145,6 +81078,17 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/smooth_large, /area/station/cargo/sorting) +"wwr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/closet/secure_closet/chemical, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/freezer, +/area/station/medical/pharmacy) "wwA" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral{ @@ -82457,13 +82401,6 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/commons/vacant_room) -"wMU" = ( -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "wNh" = ( /obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 1 @@ -82479,11 +82416,6 @@ /obj/structure/window/reinforced/plasma/spawner/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/department/engine/atmos) -"wNl" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) "wNm" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -82703,6 +82635,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/vaporwave, /area/station/service/barber) +"wQi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "wQo" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/warning{ @@ -82722,6 +82662,11 @@ dir = 4 }, /area/station/service/hydroponics/garden) +"wQw" = ( +/obj/effect/turf_decal/weather/snow, +/obj/structure/kitchenspike, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "wQx" = ( /obj/effect/turf_decal/tile/red/anticorner{ dir = 8 @@ -82750,13 +82695,6 @@ /obj/effect/spawner/random/trash/hobo_squat, /turf/open/floor/iron/smooth, /area/station/maintenance/department/engine/atmos) -"wRp" = ( -/obj/effect/turf_decal/weather/snow, -/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/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "wRU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83021,6 +82959,19 @@ /obj/item/reagent_containers/spray/cleaner, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"wVQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + dir = 4; + location = "QM #1" + }, +/obj/effect/turf_decal/box, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/iron/smooth_edge, +/area/station/cargo/storage) "wWw" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/chair/office{ @@ -83130,12 +83081,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/qm) -"wZG" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/carpet, -/area/station/commons/dorms) "wZR" = ( /obj/structure/table/reinforced/rglass, /obj/machinery/keycard_auth{ @@ -83442,6 +83387,17 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/atmos) +"xgl" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Cafeteria Aft"; + name = "service camera" + }, +/obj/structure/chair/sofa/corp/left{ + color = "#DE3A3A"; + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "xgv" = ( /obj/machinery/smartfridge/chemistry/virology/preloaded, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -83962,6 +83918,25 @@ "xnw" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) +"xnP" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 4 + }, +/obj/machinery/requests_console/directional/south{ + department = "Pharmacy"; + name = "Pharmacy Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/turf_decal/bot_red, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "xnR" = ( /obj/structure/cable, /obj/item/stack/sheet/cardboard, @@ -84357,12 +84332,6 @@ /obj/machinery/camera/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/power_room) -"xrS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/weather/snow, -/mob/living/basic/goat/pete, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "xrZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -84496,6 +84465,10 @@ "xud" = ( /turf/closed/wall, /area/station/maintenance/starboard/lesser) +"xum" = ( +/obj/structure/sign/poster/contraband/mothic_rations, +/turf/closed/wall, +/area/station/service/kitchen) "xur" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/green/filled/line, @@ -85606,16 +85579,6 @@ }, /turf/open/floor/plating, /area/station/security/execution/transfer) -"xMH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/light_switch/directional/west{ - pixel_x = -24 - }, -/obj/structure/cable, -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "xMV" = ( /obj/structure/table/wood, /obj/item/folder/blue{ @@ -86226,6 +86189,16 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/medical/morgue) +"xUG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/table, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "xUK" = ( /obj/structure/disposaloutlet{ dir = 1; @@ -86248,6 +86221,17 @@ }, /turf/open/floor/iron/smooth, /area/station/security/prison/work) +"xUZ" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/mod/module/plasma_stabilizer{ + pixel_y = 16 + }, +/obj/item/inspector, +/obj/item/mod/module/thermal_regulator{ + pixel_y = 16 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/office) "xVm" = ( /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) @@ -86839,12 +86823,6 @@ dir = 8 }, /area/station/science/ordnance) -"yeb" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/maintenance/rus_gambling) "yec" = ( /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark/smooth_large, @@ -86896,6 +86874,22 @@ /obj/effect/turf_decal/bot, /turf/open/floor/circuit/red, /area/station/science/robotics/mechbay) +"yeF" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/plasticflaps/opaque{ + name = "Engineering Deliveries" + }, +/obj/machinery/door/poddoor/preopen{ + id = "engielock"; + name = "Engineering Lockdown Blast Door" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + location = "Engineering" + }, +/turf/open/floor/iron/smooth_large, +/area/station/maintenance/starboard/aft) "yeI" = ( /obj/structure/disposalpipe/junction/flip{ dir = 4 @@ -87008,30 +87002,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/fore) -"yha" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 4; - location = "Atmospherics" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/poddoor/preopen{ - id = "atmoslock"; - name = "Atmospherics Lockdown Blast Door" - }, -/obj/machinery/door/window/left/directional/east{ - name = "Atmospherics Deliveries"; - req_access = list("atmospherics") - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/plasticflaps{ - name = "Atmospherics Deliveries" - }, -/turf/open/floor/iron/smooth_large, -/area/station/engineering/atmos/storage/gas) "yhr" = ( /obj/effect/turf_decal/trimline/dark_red/arrow_cw{ dir = 1 @@ -87154,6 +87124,15 @@ dir = 1 }, /area/station/engineering/atmos) +"yjD" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/machinery/door/window/survival_pod/left/directional/west{ + name = "Fitness Ring" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/fitness/recreation/entertainment) "yjP" = ( /obj/machinery/requests_console/directional/east{ department = "Chemistry"; @@ -105386,7 +105365,7 @@ dWX dWX jMf iDa -rwK +dIL dWX woJ djc @@ -111087,7 +111066,7 @@ qCd eFq cSD lbX -paE +hbG gOn gIW iTA @@ -111117,7 +111096,7 @@ eiV sAM sAM sAM -bTv +kOq uyk tNX eDH @@ -111625,7 +111604,7 @@ odD ycv sAM uwo -rQn +cAR jiJ ail sUx @@ -112363,7 +112342,7 @@ yhC mWZ stJ nQY -iYY +fsk fAW xsT mhe @@ -113391,7 +113370,7 @@ vRi eFp stJ jCE -uKk +cdr juC ieX mhe @@ -113884,7 +113863,7 @@ bnr pRV aoa hfE -skr +tpR ozH hfE hfE @@ -114209,7 +114188,7 @@ aeg ljI ljI rIN -fnO +eSB nPN pdU xRR @@ -114420,7 +114399,7 @@ omp stJ iWk nlu -wZG +enC mWD mhe deV @@ -115447,7 +115426,7 @@ eey oEk stJ lbM -jZf +nQh sDB oVp mhe @@ -116540,7 +116519,7 @@ fXP fXP lOV cMC -yha +hcH iXT fXP fpH @@ -118765,7 +118744,7 @@ qio ycU gMy qlN -kYg +uPU qlN aMf ybV @@ -118783,7 +118762,7 @@ oUR lnS cHc waR -gof +uKZ nmm sgE pEL @@ -118823,7 +118802,7 @@ fDn aAN hns qZl -pjI +ebp fDn fDn dof @@ -119084,7 +119063,7 @@ tAr jcd vRq tRs -tXu +fLC ttG diF sMl @@ -119593,12 +119572,12 @@ tJU ykT vVO twU -vmO +wwr mJB -dMN -ffI +eil +pAK mAC -mpw +nIJ ifq vXr goS @@ -119847,15 +119826,15 @@ gLN gLN ojZ cwM -hjt +sCO hGE gQm fft sUt daB -gkH +mYW kyV -kyy +xnP ifq fvW yiT @@ -120111,7 +120090,7 @@ pKg nXW kgk fDn -rpe +njQ dPv eEq xkq @@ -120665,7 +120644,7 @@ mXO fGl iTd gLP -syv +tbw hLh pDk tUK @@ -121353,8 +121332,8 @@ qSu qSu rUj bPZ -rFd -guv +sbx +anI lxC cnA rUb @@ -121610,8 +121589,8 @@ qSu gYN dqJ bPZ -fty -vQX +jUL +ekG kLz cnA rUb @@ -121867,13 +121846,13 @@ wAA mDP cau cau -kkV -kkV -kkV -dSY -epE -iFk -iCQ +qwy +qwy +qwy +pYe +eYX +lkz +lej rUb qQh fVT @@ -122122,16 +122101,16 @@ vDG qAl jSC jSC -whc -qGy +rJs +koZ tdn -tKu -dju -fEU -fky -rLL +xUG +fxo +olm +gyK +woE gOt -wmc +vyb kPh ooa hZp @@ -122169,7 +122148,7 @@ uDE xcg xyf mEL -vAg +yjD ieO ieO tcz @@ -122378,16 +122357,16 @@ dcg pzr lcT bnA -hBD -beg -oQq -kaD +bRS +qor +hTj +pei xFd -tPk -iRY -lCf -itc -cZL +tTC +bOI +bMB +rSO +xgl fLp oie oRJ @@ -122635,18 +122614,18 @@ gzn tUt lkG wrT -oxT -nIX +coJ +tge xRG xRG -ozm -iMu +fam +fMm jSC -bJQ +esZ bPZ bPZ fLp -oTP +cIT hhJ pep udR @@ -122892,18 +122871,18 @@ hvD uKp eGd jSC -rnk +jdH ibK xFd -npO -kBr -rkW +ocK +rGx +hxA bnA -wcc -nkL -uCw -bVv -mVk +aXm +rKK +hBP +vGE +mkD fuP roz wne @@ -122943,7 +122922,7 @@ hsq ptW uDd uDd -aGa +dzq cFx uAx jfo @@ -122974,7 +122953,7 @@ vlh hpE vlh vlh -dXQ +yeF vlh sJK aVW @@ -123149,23 +123128,23 @@ hvD hUS eGd bnA -bSL +nzv puH xFd gZD -jsJ -oUa +hqe +eGy ogb -fLI -brg -nKx -gFi +dAy +nTI +olG +tiJ wQo jGl -rMz +jio hzT mqk -rMz +jio qaD fLp nhJ @@ -123406,23 +123385,23 @@ jrX hUS eGd bnA -bSL -gdc -nmv +nzv +vZc +nMk gZD -hnu -mJT +wQi +gjG cbf -fLI -rVH +dAy +eWX vOZ -eLr +ssw bmN jGl -rMz +jio hzT mqk -rMz +jio rMh fLp tzs @@ -123662,18 +123641,18 @@ wzH hRr fba cUM -dDt -bbB +xum +whq orv xFd -lFj -goA -qFa -gmo +iog +okY +dGT +tSE ctf -tND -crV -mzX +gKB +ajR +tdO slL qEr bKI @@ -123920,18 +123899,18 @@ hvD hUS eGd bnA -jlb -vUi +fva +sIs pow pow tgy jSC -nDH -nHb -rCd +iUy +uEb +vrL fLp fLp -uKq +obz jru qKf nGh @@ -124177,15 +124156,15 @@ hvD hUS eGd bnA -cGb -dHg +iIG +mFX bLx ehn -ibU +iJt jSC -aPG +nYG rvS -dNS +vaJ fLp hnJ cCw @@ -124436,21 +124415,21 @@ slJ hfU hfU hfU -pwV +vZY hfU hfU jSC -mFr +hFu ctf -stX +uNs fLp pKd wxX mqk -rMz +jio llF mqk -rMz +jio jCH fLp uuO @@ -124691,23 +124670,23 @@ hvD dSe hzx hfU -vGn -xMH -wRp -luY +eGT +tja +nRy +mVt hfU -dFF -gKM +gtJ +fZg koq -vuc +trR fLp fNL wxX mqk -rMz +jio llF mqk -rMz +jio grQ fLp rjf @@ -124948,15 +124927,15 @@ hvD hUS eGd hfU -tRd -xrS -vQt -bGF +sJb +gFG +gIO +tUw hfU -fiO -oZO -soN -fYA +eEd +bPG +stM +bdX fLp qEC iAM @@ -125205,12 +125184,12 @@ nJH hUS fyP hfU -dva -wMU -cwy -fFu +wQw +qAn +ely +jDX hfU -vJv +itf bmk dIM rMB @@ -125224,9 +125203,9 @@ xsd jzQ nQl fLp -fWO +dWg cYI -aDQ +vZM uuO rCr cCq @@ -125465,7 +125444,7 @@ iNV iNV qzy iNV -cwP +tlk iNV iNV mNF @@ -125699,7 +125678,7 @@ ngD eMN axe eEp -dgV +xUZ mjP fXZ kPY @@ -125786,7 +125765,7 @@ pnL txh fTO gjv -qPy +vUt ssQ vIF ekf @@ -125995,7 +125974,7 @@ qGT jpR jpR ykh -vEV +omI ykh ykh iNV @@ -126253,7 +126232,7 @@ ykh kwK dLi wGI -qui +fFf ykh aqi yep @@ -126300,7 +126279,7 @@ pXL uTI djy rop -vPt +lkM wsP szj aqJ @@ -126503,7 +126482,7 @@ dnq fXm oEY bUQ -kTz +fzg pzh tir cqI @@ -127022,7 +127001,7 @@ mLy qGT cqI nGX -yeb +ikN fYs wse ykh @@ -127070,7 +127049,7 @@ vXh jTg nLC qni -vPt +lkM cfZ tjR eiX @@ -127278,7 +127257,7 @@ aXl nRG uEF ykh -pZt +muX eKx fYs nzw @@ -127329,9 +127308,9 @@ hne mth rop rli -nIM +fye vuu -nIM +fye uzc qid rli @@ -127584,7 +127563,7 @@ rop gSW xGe sSn -vPt +lkM jLQ ukJ nTB @@ -127841,14 +127820,14 @@ cRU joy bey dGK -vPt +lkM rRS uLe bmS tkn gjm wJg -nIM +fye pgc gwM mGO @@ -128052,7 +128031,7 @@ tDO wkm gDf djz -vLq +vMc ykh wtQ yep @@ -128084,7 +128063,7 @@ izK mgS onP ofb -sJE +iCW onP pqh vCX @@ -128093,11 +128072,11 @@ vCX nvF pqh pqh -gSF +uTk rop rop pOV -vPt +lkM rop nUi xaD @@ -128105,7 +128084,7 @@ ltN xHW uLe kMM -nIM +fye pgc lxc gpK @@ -128306,8 +128285,8 @@ hGr pzh ykh fop -lpj -exp +qLu +bvE pBo aWR ykh @@ -128362,7 +128341,7 @@ dNV uSX wjH wMS -dAb +vsK umD jgI rKH @@ -128565,7 +128544,7 @@ ykh irO bcY mFR -gYw +svj iAj ykh wtQ @@ -128619,7 +128598,7 @@ lCU eSk leb eEz -dAb +vsK mnf tWE rbW @@ -129112,8 +129091,8 @@ xud xud xud xdZ -vtM -vtM +nyf +nyf yaj wuW sFi @@ -129130,9 +129109,9 @@ sFi sFi sFi oLo -wNl -wNl -wNl +eDx +eDx +eDx oLo sUo rzr @@ -129361,8 +129340,8 @@ xMq xMq xMq oXI -lZQ -eQJ +fNX +iNa bkF hQq qBe @@ -129386,7 +129365,7 @@ xTN git uho cHk -wNl +eDx mqJ kBs nnr @@ -129618,8 +129597,8 @@ odJ xqO xMq oXI -noQ -mvH +ihS +cvp nqU bcW njG @@ -129628,10 +129607,10 @@ xCF xXC ueJ gjq -vtM +nyf gZb wuW -fBe +wVQ udn aRn fun @@ -129647,7 +129626,7 @@ oLo nGM lGO pHC -wNl +eDx dsj idx fsd @@ -129875,20 +129854,20 @@ ttw odJ xMq oXI -kbz -hpB -lnT +iFV +lmY +krz lon -elX +cbP szk haV xXC jay dMl -vtM +nyf cKl wuW -epX +eGw udn twB jnK @@ -129904,7 +129883,7 @@ sSV lKg npI oyG -wNl +eDx hDf vNs mvz @@ -130132,9 +130111,9 @@ ttw odJ xMq oXI -iOr -kbp -lnT +oCm +vWH +krz pmM oXI pjT @@ -130145,7 +130124,7 @@ pjT pjT cYx wuW -kDK +pqc udn gqC evd @@ -130386,12 +130365,12 @@ ttw ttw ttw ttw -elX -elX -elX -kEd -iTD -tEE +cbP +cbP +cbP +qtr +cXD +qpX lFU oXI jBq @@ -130402,7 +130381,7 @@ aUA pjT xMq sFi -haI +tEH udn cLG sny @@ -130458,7 +130437,7 @@ wIM eWs kLc unI -pTr +fJV mRm mRm rgt @@ -130831,7 +130810,7 @@ joP iEP pbe uNy -whr +qmI cDj xRQ rPq @@ -130900,9 +130879,9 @@ ttw ttw ttw ttw -elX -elX -elX +cbP +cbP +cbP dpw pws ucK @@ -131089,7 +131068,7 @@ ruQ pbe hKP isy -hbs +lgZ lFM rPq rPq @@ -133423,7 +133402,7 @@ dRS dRS dRS dRS -hsx +eAO mjH jrs kOs diff --git a/_maps/map_files/biodome/biodome.dmm b/_maps/map_files/biodome/biodome.dmm index e0cbc60ad8d..fe495118973 100644 --- a/_maps/map_files/biodome/biodome.dmm +++ b/_maps/map_files/biodome/biodome.dmm @@ -24658,7 +24658,7 @@ /turf/open/floor/stone, /area/station/maintenance/department/cargo) "iHC" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "iHH" = ( diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index d545b0cc7b8..a856336cb46 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -50,9 +50,7 @@ /turf/open/floor/iron, /area/station/engineering/main) "as" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/machinery/airalarm/directional/north{ locked = 0; pixel_y = 23 diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index c8a2d32ce84..38463d849ea 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2468,18 +2468,6 @@ /obj/item/healthanalyzer/advanced, /turf/open/floor/iron, /area/station/medical/medbay) -"Va" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "Vg" = ( /obj/machinery/light/directional/south, /obj/structure/cable, @@ -2524,6 +2512,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"Wy" = ( +/obj/machinery/power/smes/full, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "WK" = ( /obj/structure/money_bot, /turf/open/floor/iron/dark, @@ -7613,7 +7611,7 @@ aa ad af ak -Va +Wy aG aV bg diff --git a/_maps/map_files/generic/CentCom_skyrat_z2.dmm b/_maps/map_files/generic/CentCom_skyrat_z2.dmm index 30f99667b44..8174c40573b 100644 --- a/_maps/map_files/generic/CentCom_skyrat_z2.dmm +++ b/_maps/map_files/generic/CentCom_skyrat_z2.dmm @@ -34,13 +34,13 @@ "aaY" = ( /obj/structure/fans/tiny/invisible, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "abK" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "abZ" = ( /obj/machinery/vending/clothing, /obj/effect/turf_decal/bot, @@ -85,6 +85,13 @@ /obj/structure/closet/crate/bin, /turf/open/floor/iron, /area/centcom/interlink) +"aek" = ( +/obj/machinery/telecomms/relay/preset/station, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "aer" = ( /obj/structure/table/wood, /obj/structure/window/spawner/directional/south, @@ -120,7 +127,7 @@ icon_state = "fullgrass_3" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aeW" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/blue{ @@ -170,7 +177,7 @@ "afx" = ( /obj/machinery/light/directional/east, /turf/open/floor/plating/vox, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "afy" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 @@ -185,14 +192,14 @@ "afA" = ( /obj/structure/flora/grass/green, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "afB" = ( /obj/structure/flora/bush/ferny{ pixel_x = -3; pixel_y = 3 }, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "afD" = ( /obj/structure/closet/crate, /obj/item/storage/box/drinkingglasses, @@ -215,7 +222,7 @@ }, /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aga" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -231,7 +238,7 @@ pixel_y = 3 }, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "agk" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -255,18 +262,18 @@ "agy" = ( /obj/structure/flora/bush/leafy, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "agA" = ( /obj/structure/chair/stool/directional/south{ dir = 8 }, /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "agF" = ( /obj/structure/flora/bush/grassy/style_4, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "agG" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -302,26 +309,26 @@ dir = 4 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "agV" = ( /obj/structure/closet/wardrobe/grey, /obj/item/clothing/under/dress/tango, -/obj/item/clothing/under/dress/redeveninggown, +/obj/item/clothing/under/dress/eveninggown, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "ahk" = ( /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ahs" = ( /obj/structure/flora/bush/leavy/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ahA" = ( /obj/structure/flora/bush/flowers_br, /obj/structure/flora/bush/fullgrass, /obj/structure/flora/bush/pointy, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ahG" = ( /obj/structure/rack, /obj/item/clothing/mask/breath, @@ -341,7 +348,7 @@ name = "Jim Norton's Quebecois Coffee table" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ahK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -363,11 +370,11 @@ "ahQ" = ( /obj/structure/flora/bush/sparsegrass, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ahU" = ( /obj/structure/flora/bush/large, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ahY" = ( /obj/structure/chair/sofa/corp/right{ dir = 4 @@ -396,16 +403,16 @@ /turf/open/indestructible/cobble/side{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aiA" = ( /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aiD" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 8 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aiK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -463,7 +470,7 @@ /area/centcom/interlink) "ajj" = ( /turf/closed/indestructible/rock, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ajx" = ( /obj/structure/curtain{ alpha = 240; @@ -477,7 +484,7 @@ icon_state = "basalt3" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ajR" = ( /obj/structure/flora/rock/pile{ icon_state = "basalt3" @@ -515,13 +522,13 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "akp" = ( /obj/structure/flora/bush/flowers_pp, /obj/structure/flora/bush/flowers_br, /obj/structure/flora/bush/lavendergrass, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aks" = ( /obj/structure/chair/sofa/corp/left{ dir = 1 @@ -562,23 +569,23 @@ /turf/open/indestructible/cobble/side{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "alb" = ( /obj/structure/flora/grass/jungle/a/style_3, /obj/structure/flora/bush/flowers_br, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ald" = ( /turf/open/indestructible/cobble/corner{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "alf" = ( /obj/structure/flora/bush/lavendergrass, /obj/structure/flora/bush/flowers_br, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "alk" = ( /obj/effect/spawner/random/bedsheet/double, /obj/structure/bed/double, @@ -610,7 +617,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "alx" = ( /obj/machinery/door/airlock/centcom{ name = "Interlink" @@ -623,7 +630,7 @@ "alC" = ( /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/pool, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "alD" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -642,7 +649,7 @@ "alF" = ( /obj/structure/flora/rock/pile, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "alH" = ( /obj/structure/fans/tiny/invisible, /turf/open/misc/grass/planet, @@ -730,24 +737,24 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "amk" = ( /obj/structure/flora/tree/jungle/small/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "amu" = ( /obj/structure/stone_tile/block{ dir = 8 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "amv" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/centcom/interlink) "amx" = ( /turf/closed/wall/mineral/stone, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "amD" = ( /obj/structure/sink/directional/east, /obj/machinery/button/door{ @@ -775,12 +782,12 @@ "amT" = ( /obj/structure/flora/bush/flowers_br, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "amU" = ( /obj/structure/wall_torch/spawns_lit/directional/north, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ana" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/blue{ @@ -815,7 +822,7 @@ "anr" = ( /obj/item/toy/beach_ball, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "anv" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -851,14 +858,14 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "anC" = ( /obj/structure/flora/rock/pile/jungle/large{ pixel_x = 0; pixel_y = 0 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "anD" = ( /obj/structure/flora/grass/jungle/a/style_3, /obj/structure/flora/bush/flowers_pp, @@ -866,7 +873,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "anL" = ( /obj/item/storage/box/donkpockets{ pixel_x = 7 @@ -888,7 +895,7 @@ /obj/structure/railing, /obj/structure/fans/tiny/invisible, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "anZ" = ( /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/smooth, @@ -923,7 +930,7 @@ dir = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aoO" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -1070,23 +1077,23 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "apX" = ( /turf/open/misc/beach/sand{ dir = 6 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aqe" = ( /obj/structure/table/wood, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aqf" = ( /turf/closed/indestructible/wood, /area/centcom/holding/cafe) "aqo" = ( /obj/machinery/light/directional/east, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aqw" = ( /obj/machinery/button/door{ id = "CCD2"; @@ -1114,11 +1121,11 @@ "aqP" = ( /obj/structure/spacevine, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aqQ" = ( /obj/structure/flora/bush/reed, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aqR" = ( /obj/structure/chair/comfy/black, /turf/open/indestructible/hotelwood, @@ -1126,7 +1133,7 @@ "aqV" = ( /obj/structure/flora/grass/jungle/a/style_5, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aqX" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, @@ -1146,7 +1153,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "arh" = ( /turf/open/floor/iron/dark, /area/centcom/holding/cafe) @@ -1188,7 +1195,7 @@ icon_state = "lavendergrass_3" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "asp" = ( /obj/machinery/hydroponics/constructable, /turf/open/misc/dirt/planet, @@ -1199,12 +1206,12 @@ /area/centcom/interlink) "asw" = ( /turf/closed/indestructible/wood, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "asz" = ( /obj/structure/table/wood/fancy/blue, /obj/machinery/light/directional/north, /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "asC" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -1216,7 +1223,7 @@ "asF" = ( /obj/structure/flora/bush/flowers_pp/style_3, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "asP" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/centcom/interlink) @@ -1259,7 +1266,7 @@ icon_state = "lavendergrass_2" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "asY" = ( /obj/structure/kitchenspike, /turf/open/floor/iron/showroomfloor, @@ -1277,7 +1284,7 @@ "atp" = ( /obj/structure/alien/resin/wall/immovable, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "atq" = ( /obj/machinery/oven/range, /turf/open/indestructible/hoteltile{ @@ -1319,7 +1326,7 @@ icon_state = "brflowers_2" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "auf" = ( /obj/structure/flora/biolumi/flower{ light_color = "#D9FF00"; @@ -1328,7 +1335,7 @@ random_light = null }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "auj" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -1367,15 +1374,15 @@ time_between_uses = 600 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "auH" = ( /obj/machinery/light/directional/south, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "auM" = ( /obj/structure/fans/tiny/invisible, /turf/open/indestructible/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "auP" = ( /obj/effect/turf_decal/siding{ color = "#2e2e2e"; @@ -1392,14 +1399,14 @@ }, /obj/item/flashlight/flare/candle/infinite, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "auR" = ( /obj/structure/flora/biolumi/flower{ light_color = "#D9FF00"; random_light = null }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "auU" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/light/directional/south, @@ -1410,7 +1417,7 @@ icon_state = "snowgrass2gb" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "avl" = ( /obj/structure/rack/wooden, /obj/item/reagent_containers/cup/glass/trophy{ @@ -1422,7 +1429,7 @@ pixel_x = -2 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "avn" = ( /obj/structure/closet/secure_closet/freezer/meat/all_access, /obj/item/food/meat/slab/chicken, @@ -1442,7 +1449,7 @@ "avt" = ( /obj/structure/flora/grass/jungle/a/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "avu" = ( /obj/vehicle/ridden/janicart/upgraded, /obj/item/key/janitor, @@ -1459,13 +1466,13 @@ "awk" = ( /obj/structure/fans/tiny/invisible, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "awm" = ( /obj/machinery/light/directional/east, /turf/open/indestructible/cobble/side{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "awn" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe/ghost_cafe, /turf/open/indestructible/hoteltile{ @@ -1479,7 +1486,7 @@ "awt" = ( /obj/structure/wall_torch/spawns_lit/directional/south, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "awv" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1536,7 +1543,7 @@ opacity = 1 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "awW" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -1571,7 +1578,7 @@ /turf/open/misc/beach/sand{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "axo" = ( /obj/structure/chair/sofa/corner/brown{ dir = 4 @@ -1581,7 +1588,7 @@ "axw" = ( /obj/structure/flora/bush/leavy/style_3, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "axz" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/blue{ @@ -1600,7 +1607,7 @@ "axA" = ( /obj/structure/chair/sofa/bench/left, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "axB" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -1613,7 +1620,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "axD" = ( /obj/structure/curtain, /obj/machinery/light/floor{ @@ -1631,12 +1638,12 @@ pixel_x = -3 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "axJ" = ( /turf/open/misc/beach/sand{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "axL" = ( /obj/effect/turf_decal/tile/blue, /turf/open/indestructible/hoteltile{ @@ -1678,13 +1685,13 @@ /turf/open/misc/beach/coast/corner{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ayd" = ( /obj/structure/flora/grass/green{ icon_state = "snowgrass3gb" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aye" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -1730,7 +1737,7 @@ icon_state = "fullgrass_3" }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ayt" = ( /obj/structure/chair/sofa/bench/left, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -1749,7 +1756,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ayx" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -1771,10 +1778,10 @@ "ayA" = ( /obj/structure/fans/tiny/invisible, /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ayI" = ( /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ayQ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -1803,7 +1810,7 @@ "azk" = ( /obj/structure/flora/tree/jungle/small, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "azl" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -1832,10 +1839,10 @@ "azs" = ( /obj/structure/flora/bush/fullgrass, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "azB" = ( /turf/open/floor/plating/vox, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "azC" = ( /obj/structure/sign/chalkboard_menu, /turf/closed/indestructible/steel, @@ -1861,14 +1868,14 @@ "azY" = ( /obj/structure/closet/crate/wooden/storage_barrel, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAc" = ( /obj/structure/flora/bush/flowers_pp, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAd" = ( /turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAe" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4 @@ -1878,7 +1885,7 @@ "aAh" = ( /obj/machinery/light/directional/west, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAq" = ( /obj/structure/rack/wooden, /obj/item/perfume/amber{ @@ -1938,7 +1945,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAu" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -1958,7 +1965,7 @@ "aAz" = ( /obj/structure/flora/bush/jungle/a/style_3, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAC" = ( /obj/structure/fluff/tram_rail/end{ desc = "This probably won't stop a titanium tram from hitting the wall, but it's the thought that counts."; @@ -1989,7 +1996,7 @@ /obj/machinery/primitive_stove, /obj/structure/wall_torch/spawns_lit/directional/west, /turf/open/floor/stone, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAL" = ( /obj/item/reagent_containers/cup/soda_cans/thirteenloko{ pixel_x = -10; @@ -2032,7 +2039,7 @@ /turf/open/misc/beach/sand{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aAX" = ( /obj/structure/mirror{ pixel_y = 32 @@ -2054,7 +2061,7 @@ dir = 8 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aBd" = ( /turf/open/indestructible/hoteltile{ icon_state = "cafeteria" @@ -2064,7 +2071,7 @@ /turf/open/indestructible/cobble/side{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aBk" = ( /obj/machinery/vending/wardrobe/curator_wardrobe/ghost_cafe, /turf/open/indestructible/hotelwood, @@ -2093,13 +2100,13 @@ }, /obj/structure/flora/bush/sparsegrass, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aBr" = ( /obj/structure/flora/bush/fullgrass, /obj/structure/flora/bush/flowers_yw, /obj/structure/flora/bush/sunny, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aBs" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -2171,7 +2178,7 @@ icon_state = "fullgrass_2" }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aCo" = ( /obj/machinery/light/directional/east, /turf/open/indestructible/hotelwood, @@ -2189,14 +2196,14 @@ /turf/open/misc/beach/coast/corner{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aCw" = ( /obj/structure/chair/stool/directional/south{ dir = 1; name = "Jim Norton's Quebecois Coffee stool" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aCF" = ( /obj/machinery/button/curtain{ id = "ghostcafecabin3curtain"; @@ -2214,12 +2221,12 @@ "aCM" = ( /obj/structure/flora/bush/flowers_pp/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aCQ" = ( /obj/structure/flora/bush/fullgrass, /obj/structure/railing/wooden_fencing, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aCR" = ( /obj/item/hilbertshotel/ghostdojo, /turf/open/indestructible/hotelwood, @@ -2227,18 +2234,18 @@ "aCS" = ( /obj/machinery/light/directional/west, /turf/open/floor/plating/vox, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "aCU" = ( /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aCX" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aCY" = ( /obj/machinery/vending/wardrobe/viro_wardrobe/ghost_cafe, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -2249,7 +2256,7 @@ "aDa" = ( /obj/structure/flora/bush/sparsegrass, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aDg" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2265,7 +2272,7 @@ /obj/structure/flora/rock/pile/jungle/style_3, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aDr" = ( /obj/machinery/chem_master/condimaster, /obj/machinery/light/directional/north, @@ -2287,7 +2294,7 @@ dir = 10 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aDC" = ( /turf/closed/indestructible/opshuttle, /area/centcom/holding/cafe) @@ -2299,7 +2306,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aDY" = ( /obj/machinery/processor, /obj/machinery/light/directional/west, @@ -2311,7 +2318,7 @@ "aEa" = ( /obj/structure/bed/pod, /turf/open/indestructible/cobble/corner, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aEf" = ( /obj/structure/water_source/puddle{ layer = 2.89; @@ -2319,7 +2326,7 @@ pixel_y = 9 }, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aEm" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -2354,16 +2361,16 @@ icon_state = "fullgrass_3" }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aEQ" = ( /obj/structure/flora/bush/leafy, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aEX" = ( /obj/structure/wall_torch/spawns_lit/directional/south, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aFe" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -2383,7 +2390,7 @@ /turf/open/indestructible/cobble/side{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aFy" = ( /obj/structure/mineral_door/wood, /turf/open/indestructible/hotelwood, @@ -2391,13 +2398,13 @@ "aFB" = ( /obj/structure/flora/bush/ferny, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aFI" = ( /obj/structure/flora/tree/jungle/small{ icon_state = "tree6" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aFK" = ( /obj/structure/table/optable, /obj/effect/turf_decal/tile/purple/half/contrasted, @@ -2412,20 +2419,20 @@ /area/centcom/holding/cafe) "aFP" = ( /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aFV" = ( /obj/structure/flora/bush/fullgrass{ icon_state = "fullgrass_2" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aGb" = ( /turf/closed/indestructible/riveted/boss, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aGg" = ( /obj/structure/flora/bush/large/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aGk" = ( /obj/machinery/bookbinder, /turf/open/floor/wood, @@ -2455,19 +2462,19 @@ /turf/open/misc/beach/sand{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aGB" = ( /obj/structure/flora/bush/reed, /turf/open/misc/beach/coast{ dir = 5 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aGC" = ( /obj/structure/fans/tiny/invisible, /turf/open/indestructible/hoteltile{ icon_state = "stairs-old" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aGL" = ( /turf/open/indestructible/hoteltile{ icon_state = "darkfull" @@ -2481,7 +2488,7 @@ nightshift_light_power = 10 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aGT" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -2558,10 +2565,10 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aHl" = ( /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aHC" = ( /obj/machinery/vending/wardrobe/chef_wardrobe/ghost_cafe, /turf/open/floor/iron/showroomfloor, @@ -2571,13 +2578,13 @@ /turf/open/misc/beach/coast/corner{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aHJ" = ( /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 4 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aHK" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -2602,14 +2609,14 @@ /obj/machinery/door/airlock/vault, /obj/structure/fans/tiny/invisible, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aHY" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/recharge_floor, /area/centcom/holding/cafe) "aHZ" = ( /turf/open/misc/beach/coast, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aIg" = ( /obj/structure/window/reinforced/plasma/plastitanium, /turf/open/indestructible/hoteltile{ @@ -2632,7 +2639,7 @@ /area/centcom/holding/cafe) "aIr" = ( /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aIt" = ( /obj/structure/table/wood, /obj/item/gun/energy/floragun, @@ -2676,13 +2683,13 @@ /turf/open/indestructible/cobble/side{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aIE" = ( /obj/structure/flora/bush/fullgrass{ icon_state = "brflowers_1" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aII" = ( /obj/structure/chair/comfy/barber_chair{ dir = 8 @@ -2705,18 +2712,18 @@ icon_state = "lavendergrass_4" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aJh" = ( /turf/open/misc/beach/sand{ dir = 5 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aJp" = ( /obj/machinery/light/directional/north, /turf/open/indestructible/cobble/side{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aJA" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -2756,12 +2763,12 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aJT" = ( /turf/open/indestructible/cobble/side{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aJX" = ( /obj/structure/railing{ dir = 4 @@ -2777,11 +2784,11 @@ /area/centcom/interlink) "aKc" = ( /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aKu" = ( /obj/structure/flora/bush/jungle/b, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aKA" = ( /obj/structure/chair/sofa/corp/right, /turf/open/floor/carpet/purple, @@ -2802,11 +2809,11 @@ /turf/open/misc/beach/coast/corner{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aKQ" = ( /obj/structure/chair/wood, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aKU" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 8 @@ -2828,12 +2835,12 @@ "aLu" = ( /obj/structure/fake_stairs/wood/directional/north, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aLD" = ( /turf/open/misc/beach/coast{ dir = 5 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aLF" = ( /obj/effect/spawner/liquids_spawner, /obj/structure/chair/sofa/bench/corner, @@ -2842,7 +2849,7 @@ "aLH" = ( /obj/structure/flora/bush/fullgrass, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aLO" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -2859,10 +2866,10 @@ /turf/open/misc/beach/sand{ dir = 10 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aLW" = ( /turf/open/floor/light/colour_cycle/dancefloor_a, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aLY" = ( /obj/machinery/gibber, /obj/machinery/light/directional/north, @@ -2900,11 +2907,11 @@ /obj/structure/flora/grass/jungle/b, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aMJ" = ( /obj/structure/flora/tree/jungle, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aMM" = ( /obj/machinery/computer/security, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -2913,7 +2920,7 @@ /area/centcom/interlink) "aMQ" = ( /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aMR" = ( /obj/machinery/power/shuttle_engine/large{ dir = 4 @@ -2932,7 +2939,7 @@ icon_state = "snowgrass1bb" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNd" = ( /obj/structure/table/wood, /obj/item/stack/sheet/bone{ @@ -2941,7 +2948,7 @@ }, /obj/structure/wall_torch/spawns_lit/directional/south, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNe" = ( /obj/machinery/chem_master/condimaster, /turf/open/floor/wood, @@ -2958,7 +2965,7 @@ dir = 1 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNi" = ( /obj/item/reagent_containers/cup/glass/bottle/gin{ pixel_x = -7; @@ -3004,7 +3011,7 @@ icon_state = "bush3" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNp" = ( /obj/structure/stone_tile/block, /obj/structure/stone_tile/block{ @@ -3012,7 +3019,7 @@ }, /obj/item/flashlight/flare/candle/infinite, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNq" = ( /obj/machinery/button/door{ id = "ghostcafecabinb"; @@ -3041,7 +3048,7 @@ /obj/structure/flora/bush/leavy/style_3, /obj/structure/flora/tree/jungle, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNF" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/sand, @@ -3049,14 +3056,14 @@ dir = 1 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNK" = ( /obj/structure/flora/bush/flowers_yw{ pixel_x = 3; pixel_y = 3 }, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNT" = ( /obj/structure/fans/tiny/invisible, /obj/machinery/door/airlock/wood{ @@ -3068,7 +3075,7 @@ "aNU" = ( /obj/structure/closet/crate/wooden/toy, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aNY" = ( /turf/open/floor/iron/showroomfloor, /area/centcom/holding/cafe) @@ -3083,7 +3090,7 @@ "aOc" = ( /obj/machinery/light/directional/south, /turf/open/floor/plating/vox, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "aOi" = ( /obj/machinery/seed_extractor, /turf/open/indestructible/hoteltile{ @@ -3152,7 +3159,7 @@ "aOz" = ( /obj/effect/light_emitter/interlink, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aOG" = ( /obj/structure/closet, /obj/item/stack/sheet/mineral/wood/fifty, @@ -3181,7 +3188,7 @@ /obj/item/clothing/glasses/welding, /obj/item/clothing/glasses/welding, /turf/open/floor/plating/vox, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "aOI" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -3201,7 +3208,7 @@ /turf/open/misc/beach/sand{ dir = 9 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aOR" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/iron/stairs, @@ -3215,7 +3222,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aOY" = ( /obj/structure/curtain, /obj/machinery/light/floor{ @@ -3225,7 +3232,7 @@ nightshift_light_power = 10 }, /turf/open/indestructible/bathroom, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "aOZ" = ( /obj/machinery/light/directional/north, /obj/machinery/libraryscanner, @@ -3240,7 +3247,7 @@ /area/centcom/interlink) "aPf" = ( /turf/closed/mineral/earth_like, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aPo" = ( /obj/structure/sink/directional/west, /turf/open/indestructible/hotelwood, @@ -3257,7 +3264,7 @@ dir = 8 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aPG" = ( /obj/structure/sink/kitchen/directional/east, /turf/open/indestructible/hoteltile{ @@ -3285,6 +3292,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, /area/centcom/interlink/dorm_rooms) "aPZ" = ( @@ -3310,12 +3319,12 @@ /area/centcom/holding/cafe) "aQf" = ( /turf/open/water/beach, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aQw" = ( /obj/structure/flora/grass/jungle/b/style_random, /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aQx" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 10 @@ -3351,7 +3360,7 @@ dir = 4 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aQK" = ( /obj/structure/closet, /obj/item/stack/sheet/mineral/wood/fifty, @@ -3384,7 +3393,7 @@ "aQM" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/plating/vox, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "aQQ" = ( /obj/structure/fireplace{ dir = 4 @@ -3420,11 +3429,11 @@ "aRd" = ( /obj/item/kirbyplants/random, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aRe" = ( /obj/structure/flora/bush/fullgrass, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aRi" = ( /obj/structure/railing{ dir = 8 @@ -3432,7 +3441,7 @@ /turf/open/indestructible/cobble/corner{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aRk" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, @@ -3502,13 +3511,13 @@ pixel_y = -3 }, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aRL" = ( /obj/structure/flora/bush/reed, /turf/open/misc/beach/coast{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aRM" = ( /obj/structure/chair/sofa/corp/left{ dir = 8 @@ -3524,12 +3533,12 @@ random_light = null }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aRS" = ( /turf/open/misc/beach/coast/corner{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aSg" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -3584,17 +3593,17 @@ /area/centcom/holding/cafe) "aSq" = ( /turf/open/misc/beach/coast/corner, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aSs" = ( /obj/structure/flora/tree/jungle/small{ icon_state = "tree4" }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aSt" = ( /obj/effect/turf_decal/sand, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aSy" = ( /obj/structure/bookcase/random, /turf/open/indestructible/hotelwood, @@ -3602,7 +3611,7 @@ "aSC" = ( /obj/structure/chair/stool/directional/south, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aSP" = ( /turf/closed/indestructible/rock, /area/centcom/holding/cafe) @@ -3614,7 +3623,7 @@ dir = 4 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aSY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3626,7 +3635,7 @@ dir = 5 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTb" = ( /turf/closed/indestructible/fakeglass, /area/centcom/holding/cafe) @@ -3659,15 +3668,15 @@ dir = 4 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTu" = ( /obj/structure/flora/bush/grassy/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTv" = ( /obj/structure/closet/crate/bin, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTB" = ( /obj/machinery/light/floor{ alpha = 0; @@ -3680,7 +3689,7 @@ dir = 8 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTD" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -3692,7 +3701,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTE" = ( /obj/effect/turf_decal/caution, /obj/effect/turf_decal/siding/white, @@ -3701,7 +3710,7 @@ "aTG" = ( /obj/structure/flora/grass/jungle/b/style_5, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTR" = ( /obj/structure/spacevine{ name = "thick vines"; @@ -3709,7 +3718,7 @@ }, /obj/structure/alien/weeds, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aTS" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron, @@ -3726,7 +3735,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aUd" = ( /obj/machinery/button/door/directional/west{ id = "ghostcafecell1"; @@ -3757,7 +3766,7 @@ /area/centcom/interlink) "aUm" = ( /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aUo" = ( /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) @@ -3765,7 +3774,7 @@ /turf/open/misc/beach/sand{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aUu" = ( /obj/structure/chair/sofa/corp/left{ dir = 4 @@ -3777,7 +3786,7 @@ dir = 1 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aUz" = ( /obj/machinery/light/directional/south, /turf/open/indestructible/hotelwood, @@ -3792,7 +3801,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aUK" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -3809,7 +3818,7 @@ /turf/open/indestructible/cobble/side{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aUT" = ( /obj/structure/closet/crate/freezer, /turf/open/indestructible/hoteltile{ @@ -3843,7 +3852,7 @@ "aVk" = ( /obj/machinery/light/directional/north, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aVp" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -3864,20 +3873,20 @@ /turf/open/misc/beach/coast{ dir = 9 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aVA" = ( /obj/structure/flora/bush/generic, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aVC" = ( /obj/machinery/shower/directional/west, /turf/open/indestructible/bathroom, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "aVI" = ( /obj/structure/fake_stairs/directional/east, /obj/structure/railing, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aWb" = ( /turf/open/floor/iron/white, /area/centcom/interlink) @@ -3888,7 +3897,7 @@ "aWg" = ( /mob/living/basic/crab, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aWh" = ( /obj/structure/rack, /obj/item/tank/internals/nitrogen/belt/full, @@ -3905,11 +3914,11 @@ /area/centcom/holding/cafe) "aWi" = ( /turf/open/floor/holofloor/beach/water, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aWj" = ( /obj/structure/flora/bush/grassy/style_3, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aWm" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -3922,7 +3931,7 @@ opacity = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aWp" = ( /obj/effect/turf_decal/siding{ color = "#2e2e2e"; @@ -3949,7 +3958,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aWL" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -3982,7 +3991,7 @@ dir = 4 }, /turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aWT" = ( /obj/structure/easel, /obj/item/canvas/twentythree_twentythree, @@ -4016,13 +4025,13 @@ }, /obj/structure/stone_tile/surrounding_tile, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aXA" = ( /obj/structure/flora/grass/green{ icon_state = "snowgrass3gb" }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aXF" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -4052,7 +4061,7 @@ "aXW" = ( /obj/structure/flora/bush/generic, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aYc" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -4070,7 +4079,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aYj" = ( /obj/machinery/vending/wardrobe/chap_wardrobe/unholy/ghost_cafe, /turf/open/indestructible/hotelwood, @@ -4102,7 +4111,7 @@ /turf/open/indestructible/cobble/side{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aYK" = ( /obj/structure/chair/sofa/bench/left, /obj/effect/landmark/latejoin, @@ -4133,7 +4142,7 @@ }, /obj/structure/fans/tiny/invisible, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafevox) +/area/centcom/holding/cafe/vox) "aYX" = ( /obj/machinery/duct, /obj/machinery/dryer{ @@ -4149,7 +4158,7 @@ "aZs" = ( /obj/structure/flora/rock/pile/jungle/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aZz" = ( /obj/structure/table/wood, /obj/item/stack/sheet/mineral/wood/fifty, @@ -4216,7 +4225,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "aZW" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/fullupgrade{ @@ -4237,14 +4246,14 @@ dir = 6 }, /turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bbW" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/wardrobe/gene_wardrobe/ghost_cafe, /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bcb" = ( /turf/open/floor/carpet/cyan, /area/centcom/holding/cafe) @@ -4257,7 +4266,7 @@ dir = 4 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bdI" = ( /obj/structure/railing, /turf/open/floor/iron/dark, @@ -4296,6 +4305,8 @@ id_tag = "room7"; name = "Cabin" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/centcom/interlink) "biB" = ( @@ -4309,7 +4320,7 @@ pixel_x = -1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "biF" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -4324,7 +4335,7 @@ dir = 4 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bjh" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -4350,7 +4361,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bll" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -4358,7 +4369,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "blq" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -4370,7 +4381,7 @@ /obj/structure/railing, /obj/structure/fans/tiny/invisible, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "blI" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -4396,7 +4407,7 @@ }, /obj/structure/wall_torch/spawns_lit/directional/west, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bnU" = ( /obj/structure/flora/tree/stump, /obj/effect/light_emitter/interlink, @@ -4411,7 +4422,7 @@ specialfunctions = 4 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "bod" = ( /obj/effect/turf_decal/trimline/dark_green/filled/warning{ dir = 6 @@ -4434,7 +4445,7 @@ "bqT" = ( /obj/structure/wall_torch/spawns_lit/directional/north, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "brL" = ( /obj/effect/turf_decal/trimline/dark_red/filled/corner{ dir = 8 @@ -4590,6 +4601,8 @@ }, /obj/effect/mapping_helpers/airlock/cutaiwire, /obj/effect/mapping_helpers/airlock/access/any/cent_com/rep_or_captain, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/centcom/interlink) "bEI" = ( @@ -4608,7 +4621,7 @@ /turf/open/misc/beach/coast{ dir = 10 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bFy" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 1 @@ -4619,7 +4632,7 @@ /obj/effect/spawner/liquids_spawner, /obj/machinery/light/floor, /turf/open/floor/iron/pool, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bFN" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -4632,7 +4645,7 @@ /obj/item/clothing/head/costume/xenos, /obj/structure/alien/weeds, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bGH" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw{ dir = 8 @@ -4651,7 +4664,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bIf" = ( /obj/machinery/biogenerator, /turf/closed/indestructible/wood, @@ -4695,7 +4708,7 @@ dir = 4 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bNh" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -4714,6 +4727,8 @@ id_tag = "room5"; name = "Cabin" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/centcom/interlink) "bNV" = ( @@ -4725,7 +4740,7 @@ dir = 8 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bOl" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 4 @@ -4756,7 +4771,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bQR" = ( /obj/structure/chair/sofa/corp{ dir = 4 @@ -4781,13 +4796,13 @@ }, /obj/structure/fans/tiny/invisible, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bTg" = ( /obj/machinery/light/directional/south, /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bTH" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -4824,6 +4839,9 @@ "bUO" = ( /obj/structure/bed/double, /obj/effect/spawner/random/bedsheet/double, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "bUS" = ( @@ -4846,7 +4864,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "bVn" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -4935,7 +4953,7 @@ "caY" = ( /obj/structure/railing/wooden_fencing, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cby" = ( /obj/structure/railing{ invisibility = 100; @@ -4943,7 +4961,7 @@ }, /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/pool, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cbF" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -4956,6 +4974,7 @@ pixel_x = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "cdj" = ( @@ -4972,14 +4991,14 @@ /obj/structure/alien/weeds, /obj/effect/decal/remains/xeno/larva, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cfu" = ( /turf/open/floor/grass, /area/centcom/interlink) "cgU" = ( /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "che" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -4992,9 +5011,11 @@ /obj/structure/table/wood, /obj/item/fishing_rod, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "chZ" = ( /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, /area/centcom/interlink/dorm_rooms) "ckg" = ( @@ -5025,7 +5046,7 @@ /obj/structure/alien/weeds, /obj/structure/alien/weeds/node, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "clF" = ( /obj/structure/chair/sofa/corp/left{ dir = 8 @@ -5053,7 +5074,15 @@ }, /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) +"cnd" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/centcom/interlink) "cnz" = ( /obj/structure/railing{ invisibility = 100 @@ -5063,7 +5092,7 @@ dir = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cqv" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -5091,7 +5120,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cqC" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -5130,7 +5159,7 @@ /turf/open/floor/pod/light{ density = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "csC" = ( /obj/structure/chair/sofa/corp/left{ dir = 4 @@ -5237,7 +5266,7 @@ /obj/structure/spacevine, /obj/structure/alien/weeds, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cCZ" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/sofa/right/brown, @@ -5256,19 +5285,19 @@ pixel_y = 2 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cEt" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 10 }, /obj/machinery/smartfridge/drying_rack, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cEy" = ( /obj/structure/spacevine, /obj/structure/fans/tiny/invisible, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cFK" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -5313,7 +5342,7 @@ /area/centcom/interlink) "cLv" = ( /turf/open/floor/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cLD" = ( /obj/structure/table, /obj/item/storage/medkit/regular{ @@ -5350,7 +5379,7 @@ "cMM" = ( /obj/structure/stone_tile/slab/cracked, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cNa" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/misc/asteroid, @@ -5381,7 +5410,7 @@ "cPo" = ( /obj/structure/table/abductor, /turf/open/floor/plating/abductor, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cQq" = ( /obj/effect/turf_decal/weather/dirt, /obj/structure/hedge, @@ -5396,7 +5425,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cRs" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -5428,7 +5457,7 @@ dir = 8 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cWF" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp{ @@ -5460,7 +5489,7 @@ dir = 1 }, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "cYb" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/siding/dark{ @@ -5490,14 +5519,14 @@ "cZJ" = ( /obj/structure/flora/tree/palm, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dai" = ( /obj/item/flashlight/flare/torch{ pixel_x = -4; pixel_y = -10 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dau" = ( /obj/machinery/door/airlock/wood/glass{ desc = "A strange small bar. It's actually remarkably close to Space Station 13."; @@ -5512,7 +5541,7 @@ dir = 4 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dbn" = ( /obj/structure/mirror{ pixel_y = 32 @@ -5548,7 +5577,7 @@ dir = 8 }, /turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "deD" = ( /obj/machinery/status_display/shuttle{ pixel_y = -32; @@ -5566,7 +5595,7 @@ "dgl" = ( /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/stairs, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dgo" = ( /obj/item/trench_tool, /obj/item/tank/internals/emergency_oxygen/double, @@ -5582,6 +5611,8 @@ /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) "dgV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "dhi" = ( @@ -5593,7 +5624,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "djn" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -5700,6 +5731,8 @@ /obj/effect/turf_decal/trimline/dark_green/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/centcom/interlink) "dyI" = ( @@ -5723,7 +5756,7 @@ /obj/effect/turf_decal/sand, /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dAC" = ( /obj/effect/turf_decal/siding/white{ dir = 6 @@ -5802,7 +5835,7 @@ "dIw" = ( /obj/structure/flora/bush/large, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dII" = ( /turf/open/floor/iron/stairs/medium{ dir = 1 @@ -5829,17 +5862,17 @@ "dMl" = ( /obj/structure/fermenting_barrel, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dNn" = ( /obj/structure/chair/wood{ dir = 4 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dNB" = ( /obj/structure/fake_stairs/directional, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dOC" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, @@ -5847,7 +5880,7 @@ /obj/item/clothing/mask/whistle, /obj/item/binoculars, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dOM" = ( /turf/open/floor/iron/white, /area/centcom/holding/cafe) @@ -5973,7 +6006,7 @@ }, /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dVb" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/light_emitter/interlink, @@ -5987,6 +6020,8 @@ /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, /turf/open/floor/iron, /area/centcom/interlink) "dVo" = ( @@ -6004,7 +6039,7 @@ "dXe" = ( /obj/structure/flora/grass/jungle/b/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "dXJ" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -6020,13 +6055,13 @@ "dYa" = ( /obj/structure/stone_tile/surrounding_tile/cracked, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eaJ" = ( /obj/structure/fence{ dir = 4 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eaT" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/wood, @@ -6056,7 +6091,7 @@ }, /obj/structure/stone_tile/surrounding_tile, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "egr" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 8 @@ -6081,7 +6116,7 @@ pixel_y = 7 }, /turf/open/floor/carpet/red, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "ejQ" = ( /obj/machinery/door/airlock/wood{ id_tag = "ghostcafecabin3"; @@ -6092,13 +6127,13 @@ /area/centcom/holding/cafe) "ekp" = ( /turf/closed/indestructible/steel, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eks" = ( /obj/item/toy/beach_ball, /turf/open/misc/beach/coast/corner{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ekE" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -6158,11 +6193,11 @@ dir = 8 }, /turf/open/indestructible/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "epr" = ( /obj/structure/chair/sofa/left/brown, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "eqe" = ( /obj/machinery/door/airlock{ name = "Locker Room" @@ -6185,12 +6220,12 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "esx" = ( /obj/effect/decal/cleanable/xenoblood, /obj/structure/alien/weeds, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "esD" = ( /obj/structure/table, /turf/open/floor/iron/cafeteria, @@ -6203,6 +6238,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "evd" = ( @@ -6299,14 +6336,14 @@ /area/centcom/holding/cafe) "eEg" = ( /turf/open/floor/carpet/blue, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eFC" = ( /obj/structure/railing/wooden_fencing, /obj/effect/turf_decal/weather/snow/corner{ dir = 8 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eFV" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw, /turf/open/floor/iron/dark, @@ -6403,7 +6440,7 @@ dir = 6 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eNI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -6422,7 +6459,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eOx" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -6471,7 +6508,7 @@ dir = 8 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "eVe" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -6513,7 +6550,7 @@ /obj/structure/alien/weeds, /obj/effect/decal/remains/human, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "faI" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 4 @@ -6560,7 +6597,7 @@ pixel_y = 6 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fbM" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -6574,7 +6611,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fcW" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -6606,7 +6643,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "feR" = ( /obj/machinery/light/small/directional/west, /turf/open/indestructible/hotelwood, @@ -6640,7 +6677,7 @@ "fjN" = ( /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fmq" = ( /obj/structure/frame/computer, /turf/open/floor/plating, @@ -6690,7 +6727,7 @@ }, /obj/structure/closet/crate/wooden/storage_barrel, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fpe" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -6702,6 +6739,12 @@ "fqg" = ( /turf/open/floor/iron/smooth, /area/centcom/interlink) +"frI" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ + volume_rate = 200 + }, +/turf/open/floor/plating/airless, +/area/centcom/interlink) "fsl" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -6725,7 +6768,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fwc" = ( /obj/effect/turf_decal/sand, /obj/structure/chair/stool/bar/directional/west{ @@ -6734,7 +6777,7 @@ /obj/effect/turf_decal/stripes/asteroid/line, /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fwr" = ( /obj/machinery/light/floor{ alpha = 0; @@ -6743,11 +6786,11 @@ nightshift_light_power = 10 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fwu" = ( /obj/structure/water_source/puddle, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fxE" = ( /obj/structure/chair/sofa/bench/right{ greyscale_colors = "#AA8A61" @@ -6761,7 +6804,7 @@ name = "organ storage" }, /turf/open/floor/plating/abductor, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fzV" = ( /obj/structure/rack, /obj/item/pushbroom, @@ -6790,7 +6833,7 @@ dir = 4 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fEg" = ( /obj/structure/toilet{ dir = 8 @@ -6806,7 +6849,7 @@ /area/centcom/holding/cafe) "fFr" = ( /turf/open/indestructible/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fFy" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -6830,7 +6873,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fGC" = ( /obj/structure/chair/sofa/bench, /obj/effect/landmark/latejoin, @@ -6853,6 +6896,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/centcom/interlink) +"fHR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/centcom/interlink/dorm_rooms) "fHV" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/effect/light_emitter/interlink, @@ -6909,7 +6956,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fOr" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -6923,7 +6970,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fOv" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Public Garden" @@ -6948,11 +6995,11 @@ name = "Bait" }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fRe" = ( /obj/structure/fluff/beach_umbrella/science, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fSs" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -6997,7 +7044,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fTz" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 6 @@ -7010,7 +7057,7 @@ opacity = 1 }, /turf/open/water/beach, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "fTY" = ( /obj/structure/chair/sofa/corp/right{ dir = 1 @@ -7071,7 +7118,7 @@ /turf/open/indestructible/cobble/side{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gdN" = ( /obj/structure/chair/stool/directional/south{ dir = 8 @@ -7083,10 +7130,10 @@ dir = 1 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "geG" = ( /turf/open/floor/iron/stairs, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gfW" = ( /obj/structure/sign/directions/security{ dir = 8; @@ -7104,7 +7151,7 @@ dir = 8 }, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ggx" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/stripes/line{ @@ -7133,7 +7180,7 @@ /turf/open/misc/beach/coast{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gjK" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/indestructible{ @@ -7145,12 +7192,12 @@ "gko" = ( /obj/structure/flora/grass/jungle/a/style_4, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gmD" = ( /obj/structure/stone_tile/slab, /obj/structure/stone_tile/slab/cracked, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gmE" = ( /obj/machinery/vending/wardrobe/medi_wardrobe/ghost_cafe, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -7161,7 +7208,7 @@ "gmT" = ( /obj/structure/fake_stairs/directional/east, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gmU" = ( /obj/structure/chair/sofa/bench/corner{ dir = 1 @@ -7196,7 +7243,7 @@ dir = 1 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gpk" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -7215,7 +7262,7 @@ dir = 1 }, /turf/open/indestructible/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "grr" = ( /obj/structure/table, /obj/structure/towel_bin, @@ -7242,7 +7289,7 @@ dir = 8 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gsc" = ( /obj/structure/chair/sofa/corp/corner{ dir = 8 @@ -7261,7 +7308,7 @@ dir = 4 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gsO" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -7270,7 +7317,7 @@ "gsX" = ( /obj/structure/flora/rock/pile/jungle/large/style_2, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gtO" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -7279,7 +7326,7 @@ dir = 1 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gtZ" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -7298,6 +7345,7 @@ pixel_y = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "guS" = ( @@ -7318,7 +7366,7 @@ /area/centcom/holding/cafe) "gxX" = ( /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gyK" = ( /obj/machinery/status_display/shuttle{ pixel_y = 32; @@ -7334,7 +7382,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gzT" = ( /obj/structure/fake_stairs/wood/directional/north, /obj/structure/railing/wooden_fencing{ @@ -7425,7 +7473,7 @@ /area/centcom/interlink) "gMw" = ( /turf/closed/wall/mineral/sandstone, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "gMy" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -7436,7 +7484,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gOS" = ( /obj/item/flashlight/flare/candle/infinite{ pixel_x = 19; @@ -7451,7 +7499,7 @@ /turf/open/indestructible/cobble/side{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gPD" = ( /obj/structure/rack/shelf{ icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; @@ -7459,7 +7507,7 @@ }, /obj/item/reagent_containers/cup/bucket/wooden, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gPN" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/effect/turf_decal/siding/wood, @@ -7486,11 +7534,11 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gSx" = ( /obj/machinery/light/directional/south, /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gSB" = ( /obj/structure/rack/wooden, /obj/item/cultivator/rake, @@ -7500,7 +7548,7 @@ /obj/structure/wall_torch/spawns_lit/directional/east, /obj/item/reagent_containers/cup/bucket/wooden, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gSD" = ( /turf/open/floor/iron, /area/centcom/holding/cafe) @@ -7514,7 +7562,7 @@ /turf/open/misc/beach/coast{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gUZ" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, @@ -7523,7 +7571,7 @@ /obj/machinery/light/directional/east, /obj/structure/flora/bush/jungle/b, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gWT" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck/cas/black, @@ -7542,7 +7590,7 @@ "gZK" = ( /obj/structure/table/wood, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "gZM" = ( /obj/structure/rack/wooden, /obj/item/reagent_containers/cup/mortar{ @@ -7558,7 +7606,7 @@ pixel_x = -4 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hap" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/fullupgrade{ @@ -7571,10 +7619,10 @@ /obj/structure/bed/maint, /obj/item/bedsheet/black, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "haE" = ( /turf/open/floor/carpet/red, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "haM" = ( /obj/structure/dresser{ pixel_y = 7 @@ -7595,7 +7643,7 @@ }, /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hcR" = ( /turf/open/floor/wood/parquet, /area/centcom/interlink) @@ -7633,7 +7681,7 @@ dir = 8 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "heB" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -7646,7 +7694,7 @@ /obj/structure/fans/tiny/invisible, /obj/structure/bonfire/prelit, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hgd" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/siding/wood{ @@ -7670,7 +7718,7 @@ }, /obj/item/flashlight/flare/candle/infinite, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hjy" = ( /obj/item/kirbyplants/organic/plant22, /obj/effect/turf_decal/trimline/dark_green/line, @@ -7692,6 +7740,7 @@ dir = 8 }, /obj/structure/window/reinforced/tinted/spawner/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "hlh" = ( @@ -7706,6 +7755,13 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"hmV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/tank/air{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "hnz" = ( /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/freezer, @@ -7715,7 +7771,7 @@ dir = 4 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hoS" = ( /obj/structure/sign/directions/arrival{ dir = 1 @@ -7772,11 +7828,11 @@ dir = 1 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hpP" = ( /mob/living/basic/butterfly, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hpR" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/light_emitter/interlink, @@ -7794,7 +7850,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hqp" = ( /obj/machinery/door/airlock/bathroom{ id_tag = "CCToilet"; @@ -7843,14 +7899,14 @@ dir = 4 }, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hyt" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/wardrobe/viro_wardrobe/ghost_cafe, /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hyO" = ( /obj/effect/turf_decal/box/corners, /turf/open/floor/iron/dark/textured_large, @@ -7889,7 +7945,7 @@ /obj/effect/turf_decal/sand, /obj/machinery/light/directional/west, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hBk" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -7900,7 +7956,7 @@ "hBy" = ( /obj/structure/flora/tree/jungle/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hEK" = ( /obj/structure/railing/corner{ dir = 8 @@ -7952,7 +8008,7 @@ /obj/machinery/primitive_stove, /obj/structure/stone_tile/slab, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hKI" = ( /obj/structure/table, /obj/item/folder/red, @@ -7983,7 +8039,7 @@ dir = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hNU" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 4 @@ -8006,7 +8062,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hPq" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -8020,7 +8076,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hPH" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8028,7 +8084,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hPK" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -8047,7 +8103,7 @@ pixel_y = 2 }, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hRJ" = ( /obj/structure/railing{ invisibility = 100; @@ -8057,7 +8113,7 @@ dir = 4 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hSC" = ( /obj/structure/table/wood, /obj/item/folder{ @@ -8136,7 +8192,7 @@ /obj/effect/turf_decal/weather/dirt, /obj/structure/chair/wood, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hXd" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -8157,7 +8213,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hYn" = ( /obj/structure/stone_tile/center, /obj/structure/stone_tile/surrounding_tile{ @@ -8171,7 +8227,7 @@ dir = 4 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "hYA" = ( /turf/open/floor/iron/dark/corner{ dir = 8 @@ -8223,7 +8279,7 @@ /turf/open/misc/beach/coast{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ifE" = ( /obj/machinery/vending/cigarette/syndicate, /obj/effect/turf_decal/bot_white, @@ -8255,7 +8311,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "igp" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -8269,7 +8325,7 @@ "iho" = ( /obj/structure/flora/grass/jungle/b/style_4, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iiV" = ( /obj/item/trench_tool, /obj/item/tank/internals/emergency_oxygen/double, @@ -8301,7 +8357,7 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iki" = ( /turf/open/floor/carpet, /area/centcom/holding/cafe) @@ -8326,7 +8382,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ikn" = ( /obj/structure/chair/stool/directional/south{ dir = 8 @@ -8346,11 +8402,24 @@ /obj/machinery/computer/libraryconsole, /turf/open/floor/iron, /area/centcom/interlink) +"ikM" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/centcom/interlink) "ilq" = ( /obj/machinery/computer/records/security, /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/centcom/interlink) +"ilw" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/centcom/interlink/dorm_rooms) "inr" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 @@ -8425,11 +8494,11 @@ /obj/structure/flora/grass/jungle/a/style_2, /obj/structure/flora/bush/flowers_yw, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iqY" = ( /obj/structure/flora/bush/sparsegrass, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "irn" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -8445,7 +8514,7 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ism" = ( /obj/structure/filingcabinet/employment, /obj/machinery/button/door/directional/south{ @@ -8462,7 +8531,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iuK" = ( /obj/effect/light_emitter/interlink, /turf/open/floor/carpet/red, @@ -8471,7 +8540,7 @@ /obj/effect/turf_decal/sand, /obj/machinery/vending/cigarette/beach, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iwK" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; @@ -8506,12 +8575,12 @@ "izJ" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "izT" = ( /obj/structure/fans/tiny/invisible, /obj/structure/railing/corner, /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iBc" = ( /turf/open/floor/iron/smooth_edge{ dir = 1 @@ -8534,7 +8603,7 @@ name = "Beach Cabin" }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "iDL" = ( /obj/effect/turf_decal/siding{ color = "#2e2e2e" @@ -8560,7 +8629,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iFY" = ( /obj/effect/turf_decal/weather/dirt{ dir = 5 @@ -8574,12 +8643,12 @@ /area/centcom/interlink) "iGS" = ( /turf/closed/indestructible/alien, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iHv" = ( /obj/structure/fans/tiny/invisible, /obj/structure/flora/grass/jungle/a/style_4, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iIb" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 5 @@ -8589,7 +8658,7 @@ "iJK" = ( /obj/structure/flora/bush/jungle/a, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iJX" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -8621,7 +8690,7 @@ /obj/machinery/door/window/left/directional/east, /obj/structure/sink/directional/east, /turf/open/floor/plating/abductor2, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iOt" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -8630,7 +8699,7 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iOR" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/deployable_barricade/guardrail, @@ -8676,7 +8745,7 @@ dir = 4 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iUc" = ( /obj/structure/table/glass/plasmaglass, /obj/item/paper_bin{ @@ -8768,7 +8837,7 @@ }, /obj/structure/closet/abductor, /turf/open/floor/plating/abductor, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "iZc" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/fancy/cigarettes/cigars/havana{ @@ -8819,7 +8888,7 @@ dir = 8 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jdx" = ( /obj/structure/flora/grass/jungle, /obj/structure/flora/bush/flowers_yw, @@ -8827,7 +8896,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jeI" = ( /obj/machinery/cryopod/quiet{ dir = 1 @@ -8848,7 +8917,7 @@ dir = 4 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jgg" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron, @@ -8871,7 +8940,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jgT" = ( /obj/effect/light_emitter/interlink, /obj/structure/fence/corner, @@ -8895,11 +8964,11 @@ dir = 1 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jiQ" = ( /obj/structure/reagent_dispensers/watertank/high, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jjQ" = ( /obj/structure/chair/office{ dir = 8 @@ -8911,7 +8980,7 @@ /obj/item/toy/beach_ball, /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/pool, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jnu" = ( /obj/machinery/button/door/directional/east{ id = "interlink_hall2"; @@ -9009,7 +9078,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jtf" = ( /obj/effect/turf_decal/weather/dirt{ dir = 10 @@ -9053,7 +9122,7 @@ "jxl" = ( /obj/structure/wall_torch/spawns_lit/directional/north, /turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jxw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/window/indestructible{ @@ -9081,7 +9150,7 @@ opacity = 1 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jAH" = ( /obj/machinery/light/directional/north, /turf/open/floor/wood, @@ -9092,12 +9161,12 @@ pixel_x = -26 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "jDf" = ( /obj/structure/table/bronze, /obj/structure/stone_tile/block/burnt, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jEk" = ( /obj/structure/fence{ dir = 4 @@ -9108,12 +9177,12 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jFn" = ( /obj/structure/alien/weeds, /obj/structure/alien/egg/burst, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jGh" = ( /obj/machinery/light/very_dim/directional/west, /turf/open/floor/iron/dark, @@ -9154,7 +9223,7 @@ /area/centcom/interlink) "jIj" = ( /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "jKj" = ( /obj/structure/bed/pod, /turf/open/floor/iron, @@ -9178,7 +9247,7 @@ random_light = null }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jOc" = ( /obj/structure/stone_tile/block/cracked{ dir = 1 @@ -9188,7 +9257,7 @@ }, /obj/structure/stone_tile/surrounding_tile/cracked, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jQJ" = ( /obj/machinery/button/door{ id = "ghostcafecabin3"; @@ -9275,7 +9344,7 @@ dir = 6 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "jZb" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -9304,7 +9373,7 @@ }, /obj/machinery/light/small/directional/east, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kdo" = ( /obj/structure/hedge/opaque, /obj/structure/curtain/cloth/fancy/mechanical{ @@ -9330,6 +9399,7 @@ /area/centcom/interlink) "kdU" = ( /obj/machinery/shower/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "keK" = ( @@ -9362,7 +9432,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "khz" = ( /obj/structure/chair/sofa/bench/right, /turf/open/floor/iron/cafeteria, @@ -9433,7 +9503,7 @@ "knL" = ( /obj/structure/chair/sofa/right/brown, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "koF" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/effect/turf_decal/siding/wood, @@ -9446,7 +9516,7 @@ /obj/structure/closet/cardboard, /mob/living/basic/bot/medbot{ faction = list("Syndicate"); - maints_access_required = list(150); + req_one_access = list(150); name = "Kahn"; radio_channel = "Syndicate" }, @@ -9507,12 +9577,12 @@ /obj/machinery/light/directional/south, /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/pool/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kuV" = ( /obj/structure/flora/bush/leavy/style_2, /obj/structure/flora/tree/jungle/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kvj" = ( /turf/open/floor/plating, /area/cruiser_dock) @@ -9534,7 +9604,7 @@ }, /obj/structure/barricade/wooden, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kwp" = ( /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/trimline/dark_green/line{ @@ -9575,7 +9645,7 @@ id = "ghostcaferesort2curtain" }, /turf/closed/indestructible/fakeglass, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "kDO" = ( /obj/structure/chair/stool/bar/directional/west, /turf/open/floor/iron/cafeteria, @@ -9584,7 +9654,7 @@ /obj/structure/spacevine, /obj/structure/fans/tiny/invisible, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kGL" = ( /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/smooth_large, @@ -9617,11 +9687,11 @@ }, /obj/machinery/vending/wardrobe/sec_wardrobe/red, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kIR" = ( /obj/structure/bed/abductor, /turf/open/floor/plating/abductor, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kJq" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/tile/neutral{ @@ -9637,7 +9707,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kJu" = ( /obj/structure/chair/sofa/corp/corner{ dir = 4 @@ -9661,7 +9731,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kJz" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -9669,7 +9739,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kJL" = ( /obj/item/flashlight/flare/candle/infinite{ pixel_x = 9; @@ -9707,11 +9777,11 @@ dir = 4 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kLD" = ( /obj/machinery/light/directional/south, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kLW" = ( /obj/structure/railing{ invisibility = 100; @@ -9721,7 +9791,7 @@ dir = 8 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kLZ" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt, @@ -9732,19 +9802,19 @@ /turf/open/misc/beach/sand{ desc = "There's been a recent disturbance right here, it's evident something must've been buried; but it's pretty deep. A faint, yet deep humming sound emanates from the spot as you get closer." }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kMw" = ( /obj/structure/chair/stool/directional/south{ dir = 4 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kMV" = ( /obj/structure/flora/biolumi/flower{ random_light = null }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kNd" = ( /obj/machinery/door/airlock/service{ name = "Interlink Bar" @@ -9777,6 +9847,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"kPb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/centcom/interlink) "kPf" = ( /obj/structure/chair/sofa/bench/corner{ dir = 4 @@ -9787,11 +9861,11 @@ /obj/effect/turf_decal/sand, /obj/machinery/light/directional/south, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kPK" = ( /obj/structure/railing/wooden_fencing, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kQs" = ( /obj/machinery/door/airlock/public/glass{ name = "Interlink Locker Room" @@ -9825,7 +9899,7 @@ "kWr" = ( /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kWA" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 8 @@ -9851,7 +9925,7 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kZB" = ( /obj/machinery/light/directional/west, /obj/structure/table, @@ -9887,7 +9961,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "kZQ" = ( /obj/machinery/modular_computer/preset/command{ dir = 1 @@ -9917,7 +9991,7 @@ dir = 8 }, /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lba" = ( /obj/machinery/computer/records/medical{ dir = 8 @@ -9933,7 +10007,7 @@ specialfunctions = 4 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "lcR" = ( /turf/closed/indestructible/riveted, /area/centcom/interlink/dorm_rooms) @@ -9955,7 +10029,7 @@ "lgh" = ( /obj/item/stack/sheet/mineral/wood/fifty, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lgm" = ( /obj/structure/rack/shelf{ icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; @@ -9988,13 +10062,13 @@ }, /obj/structure/wall_torch/spawns_lit/directional/west, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lgt" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 9 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lgF" = ( /obj/machinery/door/airlock/centcom{ name = "Blueshield's Office" @@ -10021,7 +10095,7 @@ "lhF" = ( /obj/structure/stone_tile/block, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lhK" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -10071,7 +10145,7 @@ "lkn" = ( /obj/structure/spacevine, /turf/open/water/beach, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lkC" = ( /obj/structure/chair/sofa/bench/left{ dir = 1; @@ -10110,7 +10184,7 @@ "lro" = ( /obj/structure/marker_beacon/burgundy, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lrp" = ( /obj/effect/turf_decal/trimline/dark_green/filled/corner, /turf/open/floor/iron, @@ -10144,7 +10218,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lvk" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, @@ -10160,7 +10234,7 @@ dir = 8 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lwt" = ( /obj/structure/chair/wood{ dir = 4 @@ -10169,7 +10243,7 @@ /area/centcom/holding/cafe) "lwv" = ( /turf/closed/indestructible/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lxl" = ( /obj/structure/chair/sofa/bench/right, /obj/effect/landmark/latejoin, @@ -10221,7 +10295,7 @@ dir = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lCi" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north{ @@ -10234,13 +10308,13 @@ /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/under/shorts/red, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lDo" = ( /obj/structure/chair/wood{ dir = 8 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lDy" = ( /obj/effect/turf_decal/siding{ color = "#2e2e2e"; @@ -10301,7 +10375,7 @@ dir = 1 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "lJi" = ( /obj/structure/deployable_barricade/guardrail, /turf/open/floor/iron/smooth_edge{ @@ -10315,7 +10389,7 @@ name = "Beach Cabin" }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "lLN" = ( /obj/structure/mirror/directional/east, /obj/structure/sink/directional/west, @@ -10326,14 +10400,14 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lMY" = ( /obj/structure/stone_tile/slab/cracked, /obj/structure/statue/bone/rib{ dir = 1 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lNi" = ( /obj/machinery/vending/wardrobe/chem_wardrobe/ghost_cafe, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -10368,7 +10442,7 @@ dir = 8 }, /turf/open/floor/carpet/red, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "lRF" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/left/directional/south{ @@ -10458,7 +10532,7 @@ pixel_y = 10 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lXk" = ( /obj/item/flashlight/lantern, /turf/open/misc/dirt/planet, @@ -10466,7 +10540,7 @@ "lXl" = ( /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "lXo" = ( /obj/machinery/oven/range, /turf/open/floor/wood, @@ -10485,7 +10559,7 @@ dir = 8 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mac" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -10529,14 +10603,14 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mfu" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/weather/dirt{ dir = 9 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mfN" = ( /obj/structure/table{ name = "Jim Norton's Quebecois Coffee table" @@ -10556,7 +10630,7 @@ "mgr" = ( /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mgY" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, @@ -10587,6 +10661,8 @@ /obj/effect/turf_decal/trimline/dark_green/filled/warning{ 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/centcom/interlink) "mjK" = ( @@ -10634,7 +10710,7 @@ /obj/structure/fans/tiny/invisible, /obj/structure/flora/bush/jungle/b, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "moG" = ( /obj/item/kirbyplants/organic/plant22, /turf/open/floor/iron/dark, @@ -10660,6 +10736,7 @@ pixel_y = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "mtv" = ( @@ -10718,7 +10795,7 @@ /obj/structure/flora/ash/cacti, /obj/structure/wall_torch/spawns_lit/directional/north, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mxd" = ( /obj/structure/railing/corner{ dir = 4 @@ -10739,7 +10816,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mxj" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/glass/shaker{ @@ -10772,7 +10849,7 @@ dir = 4 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mzf" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /obj/effect/turf_decal/siding/white, @@ -10803,7 +10880,7 @@ "mzR" = ( /obj/structure/fluff/beach_umbrella/cap, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mBj" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -10818,7 +10895,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mBM" = ( /obj/structure/table/rolling, /obj/item/hhmirror{ @@ -10857,14 +10934,14 @@ /obj/item/circular_saw/ashwalker, /obj/item/cautery/ashwalker, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mCg" = ( /obj/structure/railing/wooden_fencing, /obj/structure/railing/wooden_fencing{ dir = 8 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mCr" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -10907,7 +10984,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mEW" = ( /obj/effect/turf_decal/sand, /obj/structure/chair/stool/bar/directional/west{ @@ -10915,7 +10992,7 @@ }, /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mGn" = ( /obj/structure/table{ name = "Jim Norton's Quebecois Coffee table" @@ -10929,7 +11006,7 @@ pixel_y = 7 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mHF" = ( /obj/structure/sink/directional/east, /turf/open/floor/iron, @@ -10956,7 +11033,7 @@ pixel_y = 7 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mJB" = ( /obj/structure/fireplace, /turf/open/floor/stone, @@ -10966,7 +11043,7 @@ dir = 8 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mLa" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -10987,7 +11064,7 @@ dir = 5 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mMu" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -11002,7 +11079,7 @@ /turf/open/misc/beach/coast{ dir = 9 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mOW" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, @@ -11016,14 +11093,14 @@ dir = 1 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mQa" = ( /obj/effect/turf_decal/bot, /obj/machinery/skill_station, /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mRb" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -11049,7 +11126,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mSs" = ( /turf/open/floor/iron/freezer, /area/centcom/interlink) @@ -11061,14 +11138,14 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mSQ" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/weather/dirt{ dir = 5 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mTS" = ( /obj/machinery/stasis{ dir = 4 @@ -11087,6 +11164,7 @@ pixel_x = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "mVc" = ( @@ -11115,7 +11193,7 @@ }, /obj/structure/fake_stairs/directional/south, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mZp" = ( /obj/structure/flora/tree/jungle/small/style_random, /obj/structure/flora/grass/jungle, @@ -11123,7 +11201,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "mZu" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/bot, @@ -11134,7 +11212,7 @@ name = "Shelly" }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nbv" = ( /obj/structure/chair/sofa/corp/corner{ dir = 4 @@ -11153,7 +11231,7 @@ "ncP" = ( /obj/structure/flora/ash/cacti, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ndc" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -11189,7 +11267,7 @@ dir = 8 }, /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nii" = ( /obj/structure/fireplace, /turf/open/indestructible/hotelwood, @@ -11225,7 +11303,7 @@ pixel_x = -5 }, /turf/open/floor/stone, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "niJ" = ( /obj/structure/closet/crate/bin, /turf/open/floor/iron/dark, @@ -11236,7 +11314,7 @@ pixel_x = 2 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "njQ" = ( /obj/effect/turf_decal/bot, /obj/structure/showcase/machinery/implanter{ @@ -11247,7 +11325,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nkZ" = ( /obj/machinery/light/directional/west, /obj/structure/closet, @@ -11271,20 +11349,25 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nlB" = ( /obj/structure/chair/stool{ name = "Jim Norton's Quebecois Coffee stool" }, /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nlM" = ( /obj/structure/curtain, /obj/machinery/shower/directional/north, /obj/structure/window/reinforced/tinted/spawner/directional/east, /turf/open/floor/plating/abductor2, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) +"nmH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/centcom/interlink) "nng" = ( /obj/structure/table/wood, /obj/item/food/muffin/berry{ @@ -11308,7 +11391,7 @@ pixel_y = 5 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "noq" = ( /turf/open/floor/wood, /area/centcom/holding/cafe) @@ -11346,7 +11429,7 @@ dir = 8 }, /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "npe" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood/corner{ @@ -11358,7 +11441,7 @@ "npr" = ( /obj/structure/fake_stairs/wood/directional/east, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nps" = ( /obj/structure/easel, /obj/item/canvas/twentythree_twentythree, @@ -11402,6 +11485,8 @@ /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, /area/centcom/interlink/dorm_rooms) "ntJ" = ( @@ -11427,7 +11512,7 @@ "nzn" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nzO" = ( /obj/machinery/door/poddoor/shutters/window/preopen, /turf/open/floor/iron, @@ -11444,11 +11529,12 @@ /obj/structure/bed/double, /obj/effect/spawner/random/bedsheet/double, /obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "nDE" = ( /turf/open/floor/carpet/purple, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nER" = ( /turf/open/floor/iron/stairs/left{ dir = 4 @@ -11506,7 +11592,7 @@ "nJO" = ( /obj/structure/railing/wooden_fencing, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nJQ" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -11534,7 +11620,7 @@ "nLr" = ( /obj/structure/fake_stairs/wood/directional/east, /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nMw" = ( /obj/structure/fence{ dir = 4 @@ -11542,7 +11628,7 @@ /obj/effect/turf_decal/caution/stand_clear, /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nNe" = ( /obj/structure/table, /obj/item/pizzabox/pineapple, @@ -11602,7 +11688,7 @@ }, /obj/item/reagent_containers/cup/glass/mug/coco, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nQm" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -11636,10 +11722,16 @@ }, /turf/open/floor/iron/grimy, /area/centcom/interlink) +"nUB" = ( +/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/centcom/interlink/dorm_rooms) "nUS" = ( /obj/structure/flora/grass/jungle/a/style_2, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nWn" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -11660,11 +11752,11 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nXu" = ( /obj/structure/stone_tile/slab, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nXw" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/weather/dirt{ @@ -11674,7 +11766,7 @@ dir = 1 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "nYp" = ( /obj/structure/chair/sofa/corp/right, /obj/effect/turf_decal/stripes/line{ @@ -11691,6 +11783,8 @@ /area/centcom/interlink) "nYF" = ( /obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "nZP" = ( @@ -11725,7 +11819,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "obP" = ( /obj/effect/turf_decal/box/corners{ dir = 1 @@ -11749,17 +11843,17 @@ /obj/structure/sign/departments/restroom/directional/south, /obj/machinery/light/directional/south, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ofw" = ( /obj/structure/closet/crate/wooden/storage_barrel, /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ofJ" = ( /turf/open/misc/beach/coast{ dir = 6 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ogq" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -11781,7 +11875,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ojv" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -11856,7 +11950,7 @@ /obj/structure/flora/grass/jungle/a/style_4, /obj/structure/chair/sofa/bench/right, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "orh" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 4 @@ -11893,6 +11987,7 @@ pixel_x = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "ouF" = ( @@ -11913,7 +12008,7 @@ /obj/structure/fans/tiny/invisible, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ovH" = ( /obj/machinery/vending/wardrobe/syndie_wardrobe/ghost_cafe{ default_price = 0; @@ -11921,7 +12016,7 @@ fair_market_price = 0 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "owJ" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /obj/machinery/button/door{ @@ -11962,7 +12057,7 @@ layer = 2.9 }, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oyi" = ( /obj/item/reagent_containers/cup/soda_cans/dr_gibb{ pixel_x = -8; @@ -12015,7 +12110,7 @@ dir = 4 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ozR" = ( /obj/structure/table/reinforced/rglass, /obj/structure/curtain/cloth, @@ -12046,7 +12141,7 @@ /obj/structure/flora/grass/jungle/a/style_4, /obj/structure/fans/tiny/invisible, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oBa" = ( /obj/structure/stone_tile/center, /obj/structure/stone_tile/surrounding_tile/cracked, @@ -12060,7 +12155,7 @@ dir = 1 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oBf" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -12091,6 +12186,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"oDW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/indestructible/riveted, +/area/centcom/interlink) "oEm" = ( /obj/structure/table, /obj/item/reagent_containers/cup/rag{ @@ -12114,13 +12213,29 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) +"oHW" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + 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/centcom/interlink) "oIK" = ( /obj/effect/turf_decal/trimline/dark_green/filled/warning{ dir = 8 }, /turf/open/floor/iron, /area/centcom/interlink) +"oJg" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/centcom/interlink) "oJo" = ( /obj/effect/turf_decal/siding/white{ dir = 9 @@ -12174,7 +12289,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oPL" = ( /obj/structure/chair/stool/directional/south{ dir = 4 @@ -12222,7 +12337,7 @@ pixel_y = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oTx" = ( /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, @@ -12235,7 +12350,7 @@ dir = 1 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oVT" = ( /obj/structure/flora/grass/jungle, /obj/structure/flora/bush/flowers_br/style_random, @@ -12243,11 +12358,11 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oWR" = ( /obj/structure/fake_stairs/wood/directional/north, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "oXS" = ( /turf/open/floor/carpet/red, /area/cruiser_dock) @@ -12289,7 +12404,12 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) +"oYh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/centcom/interlink/dorm_rooms) "oYO" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -12336,7 +12456,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pbP" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/effect/turf_decal/weather/dirt{ @@ -12350,7 +12470,7 @@ dir = 8 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pcp" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/siding/wood, @@ -12439,14 +12559,14 @@ dir = 4 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pkJ" = ( /obj/structure/fans/tiny/invisible, /obj/structure/fence{ dir = 4 }, /turf/open/floor/iron/white, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pmu" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -12476,7 +12596,7 @@ dir = 1 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pnH" = ( /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood, @@ -12497,7 +12617,7 @@ pixel_y = -12 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ppR" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -12510,7 +12630,7 @@ }, /obj/structure/fans/tiny/invisible, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pqy" = ( /obj/structure/chair/sofa/corp/left, /turf/open/indestructible/hotelwood, @@ -12524,6 +12644,9 @@ /obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "prH" = ( @@ -12565,14 +12688,14 @@ /obj/effect/turf_decal/sand, /obj/machinery/light/directional/east, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pux" = ( /obj/structure/flora/bush/jungle/c/style_2, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pvN" = ( /turf/open/floor/iron/stairs/left{ dir = 8 @@ -12599,7 +12722,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pwV" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -12610,7 +12733,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pxW" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -12624,7 +12747,7 @@ id = "ghostcaferesort1curtain" }, /turf/closed/indestructible/fakeglass, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "pBj" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -12637,10 +12760,10 @@ /obj/machinery/light/directional/south, /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pCd" = ( /turf/closed/wall/mineral/wood/nonmetal, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pCw" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/rag, @@ -12669,6 +12792,7 @@ /area/centcom/interlink) "pDN" = ( /obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "pET" = ( @@ -12805,6 +12929,8 @@ /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, /turf/open/floor/iron, /area/centcom/interlink) "pMm" = ( @@ -12835,7 +12961,7 @@ "pMT" = ( /obj/item/kirbyplants/random, /turf/open/floor/carpet/blue, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "pNf" = ( /obj/structure/stone_tile/block{ dir = 8 @@ -12844,7 +12970,7 @@ dir = 4 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pNF" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -12869,11 +12995,19 @@ }, /turf/open/floor/wood, /area/centcom/interlink) +"pPw" = ( +/obj/effect/turf_decal/trimline/dark_green/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/centcom/interlink) "pPH" = ( /obj/structure/stone_tile/surrounding_tile/cracked, /obj/structure/flora/ash/stem_shroom, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pPI" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink" @@ -12924,7 +13058,7 @@ dir = 4 }, /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pTO" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/right/directional/north{ @@ -12944,7 +13078,7 @@ /obj/structure/flora/grass/jungle/a/style_2, /obj/structure/flora/bush/flowers_br, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pVh" = ( /obj/machinery/photocopier, /obj/machinery/button/door/directional/north{ @@ -12961,12 +13095,14 @@ id_tag = "room6"; name = "Cabin" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/centcom/interlink) "pWF" = ( /obj/structure/flora/ash/cap_shroom, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pXn" = ( /obj/machinery/button/door/directional/east{ id = "evac_hall_lookout"; @@ -12995,7 +13131,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "pYF" = ( /obj/effect/turf_decal/weather/dirt{ dir = 6 @@ -13014,7 +13150,7 @@ name = "Claws" }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qaO" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/fullupgrade{ @@ -13079,12 +13215,12 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qdV" = ( /obj/structure/stone_tile/surrounding_tile/cracked, /obj/structure/wall_torch/spawns_lit/directional/south, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qey" = ( /obj/effect/turf_decal/caution/stand_clear{ dir = 1 @@ -13094,18 +13230,18 @@ "qfy" = ( /obj/structure/table/wood/fancy/blue, /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qgh" = ( /obj/structure/stone_tile/surrounding, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qhl" = ( /obj/structure/flora/bush/large/style_2, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qhn" = ( /obj/machinery/light/very_dim/directional/east, /turf/open/floor/iron/dark, @@ -13113,7 +13249,7 @@ "qiI" = ( /obj/machinery/light/directional/south, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qjh" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -13198,7 +13334,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qot" = ( /obj/effect/turf_decal/weather/dirt{ dir = 9 @@ -13236,7 +13372,7 @@ name = "Bin Bee" }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qpx" = ( /obj/machinery/status_display/evac/directional/north, /obj/structure/chair/office, @@ -13312,7 +13448,7 @@ /obj/effect/turf_decal/sand, /obj/machinery/vending/snack, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qwJ" = ( /obj/structure/chair/sofa/corp/left, /obj/effect/turf_decal/stripes/line, @@ -13330,7 +13466,7 @@ dir = 5 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qzE" = ( /obj/structure/sign/poster/random/directional/west, /obj/structure/chair/sofa/bench{ @@ -13346,7 +13482,7 @@ dir = 8 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qAW" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -13356,15 +13492,15 @@ "qBd" = ( /obj/machinery/light/directional/west, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qBC" = ( /obj/machinery/vending/primitive_catgirl_clothing_vendor, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qCU" = ( /obj/machinery/light/directional/south, /turf/open/floor/plating/abductor, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qDc" = ( /obj/machinery/door/window/left/directional/south{ name = "Coffee Counter" @@ -13442,7 +13578,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qIl" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 4 @@ -13456,7 +13592,7 @@ "qJm" = ( /obj/structure/alien/weeds, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qJA" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron, @@ -13475,7 +13611,7 @@ dir = 6 }, /turf/open/floor/stone, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qLQ" = ( /obj/machinery/washing_machine, /turf/open/floor/iron/dark, @@ -13483,7 +13619,7 @@ "qMl" = ( /obj/structure/wall_torch/spawns_lit/directional/west, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qNu" = ( /obj/structure/railing{ invisibility = 100; @@ -13496,12 +13632,12 @@ dir = 4 }, /turf/open/indestructible/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qNZ" = ( /obj/effect/spawner/liquids_spawner, /obj/effect/light_emitter/interlink, /turf/open/floor/iron/pool/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qPk" = ( /obj/structure/window/spawner/directional/south, /turf/open/floor/carpet/black, @@ -13569,14 +13705,14 @@ /obj/structure/fence/door/opened, /obj/effect/light_emitter/interlink, /turf/open/indestructible/dark, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qVO" = ( /obj/structure/railing/wooden_fencing{ dir = 8 }, /obj/structure/fake_stairs/wood/directional/north, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qVQ" = ( /obj/structure/chair/office/light{ dir = 4; @@ -13599,7 +13735,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "qWc" = ( /obj/machinery/shower/directional/west, /turf/open/indestructible/bathroom, @@ -13656,6 +13792,8 @@ /area/centcom/interlink) "rbT" = ( /obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "rcq" = ( @@ -13666,11 +13804,11 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rfx" = ( /obj/structure/reagent_dispensers/fueltank/large, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rgK" = ( /obj/docking_port/stationary{ dir = 8; @@ -13721,7 +13859,7 @@ dir = 1 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rjk" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -13731,7 +13869,7 @@ "rjD" = ( /obj/structure/fake_stairs/wood/directional/east, /turf/closed/indestructible/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rkm" = ( /obj/machinery/vending/tool, /turf/open/floor/iron/dark/textured_large, @@ -13752,7 +13890,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rma" = ( /obj/structure/railing/corner{ dir = 1 @@ -13771,6 +13909,7 @@ pixel_y = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "rmZ" = ( @@ -13823,12 +13962,12 @@ "rnM" = ( /obj/structure/wall_torch/spawns_lit/directional/south, /turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "roh" = ( /obj/structure/flora/grass/jungle/a/style_3, /obj/structure/flora/tree/jungle/small/style_random, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rpG" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -13857,7 +13996,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rxB" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/indestructible/hoteltile{ @@ -13869,7 +14008,7 @@ dir = 9 }, /turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rzT" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -13902,7 +14041,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rDg" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -13948,15 +14087,16 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rHH" = ( /obj/structure/railing/wooden_fencing, /obj/structure/water_source/puddle, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rHY" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/condom_pack, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "rJC" = ( @@ -14020,7 +14160,7 @@ dir = 4 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rNs" = ( /obj/structure/chair/office{ dir = 1 @@ -14074,14 +14214,14 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rOQ" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 9 }, /obj/structure/flora/ash/leaf_shroom, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rPh" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -14095,7 +14235,7 @@ }, /obj/item/reagent_containers/cup/glass/waterbottle, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rPm" = ( /obj/effect/turf_decal/sand, /obj/structure/closet{ @@ -14126,7 +14266,7 @@ /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian, /obj/item/clothing/suit/costume/hawaiian, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rPJ" = ( /obj/item/kirbyplants/organic/plant22, /turf/open/floor/iron/smooth, @@ -14205,7 +14345,7 @@ "rUA" = ( /obj/machinery/vending/ashclothingvendor, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "rUT" = ( /obj/structure/chair/sofa/corp/left, /obj/structure/window/reinforced/spawner/directional/north, @@ -14261,7 +14401,7 @@ /turf/open/floor/iron/stairs{ dir = 1 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "saE" = ( /obj/effect/turf_decal/trimline/dark_green/line{ dir = 4 @@ -14297,7 +14437,7 @@ /obj/effect/turf_decal/weather/dirt, /obj/structure/chair/wood, /turf/open/indestructible/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sfd" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -14317,7 +14457,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sfN" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -14328,7 +14468,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sga" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -14374,7 +14514,7 @@ }, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "skM" = ( /obj/structure/fans/tiny/invisible, /obj/machinery/door/airlock{ @@ -14423,7 +14563,7 @@ "smA" = ( /obj/structure/flora/tree/dead, /turf/open/floor/grass/fairy, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "smT" = ( /obj/structure/railing{ dir = 10 @@ -14431,7 +14571,7 @@ /turf/open/indestructible/cobble/corner{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sow" = ( /obj/machinery/cryopod{ dir = 4 @@ -14462,10 +14602,10 @@ dir = 8 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "srS" = ( /turf/open/floor/iron/stairs/old, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ssi" = ( /obj/machinery/button/door{ id = "ghostcafecabin2"; @@ -14477,7 +14617,7 @@ /obj/structure/bed/double, /obj/effect/spawner/random/bedsheet/double, /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ssn" = ( /obj/machinery/status_display/shuttle{ pixel_y = 32; @@ -14492,7 +14632,7 @@ /obj/structure/curtain/bounty, /obj/structure/bed/maint, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "std" = ( /obj/machinery/door/airlock/service{ name = "Interlink Kitchen" @@ -14515,7 +14655,7 @@ /obj/structure/stone_tile/slab, /obj/structure/wall_torch/spawns_lit/directional/west, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "suL" = ( /obj/effect/turf_decal/weather/dirt{ dir = 8 @@ -14549,6 +14689,13 @@ /obj/structure/sink/directional/south, /turf/open/indestructible/bathroom, /area/centcom/holding/cafe) +"sAl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "sAC" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -14560,7 +14707,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sBJ" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw, /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ @@ -14586,7 +14733,12 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) +"sDF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/centcom/interlink/dorm_rooms) "sDJ" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood, @@ -14596,7 +14748,7 @@ /turf/open/indestructible/cobble/corner{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sFB" = ( /obj/machinery/vending/boozeomat/cafe, /turf/open/indestructible/hotelwood, @@ -14604,7 +14756,7 @@ "sFC" = ( /obj/structure/fake_stairs/wood/directional/east, /turf/open/indestructible/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sFF" = ( /obj/machinery/door/airlock/multi_tile/public/glass, /obj/structure/fans/tiny/invisible, @@ -14613,7 +14765,7 @@ dir = 1 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sGb" = ( /obj/machinery/door/airlock/medical{ name = "Surgery"; @@ -14632,13 +14784,13 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sGw" = ( /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sGU" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -14691,7 +14843,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sJa" = ( /obj/effect/turf_decal/siding/white{ dir = 5 @@ -14718,7 +14870,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sMF" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /obj/machinery/firealarm/directional/south, @@ -14780,7 +14932,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sQh" = ( /turf/open/floor/iron/smooth_corner, /area/cruiser_dock) @@ -14793,7 +14945,7 @@ random_light = null }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sRt" = ( /obj/machinery/light/directional/east, /turf/open/floor/carpet/cyan, @@ -14813,7 +14965,7 @@ }, /obj/structure/stone_tile/surrounding_tile, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sSX" = ( /obj/machinery/door/airlock/medical{ name = "Interlink Operating Room" @@ -14832,7 +14984,7 @@ /obj/structure/fans/tiny/invisible, /obj/structure/flora/grass/jungle/a/style_3, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sUE" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -14850,7 +15002,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "sWb" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/closet/secure_closet/freezer/empty{ @@ -14920,7 +15072,7 @@ pixel_y = 7 }, /turf/open/floor/carpet/blue, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "sZV" = ( /obj/item/kirbyplants/organic/plant22, /obj/machinery/light/warm/directional/south, @@ -14968,7 +15120,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tdm" = ( /obj/structure/chair/sofa/bench/corner, /obj/effect/turf_decal/siding/white/corner{ @@ -15001,13 +15153,13 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tgU" = ( /obj/structure/chair/wood{ dir = 4 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "thr" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/deck{ @@ -15027,7 +15179,7 @@ dir = 4 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tin" = ( /obj/effect/turf_decal/caution{ dir = 1 @@ -15040,7 +15192,7 @@ }, /obj/structure/stone_tile/block, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tky" = ( /turf/open/indestructible/bathroom, /area/centcom/holding/cafe) @@ -15086,7 +15238,7 @@ dir = 8 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ttx" = ( /obj/structure/table, /obj/item/storage/fancy/candle_box{ @@ -15109,7 +15261,7 @@ "tur" = ( /obj/structure/chair/stool/bar/directional/south, /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tuO" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -15122,19 +15274,21 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tvh" = ( /obj/structure/fence{ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tvm" = ( /obj/machinery/door/airlock{ id_tag = "room8"; name = "Cabin" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/centcom/interlink) "tvw" = ( @@ -15150,12 +15304,12 @@ /turf/open/misc/beach/coast{ dir = 8 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tyG" = ( /obj/effect/turf_decal/sand, /obj/machinery/vending/cola, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tzz" = ( /obj/structure/toilet/snappop{ dir = 4 @@ -15175,7 +15329,7 @@ dir = 8 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tBo" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -15188,7 +15342,7 @@ dir = 1 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "tCi" = ( /obj/machinery/cryopod{ dir = 4 @@ -15213,11 +15367,11 @@ pixel_y = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tEg" = ( /obj/structure/fans/tiny/invisible, /turf/open/water/beach, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tEq" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -15255,7 +15409,7 @@ /obj/structure/flora/bush/jungle/b, /obj/structure/fans/tiny/invisible, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tIN" = ( /obj/effect/light_emitter/interlink, /obj/structure/flora/bush/flowers_yw/style_random, @@ -15264,13 +15418,13 @@ /area/centcom/interlink) "tKt" = ( /turf/open/floor/plating/abductor, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tLu" = ( /obj/item/toy/plush/lizard_plushie/green{ name = "Soaks-The-Rays" }, /turf/open/floor/carpet/orange, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tMb" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -15279,7 +15433,7 @@ dir = 8 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tNw" = ( /obj/structure/railing/corner{ dir = 4 @@ -15316,7 +15470,7 @@ "tUL" = ( /obj/item/flashlight/flare/torch, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tVg" = ( /obj/structure/falsewall/sandstone, /obj/structure/fans/tiny/invisible, @@ -15329,7 +15483,7 @@ /obj/structure/stone_tile/block, /obj/item/flashlight/flare/candle/infinite, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tWA" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -15366,7 +15520,7 @@ dir = 9 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "tYf" = ( /obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/bot, @@ -15387,7 +15541,7 @@ pixel_y = 12 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "tYP" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck, @@ -15486,7 +15640,7 @@ dir = 1 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uew" = ( /obj/structure/table/reinforced, /obj/item/storage/belt/utility{ @@ -15639,13 +15793,13 @@ "uoM" = ( /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/pool/cobble, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "upo" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uqJ" = ( /obj/machinery/door/airlock/centcom{ name = "Nanotrasen Consultant's Office" @@ -15663,7 +15817,7 @@ dir = 4 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "usr" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -15675,17 +15829,17 @@ "uwP" = ( /obj/structure/chair/wood, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uxW" = ( /turf/open/misc/beach/coast{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uxZ" = ( /turf/open/misc/dirt/planet{ desc = "Upon closer examination, it's still dirt." }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uyr" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -15710,18 +15864,18 @@ "uAN" = ( /obj/structure/chair/stool/bamboo, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uBw" = ( /obj/effect/decal/remains/xeno, /obj/structure/alien/weeds, /obj/structure/alien/weeds/node, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uCw" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uCW" = ( /obj/machinery/light/directional/west, /turf/open/floor/iron, @@ -15745,6 +15899,7 @@ pixel_x = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "uEn" = ( @@ -15793,7 +15948,7 @@ /obj/structure/alien/weeds, /obj/structure/bed/nest, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uIo" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/weather/dirt{ @@ -15801,7 +15956,7 @@ }, /obj/structure/marker_beacon/burgundy, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uIp" = ( /obj/machinery/deepfryer, /obj/machinery/light/cold/directional/east, @@ -15847,7 +16002,7 @@ dir = 8 }, /turf/open/floor/carpet/blue, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "uPd" = ( /obj/machinery/duct, /obj/structure/sign/poster/random/directional/south, @@ -15900,7 +16055,7 @@ }, /obj/structure/wall_torch/spawns_lit/directional/west, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uWe" = ( /obj/structure/stone_tile/block, /obj/structure/stone_tile/block/cracked{ @@ -15908,7 +16063,7 @@ }, /obj/structure/wall_torch/spawns_lit/directional/east, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uWG" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood/corner{ @@ -15925,20 +16080,20 @@ }, /obj/structure/window/reinforced/tinted/spawner/directional/east, /turf/open/floor/plating/abductor2, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uXF" = ( /obj/structure/chair/sofa/bench{ dir = 4 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uXH" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ dir = 1 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uXK" = ( /obj/structure/mineral_door/wood/large_gate{ dir = 8 @@ -15948,7 +16103,7 @@ dir = 4 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "uYe" = ( /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark/textured_large, @@ -16031,11 +16186,11 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "veh" = ( /obj/structure/fence/door, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vgs" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -16043,7 +16198,7 @@ "vgx" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vgL" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron/dark/textured_large, @@ -16065,7 +16220,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vhm" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -16082,7 +16237,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vkD" = ( /obj/effect/turf_decal/siding{ color = "#2e2e2e"; @@ -16104,7 +16259,7 @@ /obj/structure/flora/bush/sparsegrass, /obj/structure/flora/bush/reed, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vqy" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -16137,7 +16292,7 @@ pixel_y = 32 }, /turf/open/indestructible/bathroom, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "vui" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -16161,6 +16316,7 @@ pixel_y = -8; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "vxh" = ( @@ -16206,7 +16362,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vxF" = ( /obj/machinery/vending/games, /turf/open/floor/carpet/cyan, @@ -16221,7 +16377,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vzb" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 10 @@ -16231,7 +16387,7 @@ dir = 4 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vzH" = ( /obj/structure/sign/poster/random/directional/north, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -16250,7 +16406,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vEs" = ( /obj/structure/fans/tiny/invisible, /obj/structure/spacevine{ @@ -16258,7 +16414,7 @@ opacity = 1 }, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vEI" = ( /obj/machinery/light/warm/directional/north, /obj/structure/closet/crate/bin, @@ -16356,7 +16512,7 @@ "vQH" = ( /obj/structure/table/wood, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vRf" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; @@ -16386,7 +16542,7 @@ dir = 1 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vUI" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 8 @@ -16413,14 +16569,14 @@ "vXr" = ( /obj/structure/flora/grass/jungle/b, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vYz" = ( /obj/machinery/button/curtain{ id = "ghostcaferesort1curtain"; pixel_x = -26 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "vYC" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -16428,7 +16584,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vYI" = ( /obj/effect/turf_decal/siding{ color = "#2e2e2e" @@ -16448,7 +16604,7 @@ "vYR" = ( /obj/structure/flora/coconuts, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vYV" = ( /obj/machinery/light/directional/east, /obj/structure/table/reinforced/rglass, @@ -16460,7 +16616,7 @@ dir = 4 }, /turf/open/indestructible/carpet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "vZv" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark/side{ @@ -16480,7 +16636,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wcf" = ( /obj/structure/closet/secure_closet/freezer/kitchen/all_access, /obj/item/reagent_containers/condiment/mayonnaise, @@ -16513,7 +16669,7 @@ dir = 4 }, /turf/open/floor/wood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wdB" = ( /obj/machinery/door/airlock{ id_tag = "room3"; @@ -16522,6 +16678,8 @@ /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, /turf/open/floor/iron, /area/centcom/interlink) "weP" = ( @@ -16565,7 +16723,7 @@ /obj/structure/flora/grass/jungle/a/style_2, /obj/machinery/light/directional/north, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wkG" = ( /obj/structure/chair/stool/bar/directional/south, /turf/open/floor/wood/parquet, @@ -16580,9 +16738,12 @@ }, /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wlA" = ( /obj/structure/window/reinforced/tinted/spawner/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "wlL" = ( @@ -16592,12 +16753,12 @@ /obj/structure/stone_tile/block, /obj/item/flashlight/flare/candle/infinite, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wmA" = ( /obj/structure/stone_tile/slab/cracked, /obj/structure/fans/tiny/invisible, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wmW" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw{ dir = 8 @@ -16607,12 +16768,12 @@ "wnj" = ( /obj/structure/reagent_water_basin, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wns" = ( /obj/structure/fans/tiny/invisible, /obj/structure/flora/grass/jungle/b, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wod" = ( /obj/structure/sign/poster/random/directional/north, /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, @@ -16626,7 +16787,7 @@ "wqC" = ( /obj/structure/lavaland/ash_walker_fake, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wqG" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -16651,7 +16812,7 @@ /area/cruiser_dock) "wrf" = ( /turf/open/floor/carpet/blue, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "wsu" = ( /obj/structure/table/wood, /obj/item/folder/red{ @@ -16675,7 +16836,7 @@ }, /obj/structure/curtain/bounty, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wtI" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, @@ -16758,11 +16919,11 @@ "wBV" = ( /obj/structure/railing, /turf/open/indestructible/cobble/side, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wBX" = ( /obj/structure/sink/directional/south, /turf/open/indestructible/bathroom, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "wCl" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/bot_white, @@ -16772,7 +16933,7 @@ /obj/structure/flora/bush/large/style_random, /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wCN" = ( /obj/machinery/computer/records/security, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -16789,7 +16950,7 @@ dir = 8 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wFF" = ( /obj/machinery/light/directional/west, /obj/structure/closet/crate/bin, @@ -16819,8 +16980,10 @@ /turf/open/floor/iron, /area/centcom/interlink) "wHS" = ( -/obj/machinery/telecomms/relay/preset/station, /obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, /turf/open/floor/iron, /area/centcom/interlink) "wId" = ( @@ -16838,7 +17001,7 @@ pixel_y = 6 }, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "wIg" = ( /obj/structure/table, /obj/machinery/reagentgrinder{ @@ -16852,7 +17015,7 @@ dir = 8 }, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wJj" = ( /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/iron/dark, @@ -16885,7 +17048,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wKT" = ( /obj/structure/bed/pod{ pixel_y = 1 @@ -16903,7 +17066,7 @@ }, /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/pool, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wME" = ( /obj/structure/table, /obj/item/paper/pamphlet/centcom/visitor_info{ @@ -16953,7 +17116,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wVd" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -16974,13 +17137,13 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wWm" = ( /obj/structure/chair/stool/bar/directional/south, /turf/open/indestructible/cobble/corner{ dir = 4 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wXe" = ( /obj/structure/bookcase/random/adult, /obj/effect/turf_decal/siding/wood{ @@ -16997,6 +17160,8 @@ /obj/machinery/door/airlock/bathroom{ name = "Bathroom" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "wYD" = ( @@ -17034,7 +17199,7 @@ "wZS" = ( /obj/item/storage/cans/sixbeer, /turf/open/floor/carpet/orange, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "wZW" = ( /obj/machinery/newscaster/directional/west, /obj/structure/table/reinforced, @@ -17057,7 +17222,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xct" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/dark{ @@ -17084,7 +17249,7 @@ pixel_y = 10 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xfD" = ( /obj/structure/punching_bag, /turf/open/indestructible/hotelwood, @@ -17125,7 +17290,7 @@ dir = 1 }, /turf/open/lava/fake, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xlS" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -17137,7 +17302,7 @@ dir = 4 }, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xmn" = ( /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/flora/bush/flowers_yw/style_random, @@ -17148,7 +17313,7 @@ /obj/effect/turf_decal/sand, /obj/structure/marker_beacon/burgundy, /turf/open/indestructible/plating, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xnI" = ( /obj/structure/table/reinforced, /obj/item/storage/backpack/duffelbag/science/robo/surgery{ @@ -17227,7 +17392,7 @@ "xsf" = ( /obj/structure/flora/ash/stem_shroom, /turf/open/floor/fakebasalt, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xsg" = ( /obj/effect/turf_decal/trimline/blue/filled/arrow_cw{ dir = 8 @@ -17265,7 +17430,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xuY" = ( /turf/closed/indestructible/syndicate, /area/cruiser_dock) @@ -17282,12 +17447,12 @@ /obj/structure/mineral_door/wood, /obj/structure/fans/tiny/invisible, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "xyn" = ( /obj/structure/flora/grass/jungle/a/style_4, /obj/machinery/light/directional/north, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xyz" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, @@ -17310,7 +17475,7 @@ /obj/structure/alien/weeds/node, /obj/structure/alien/egg/burst, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xCO" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -17331,7 +17496,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xDp" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/chair/sofa/bench/right{ @@ -17350,7 +17515,7 @@ /turf/open/indestructible/hoteltile{ icon_state = "floor" }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xDE" = ( /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) @@ -17377,15 +17542,15 @@ dir = 1 }, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xFU" = ( /obj/effect/turf_decal/sand, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xFZ" = ( /obj/structure/flora/bush/sunny, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xGO" = ( /obj/structure/railing{ dir = 4 @@ -17397,6 +17562,12 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/bamboo, /area/centcom/holding/cafe) +"xHU" = ( +/obj/effect/turf_decal/trimline/dark_green/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/centcom/interlink) "xIx" = ( /obj/structure/chair/office, /turf/open/indestructible/hotelwood, @@ -17425,6 +17596,14 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/wood/tile, /area/centcom/interlink) +"xLz" = ( +/obj/machinery/door/airlock/bathroom{ + name = "Bathroom" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/centcom/interlink/dorm_rooms) "xLF" = ( /obj/machinery/door/poddoor/shutters/window/preopen{ id = "cc_arrivals" @@ -17584,7 +17763,7 @@ "xWg" = ( /obj/item/toy/plush/bubbleplush, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "xXc" = ( /obj/effect/light_emitter/interlink, /obj/structure/fence, @@ -17628,7 +17807,7 @@ "ybu" = ( /obj/structure/flora/rock/pile/jungle/style_3, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ybB" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -17648,7 +17827,7 @@ /obj/structure/flora/grass/jungle/a/style_2, /obj/structure/flora/bush/flowers_pp, /turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ybX" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/turf_decal/weather/dirt{ @@ -17699,7 +17878,7 @@ /turf/open/misc/grass/planet{ smoothing_flags = 0 }, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "ydt" = ( /obj/effect/landmark/latejoin, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -17710,12 +17889,12 @@ "ydM" = ( /obj/structure/fluff/beach_umbrella/engine, /turf/open/misc/beach/sand, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "yea" = ( /obj/structure/table/wood, /obj/machinery/light/directional/east, /turf/open/floor/wood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "yet" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw, /obj/effect/turf_decal/siding/white/corner, @@ -17724,7 +17903,7 @@ "yev" = ( /obj/item/kirbyplants/random, /turf/open/floor/carpet/red, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe/dorms) "yfm" = ( /obj/machinery/sleeper{ dir = 1 @@ -17765,7 +17944,7 @@ pixel_x = 1 }, /turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe/park) "yjX" = ( /obj/structure/closet, /obj/item/clothing/under/rank/centcom/officer/replica{ @@ -17798,6 +17977,8 @@ /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, /turf/open/floor/iron, /area/centcom/interlink) @@ -32239,10 +32420,10 @@ nJp tvw iVr rbT -dgV -wXo +sDF +xLz nsT -bsj +oYh nYF tvw vzH @@ -32502,8 +32683,8 @@ pry bsj chZ pMg -dGD -nJp +oHW +xHU aDg mDR iPs @@ -32760,7 +32941,7 @@ bsj osk tvw iMY -nJp +xHU aDg fVr iPs @@ -33014,10 +33195,10 @@ cWF bsj bsj bsj -bsj +fHR tvw iMY -nJp +xHU tvw jSW iPs @@ -33274,7 +33455,7 @@ bsj bUO tvw ukp -nJp +xHU tvw fVr iPs @@ -33531,7 +33712,7 @@ tvw tvw tvw iMY -nJp +xHU aDg kLZ iPs @@ -33781,14 +33962,14 @@ nJp tvw iVr rbT -dgV -wXo +sDF +xLz nsT -bsj +oYh nYF tvw iMY -nJp +xHU aDg fVr iPs @@ -34044,8 +34225,8 @@ pry bsj chZ dVh -dGD -nJp +oHW +xHU aDg fVr iPs @@ -34302,7 +34483,7 @@ bsj uDT tvw iMY -nJp +xHU tvw fVr iPs @@ -34556,10 +34737,10 @@ cWF bsj bsj bsj -bsj +fHR tvw iMY -nJp +xHU tvw fVr iPs @@ -34816,7 +34997,7 @@ bsj bUO tvw iMY -nJp +xHU aDg fVr iPs @@ -35073,7 +35254,7 @@ tvw tvw tvw iMY -nJp +xHU aDg fVr iPs @@ -35323,14 +35504,14 @@ nJp tvw iVr rbT -dgV -wXo +sDF +xLz nsT -bsj +oYh nYF tvw iMY -nJp +xHU aDg rVQ iem @@ -35586,8 +35767,8 @@ pry bsj chZ wdB -dGD -nJp +oHW +xHU tvw vLx vLx @@ -35844,7 +36025,7 @@ bsj mUC tvw iMY -nJp +xHU tvw vLx unt @@ -36098,10 +36279,10 @@ cWF bsj bsj bsj -bsj +fHR tvw iMY -nJp +xHU tvw vLx tpU @@ -36358,7 +36539,7 @@ bsj bUO tvw ukp -nJp +xHU tvw vLx tpU @@ -36615,7 +36796,7 @@ tvw tvw tvw vzH -nJp +xHU tvw vLx tpU @@ -36865,14 +37046,14 @@ tvw tvw iVr rbT -dgV -wXo +sDF +xLz nsT -bsj +oYh nYF tvw iMY -nJp +xHU tvw vLx wji @@ -37126,10 +37307,10 @@ fEg lcR pry bsj -chZ +nUB yln -dGD -nJp +oHW +xHU tvw vLx vLx @@ -37386,7 +37567,7 @@ bsj cbF tvw iMY -nJp +xHU tvw aaa vLx @@ -37640,10 +37821,10 @@ cWF bsj bsj bsj -bsj +fHR tvw iMY -nJp +xHU tvw aaa vLx @@ -37900,7 +38081,7 @@ bsj bUO tvw iMY -nJp +xHU tvw aaa vLx @@ -38157,7 +38338,7 @@ tvw tvw tvw ukp -nJp +xHU tvw aaa vLx @@ -38414,7 +38595,7 @@ gIO mMu xwC oOC -nJp +xHU tvw aaa vLx @@ -38649,29 +38830,29 @@ aaa aaa aaa tvw -hvQ -hvQ +aek +sAl bDM -lvR -kOZ -kOZ -kOZ -kOZ -kOZ +oJg +pPw +pPw +pPw +pPw +pPw dyE -kOZ -kOZ -kOZ -oOC -hvQ -hvQ -hvQ -hvQ -hvQ -hvQ -hvQ -hvQ -nJp +pPw +pPw +pPw +cnd +nmH +nmH +nmH +nmH +nmH +nmH +nmH +nmH +xHU tvw aaa vLx @@ -38907,7 +39088,7 @@ aaa aaa tvw wHS -hvQ +kPb tvw iIb eYX @@ -38928,7 +39109,7 @@ mjA eYX eYX eYX -bod +ikM tvw aaa vLx @@ -39161,10 +39342,10 @@ aaa aaa aaa aaa -aaa -tvw -hvQ -hvQ +frI +oDW +hmV +kPb tvw tvw tvw @@ -39687,19 +39868,19 @@ aaa tvw sBZ bsj -bsj +oYh tvw sBZ bsj -bsj +oYh tvw sBZ bsj -bsj +oYh tvw sBZ bsj -bsj +oYh tvw aaa aaa @@ -40457,19 +40638,19 @@ aaa aaa tvw iVr -rbT +ilw dgV tvw iVr -rbT +ilw dgV tvw iVr -rbT +ilw dgV tvw iVr -rbT +ilw dgV tvw aaa diff --git a/_maps/map_files/moonstation/moonstation.dmm b/_maps/map_files/moonstation/moonstation.dmm index cf8ebc0081e..f85671df169 100644 --- a/_maps/map_files/moonstation/moonstation.dmm +++ b/_maps/map_files/moonstation/moonstation.dmm @@ -14953,7 +14953,7 @@ /turf/open/floor/iron, /area/station/engineering/hallway) "eAp" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "eAv" = ( @@ -57075,7 +57075,7 @@ /turf/open/floor/plating, /area/station/maintenance/port) "rbQ" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /obj/effect/turf_decal/vg_decals/numbers/six, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -59491,7 +59491,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/asteroid_lobby) "rLI" = ( -/mob/living/simple_animal/hostile/alien/maid, +/mob/living/basic/alien/maid, /obj/item/radio/intercom/directional/east, /turf/open/floor/plating, /area/station/maintenance/abandon_wrestle) diff --git a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_1.dmm b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_1.dmm index ab150268e14..b3959ec8463 100644 --- a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_1.dmm @@ -9,38 +9,23 @@ /area/station/maintenance/starboard/lesser) "g" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 37; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 22; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 27; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 32; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "x"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/x{ pixel_x = 32 }, /turf/open/floor/plating, @@ -77,38 +62,23 @@ /area/station/maintenance/starboard/lesser) "t" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 37; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 22; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 27; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 32; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "x"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/x{ pixel_x = 32 }, /obj/effect/spawner/random/trash/food_packaging, @@ -131,38 +101,23 @@ /area/station/maintenance/starboard/lesser) "x" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 37; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 22; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 27; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 32; pixel_y = 1 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "x"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/x{ pixel_x = 32 }, /obj/effect/spawner/random/trash/food_packaging, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 25075faf65c..e0de5bebc26 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -71,8 +71,8 @@ /area/station/asteroid) "aam" = ( /obj/machinery/power/solar{ - id = "forestarboard"; - name = "Starboard Solar Array" + name = "Starboard Solar Array"; + id = "forestarboard" }, /obj/effect/turf_decal/sand/plating, /obj/structure/cable, @@ -604,6 +604,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, +/obj/machinery/photobooth/security, /turf/open/floor/iron, /area/station/security/execution/transfer) "acj" = ( @@ -629,11 +630,11 @@ /turf/open/floor/grass, /area/station/asteroid) "acn" = ( +/mob/living/basic/mouse, /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper/stack{ dir = 4 }, -/mob/living/basic/mouse, /turf/open/floor/plating, /area/station/maintenance/tram/mid) "aco" = ( @@ -724,6 +725,10 @@ /turf/open/floor/iron, /area/station/escapepodbay) "acC" = ( +/mob/living/basic/bot/medbot/autopatrol{ + name = "T.R.A.M Unit"; + desc = "A Trauma Response Activation Medibot. It seems overwhelmed." + }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -735,10 +740,6 @@ /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, -/mob/living/basic/bot/medbot/autopatrol{ - desc = "A Trauma Response Activation Medibot. It seems overwhelmed."; - name = "T.R.A.M Unit" - }, /turf/open/floor/iron, /area/station/maintenance/tram/left) "acE" = ( @@ -1020,8 +1021,8 @@ "adn" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/camera/directional/south{ - c_tag = "Security - Prison Main East"; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Main East" }, /turf/open/floor/iron, /area/station/security/prison) @@ -1051,8 +1052,8 @@ /area/station/security/prison/garden) "adr" = ( /obj/structure/chair{ - dir = 4; - name = "Judge" + name = "Judge"; + dir = 4 }, /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, @@ -1156,6 +1157,7 @@ /turf/open/floor/iron, /area/station/security/courtroom) "adD" = ( +/mob/living/simple_animal/bot/secbot/beepsky/officer, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/camera/directional/south{ @@ -1168,7 +1170,6 @@ /obj/effect/turf_decal/trimline/white/warning{ dir = 1 }, -/mob/living/simple_animal/bot/secbot/beepsky/officer, /turf/open/floor/iron, /area/station/maintenance/tram/right) "adE" = ( @@ -1341,8 +1342,8 @@ /obj/effect/turf_decal/sand/plating, /obj/structure/cable, /obj/machinery/power/solar{ - id = "portsolar"; - name = "Port Solar Array" + name = "Port Solar Array"; + id = "portsolar" }, /turf/open/floor/plating/airless, /area/station/solars/port) @@ -1533,8 +1534,8 @@ dir = 10 }, /obj/machinery/camera/motion/directional/north{ - c_tag = "Secure - Nuclear Storage"; - network = list("ss13","secure") + network = list("ss13","secure"); + c_tag = "Secure - Nuclear Storage" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) @@ -1545,19 +1546,19 @@ /area/station/asteroid) "aeW" = ( /obj/docking_port/stationary{ - dwidth = 2; - height = 5; name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/generic; + width = 9; + height = 5; shuttle_id = "laborcamp_home"; - width = 9 + dwidth = 2; + roundstart_template = /datum/map_template/shuttle/labour/generic }, /turf/open/misc/asteroid/airless, /area/station/asteroid) "aeX" = ( +/mob/living/simple_animal/bot/secbot/beepsky/armsky, /obj/effect/turf_decal/stripes/line, /obj/structure/cable, -/mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) "aeY" = ( @@ -1605,11 +1606,11 @@ /area/station/asteroid) "aff" = ( /obj/docking_port/stationary{ - dwidth = 5; - height = 7; name = "Cargo Bay"; + width = 12; + height = 7; shuttle_id = "cargo_home"; - width = 12 + dwidth = 5 }, /turf/open/misc/asteroid/airless, /area/station/asteroid) @@ -1852,12 +1853,12 @@ /turf/open/floor/grass, /area/station/asteroid) "agp" = ( +/mob/living/basic/pet/dog/corgi/ian, /obj/structure/bed/dogbed/ian, /obj/machinery/computer/security/telescreen/entertainment/directional/south, /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/mob/living/basic/pet/dog/corgi/ian, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "agq" = ( @@ -2153,8 +2154,8 @@ "ahl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "containdeez4"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez4" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -2256,9 +2257,9 @@ dir = 4 }, /obj/machinery/button/door/directional/south{ - id = "trammaintdock"; name = "Tram Maintenance Dock Access"; - pixel_x = 8 + pixel_x = 8; + id = "trammaintdock" }, /turf/open/floor/iron, /area/station/maintenance/port/central) @@ -2359,11 +2360,11 @@ /area/station/maintenance/disposal) "ajc" = ( /obj/machinery/button/door/directional/west{ - id = "private_i"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = -9; - specialfunctions = 4 + id = "private_i"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, @@ -2371,12 +2372,12 @@ "aje" = ( /obj/structure/chair/stool/directional/north, /obj/machinery/button/door/directional/west{ - id = "private_j"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = -9; - specialfunctions = 4 + id = "private_j"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /turf/open/floor/wood, /area/station/commons/dorms) @@ -2444,11 +2445,11 @@ /area/station/hallway/secondary/entry) "ajy" = ( /obj/machinery/button/door/directional/west{ - id = "private_h"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = -9; - specialfunctions = 4 + id = "private_h"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/structure/chair/stool/directional/north, /turf/open/floor/carpet, @@ -2456,12 +2457,12 @@ "ajz" = ( /obj/structure/chair/stool/directional/north, /obj/machinery/button/door/directional/west{ - id = "private_k"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = -9; - specialfunctions = 4 + id = "private_k"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /turf/open/floor/carpet, /area/station/commons/dorms) @@ -2530,8 +2531,8 @@ dir = 1 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 Outlet Pump" + name = "N2 Outlet Pump"; + dir = 1 }, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -2587,11 +2588,11 @@ /area/station/engineering/atmos) "ala" = ( /obj/machinery/button/door/directional/west{ - id = "private_g"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = -9; - specialfunctions = 4 + id = "private_g"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, @@ -2599,20 +2600,20 @@ "alb" = ( /obj/structure/chair/stool/directional/north, /obj/machinery/button/door/directional/west{ - id = "private_l"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = -9; - specialfunctions = 4 + id = "private_l"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /turf/open/floor/wood, /area/station/commons/dorms) "ald" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ - id = "papersplease"; - name = "HoP Arrival Procedure Enforcement Shutters" + name = "HoP Arrival Procedure Enforcement Shutters"; + id = "papersplease" }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) @@ -2776,8 +2777,8 @@ dir = 10 }, /obj/machinery/fax{ - fax_name = "Engineering Lobby"; - name = "Engineering Lobby Fax Machine" + name = "Engineering Lobby Fax Machine"; + fax_name = "Engineering Lobby" }, /turf/open/floor/iron, /area/station/engineering/break_room) @@ -2813,10 +2814,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) -"anp" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hop) "anr" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -2920,8 +2917,8 @@ /area/station/security/lockers) "aog" = ( /obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" + name = "Atmospherics Blast Door"; + id = "atmos" }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -2970,9 +2967,9 @@ "aoN" = ( /obj/machinery/elevator_control_panel{ layer = 3.1; - linked_elevator_id = "tram_xeno_lift"; pixel_y = 2; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") + linked_elevator_id = "tram_xeno_lift"; + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /turf/closed/wall, /area/station/science/xenobiology) @@ -3012,8 +3009,8 @@ /area/station/engineering/atmos/pumproom) "apJ" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Pure to Mix" + name = "Pure to Mix"; + dir = 1 }, /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ dir = 4 @@ -3061,8 +3058,8 @@ }, /obj/item/multitool, /obj/machinery/camera/emp_proof{ - c_tag = "Secure - Telecomms Control Room"; - dir = 9 + dir = 9; + c_tag = "Secure - Telecomms Control Room" }, /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, @@ -3087,9 +3084,9 @@ dir = 8 }, /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; + name = "navigation beacon (Chapel Delivery)"; location = "Chapel"; - name = "navigation beacon (Chapel Delivery)" + codes_txt = "delivery;dir=8" }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/dorms) @@ -3104,8 +3101,8 @@ /area/station/engineering/supermatter/room) "aql" = ( /obj/machinery/door/airlock{ - id_tag = "private_i"; - name = "Private Quarters I" + name = "Private Quarters I"; + id_tag = "private_i" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3334,8 +3331,8 @@ dir = 9 }, /obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Main North-West"; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Main North-West" }, /turf/open/floor/iron, /area/station/security/prison) @@ -3438,9 +3435,9 @@ "auG" = ( /obj/structure/sign/poster/official/safety_report/directional/north, /obj/machinery/camera{ - c_tag = "Security - Equipment Room"; dir = 9; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Equipment Room" }, /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) @@ -3451,8 +3448,8 @@ "auP" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "HOSOffice"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + id = "HOSOffice" }, /turf/open/floor/plating, /area/station/command/heads_quarters/hos) @@ -3479,9 +3476,9 @@ dir = 1 }, /obj/machinery/camera{ - c_tag = "Security - Main Office North"; dir = 9; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Main Office North" }, /turf/open/floor/iron, /area/station/security/office) @@ -3539,8 +3536,8 @@ /obj/structure/table, /obj/item/assembly/flash/handheld, /obj/machinery/fax{ - fax_name = "Security Office"; - name = "Security Office Fax Machine" + name = "Security Office Fax Machine"; + fax_name = "Security Office" }, /turf/open/floor/iron, /area/station/security/office) @@ -3640,11 +3637,11 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 }, -/obj/machinery/disposal/bin, /obj/machinery/status_display/evac/directional/north, /obj/structure/disposalpipe/trunk{ dir = 2 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/commons/dorms) "awi" = ( @@ -3843,18 +3840,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) -"ayc" = ( -/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/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/stripes/white/full, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "ayd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -4189,10 +4174,28 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"aCx" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Delivery Desk"; + req_access = list("shipping") + }, +/obj/structure/desk_bell{ + pixel_x = -7 + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) "aCy" = ( /obj/machinery/camera{ - c_tag = "Civilian - Radstorm Shelter"; - dir = 10 + dir = 10; + c_tag = "Civilian - Radstorm Shelter" }, /turf/open/floor/iron/dark, /area/station/maintenance/radshelter/civil) @@ -4286,9 +4289,9 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Engine Room North-East"; dir = 9; - network = list("ss13","engine","engineering") + network = list("ss13","engine","engineering"); + c_tag = "Engineering - Engine Room North-East" }, /obj/structure/cable, /turf/open/floor/engine, @@ -4384,16 +4387,16 @@ "aEh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_upper_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_upper_eva_external"; - idSelf = "mostleft_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "mostleft_upper_eva_airlock_control"; + idDoor = "mostleft_upper_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -4419,6 +4422,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"aEm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "aEn" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -4488,12 +4501,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/cult, /area/station/service/chapel/office) -"aEO" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "aEP" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, @@ -4535,6 +4542,12 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"aFP" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "aFU" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance_hatch{ @@ -4557,7 +4570,7 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/security/brig) -"aGa" = ( +"aFZ" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/hallway/secondary/exit) @@ -4582,11 +4595,11 @@ /area/station/command/heads_quarters/hop) "aGi" = ( /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleright_lower_upper_eva_external"; - idInterior = "middleright_lower_upper_eva_internal"; - idSelf = "middleright_lower_upper_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleright_lower_upper_eva_airlock_control"; + idInterior = "middleright_lower_upper_eva_internal"; + idExterior = "middleright_lower_upper_eva_external" }, /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -4602,6 +4615,14 @@ /obj/effect/spawner/random/decoration/ornament, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) +"aGq" = ( +/obj/machinery/vending/snack/blue, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) "aGs" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -4618,6 +4639,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"aGw" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "aGx" = ( /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 @@ -4642,16 +4669,16 @@ "aGL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_lower_eva_internal"; - idSelf = "mostleft_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "mostleft_lower_eva_airlock_control"; + idDoor = "mostleft_lower_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -4672,60 +4699,60 @@ "aHe" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "mostleft_lower_eva_external"; - idInterior = "mostleft_lower_eva_internal"; - idSelf = "mostleft_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "mostleft_lower_eva_airlock_control"; + idInterior = "mostleft_lower_eva_internal"; + idExterior = "mostleft_lower_eva_external" }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/left) "aHf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleleft_lower_eva_external"; - idInterior = "middleleft_lower_eva_internal"; - idSelf = "middleleft_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleleft_lower_eva_airlock_control"; + idInterior = "middleleft_lower_eva_internal"; + idExterior = "middleleft_lower_eva_external" }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) "aHl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleright_lower_eva_external"; - idInterior = "middleright_lower_eva_internal"; - idSelf = "middleright_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleright_lower_eva_airlock_control"; + idInterior = "middleright_lower_eva_internal"; + idExterior = "middleright_lower_eva_external" }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) "aHn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "rightmost_lower_eva_external"; - idInterior = "rightmost_lower_eva_internal"; - idSelf = "rightmost_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "rightmost_lower_eva_airlock_control"; + idInterior = "rightmost_lower_eva_internal"; + idExterior = "rightmost_lower_eva_external" }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) "aHo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_lower_eva_internal"; - idSelf = "rightmost_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "rightmost_lower_eva_airlock_control"; + idDoor = "rightmost_lower_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -4857,22 +4884,6 @@ "aIi" = ( /turf/open/floor/iron, /area/station/security/prison/work) -"aIj" = ( -/obj/machinery/door/window/brigdoor/left/directional/west{ - id = "engcell"; - name = "Engineering Cell"; - req_access = list("security") - }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "aIp" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -4887,17 +4898,17 @@ /area/station/security/checkpoint/medical) "aIq" = ( /obj/machinery/status_display/door_timer{ - id = "medcell"; name = "Medical Cell"; - pixel_y = 32 + pixel_y = 32; + id = "medcell" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 }, /obj/effect/landmark/start/depsec/medical, /obj/machinery/camera/directional/north{ - c_tag = "Medical - Security Checkpoint"; - network = list("ss13","medbay","Security") + network = list("ss13","medbay","Security"); + c_tag = "Medical - Security Checkpoint" }, /turf/open/floor/iron, /area/station/security/checkpoint/medical) @@ -5001,13 +5012,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"aJI" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lab) "aJN" = ( /obj/machinery/disposal/bin, /obj/structure/sign/painting/large/library_private{ @@ -5016,10 +5020,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/engine/cult, /area/station/service/library) -"aJT" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) "aKe" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5349,8 +5349,8 @@ /area/station/medical/treatment_center) "aML" = ( /obj/machinery/camera/directional/north{ - c_tag = "Science - Monkey Pit"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Monkey Pit" }, /obj/machinery/light/warm/directional/north, /turf/open/misc/dirt/jungle{ @@ -5526,9 +5526,9 @@ "aOF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + name = "CMO Office Shutters"; dir = 4; - id = "cmoshutter"; - name = "CMO Office Shutters" + id = "cmoshutter" }, /obj/structure/cable, /turf/open/floor/plating, @@ -5539,8 +5539,8 @@ }, /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ - c_tag = "Medical - Virology"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Virology" }, /turf/open/floor/iron/white, /area/station/medical/virology) @@ -5571,8 +5571,8 @@ "aOQ" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Main South"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main South" }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) @@ -5627,8 +5627,8 @@ "aPm" = ( /obj/structure/table/glass, /obj/machinery/fax{ - fax_name = "Chief Medical Officer's Office"; - name = "Chief Medical Officer's Fax Machine" + name = "Chief Medical Officer's Fax Machine"; + fax_name = "Chief Medical Officer's Office" }, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, @@ -5851,6 +5851,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"aRE" = ( +/obj/machinery/mass_driver/chapelgun, +/obj/machinery/door/window/left/directional/north{ + name = "Mass Driver"; + req_access = list("chapel_office") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/chapel/monastery) "aRI" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/service/chapel/monastery) @@ -5948,8 +5959,8 @@ dir = 1 }, /obj/structure/sign/warning/secure_area{ - desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"; + desc = "A warning sign which reads 'BOMB RANGE"; pixel_y = 32 }, /obj/structure/disposalpipe/segment{ @@ -5957,19 +5968,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"aTr" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 4 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "aTt" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -5988,8 +5986,8 @@ "aTY" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/solar{ - id = "forestarboard"; - name = "Starboard Solar Array" + name = "Starboard Solar Array"; + id = "forestarboard" }, /obj/structure/cable, /turf/open/space/openspace, @@ -6213,6 +6211,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"aZm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "aZo" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -6510,8 +6516,8 @@ /area/station/ai_monitored/turret_protected/aisat_interior) "bhG" = ( /obj/machinery/door/airlock/centcom{ - desc = "Truly, a marvel of modern engineering."; - name = "Syndicate Secure Airlock System" + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/grimy, @@ -6570,10 +6576,23 @@ }, /turf/open/floor/wood/large, /area/station/service/barber) +"bjb" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/window/right/directional/east{ + name = "Brig Infirmary" + }, +/turf/open/floor/iron/white, +/area/station/security/medical) "bje" = ( /obj/effect/spawner/random/structure{ - loot = list(/obj/structure/statue/snow/snowman); name = "random snowman spawner"; + loot = list(/obj/structure/statue/snow/snowman); spawn_loot_chance = 10 }, /obj/machinery/light_switch/directional/south, @@ -6635,18 +6654,18 @@ "blo" = ( /obj/structure/filingcabinet/security, /obj/machinery/button/door/directional/east{ - id = "outerbrigright"; name = "Outer Brig Door Toggle"; - normaldoorcontrol = 1; pixel_y = -8; - req_access = list("security") + id = "outerbrigright"; + req_access = list("security"); + normaldoorcontrol = 1 }, /obj/machinery/button/door/directional/east{ - id = "innerbrigright"; name = "Inner Brig Door Toggle"; - normaldoorcontrol = 1; pixel_y = 8; - req_access = list("security") + id = "innerbrigright"; + req_access = list("security"); + normaldoorcontrol = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -6680,11 +6699,11 @@ /area/station/hallway/primary/tram/right) "blN" = ( /obj/machinery/button/door/directional/west{ - id = "private_r"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = 9; - specialfunctions = 4 + id = "private_r"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6718,13 +6737,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/server) -"bmB" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/structure/sign/clock/directional/north, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "bmG" = ( /obj/structure/chair/greyscale{ dir = 4 @@ -6781,12 +6793,12 @@ /area/station/solars/port) "bop" = ( /obj/machinery/button/door/directional/west{ - id = "private_c"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = 9; - specialfunctions = 4 + id = "private_c"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -6877,8 +6889,8 @@ "bqg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + id = "pharmacy_shutters_2" }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -6893,8 +6905,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez4"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez4" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -6914,8 +6926,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/turf_decal/box, /obj/structure/sign/warning/directional/west{ - desc = "A sign warning you to be cautious of falling packages."; - name = "FALLING HAZARD sign" + name = "FALLING HAZARD sign"; + desc = "A sign warning you to be cautious of falling packages." }, /obj/item/stack/sheet/cardboard, /turf/open/floor/plating, @@ -6952,14 +6964,6 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"brN" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "bsh" = ( /obj/structure/table/glass, /obj/structure/microscope, @@ -7012,16 +7016,16 @@ "btf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_lower_upper_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_lower_upper_eva_external"; - idSelf = "rightmost_lower_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "rightmost_lower_upper_eva_airlock_control"; + idDoor = "rightmost_lower_upper_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -7171,8 +7175,8 @@ "bwp" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/solar{ - id = "forestarboard"; - name = "Starboard Solar Array" + name = "Starboard Solar Array"; + id = "forestarboard" }, /obj/structure/cable, /turf/open/space/basic, @@ -7234,14 +7238,27 @@ "bxd" = ( /obj/structure/table, /obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; name = "Common Channel"; - pixel_x = 0 + pixel_x = 0; + listening = 0; + freerange = 1 }, /obj/structure/sign/calendar/directional/south, /turf/open/floor/iron/dark/small, /area/station/commons/vacant_room) +"bxC" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "bxG" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -7294,9 +7311,9 @@ }, /obj/structure/table/glass, /obj/machinery/fax{ - fax_name = "Research Division"; name = "Research Division Fax Machine"; - pixel_x = 1 + pixel_x = 1; + fax_name = "Research Division" }, /turf/open/floor/iron/white, /area/station/science/lower) @@ -7320,8 +7337,8 @@ }, /obj/machinery/airalarm/directional/south, /obj/machinery/camera/directional/south{ - c_tag = "Secure - AI Antechamber North"; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Antechamber North" }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -7368,6 +7385,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/tcommsat/computer) +"bzs" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/structure/sign/clock/directional/west, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "bzt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -7571,7 +7599,7 @@ /obj/effect/turf_decal/trimline/dark_red/warning, /obj/machinery/elevator_control_panel/directional/south{ linked_elevator_id = "tram_dorm_lift"; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/left) @@ -7594,8 +7622,8 @@ "bFo" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/camera/directional/south{ - c_tag = "Security - Main Office South"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Main Office South" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7638,16 +7666,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/modular_map_root/tramstation{ - key = "barcargoupper"; - name = "barcargoupper" + name = "barcargoupper"; + key = "barcargoupper" }, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/cargo) "bGh" = ( /obj/machinery/camera/motion{ - c_tag = "Secure - AI Upper External West"; dir = 6; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Upper External West" }, /turf/open/space/openspace, /area/space/nearstation) @@ -7698,8 +7726,8 @@ /obj/item/stack/sheet/cardboard, /obj/item/food/donkpocket/pizza, /obj/machinery/camera/directional/east{ - c_tag = "Medical - Virology Break Room"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Virology Break Room" }, /turf/open/floor/iron/dark, /area/station/medical/virology) @@ -7828,12 +7856,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"bID" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "bIJ" = ( /obj/structure/bodycontainer/crematorium{ dir = 8; @@ -7914,8 +7936,8 @@ "bKF" = ( /obj/structure/table/wood, /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" + name = "HoochMaster Deluxe"; + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments." }, /turf/open/floor/iron/dark, /area/station/service/bar) @@ -7955,9 +7977,9 @@ dir = 6 }, /obj/machinery/camera{ - c_tag = "Cargo - Lobby"; dir = 6; - network = list("ss13","cargo") + network = list("ss13","cargo"); + c_tag = "Cargo - Lobby" }, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, @@ -8019,7 +8041,6 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) "bLr" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 }, @@ -8030,6 +8051,7 @@ dir = 8 }, /obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/security/office) "bLA" = ( @@ -8085,8 +8107,8 @@ /area/station/hallway/secondary/exit) "bLS" = ( /obj/machinery/requests_console/directional/south{ - department = "Janitorial"; - name = "Janitorial Requests Console" + name = "Janitorial Requests Console"; + department = "Janitorial" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -8101,6 +8123,7 @@ /turf/open/floor/iron, /area/station/service/janitor) "bLT" = ( +/mob/living/basic/pet/dog/pug/mcgriff, /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 }, @@ -8108,7 +8131,6 @@ dir = 4 }, /obj/structure/bed/dogbed/mcgriff, -/mob/living/basic/pet/dog/pug/mcgriff, /turf/open/floor/glass/reinforced, /area/station/security/warden) "bMb" = ( @@ -8157,8 +8179,8 @@ dir = 8 }, /obj/machinery/door/poddoor/preopen{ - id = "Sciencelockdown"; - name = "Research Lockdown Blastdoor" + name = "Research Lockdown Blastdoor"; + id = "Sciencelockdown" }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, @@ -8189,8 +8211,8 @@ name = "AI Core" }, /obj/machinery/door/poddoor/shutters/preopen{ - id = "AI Core shutters"; - name = "AI Core Shutters" + name = "AI Core Shutters"; + id = "AI Core shutters" }, /obj/machinery/flasher/directional/west{ id = "AI" @@ -8408,8 +8430,8 @@ /area/station/service/library) "bSr" = ( /obj/structure/chair{ - dir = 4; - name = "Judge" + name = "Judge"; + dir = 4 }, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -8469,8 +8491,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Privacy Shutter" + name = "Privacy Shutter"; + id = "ceprivacy" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -8642,8 +8664,8 @@ /area/space/nearstation) "bWD" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "prisondorm"; - name = "Prison Dorm 5" + name = "Prison Dorm 5"; + id_tag = "prisondorm" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -8707,37 +8729,22 @@ /area/station/commons/lounge) "bXp" = ( /obj/item/toy/crayon/orange, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 8; pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 4; pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = -4; pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "x"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/x{ pixel_x = 4; pixel_y = -32 }, @@ -8751,11 +8758,11 @@ /area/station/security/execution/transfer) "bXs" = ( /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleright_lower_lower_eva_external"; - idInterior = "middleright_lower_lower_eva_internal"; - idSelf = "middleright_lower_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleright_lower_lower_eva_airlock_control"; + idInterior = "middleright_lower_lower_eva_internal"; + idExterior = "middleright_lower_lower_eva_external" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -8769,25 +8776,25 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/button/door/directional/east{ - id = "greedygrinnersden"; name = "Privacy Shutters Toggle"; - pixel_y = -11 + pixel_y = -11; + id = "greedygrinnersden" }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) "bXG" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_lower_eva_external"; - idSelf = "rightmost_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "rightmost_lower_eva_airlock_control"; + idDoor = "rightmost_lower_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, @@ -8800,6 +8807,13 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"bYa" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "bYd" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/landmark/start/assistant, @@ -8807,10 +8821,10 @@ /area/station/commons/fitness/recreation/entertainment) "bYe" = ( /obj/machinery/button/door/directional/west{ - id = "Toilet6"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "Toilet6"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/recharge_station, /obj/machinery/light/small/dim/directional/east, @@ -8880,8 +8894,8 @@ /area/station/science/lower) "bZh" = ( /obj/machinery/requests_console/directional/south{ - department = "Law Office"; - name = "Law Office Requests Console" + name = "Law Office Requests Console"; + department = "Law Office" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -8980,6 +8994,7 @@ /turf/open/floor/engine/cult, /area/station/service/library) "cay" = ( +/mob/living/basic/goat/pete, /obj/effect/turf_decal/weather/snow/corner{ dir = 10 }, @@ -8987,7 +9002,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/mob/living/basic/goat/pete, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "caN" = ( @@ -9030,8 +9044,8 @@ /area/station/science/ordnance/office) "cbn" = ( /obj/machinery/door/airlock{ - id_tag = "private_r"; - name = "Private Quarters R" + name = "Private Quarters R"; + id_tag = "private_r" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -9088,9 +9102,9 @@ pixel_y = 32 }, /obj/machinery/camera{ - c_tag = "Cargo - Main Office"; dir = 9; - network = list("ss13","cargo") + network = list("ss13","cargo"); + c_tag = "Cargo - Main Office" }, /obj/item/multitool, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -9108,8 +9122,8 @@ "ccO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "robotics2"; - name = "Robotics Lab Shutters" + name = "Robotics Lab Shutters"; + id = "robotics2" }, /turf/open/floor/plating, /area/station/science/robotics/lab) @@ -9236,8 +9250,8 @@ /area/station/engineering/atmos) "cew" = ( /obj/machinery/door/poddoor{ - id = "QMLoaddoor"; - name = "Supply Dock Loading Door" + name = "Supply Dock Loading Door"; + id = "QMLoaddoor" }, /obj/machinery/conveyor{ dir = 1; @@ -9266,19 +9280,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"cez" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Armory Desk"; - req_access = list("armory") - }, -/obj/machinery/door/window/left/directional/south{ - name = "Reception Desk"; - req_access = list("security") - }, -/obj/item/papercutter, -/turf/open/floor/plating, -/area/station/security/warden) "ceF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -9321,8 +9322,8 @@ /obj/item/wallframe/camera, /obj/item/assault_pod/mining, /obj/machinery/button/door/directional/south{ - id = "aux_base_shutters"; name = "Public Shutters Control"; + id = "aux_base_shutters"; req_access = list("aux_base") }, /turf/open/floor/iron, @@ -9417,9 +9418,9 @@ /obj/item/stack/license_plates/empty/fifty, /obj/item/stack/license_plates/empty/fifty, /obj/machinery/camera{ - c_tag = "Security - Prison Workshop"; dir = 6; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Workshop" }, /obj/item/stack/license_plates/empty/fifty, /obj/item/stack/license_plates/empty/fifty, @@ -9544,8 +9545,8 @@ /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 = "lefttunnel"; - name = "Tunnel Access Shutters Toggle" + name = "Tunnel Access Shutters Toggle"; + id = "lefttunnel" }, /turf/open/floor/plating, /area/station/maintenance/tram/left) @@ -9592,8 +9593,8 @@ }, /obj/item/assembly/timer, /obj/machinery/camera/directional/west{ - c_tag = "Science - Ordnance Launch Bay"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Ordnance Launch Bay" }, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, @@ -9650,14 +9651,6 @@ "clT" = ( /turf/closed/wall, /area/station/security/checkpoint/medical) -"cmj" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "cmo" = ( /obj/effect/turf_decal/siding/thinplating/end, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ @@ -9718,8 +9711,8 @@ /area/station/science/lobby) "coI" = ( /obj/machinery/door/airlock{ - id_tag = "miningdorm1"; - name = "Room 1" + name = "Room 1"; + id_tag = "miningdorm1" }, /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9776,6 +9769,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"cpK" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "cpR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -9799,8 +9808,8 @@ "cqn" = ( /obj/structure/table, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Virology Patient Room A"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Virology Patient Room A" }, /turf/open/floor/iron, /area/station/medical/virology) @@ -9850,8 +9859,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + id = "rndlab1" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9977,8 +9986,8 @@ }, /obj/item/clothing/glasses/science, /obj/machinery/requests_console/directional/west{ - department = "Pharmacy"; - name = "Pharmacy Requests Console" + name = "Pharmacy Requests Console"; + department = "Pharmacy" }, /obj/effect/mapping_helpers/requests_console/ore_update, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -10107,6 +10116,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/tram/mid) +"cvf" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Captain's Desk"; + req_access = list("captain") + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) +"cvg" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/landmark/start/assistant, +/obj/structure/sign/clock/directional/north, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "cvz" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -10136,8 +10163,8 @@ dir = 8 }, /obj/machinery/camera/directional/west{ - c_tag = "Medical - Main West"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main West" }, /obj/machinery/firealarm/directional/west, /obj/machinery/light/cold/directional/west, @@ -10344,8 +10371,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, /obj/machinery/door/poddoor/preopen{ - id = "containdeez4"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez4" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -10391,14 +10418,14 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/door/poddoor/shutters/preopen{ - id = "papersplease"; - name = "HoP Arrival Procedure Enforcement Shutters" + name = "HoP Arrival Procedure Enforcement Shutters"; + id = "papersplease" }, /obj/machinery/button/door/directional/south{ - id = "papersplease"; 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, @@ -10426,6 +10453,7 @@ c_tag = "Service - Hydroponics" }, /obj/effect/turf_decal/tile/green/fourcorners, +/obj/item/storage/box/syringes, /turf/open/floor/iron/dark, /area/station/service/hydroponics) "cAd" = ( @@ -10467,11 +10495,11 @@ pixel_y = 15 }, /obj/item/reagent_containers/cup/bottle{ - desc = "A small bottle of Barber's Aid."; - list_reagents = list(/datum/reagent/barbers_aid = 30); name = "Barber's Aid bottle"; + desc = "A small bottle of Barber's Aid."; pixel_x = 10; - pixel_y = 3 + pixel_y = 3; + list_reagents = list(/datum/reagent/barbers_aid=30) }, /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/wood/large, @@ -10482,19 +10510,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) -"cAS" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/right/directional/east{ - name = "Brig Infirmary" - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "cBo" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -10551,17 +10566,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) -"cDb" = ( -/obj/effect/spawner/random/bedsheet/double{ - dir = 4 - }, -/obj/structure/bed/double{ - dir = 4 - }, -/obj/structure/sign/clock/directional/north, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "cDd" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -10635,16 +10639,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"cEi" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "cEq" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics" @@ -10822,8 +10816,8 @@ "cGN" = ( /obj/structure/table/wood, /obj/item/pai_card{ - desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; - name = "\improper Nanotrasen-brand personal AI device exhibit" + name = "\improper Nanotrasen-brand personal AI device exhibit"; + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape." }, /obj/machinery/light/warm/directional/west, /turf/open/floor/carpet, @@ -11006,8 +11000,8 @@ dir = 9 }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez7"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez7" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -11018,8 +11012,8 @@ "cJS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "Test Chamber Blast Door" + name = "Test Chamber Blast Door"; + id = "testlab" }, /turf/open/floor/plating, /area/station/science/explab) @@ -11061,15 +11055,6 @@ /obj/item/weldingtool, /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) -"cKS" = ( -/obj/structure/bed{ - dir = 8 - }, -/obj/effect/spawner/random/bedsheet, -/obj/structure/sign/clock/directional/east, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "cLs" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/disposalpipe/segment{ @@ -11084,8 +11069,8 @@ "cMa" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Main North-East"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main North-East" }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) @@ -11182,8 +11167,8 @@ /area/station/commons/dorms) "cNU" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + name = "Radiation Chamber Shutters"; + id = "engsm" }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -11210,8 +11195,8 @@ dir = 8 }, /obj/machinery/power/shuttle_engine/propulsion{ - desc = "A standard reliable bluespace engine used by many forms of shuttles. This one has the bluespace core removed."; - name = "inactive propulsion engine" + name = "inactive propulsion engine"; + desc = "A standard reliable bluespace engine used by many forms of shuttles. This one has the bluespace core removed." }, /obj/effect/decal/cleanable/oil, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -11282,9 +11267,9 @@ /obj/machinery/power/smes/engineering, /obj/structure/sign/warning/electric_shock/directional/west, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - SMES"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - SMES" }, /obj/structure/cable, /obj/machinery/light/directional/west, @@ -11349,12 +11334,24 @@ /area/station/hallway/secondary/entry) "cPI" = ( /obj/machinery/camera/directional/east{ - c_tag = "Hallway - Port Tram Platform South"; - pixel_y = -23 + pixel_y = -23; + c_tag = "Hallway - Port Tram Platform South" }, /obj/machinery/light/directional/east, /turf/open/floor/noslip/tram, /area/station/hallway/primary/tram/left) +"cPK" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/sign/clock/directional/west, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "cPM" = ( /turf/closed/wall, /area/station/engineering/atmos) @@ -11455,8 +11452,8 @@ dir = 5 }, /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix Outlet Pump" + name = "Mix Outlet Pump"; + dir = 8 }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) @@ -11510,8 +11507,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez1"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez1" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -11596,17 +11593,6 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"cUk" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "cUB" = ( /obj/effect/landmark/start/shaft_miner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11648,12 +11634,7 @@ "cVk" = ( /obj/effect/turf_decal/box, /obj/machinery/shower/directional/east, -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) @@ -11789,6 +11770,23 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) +"cXt" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Isolation Cell C"; + id = "Isolation_C" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/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) "cXy" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, @@ -11876,14 +11874,14 @@ /area/station/engineering/supermatter/room) "cYA" = ( /obj/docking_port/stationary{ - dheight = 4; - dir = 2; - dwidth = 4; - height = 9; name = "Aux Base Zone"; - roundstart_template = /datum/map_template/shuttle/aux_base/default; + dir = 2; + width = 9; + height = 9; shuttle_id = "aux_base_zone"; - width = 9 + dwidth = 4; + dheight = 4; + roundstart_template = /datum/map_template/shuttle/aux_base/default }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) @@ -11928,8 +11926,8 @@ "cZN" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/sign/warning/directional/north{ - desc = "A sign warning you to be cautious of falling packages."; - name = "FALLING HAZARD sign" + name = "FALLING HAZARD sign"; + desc = "A sign warning you to be cautious of falling packages." }, /obj/machinery/light/small/directional/south, /turf/open/floor/plating, @@ -11970,14 +11968,6 @@ }, /turf/open/floor/wood/large, /area/station/service/theater) -"daq" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/effect/landmark/start/hangover, -/obj/structure/sign/clock/directional/north, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "dar" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -12015,22 +12005,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"daS" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "dbc" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -12140,9 +12114,9 @@ name = "Bar Delivery Chute" }, /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; + name = "navigation beacon (Bar Delivery)"; location = "Bar"; - name = "navigation beacon (Bar Delivery)" + codes_txt = "delivery;dir=1" }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) @@ -12182,16 +12156,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark, /area/station/commons/lounge) -"ddH" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Captain's Desk"; - req_access = list("captain") - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "ddM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -12305,6 +12269,10 @@ "dfz" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) +"dfC" = ( +/mob/living/basic/slime, +/turf/open/floor/engine, +/area/station/science/xenobiology) "dfE" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -12378,9 +12346,9 @@ dir = 8 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Lobby South"; dir = 6; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Lobby South" }, /turf/open/floor/iron, /area/station/engineering/break_room) @@ -12404,8 +12372,8 @@ /area/station/engineering/atmos) "dhg" = ( /obj/machinery/door/airlock{ - id_tag = "private_j"; - name = "Private Quarters J" + name = "Private Quarters J"; + id_tag = "private_j" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12417,8 +12385,8 @@ /area/station/medical/virology) "dhI" = ( /obj/machinery/camera/directional/east{ - c_tag = "Hallway - Central Tram Platform South"; - pixel_y = -23 + pixel_y = -23; + c_tag = "Hallway - Central Tram Platform South" }, /obj/machinery/light/directional/east, /turf/open/floor/noslip/tram, @@ -12639,16 +12607,16 @@ "dmx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_lower_upper_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_lower_upper_eva_external"; - idSelf = "middleright_lower_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleright_lower_upper_eva_airlock_control"; + idDoor = "middleright_lower_upper_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -12657,8 +12625,8 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/decal/cleanable/dirt, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=TramLower1"; - location = "TramLower16" + location = "TramLower16"; + codes_txt = "patrol;next_patrol=TramLower1" }, /obj/effect/turf_decal/bot{ dir = 1 @@ -12678,9 +12646,9 @@ dir = 1 }, /obj/machinery/status_display/door_timer{ - id = "Isolation_A"; name = "Isolation Cell A"; - pixel_y = 32 + pixel_y = 32; + id = "Isolation_A" }, /turf/open/floor/iron, /area/station/security/execution/transfer) @@ -12705,16 +12673,16 @@ "dnp" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_lower_eva_external"; - idSelf = "middleleft_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleleft_lower_eva_airlock_control"; + idDoor = "middleleft_lower_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, @@ -12800,23 +12768,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) -"dpd" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Isolation Cell B"; - id = "Isolation_B" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/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) "dpk" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/dark, @@ -12898,19 +12849,11 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"drg" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "drh" = ( /obj/structure/table, /obj/machinery/fax{ - fax_name = "Pre-Trial"; - name = "Pre-Trial Fax Machine" + name = "Pre-Trial Fax Machine"; + fax_name = "Pre-Trial" }, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) @@ -12946,21 +12889,21 @@ dir = 8 }, /obj/machinery/lift_indicator/directional/west{ - linked_elevator_id = "tram_cargo_lift"; pixel_x = -27; - pixel_y = -2 + pixel_y = -2; + linked_elevator_id = "tram_cargo_lift" }, /obj/machinery/button/elevator/directional/west{ - id = "tram_cargo_lift"; pixel_x = -26; - pixel_y = -1 + pixel_y = -1; + id = "tram_cargo_lift" }, /turf/open/floor/iron, /area/station/cargo/storage) "drE" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "prisondorm"; - name = "Prison Dorm 2" + name = "Prison Dorm 2"; + id_tag = "prisondorm" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -13001,9 +12944,9 @@ }, /obj/machinery/keycard_auth/directional/north, /obj/machinery/button/door/directional/north{ - id = "cmoshutter"; name = "CMO Privacy Shutters"; pixel_y = 38; + id = "cmoshutter"; req_access = list("cmo") }, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -13043,15 +12986,6 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/brig) -"dtd" = ( -/obj/structure/bed{ - dir = 8 - }, -/obj/effect/spawner/random/bedsheet, -/obj/structure/sign/clock/directional/east, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "dte" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13066,8 +13000,8 @@ /area/station/command/meeting_room) "dtz" = ( /obj/machinery/flasher/directional/east{ - id = "AI"; - pixel_y = 26 + pixel_y = 26; + id = "AI" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) @@ -13092,6 +13026,17 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"duA" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "duB" = ( /turf/closed/wall/r_wall, /area/station/security/prison/garden) @@ -13214,26 +13159,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"dxy" = ( -/obj/machinery/door/window/brigdoor/left/directional/east{ - id = "crgcell"; - name = "Cargo Cell"; - req_access = list("security") - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "dxC" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) @@ -13275,8 +13200,8 @@ dir = 6 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Air Outlet Pump" + name = "Air Outlet Pump"; + dir = 1 }, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -13482,8 +13407,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/poddoor/preopen{ - id = "rdoffice"; - name = "Research Director's Shutters" + name = "Research Director's Shutters"; + id = "rdoffice" }, /obj/structure/disposalpipe/segment{ dir = 8 @@ -13588,16 +13513,16 @@ "dEH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_upper_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_upper_eva_internal"; - idSelf = "middleleft_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleleft_upper_eva_airlock_control"; + idDoor = "middleleft_upper_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -13675,9 +13600,9 @@ /obj/item/storage/box/deputy, /obj/item/radio/intercom/directional/west, /obj/machinery/button/door/directional/west{ - id = "HOSOffice"; name = "Emergency Blast Doors"; pixel_y = -8; + id = "HOSOffice"; req_access = list("hos") }, /turf/open/floor/carpet, @@ -13691,8 +13616,8 @@ /area/station/hallway/secondary/command) "dFN" = ( /obj/machinery/door/poddoor/shutters{ - id = "secmechbay"; - name = "Security Mech Bay Shutters" + name = "Security Mech Bay Shutters"; + id = "secmechbay" }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -13761,8 +13686,8 @@ dir = 9 }, /obj/machinery/button/door{ - id = "containdeez1"; - name = "Cell Containment Toggle Button" + name = "Cell Containment Toggle Button"; + id = "containdeez1" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -13791,8 +13716,8 @@ /area/station/medical/treatment_center) "dHF" = ( /obj/machinery/camera{ - c_tag = "Arrivals - Lounge"; - dir = 6 + dir = 6; + c_tag = "Arrivals - Lounge" }, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -13936,9 +13861,9 @@ /area/station/security/processing) "dKv" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Mixing Chamber"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Mixing Chamber" }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) @@ -14035,8 +13960,8 @@ /area/station/engineering/atmos) "dLS" = ( /obj/machinery/turretid{ - icon_state = "control_stun"; name = "AI Chamber turret control"; + icon_state = "control_stun"; pixel_x = 3; pixel_y = -23 }, @@ -14189,6 +14114,21 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"dOM" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "dPe" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -14200,8 +14140,8 @@ /area/station/science/research) "dPo" = ( /obj/machinery/camera/directional/north{ - c_tag = "Medical - Morgue"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Morgue" }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/bodycontainer/morgue{ @@ -14242,8 +14182,8 @@ dir = 5 }, /obj/machinery/button/door{ - id = "containdeez7"; - name = "Cell Containment Toggle Button" + name = "Cell Containment Toggle Button"; + id = "containdeez7" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -14370,6 +14310,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating/airless, /area/station/engineering/supermatter/room) +"dRz" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/structure/sign/clock/directional/south, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "dRJ" = ( /obj/structure/cable, /turf/open/floor/iron/cafeteria, @@ -14618,18 +14569,18 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "dWi" = ( +/mob/living/simple_animal/bot/secbot/beepsky, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, -/mob/living/simple_animal/bot/secbot/beepsky, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) "dWj" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics CO2 Chamber"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics CO2 Chamber" }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) @@ -14782,8 +14733,8 @@ "eam" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ - id_tag = "prisondorm"; - name = "Prison Dorm 6" + name = "Prison Dorm 6"; + id_tag = "prisondorm" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -15085,13 +15036,13 @@ dir = 8 }, /obj/machinery/camera/directional/south{ - c_tag = "Secure - AI Minisat Teleporter"; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Minisat Teleporter" }, /obj/machinery/button/door/directional/south{ - id = "teledoor"; name = "MiniSat Shutter Control"; pixel_x = 8; + id = "teledoor"; req_one_access = list("teleporter","minisat") }, /turf/open/floor/iron/dark, @@ -15208,8 +15159,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ - id = "playerscantreadthis"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + id = "playerscantreadthis" }, /obj/item/reagent_containers/condiment/saltshaker{ pixel_x = -3 @@ -15222,16 +15173,16 @@ "ejR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_lower_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_lower_lower_eva_external"; - idSelf = "rightmost_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "rightmost_lower_lower_eva_airlock_control"; + idDoor = "rightmost_lower_lower_eva_external" }, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/right) @@ -15282,16 +15233,6 @@ "ekB" = ( /turf/closed/wall, /area/station/service/janitor) -"ekE" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/item/stamp/head/captain, -/obj/machinery/door/window/right/directional/south{ - name = "Captain's Desk"; - req_access = list("captain") - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "ekL" = ( /obj/machinery/conveyor{ dir = 1; @@ -15395,8 +15336,8 @@ "emP" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "rdoffice"; - name = "Research Director's Shutters" + name = "Research Director's Shutters"; + id = "rdoffice" }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -15512,8 +15453,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "Test Chamber Blast Door" + name = "Test Chamber Blast Door"; + id = "testlab" }, /turf/open/floor/iron/dark, /area/station/science/explab) @@ -15527,16 +15468,6 @@ /obj/effect/landmark/navigate_destination/tcomms, /turf/open/floor/iron, /area/station/tcommsat/computer) -"eqo" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #1" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "eqJ" = ( /obj/structure/cable/layer1, /obj/structure/cable, @@ -15547,16 +15478,16 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_upper_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_upper_eva_external"; - idSelf = "middleright_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleright_upper_eva_airlock_control"; + idDoor = "middleright_upper_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -15606,8 +15537,8 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Hallway - Upper Right Command"; - dir = 10 + dir = 10; + c_tag = "Hallway - Upper Right Command" }, /obj/machinery/newscaster/directional/west, /turf/open/floor/iron, @@ -15636,10 +15567,10 @@ }, /area/station/command/bridge) "esi" = ( +/mob/living/basic/bot/cleanbot, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/mob/living/basic/bot/cleanbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "esA" = ( @@ -15673,8 +15604,8 @@ /obj/structure/lattice/catwalk, /obj/structure/cable, /obj/machinery/power/solar{ - id = "portsolar"; - name = "Port Solar Array" + name = "Port Solar Array"; + id = "portsolar" }, /turf/open/space/openspace, /area/station/solars/port) @@ -15708,12 +15639,12 @@ dir = 1 }, /obj/machinery/button/door/directional/north{ - id = "QMLoaddoor"; - pixel_x = -6 + pixel_x = -6; + id = "QMLoaddoor" }, /obj/machinery/button/door/directional/north{ - id = "QMLoaddoor2"; - pixel_x = 6 + pixel_x = 6; + id = "QMLoaddoor2" }, /obj/machinery/camera/directional/north{ c_tag = "Cargo - Warehouse North" @@ -15728,10 +15659,10 @@ dir = 4 }, /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") + req_access = list("minisat"); + control_area = "/area/station/ai_monitored/turret_protected/ai_upload" }, /turf/open/floor/iron/dark, /area/station/science/lower) @@ -15918,8 +15849,8 @@ /obj/structure/table, /obj/effect/turf_decal/stripes/line, /obj/machinery/button/door{ - id = "containdeez4"; - name = "Cell Containment Toggle Button" + name = "Cell Containment Toggle Button"; + id = "containdeez4" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -15968,8 +15899,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/docking{ - desc = "A warning sign which reads 'KEEP CLEAR OF TRAM DOCKING AREA'."; name = "KEEP CLEAR: TRAM DOCKING AREA sign"; + desc = "A warning sign which reads 'KEEP CLEAR OF TRAM DOCKING AREA'."; pixel_y = 32 }, /obj/effect/turf_decal/siding/thinplating, @@ -16154,8 +16085,8 @@ }, /obj/structure/sign/poster/official/safety_internals/directional/west, /obj/machinery/camera/directional/west{ - c_tag = "Cargo - Public Mining Dock"; - network = list("ss13","cargo") + network = list("ss13","cargo"); + c_tag = "Cargo - Public Mining Dock" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -16170,8 +16101,8 @@ dir = 6 }, /obj/machinery/camera/directional/north{ - c_tag = "Science - Lower Hall West"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Lower Hall West" }, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/white, @@ -16201,9 +16132,9 @@ dir = 6 }, /obj/machinery/camera{ - c_tag = "Security - Prison Main South-East"; dir = 6; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Main South-East" }, /turf/open/floor/iron, /area/station/security/prison) @@ -16260,8 +16191,8 @@ /area/station/cargo/warehouse) "eCR" = ( /obj/machinery/door/airlock{ - id_tag = "private_h"; - name = "Private Quarters H" + name = "Private Quarters H"; + id_tag = "private_h" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16427,17 +16358,6 @@ }, /turf/open/openspace, /area/station/asteroid) -"eGY" = ( -/obj/machinery/mass_driver/chapelgun, -/obj/machinery/door/window/left/directional/north{ - name = "Mass Driver"; - req_access = list("chapel_office") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/chapel/monastery) "eHj" = ( /obj/machinery/vending/tool, /obj/machinery/airalarm/directional/east, @@ -16490,8 +16410,8 @@ }, /obj/machinery/newscaster/directional/south, /obj/machinery/fax{ - fax_name = "Psychology Office"; - name = "Psychology Office Fax Machine" + name = "Psychology Office Fax Machine"; + fax_name = "Psychology Office" }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) @@ -16809,12 +16729,7 @@ /area/station/science/auxlab/firing_range) "ePS" = ( /obj/machinery/shower/directional/west, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, @@ -16924,8 +16839,8 @@ /area/station/maintenance/tram/mid) "eRQ" = ( /obj/machinery/camera{ - c_tag = "Hallway - Starboard Tram Platform South-East"; - dir = 6 + dir = 6; + c_tag = "Hallway - Starboard Tram Platform South-East" }, /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/disposalpipe/segment, @@ -17091,8 +17006,8 @@ dir = 4 }, /obj/machinery/camera/directional/west{ - c_tag = "Medical - Chief Medical Officer's Office"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Chief Medical Officer's Office" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -17106,22 +17021,22 @@ "eVl" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; name = "Custom Channel"; - pixel_x = -6 + pixel_x = -6; + listening = 0; + freerange = 1 }, /obj/item/radio/intercom/directional/west{ - freerange = 1; + name = "Common Channel"; listening = 0; - name = "Common Channel" + freerange = 1 }, /obj/item/radio/intercom/directional/south{ - freerange = 1; + name = "Private Channel"; + pixel_x = -6; frequency = 1447; listening = 0; - name = "Private Channel"; - pixel_x = -6 + freerange = 1 }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) @@ -17142,23 +17057,6 @@ "eVz" = ( /turf/open/floor/grass, /area/station/service/hydroponics) -"eVB" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/security/glass{ - name = "Isolation Cell A"; - id = "Isolation_A" - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "eVC" = ( /obj/effect/spawner/random/decoration/showcase, /obj/structure/window/reinforced/spawner/directional/north, @@ -17258,26 +17156,16 @@ /area/station/security/checkpoint/supply) "eYn" = ( /obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 15; name = "arrivals"; - roundstart_template = /datum/map_template/shuttle/arrival/box; + dir = 8; + width = 7; + height = 15; shuttle_id = "arrival_stationary"; - width = 7 + dwidth = 3; + roundstart_template = /datum/map_template/shuttle/arrival/box }, /turf/open/space/openspace, /area/space) -"eYr" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/machinery/transport/power_rectifier, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "eYs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -17337,8 +17225,8 @@ }, /obj/effect/landmark/start/assistant, /obj/machinery/camera/directional/south{ - c_tag = "Science - Front Lobby"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Front Lobby" }, /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white, @@ -17347,8 +17235,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/corner, /obj/structure/frame/computer{ - anchored = 1; - dir = 4 + dir = 4; + anchored = 1 }, /obj/item/stack/cable_coil{ amount = 15 @@ -17419,19 +17307,6 @@ dir = 8 }, /area/station/command/bridge) -"faH" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Science - Research & Development"; - network = list("ss13","rd") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lab) "faN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -17445,8 +17320,8 @@ }, /obj/item/radio/intercom/directional/west, /obj/machinery/camera/directional/west{ - c_tag = "Science - Upper Hall Right"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Upper Hall Right" }, /turf/open/floor/iron/white, /area/station/science/research) @@ -17483,6 +17358,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) +"fdc" = ( +/obj/machinery/brm, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "fdr" = ( /obj/machinery/duct, /obj/structure/cable, @@ -17571,8 +17454,8 @@ dir = 5 }, /obj/machinery/camera/directional/north{ - c_tag = "Science - Lower Hall East"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Lower Hall East" }, /turf/open/floor/iron/white, /area/station/science/lower) @@ -17590,10 +17473,21 @@ }, /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) "ffE" = ( /obj/machinery/door/airlock{ - id_tag = "Toilet1"; - name = "Unit 1" + name = "Unit 1"; + id_tag = "Toilet1" }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) @@ -17658,8 +17552,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ - id = "playerscantreadthis"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + id = "playerscantreadthis" }, /turf/open/floor/iron/checker, /area/station/service/kitchen) @@ -17699,8 +17593,8 @@ }, /obj/effect/turf_decal/tile/purple/fourcorners, /obj/machinery/door/poddoor/shutters/preopen{ - id = "robotics2"; - name = "Robotics Lab Shutters" + name = "Robotics Lab Shutters"; + id = "robotics2" }, /turf/open/floor/iron/white/side{ dir = 1 @@ -17711,8 +17605,8 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Hallway - Engineering Entry West"; - dir = 10 + dir = 10; + c_tag = "Hallway - Engineering Entry West" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17901,8 +17795,8 @@ /area/station/hallway/secondary/exit/departure_lounge) "fkL" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Plasma Outlet Pump" + name = "Plasma Outlet Pump"; + dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -18249,17 +18143,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"fqG" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 4 - }, -/obj/structure/sign/clock/directional/west, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "fqM" = ( /obj/structure/disposaloutlet{ dir = 8 @@ -18372,18 +18255,18 @@ /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/virology{ - autoclose = 0; + name = "Virology Interior Airlock"; frequency = 1449; id_tag = "virology_airlock_interior"; - name = "Virology Interior Airlock" + autoclose = 0 }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door_buttons/access_button{ - idDoor = "virology_airlock_interior"; - idSelf = "virology_airlock_control"; name = "Virology Access Button"; pixel_y = 24; - req_access = list("virology") + req_access = list("virology"); + idSelf = "virology_airlock_control"; + idDoor = "virology_airlock_interior" }, /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /obj/structure/cable, @@ -18470,6 +18353,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"ftZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/hallway/primary/tram/right) "fuj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, @@ -18505,9 +18392,9 @@ dir = 1 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Entry Airlock"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Entry Airlock" }, /obj/item/tank/internals/emergency_oxygen{ pixel_x = -8 @@ -18840,18 +18727,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/commons/storage/tools) -"fDB" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/computer/department_orders/science{ - dir = 4 - }, -/turf/open/floor/glass/reinforced, -/area/station/science/research) "fDS" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room" @@ -18968,8 +18843,8 @@ /area/station/maintenance/tram/mid) "fFi" = ( /obj/machinery/door/airlock{ - id_tag = "private_g"; - name = "Private Quarters G" + name = "Private Quarters G"; + id_tag = "private_g" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18989,8 +18864,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez2"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez2" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -19047,14 +18922,14 @@ /turf/open/floor/iron, /area/station/commons/dorms) "fGK" = ( -/obj/structure/window/reinforced/spawner/directional/west, /mob/living/carbon/human/species/monkey, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/misc/grass/jungle, /area/station/science/explab) "fHg" = ( /obj/structure/chair{ - dir = 1; - name = "Prosecution" + name = "Prosecution"; + dir = 1 }, /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, @@ -19079,31 +18954,31 @@ /area/station/service/theater) "fHz" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Air Chamber"; dir = 6; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Air Chamber" }, /turf/open/floor/engine/air, /area/station/engineering/atmos) "fHR" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; name = "Custom Channel"; - pixel_x = 6 + pixel_x = 6; + listening = 0; + freerange = 1 }, /obj/item/radio/intercom/directional/east{ - freerange = 1; + name = "Common Channel"; listening = 0; - name = "Common Channel" + freerange = 1 }, /obj/item/radio/intercom/directional/south{ - freerange = 1; + name = "Private Channel"; + pixel_x = 6; frequency = 1447; listening = 0; - name = "Private Channel"; - pixel_x = 6 + freerange = 1 }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) @@ -19127,16 +19002,6 @@ dir = 8 }, /area/station/science/lobby) -"fIs" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Incoming Mail"; - req_access = list("shipping") - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "fIB" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -19207,15 +19072,12 @@ dir = 9 }, /obj/machinery/newscaster/directional/north, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 4 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white, /area/station/science/lab) -"fKd" = ( -/turf/closed/wall, -/area/station/science/auxlab/firing_range) "fKg" = ( /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, @@ -19256,6 +19118,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lower) +"fKO" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) "fKW" = ( /obj/structure/table/glass, /obj/item/radio/intercom/command, @@ -19318,11 +19184,11 @@ "fLJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "rightmost_lower_lower_eva_external"; - idInterior = "rightmost_lower_lower_eva_internal"; - idSelf = "rightmost_lower_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = 24 + pixel_y = 24; + idSelf = "rightmost_lower_lower_eva_airlock_control"; + idInterior = "rightmost_lower_lower_eva_internal"; + idExterior = "rightmost_lower_lower_eva_external" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, @@ -19373,8 +19239,8 @@ /area/station/maintenance/disposal/incinerator) "fLY" = ( /obj/machinery/door/poddoor/shutters{ - id = "secmechbay"; - name = "Security Mech Bay Shutters" + name = "Security Mech Bay Shutters"; + id = "secmechbay" }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -19452,17 +19318,17 @@ "fNX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_lower_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_lower_lower_eva_internal"; - idSelf = "middleright_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_x = 24 + pixel_x = 24; + idSelf = "middleright_lower_lower_eva_airlock_control"; + idDoor = "middleright_lower_lower_eva_internal" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19492,23 +19358,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"fOZ" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/effect/spawner/random/decoration/statue{ - spawn_loot_chance = 50 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/west{ - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/turf/open/floor/wood/large, -/area/station/service/library) "fPv" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ @@ -19520,8 +19369,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez1"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez1" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -19532,8 +19381,8 @@ "fPJ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #4" + location = "QM #4"; + codes_txt = "delivery;dir=1" }, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, @@ -19559,8 +19408,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez5"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez5" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -19574,8 +19423,8 @@ "fQH" = ( /obj/effect/turf_decal/delivery, /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #5" + location = "QM #5"; + codes_txt = "delivery;dir=1" }, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, @@ -19593,8 +19442,8 @@ /area/station/engineering/supermatter/room) "fQV" = ( /obj/machinery/button/door/directional/east{ - id = "offstationaccess"; - pixel_y = -10 + pixel_y = -10; + id = "offstationaccess" }, /obj/effect/turf_decal/stripes/corner, /obj/structure/table, @@ -19636,6 +19485,13 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/science/explab) +"fRb" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "fRs" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -19706,8 +19562,8 @@ "fSY" = ( /obj/structure/table/reinforced, /obj/machinery/computer/security/telescreen{ - dir = 4; name = "Cargo Camera Monitor"; + dir = 4; network = list("ss13","cargo") }, /obj/item/radio/intercom/directional/west, @@ -19749,8 +19605,8 @@ "fTM" = ( /obj/structure/table, /obj/machinery/requests_console/directional/east{ - department = "EVA"; - name = "EVA Requests Console" + name = "EVA Requests Console"; + department = "EVA" }, /obj/effect/mapping_helpers/requests_console/assistance, /obj/machinery/cell_charger, @@ -20152,8 +20008,8 @@ /area/station/commons/dorms) "gba" = ( /obj/machinery/requests_console/directional/south{ - department = "Cargo Bay"; - name = "Cargo Bay Requests Console" + name = "Cargo Bay Requests Console"; + department = "Cargo Bay" }, /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/mapping_helpers/requests_console/assistance, @@ -20261,8 +20117,8 @@ /area/station/engineering/atmos) "gdC" = ( /obj/machinery/door/airlock{ - id_tag = "ToiletSci2"; - name = "Private Stall 2" + name = "Private Stall 2"; + id_tag = "ToiletSci2" }, /turf/open/floor/iron/freezer, /area/station/science/lower) @@ -20277,9 +20133,9 @@ }, /obj/structure/sign/poster/contraband/atmosia_independence/directional/north, /obj/machinery/conveyor_switch/oneway{ - id = "hydrodropoff"; name = "Shipment Delivery Chute Activator"; - pixel_x = 10 + pixel_x = 10; + id = "hydrodropoff" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -20301,8 +20157,8 @@ dir = 5 }, /obj/machinery/camera/directional/north{ - c_tag = "Science - Firing Range"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Firing Range" }, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) @@ -20378,8 +20234,8 @@ /area/station/science/ordnance/testlab) "ggw" = ( /obj/machinery/door/poddoor{ - id = "QMLoaddoor2"; - name = "Supply Dock Loading Door" + name = "Supply Dock Loading Door"; + id = "QMLoaddoor2" }, /obj/machinery/conveyor{ id = "QMLoad2" @@ -20417,8 +20273,8 @@ dir = 8 }, /obj/machinery/camera/directional/west{ - c_tag = "Science - Entrance Airlock"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Entrance Airlock" }, /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/white, @@ -20593,9 +20449,9 @@ dir = 4 }, /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; + name = "navigation beacon (Science Delivery)"; location = "Science"; - name = "navigation beacon (Science Delivery)" + codes_txt = "delivery;dir=4" }, /turf/open/floor/plating, /area/station/maintenance/department/science) @@ -20687,8 +20543,8 @@ "glp" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "cytologysecure2"; - name = "Secure Pen Lockdown" + name = "Secure Pen Lockdown"; + id = "cytologysecure2" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -20794,8 +20650,8 @@ /area/station/science/xenobiology) "gnj" = ( /obj/modular_map_root/tramstation{ - key = "medsciupper"; - name = "medsciupper" + name = "medsciupper"; + key = "medsciupper" }, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/center) @@ -20902,8 +20758,8 @@ }, /obj/item/radio/intercom/directional/east, /obj/machinery/camera/directional/east{ - c_tag = "Medical - Main East"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main East" }, /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/white, @@ -20994,8 +20850,8 @@ /area/station/hallway/secondary/entry) "gqf" = ( /obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber" + name = "Supermatter Chamber"; + heat_proof = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -21167,8 +21023,8 @@ dir = 4 }, /obj/machinery/camera/motion/directional/north{ - c_tag = "Secure - AI Lower Ring Access"; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Lower Ring Access" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -21317,11 +21173,11 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 }, -/obj/machinery/disposal/bin, /obj/machinery/newscaster/directional/north, /obj/structure/disposalpipe/trunk{ dir = 4 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/engineering/main) "gxV" = ( @@ -21329,8 +21185,8 @@ dir = 2 }, /obj/machinery/camera/directional/north{ - c_tag = "Science - Mech Bay"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Mech Bay" }, /obj/machinery/light/directional/north, /turf/open/floor/plating, @@ -21400,18 +21256,6 @@ "gyP" = ( /turf/closed/wall, /area/station/science/robotics/mechbay) -"gzs" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gzw" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/office) @@ -21499,8 +21343,8 @@ "gAQ" = ( /obj/structure/table, /obj/machinery/door/poddoor/shutters{ - id = "commissarydeezdoorz"; - name = "Vacant Commissary Shutters" + name = "Vacant Commissary Shutters"; + id = "commissarydeezdoorz" }, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) @@ -21626,13 +21470,13 @@ dir = 8 }, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "virology_airlock_exterior"; - idInterior = "virology_airlock_interior"; - idSelf = "virology_airlock_control"; name = "Virology Access Console"; pixel_x = -24; pixel_y = 24; - req_access = list("virology") + req_access = list("virology"); + idSelf = "virology_airlock_control"; + idInterior = "virology_airlock_interior"; + idExterior = "virology_airlock_exterior" }, /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -21713,11 +21557,11 @@ "gEC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleright_upper_eva_external"; - idInterior = "middleright_upper_eva_internal"; - idSelf = "middleright_upper_eva_airlock_control"; name = "External Access Console"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleright_upper_eva_airlock_control"; + idInterior = "middleright_upper_eva_internal"; + idExterior = "middleright_upper_eva_external" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -21808,8 +21652,8 @@ /area/station/maintenance/tram/right) "gFI" = ( /obj/machinery/door/airlock{ - id_tag = "private_n"; - name = "Private Quarters N" + name = "Private Quarters N"; + id_tag = "private_n" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21826,8 +21670,8 @@ /area/station/security/checkpoint/science) "gGb" = ( /obj/structure/sign/warning/secure_area{ - desc = "A warning sign which reads 'BOMB RANGE"; - name = "BOMB RANGE" + name = "BOMB RANGE"; + desc = "A warning sign which reads 'BOMB RANGE" }, /turf/closed/wall, /area/station/science/ordnance/bomb) @@ -21851,8 +21695,8 @@ dir = 10 }, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Chemistry Airlock"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Chemistry Airlock" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -21889,18 +21733,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) -"gHs" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/structure/sign/clock/directional/west, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "gHx" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21937,8 +21769,8 @@ /area/station/engineering/atmos/pumproom) "gIj" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1; - name = "Oxygen Tank Injection Port" + name = "Oxygen Tank Injection Port"; + dir = 1 }, /obj/effect/turf_decal/box, /obj/effect/turf_decal/stripes/line, @@ -22063,6 +21895,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/eva) +"gLa" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Isolation Cell B"; + id = "Isolation_B" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/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) "gLd" = ( /obj/machinery/field/generator, /obj/effect/turf_decal/stripes/line, @@ -22126,17 +21975,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"gMV" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/structure/sign/departments/evac/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "gNc" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "crgdoor"; - name = "Security Post - Cargo" + name = "Security Post - Cargo"; + id_tag = "crgdoor" }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -22195,6 +22037,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"gNK" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Armory Desk"; + req_access = list("armory") + }, +/obj/machinery/door/window/left/directional/south{ + name = "Reception Desk"; + req_access = list("security") + }, +/obj/item/papercutter, +/turf/open/floor/plating, +/area/station/security/warden) "gNN" = ( /obj/machinery/vending/wardrobe/coroner_wardrobe, /obj/structure/window/reinforced/spawner/directional/west, @@ -22254,16 +22109,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) -"gOB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/personal, -/obj/effect/spawner/random/bureaucracy/briefcase, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "gOF" = ( /obj/structure/fluff/tram_rail/floor{ dir = 1 @@ -22278,8 +22123,8 @@ dir = 4 }, /obj/machinery/door/poddoor/preopen{ - id = "Sciencelockdown"; - name = "Research Lockdown Blastdoor" + name = "Research Lockdown Blastdoor"; + id = "Sciencelockdown" }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, @@ -22401,11 +22246,11 @@ dir = 6 }, /obj/machinery/computer/security/telescreen{ + name = "Prison Monitor"; desc = "Used for watching Prison Wing holding areas."; dir = 8; - name = "Prison Monitor"; - network = list("prison"); - pixel_x = 30 + pixel_x = 30; + network = list("prison") }, /obj/structure/disposalpipe/segment{ dir = 9 @@ -22442,9 +22287,9 @@ dir = 5 }, /obj/machinery/camera{ - c_tag = "Security - Prison Cell 6"; dir = 6; - network = list("ss13","Security","prison","pcell") + network = list("ss13","Security","prison","pcell"); + c_tag = "Security - Prison Cell 6" }, /turf/open/floor/iron, /area/station/security/prison/safe) @@ -22542,11 +22387,11 @@ "gTY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleleft_lower_lower_eva_external"; - idInterior = "middleleft_lower_lower_eva_internal"; - idSelf = "middleleft_lower_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleleft_lower_lower_eva_airlock_control"; + idInterior = "middleleft_lower_lower_eva_internal"; + idExterior = "middleleft_lower_lower_eva_external" }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, @@ -22585,8 +22430,8 @@ dir = 1 }, /obj/machinery/camera/directional/south{ - c_tag = "Secure - AI Upper Ring North"; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Upper Ring North" }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -22637,12 +22482,7 @@ /area/station/commons/fitness/recreation) "gWt" = ( /obj/effect/turf_decal/box, -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/machinery/shower/directional/west, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, @@ -22659,12 +22499,12 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "gWx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /mob/living/simple_animal/bot/secbot/pingsky{ 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/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) "gWD" = ( @@ -22709,6 +22549,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"gXH" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "gYd" = ( /obj/machinery/rnd/production/techfab/department/security, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -22922,9 +22769,9 @@ /obj/structure/table, /obj/machinery/status_display/ai/directional/south, /obj/machinery/camera{ - c_tag = "Secure - AI Minisat Entry"; dir = 10; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Minisat Entry" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -22954,8 +22801,8 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "hdT" = ( -/obj/structure/bed/dogbed/renault, /mob/living/basic/pet/fox/renault, +/obj/structure/bed/dogbed/renault, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) "hee" = ( @@ -22998,6 +22845,23 @@ dir = 8 }, /area/station/ai_monitored/command/storage/eva) +"heS" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/directional/east{ + c_tag = "Departures - West Main" + }, +/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/landmark/transport/nav_beacon/tram/nav/immovable_rod, +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "heY" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable, @@ -23019,12 +22883,21 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Secure - AI Upper Ring West"; dir = 6; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Upper Ring West" }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) +"hft" = ( +/obj/structure/bed{ + dir = 8 + }, +/obj/effect/spawner/random/bedsheet, +/obj/structure/sign/clock/directional/east, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "hfy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23063,24 +22936,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"hgo" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Delivery Desk"; - req_access = list("shipping") - }, -/obj/structure/desk_bell{ - pixel_x = -7 - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) "hgG" = ( /obj/structure/sign/warning/secure_area/directional/north, /obj/structure/disposalpipe/segment{ @@ -23104,7 +22959,7 @@ /area/station/command/bridge) "hhf" = ( /obj/machinery/power/smes{ - charge = 5e+006 + charge = 5e+06 }, /obj/structure/cable, /turf/open/floor/circuit, @@ -23135,8 +22990,8 @@ /area/station/service/library) "hhJ" = ( /obj/machinery/requests_console/directional/east{ - department = "Captain's Desk"; - name = "Captain's Requests Console" + name = "Captain's Requests Console"; + department = "Captain's Desk" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/assistance, @@ -23227,9 +23082,9 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Security - Rec Room East"; dir = 6; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Rec Room East" }, /turf/open/floor/iron, /area/station/security/prison/workout) @@ -23271,17 +23126,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"hjf" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 4 - }, -/obj/structure/sign/clock/directional/south, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "hjo" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -23293,14 +23137,14 @@ /area/station/cargo/sorting) "hjv" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Distribution Loop"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Distribution Loop" }, /obj/machinery/power/apc/auto_name/directional/north, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to Distro" + name = "Air to Distro"; + dir = 8 }, /obj/structure/cable, /turf/open/floor/iron, @@ -23486,8 +23330,8 @@ /area/station/engineering/gravity_generator) "hmR" = ( /obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Drone Launch Room"; - pixel_x = 14 + pixel_x = 14; + c_tag = "Cargo Bay - Drone Launch Room" }, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -23496,16 +23340,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"hmT" = ( -/obj/structure/bed{ - dir = 8 - }, -/obj/effect/spawner/random/bedsheet, -/obj/effect/landmark/start/assistant, -/obj/structure/sign/clock/directional/east, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "hmZ" = ( /obj/structure/sign/poster/official/space_cops/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -23597,15 +23431,15 @@ dir = 10 }, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8; - name = "Exfiltrate Port" + name = "Exfiltrate Port"; + dir = 8 }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) "hpf" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Engine" + name = "Mix to Engine"; + dir = 8 }, /obj/structure/cable, /turf/open/floor/iron, @@ -23650,11 +23484,11 @@ pixel_y = 2 }, /obj/item/reagent_containers/cup/bottle{ - desc = "A small bottle of Barber's Aid."; - list_reagents = list(/datum/reagent/barbers_aid = 30); name = "Barber's Aid bottle"; + desc = "A small bottle of Barber's Aid."; pixel_x = -2; - pixel_y = 10 + pixel_y = 10; + list_reagents = list(/datum/reagent/barbers_aid=30) }, /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/wood/large, @@ -23664,16 +23498,16 @@ dir = 8 }, /obj/machinery/computer/security/telescreen{ + name = "AI Upload Monitor"; desc = "Used for watching the ai_upload."; dir = 4; - name = "AI Upload Monitor"; - network = list("aiupload"); - pixel_x = -28 + pixel_x = -28; + network = list("aiupload") }, /obj/item/kirbyplants/photosynthetic, /obj/machinery/camera/directional/west{ - c_tag = "Science - AI Access Hallway"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - AI Access Hallway" }, /turf/open/floor/iron/dark, /area/station/science/lower) @@ -23743,16 +23577,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"hsn" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "hss" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "prisondorm"; - name = "Prison Dorm 1" + name = "Prison Dorm 1"; + id_tag = "prisondorm" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -23767,23 +23595,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"hsH" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/machinery/camera/directional/east{ - c_tag = "Departures - West Main" - }, -/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/landmark/transport/nav_beacon/tram/nav/immovable_rod, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "hsN" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -23818,8 +23629,8 @@ "htr" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ - id = "bunkermodeactivated"; - name = "Bridge Blast Door" + name = "Bridge Blast Door"; + id = "bunkermodeactivated" }, /obj/machinery/door/firedoor, /turf/open/floor/iron, @@ -23863,8 +23674,8 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Arrivals - Central Hall"; - dir = 10 + dir = 10; + c_tag = "Arrivals - Central Hall" }, /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -23949,8 +23760,8 @@ "hwM" = ( /obj/effect/turf_decal/bot, /obj/machinery/requests_console/directional/west{ - department = "Robotics"; - name = "Robotics Requests Console" + name = "Robotics Requests Console"; + department = "Robotics" }, /obj/effect/mapping_helpers/requests_console/ore_update, /obj/effect/mapping_helpers/requests_console/supplies, @@ -23982,6 +23793,13 @@ }, /turf/open/floor/glass, /area/station/command/meeting_room) +"hyK" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/window/left/directional/west{ + name = "Fitness Ring" + }, +/turf/open/floor/iron/dark/smooth_corner, +/area/station/commons/fitness) "hze" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -24055,9 +23873,9 @@ /obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/bot, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics East"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics East" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -24076,9 +23894,9 @@ dir = 1 }, /obj/machinery/status_display/door_timer{ - id = "Isolation_D"; name = "Isolation Cell D"; - pixel_y = -32 + pixel_y = -32; + id = "Isolation_D" }, /turf/open/floor/iron, /area/station/security/execution/transfer) @@ -24107,9 +23925,9 @@ /area/station/engineering/atmos) "hBJ" = ( /obj/machinery/camera{ - c_tag = "Secure - AI Upper Ring South"; dir = 9; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Upper Ring South" }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -24127,11 +23945,11 @@ /area/station/commons/fitness) "hBY" = ( /obj/machinery/computer/security/telescreen{ + name = "turbine vent monitor"; desc = "Used for watching the turbine vent."; dir = 8; - name = "turbine vent monitor"; - network = list("turbine"); - pixel_x = 29 + pixel_x = 29; + network = list("turbine") }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -24150,8 +23968,8 @@ /area/station/science/breakroom) "hCA" = ( /obj/machinery/chem_master/condimaster{ - desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; name = "HoochMaster Deluxe"; + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; pixel_x = -4 }, /obj/structure/sign/clock/directional/north, @@ -24417,8 +24235,8 @@ }, /obj/effect/turf_decal/stripes/corner, /obj/machinery/button/door/directional/east{ - id = "cargowarehouse"; - name = "Cargo Warehouse Shutters" + name = "Cargo Warehouse Shutters"; + id = "cargowarehouse" }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -24557,8 +24375,8 @@ /area/station/security/courtroom) "hLx" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "prisondorm"; - name = "Prison Dorm 3" + name = "Prison Dorm 3"; + id_tag = "prisondorm" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -24618,8 +24436,8 @@ dir = 5 }, /obj/machinery/requests_console/directional/east{ - department = "Research Lab"; - name = "Research Requests Console" + name = "Research Requests Console"; + department = "Research Lab" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/ore_update, @@ -24756,8 +24574,8 @@ dir = 4 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "External Waste Ports to Filter" + name = "External Waste Ports to Filter"; + dir = 4 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -24768,9 +24586,9 @@ dir = 5 }, /obj/machinery/camera{ - c_tag = "Security - Prison Cell 2"; dir = 6; - network = list("ss13","Security","prison","pcell") + network = list("ss13","Security","prison","pcell"); + c_tag = "Security - Prison Cell 2" }, /turf/open/floor/iron, /area/station/security/prison/safe) @@ -24892,8 +24710,8 @@ dir = 4 }, /obj/machinery/camera/directional/west{ - c_tag = "Science - Genetics"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Genetics" }, /obj/structure/sign/clock/directional/west, /obj/effect/turf_decal/tile/dark_green/fourcorners, @@ -24934,6 +24752,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) +"hRK" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/clock/directional/south, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "hSm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24953,6 +24779,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"hSt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Central Escape Wing Entry" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "hSH" = ( /obj/structure/chair{ dir = 1 @@ -25016,9 +24854,9 @@ /area/station/maintenance/disposal/incinerator) "hUf" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Incinerator"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Incinerator" }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -25037,6 +24875,23 @@ dir = 8 }, /area/station/security/execution/education) +"hUs" = ( +/obj/machinery/computer/bank_machine{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Terminal Access"; + req_access = list("qm") + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/cargo/miningdock/oresilo) "hUz" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/full, @@ -25062,17 +24917,17 @@ /area/station/command/teleporter) "hUY" = ( /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_lower_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_lower_lower_eva_external"; - idSelf = "mostleft_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "mostleft_lower_lower_eva_airlock_control"; + idDoor = "mostleft_lower_lower_eva_external" }, /obj/effect/turf_decal/sand, /turf/open/floor/catwalk_floor, @@ -25159,6 +25014,16 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/genetics) +"hXW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/transport/power_rectifier, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "hYd" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/green/visible, @@ -25272,8 +25137,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/tram/right) "hZA" = ( -/obj/effect/decal/cleanable/dirt, /mob/living/basic/mouse, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/tram/mid) "hZB" = ( @@ -25281,10 +25146,10 @@ dir = 9 }, /obj/item/radio/intercom/directional/south{ - freerange = 1; + name = "Private Channel"; frequency = 1447; listening = 0; - name = "Private Channel" + freerange = 1 }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -25346,8 +25211,8 @@ /area/station/engineering/break_room) "iaE" = ( /obj/machinery/door/airlock{ - id_tag = "private_e"; - name = "Private Quarters E" + name = "Private Quarters E"; + id_tag = "private_e" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25364,8 +25229,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ - id = "playerscantreadthis"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + id = "playerscantreadthis" }, /obj/structure/displaycase/forsale/kitchen{ pixel_y = 8 @@ -25379,8 +25244,8 @@ dir = 4 }, /obj/machinery/button/door/directional/north{ - id = "mechbay"; name = "Mech Bay Shutters Control"; + id = "mechbay"; req_access = list("robotics") }, /turf/open/floor/iron, @@ -25464,11 +25329,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) -"idb" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) "ide" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 10 @@ -25499,8 +25359,8 @@ /area/station/hallway/secondary/command) "idI" = ( /obj/machinery/camera/directional/east{ - c_tag = "Hallway - Starboard Tram Platform South"; - pixel_y = -23 + pixel_y = -23; + c_tag = "Hallway - Starboard Tram Platform South" }, /obj/machinery/light/directional/east, /turf/open/floor/noslip/tram, @@ -25638,9 +25498,9 @@ /obj/structure/chair, /obj/machinery/airalarm/directional/north, /obj/machinery/camera{ - c_tag = "Departures - Holding Wing"; dir = 10; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Departures - Holding Wing" }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -25819,9 +25679,9 @@ /obj/machinery/vending/cigarette, /obj/machinery/airalarm/directional/north, /obj/machinery/camera{ - c_tag = "Cargo - Mining Break Room"; dir = 9; - network = list("ss13","cargo") + network = list("ss13","cargo"); + c_tag = "Cargo - Mining Break Room" }, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, @@ -25973,8 +25833,8 @@ "inN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/east{ - id = "winkyface"; - name = "Docking Access Control" + name = "Docking Access Control"; + id = "winkyface" }, /turf/open/floor/plating, /area/station/maintenance/central/greater) @@ -26044,9 +25904,9 @@ }, /obj/structure/transport/linear/public, /obj/machinery/elevator_control_panel/directional/west{ + req_access = list("mining"); linked_elevator_id = "tram_cargo_lift"; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck"); - req_access = list("mining") + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /obj/effect/abstract/elevator_music_zone{ linked_elevator_id = "tram_cargo_lift" @@ -26104,8 +25964,8 @@ pixel_y = -2 }, /obj/machinery/camera/directional/south{ - c_tag = "Science - Testing Lab"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Testing Lab" }, /turf/open/floor/iron, /area/station/science/explab) @@ -26156,8 +26016,8 @@ /area/station/security/brig) "irf" = ( /obj/machinery/button/door/directional/east{ - id = "armory"; name = "Armory Shutters"; + id = "armory"; req_access = list("armory") }, /obj/machinery/status_display/ai/directional/north, @@ -26237,10 +26097,10 @@ "isP" = ( /obj/structure/table, /obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; name = "Custom Channel"; - pixel_x = 0 + pixel_x = 0; + listening = 0; + freerange = 1 }, /turf/open/floor/iron/dark/small, /area/station/commons/vacant_room) @@ -26269,8 +26129,8 @@ /area/station/commons/dorms) "itE" = ( /obj/modular_map_root/tramstation{ - key = "atmoscilower"; - name = "atmoscilower" + name = "atmoscilower"; + key = "atmoscilower" }, /turf/open/misc/asteroid, /area/station/asteroid) @@ -26308,6 +26168,15 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"iur" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "iuz" = ( /obj/machinery/door/airlock/external{ name = "Port Docking Bay 1"; @@ -26316,6 +26185,27 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"iuJ" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/structure/sign/clock/directional/north, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"iuM" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/machinery/door/window/left/directional/west{ + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/painting/large/library{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "iva" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 9 @@ -26408,9 +26298,9 @@ "iws" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters{ + name = "Mech Bay"; dir = 4; - id = "mechbay"; - name = "Mech Bay" + id = "mechbay" }, /turf/open/floor/plating, /area/station/science/robotics/mechbay) @@ -26467,8 +26357,8 @@ "ixu" = ( /obj/structure/noticeboard/directional/north, /obj/machinery/camera/directional/north{ - c_tag = "Science - Robotics"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Robotics" }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/closet/crate/mod, @@ -26501,9 +26391,9 @@ /area/space) "ixO" = ( /obj/structure/chair/comfy/brown{ - buildstackamount = 0; + dir = 8; color = "#c45c57"; - dir = 8 + buildstackamount = 0 }, /obj/effect/landmark/start/detective, /obj/machinery/newscaster/directional/east, @@ -26687,8 +26577,8 @@ /area/station/medical/medbay/central) "iCe" = ( /obj/machinery/door/airlock{ - id_tag = "Toilet2"; - name = "Unit 2" + name = "Unit 2"; + id_tag = "Toilet2" }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) @@ -26766,8 +26656,8 @@ pixel_x = -8 }, /obj/machinery/requests_console/directional/west{ - department = "Head of Personnel's Desk"; - name = "Head of Personnel's Requests Console" + name = "Head of Personnel's Requests Console"; + department = "Head of Personnel's Desk" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/information, @@ -26783,9 +26673,9 @@ "iEz" = ( /obj/structure/lattice, /obj/machinery/camera/motion{ - c_tag = "Secure - AI Lower External East"; dir = 10; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Lower External East" }, /turf/open/space/basic, /area/space/nearstation) @@ -26799,6 +26689,23 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"iEO" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Isolation Cell D"; + id = "Isolation_D" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/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) "iFb" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -26855,8 +26762,8 @@ /area/station/engineering/supermatter/room) "iGh" = ( /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Cooling Loop to Gas" + name = "Cooling Loop to Gas"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -27130,8 +27037,8 @@ }, /obj/item/pen/red, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Virology Patient Room B"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Virology Patient Room B" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -27195,8 +27102,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/box, /obj/structure/sign/warning/directional/west{ - desc = "A sign warning you to be cautious of falling packages."; - name = "FALLING HAZARD sign" + name = "FALLING HAZARD sign"; + desc = "A sign warning you to be cautious of falling packages." }, /turf/open/floor/plating, /area/station/service/lawoffice) @@ -27280,16 +27187,16 @@ /area/station/service/library) "iOm" = ( /obj/machinery/button/flasher{ - id = "hopflash"; pixel_x = 23; - pixel_y = -10 + pixel_y = -10; + id = "hopflash" }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "iOo" = ( /obj/docking_port/stationary/random{ - dir = 8; name = "lavaland"; + dir = 8; shuttle_id = "pod_lavaland" }, /turf/open/misc/asteroid/airless, @@ -27317,8 +27224,8 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Arrivals - South Docking Hall"; - dir = 6 + dir = 6; + c_tag = "Arrivals - South Docking Hall" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27346,8 +27253,8 @@ }, /obj/item/storage/medkit/regular, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Main North"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main North" }, /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white, @@ -27384,23 +27291,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"iPu" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Isolation Cell C"; - id = "Isolation_C" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/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) "iPy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -27541,8 +27431,8 @@ dir = 1 }, /obj/machinery/camera{ - c_tag = "Maintenance - East Tram Tunnel 3"; - dir = 9 + dir = 9; + c_tag = "Maintenance - East Tram Tunnel 3" }, /obj/effect/turf_decal/siding/thinplating, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27738,8 +27628,8 @@ color = "#52B4E9" }, /obj/effect/turf_decal/arrows/white{ - color = "#0000FF"; - dir = 4 + dir = 4; + color = "#0000FF" }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -28125,14 +28015,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"jbW" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/obj/effect/landmark/start/hangover, -/obj/structure/sign/clock/directional/south, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "jcm" = ( /obj/structure/disposaloutlet{ dir = 8 @@ -28168,9 +28050,9 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Cargo - Bank Vault"; dir = 6; - network = list("ss13","cargo") + network = list("ss13","cargo"); + c_tag = "Cargo - Bank Vault" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -28213,9 +28095,9 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Security - Prison Block North"; dir = 6; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Block North" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -28256,8 +28138,8 @@ dir = 8 }, /obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrigleft"; - name = "Brig" + name = "Brig"; + id_tag = "innerbrigleft" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig_left" @@ -28445,6 +28327,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"jhn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "jhs" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -28464,9 +28356,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/east{ - id = "fortnitedoor"; name = "Trash Disposal Toggle"; - pixel_y = -8 + pixel_y = -8; + id = "fortnitedoor" }, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) @@ -28483,9 +28375,9 @@ dir = 9 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Lobby North"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Lobby North" }, /turf/open/floor/iron, /area/station/engineering/break_room) @@ -28588,9 +28480,9 @@ "jjG" = ( /obj/structure/lattice, /obj/machinery/camera/motion{ - c_tag = "Secure - AI Lower External West"; dir = 6; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Lower External West" }, /turf/open/space/basic, /area/space/nearstation) @@ -28686,8 +28578,8 @@ /area/station/commons/dorms) "jll" = ( /obj/machinery/camera/directional/north{ - c_tag = "Secure - Vault Entrance"; - network = list("ss13","secure") + network = list("ss13","secure"); + c_tag = "Secure - Vault Entrance" }, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/stripes/end, @@ -28782,8 +28674,8 @@ dir = 9 }, /obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Cell 1"; - network = list("ss13","Security","prison","pcell") + network = list("ss13","Security","prison","pcell"); + c_tag = "Security - Prison Cell 1" }, /turf/open/floor/iron, /area/station/security/prison/safe) @@ -28811,6 +28703,36 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/cargo/lobby) +"jnJ" = ( +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Cargo Cell"; + id = "crgcell"; + req_access = list("security") + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"jnR" = ( +/obj/structure/bed{ + dir = 8 + }, +/obj/effect/spawner/random/bedsheet, +/obj/effect/landmark/start/assistant, +/obj/structure/sign/clock/directional/east, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "jnY" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/cake_ingredients, @@ -28983,8 +28905,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" + name = "Test Chamber Blast Door"; + id = "Xenolab" }, /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/plating, @@ -29009,6 +28931,18 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"jrc" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jrz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/dim/directional/north, @@ -29164,8 +29098,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/flasher/directional/west{ - id = "AI"; - pixel_y = -26 + pixel_y = -26; + id = "AI" }, /obj/structure/cable, /turf/open/floor/iron/dark, @@ -29213,7 +29147,7 @@ /obj/structure/transport/linear/public, /obj/machinery/elevator_control_panel/directional/west{ linked_elevator_id = "tram_perma_lift"; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /obj/effect/turf_decal/caution/stand_clear/red{ dir = 1 @@ -29259,19 +29193,19 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/virology{ - autoclose = 0; + name = "Virology Exterior Airlock"; frequency = 1449; id_tag = "virology_airlock_exterior"; - name = "Virology Exterior Airlock" + autoclose = 0 }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door_buttons/access_button{ - dir = 1; - idDoor = "virology_airlock_exterior"; - idSelf = "virology_airlock_control"; name = "Virology Access Button"; + dir = 1; pixel_y = -24; - req_access = list("virology") + req_access = list("virology"); + idSelf = "virology_airlock_control"; + idDoor = "virology_airlock_exterior" }, /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /obj/structure/cable, @@ -29312,11 +29246,11 @@ /area/station/science/ordnance/storage) "jwq" = ( /obj/machinery/button/door/directional/west{ - id = "private_o"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = -9; - specialfunctions = 4 + id = "private_o"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -29354,9 +29288,9 @@ name = "Medical Delivery Chute" }, /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; + name = "navigation beacon (Medical Delivery)"; location = "Medical"; - name = "navigation beacon (Medical Delivery)" + codes_txt = "delivery;dir=4" }, /obj/effect/turf_decal/loading_area{ dir = 4 @@ -29519,9 +29453,9 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Cargo - Warehouse East"; dir = 6; - network = list("ss13","cargo") + network = list("ss13","cargo"); + c_tag = "Cargo - Warehouse East" }, /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/stripes/corner{ @@ -29583,8 +29517,8 @@ dir = 10 }, /obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Main North"; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Main North" }, /turf/open/floor/iron, /area/station/security/prison) @@ -29624,10 +29558,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"jBk" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jBn" = ( /obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber" + name = "Supermatter Chamber"; + heat_proof = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, @@ -29694,9 +29636,9 @@ dir = 4 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics South-West"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics South-West" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -29731,8 +29673,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/effect/turf_decal/stripes/line, /obj/machinery/camera/emp_proof/directional/south{ - c_tag = "Engineering - Engine Room South-East"; - network = list("ss13","engine","engineering") + network = list("ss13","engine","engineering"); + c_tag = "Engineering - Engine Room South-East" }, /obj/structure/cable, /turf/open/floor/engine, @@ -29751,8 +29693,8 @@ dir = 5 }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez5"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez5" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -29891,14 +29833,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance) -"jGA" = ( -/obj/structure/bed/double, -/obj/effect/spawner/random/bedsheet/double, -/obj/effect/landmark/start/assistant, -/obj/structure/sign/clock/directional/north, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "jGD" = ( /obj/structure/chair{ dir = 1 @@ -30062,9 +29996,9 @@ }, /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Material Storage"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Material Storage" }, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -30223,8 +30157,8 @@ pixel_y = -32 }, /obj/machinery/camera/directional/south{ - c_tag = "Civilian - Security Outpost"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Civilian - Security Outpost" }, /obj/machinery/light/directional/south, /turf/open/floor/iron, @@ -30245,12 +30179,12 @@ dir = 4 }, /obj/machinery/button/door/directional/west{ - id = "cytologysecure2"; - name = "Secure Pen Lockdown" + name = "Secure Pen Lockdown"; + id = "cytologysecure2" }, /obj/machinery/requests_console/directional/north{ - department = "Cytology"; - name = "Cytology Requests Console" + name = "Cytology Requests Console"; + department = "Cytology" }, /obj/effect/mapping_helpers/requests_console/ore_update, /obj/effect/mapping_helpers/requests_console/supplies, @@ -30352,16 +30286,16 @@ "jPx" = ( /obj/machinery/gulag_teleporter, /obj/machinery/camera/directional/south{ - c_tag = "Security - Labor Dock"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Labor Dock" }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/processing) "jPK" = ( +/mob/living/carbon/human/species/monkey/punpun, /obj/structure/cable, /obj/machinery/holopad, -/mob/living/carbon/human/species/monkey/punpun, /turf/open/floor/iron/dark, /area/station/service/bar) "jPM" = ( @@ -30395,8 +30329,8 @@ dir = 4 }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez2"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez2" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -30435,8 +30369,8 @@ "jRy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + id = "rndlab1" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -30504,9 +30438,9 @@ /area/station/construction/mining/aux_base) "jSK" = ( /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; + name = "navigation beacon (Theatre Delivery)"; location = "Theatre"; - name = "navigation beacon (Theatre Delivery)" + codes_txt = "delivery;dir=2" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/window/right/directional/south{ @@ -30548,23 +30482,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"jUf" = ( -/obj/structure/table/reinforced, -/obj/structure/desk_bell{ - pixel_x = -7 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Chemistry Desk"; - req_access = list("pharmacy") - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "jUz" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -30585,8 +30502,8 @@ dir = 4 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to External Air Ports" + name = "Air to External Air Ports"; + dir = 8 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -30744,33 +30661,33 @@ "jXF" = ( /obj/structure/table, /obj/machinery/fax{ - fax_name = "Research Director's Office"; - name = "Research Director's Fax Machine" + name = "Research Director's Fax Machine"; + fax_name = "Research Director's Office" }, /obj/machinery/button/door/directional/south{ - id = "Sciencelockdown"; name = "Science Lockdown Toggle"; pixel_x = -6; + id = "Sciencelockdown"; req_access = list("research") }, /obj/machinery/button/door/directional/south{ - id = "rndlab1"; name = "Research Lab Shutter Control"; pixel_x = 6; + id = "rndlab1"; req_access = list("research") }, /obj/machinery/button/door/directional/south{ - id = "xenobiomain"; name = "Xenobiology Containmenr Blast Door"; pixel_x = -6; pixel_y = -34; + id = "xenobiomain"; req_access = list("xenobiology") }, /obj/machinery/button/door/directional/south{ - id = "misclab"; name = "Test Chamber Blast Doors"; pixel_x = 6; pixel_y = -34; + id = "misclab"; req_access = list("xenobiology") }, /turf/open/floor/iron/cafeteria, @@ -30894,8 +30811,8 @@ /area/station/medical/chemistry) "jYF" = ( /obj/machinery/door/airlock{ - id_tag = "private_d"; - name = "Private Quarters D" + name = "Private Quarters D"; + id_tag = "private_d" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30917,6 +30834,14 @@ "jYS" = ( /turf/closed/wall, /area/station/medical/chemistry) +"jYT" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jYU" = ( /obj/structure/transport/linear/public, /obj/effect/turf_decal/trimline/dark_red/warning{ @@ -30929,6 +30854,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) +"jZe" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jZJ" = ( /obj/structure/chair/plastic, /obj/machinery/light/warm/directional/north, @@ -31089,7 +31022,7 @@ /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") + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/mid) @@ -31121,8 +31054,8 @@ dir = 1 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 Outlet Pump" + name = "O2 Outlet Pump"; + dir = 1 }, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -31135,8 +31068,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/east{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" + name = "Atmospherics Requests Console"; + department = "Atmospherics" }, /obj/structure/cable, /obj/machinery/light/directional/east, @@ -31185,13 +31118,31 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"kcP" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + name = "Atmospherics Blast Door"; + id = "atmos" + }, +/obj/effect/landmark/navigate_destination/atmos, +/obj/machinery/door/window/right/directional/east{ + name = "Atmospherics Front Desk"; + req_access = list("atmospherics") + }, +/obj/structure/desk_bell{ + pixel_x = -7 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/atmos) "kcV" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/item/stack/cable_coil{ - amount = 15; pixel_x = 6; - pixel_y = 6 + pixel_y = 6; + amount = 15 }, /obj/item/stack/cable_coil/cut, /turf/open/floor/iron/smooth, @@ -31292,8 +31243,8 @@ }, /obj/machinery/suit_storage_unit/rd, /obj/machinery/requests_console/directional/south{ - department = "Research Director's Desk"; - name = "Research Director's Request Console" + name = "Research Director's Request Console"; + department = "Research Director's Desk" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/information, @@ -31333,9 +31284,9 @@ /area/station/security/detectives_office) "keT" = ( /obj/machinery/door/airlock/research{ - glass = 1; name = "Slime Euthanization Chamber"; - opacity = 0 + opacity = 0; + glass = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, @@ -31365,16 +31316,16 @@ "kfD" = ( /obj/effect/turf_decal/sand, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_upper_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_upper_lower_eva_external"; - idSelf = "middleleft_upper_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleleft_upper_lower_eva_airlock_control"; + idDoor = "middleleft_upper_lower_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -31407,8 +31358,8 @@ name = "Maintenance Hatch" }, /obj/modular_map_root/tramstation{ - key = "dormenginelower"; - name = "dormenginelower" + name = "dormenginelower"; + key = "dormenginelower" }, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/crew_quarters/dorms) @@ -31549,8 +31500,8 @@ dir = 5 }, /obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" + name = "Security Requests Console"; + department = "Security" }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) @@ -31652,12 +31603,12 @@ /area/station/service/bar) "kkn" = ( /obj/machinery/button/door/directional/west{ - id = "private_a"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = 9; - specialfunctions = 4 + id = "private_a"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31701,8 +31652,8 @@ }, /obj/machinery/firealarm/directional/north, /obj/machinery/camera/directional/north{ - c_tag = "Science - Xenobiology North"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Xenobiology North" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -31752,8 +31703,8 @@ "klI" = ( /obj/effect/turf_decal/trimline/white/filled/line, /obj/machinery/camera{ - c_tag = "Secure - Tech Secure Storage"; - dir = 10 + dir = 10; + c_tag = "Secure - Tech Secure Storage" }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) @@ -32008,8 +31959,8 @@ /area/station/science/lower) "kqY" = ( /obj/machinery/camera{ - c_tag = "Hallway - Port Tram Platform South-West"; - dir = 10 + dir = 10; + c_tag = "Hallway - Port Tram Platform South-West" }, /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/cable, @@ -32024,14 +31975,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"krd" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "kre" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -32042,16 +31985,16 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_upper_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_upper_eva_internal"; - idSelf = "middleright_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleright_upper_eva_airlock_control"; + idDoor = "middleright_upper_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -32088,21 +32031,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"krx" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #2" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "krB" = ( +/mob/living/carbon/human/species/monkey, /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/leavy/style_random, /obj/machinery/light/directional/east, -/mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) "krE" = ( @@ -32118,8 +32051,8 @@ /area/station/security/brig) "krM" = ( /obj/machinery/camera{ - c_tag = "Hallway - Central Tram Platform South-East"; - dir = 6 + dir = 6; + c_tag = "Hallway - Central Tram Platform South-East" }, /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/stripes/white/line{ @@ -32265,8 +32198,8 @@ dir = 4 }, /obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrigleft"; - name = "Brig" + name = "Brig"; + id_tag = "outerbrigleft" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig_left" @@ -32348,8 +32281,8 @@ dir = 1 }, /obj/machinery/button/door/directional/east{ - id = "cytologysecure1"; - name = "Secure Pen Lockdown" + name = "Secure Pen Lockdown"; + id = "cytologysecure1" }, /obj/machinery/light/directional/north, /obj/item/soap{ @@ -32412,15 +32345,15 @@ /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{ - desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off."; - name = "cat bed" + 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) "kxF" = ( @@ -32489,12 +32422,12 @@ /area/station/security/evidence) "kyU" = ( /obj/docking_port/stationary{ - dir = 4; - dwidth = 12; - height = 18; name = "Tramstation emergency evac bay"; + dir = 4; + width = 32; + height = 18; shuttle_id = "emergency_home"; - width = 32 + dwidth = 12 }, /turf/open/space/openspace, /area/space) @@ -32669,16 +32602,16 @@ "kDh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_lower_upper_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_lower_upper_eva_internal"; - idSelf = "rightmost_lower_upper_eva_airlock_control"; name = "External Access Button"; - pixel_x = -24 + pixel_x = -24; + idSelf = "rightmost_lower_upper_eva_airlock_control"; + idDoor = "rightmost_lower_upper_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32826,8 +32759,8 @@ /area/station/security/checkpoint/supply) "kFT" = ( /obj/machinery/door/airlock{ - id_tag = "private_f"; - name = "Private Quarters F" + name = "Private Quarters F"; + id_tag = "private_f" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32849,8 +32782,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/item/radio/intercom/directional/east, /obj/machinery/camera/directional/east{ - c_tag = "Science - Upper Hall Left"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Upper Hall Left" }, /turf/open/floor/iron/white, /area/station/science/research) @@ -32950,12 +32883,7 @@ }, /obj/machinery/shower/directional/west, /obj/effect/turf_decal/bot, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -33006,30 +32934,30 @@ /turf/open/floor/grass, /area/station/medical/virology) "kHR" = ( +/mob/living/basic/parrot/poly, /obj/structure/filingcabinet/chestdrawer, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 }, /obj/machinery/button/door/directional/west{ - id = "atmos"; name = "Atmospherics Lockdown"; pixel_y = 8; + id = "atmos"; req_access = list("atmospherics") }, /obj/machinery/button/door/directional/west{ - id = "Secure Storage"; name = "Engineering Secure Storage"; + id = "Secure Storage"; req_access = list("engine_equip") }, /obj/machinery/button/door/directional/west{ - id = "Engineering"; name = "Engineering Lockdown"; pixel_y = -8; + id = "Engineering"; req_access = list("engineering") }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/mob/living/basic/parrot/poly, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) "kHS" = ( @@ -33140,8 +33068,8 @@ /area/station/hallway/secondary/entry) "kJy" = ( /obj/docking_port/stationary/random{ - dir = 8; name = "lavaland"; + dir = 8; shuttle_id = "pod_2_lavaland" }, /turf/open/misc/asteroid/airless, @@ -33175,11 +33103,11 @@ /area/station/hallway/secondary/service) "kKe" = ( /obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "QMLoad"; name = "Loading Conveyor"; + dir = 8; pixel_x = -13; - pixel_y = -5 + pixel_y = -5; + id = "QMLoad" }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -33212,8 +33140,8 @@ /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 = "midtunnelleft"; - name = "Tunnel Access Shutters Toggle" + name = "Tunnel Access Shutters Toggle"; + id = "midtunnelleft" }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) @@ -33268,14 +33196,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"kMt" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/full, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "kMD" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33325,8 +33245,8 @@ /area/station/medical/pharmacy) "kNf" = ( /obj/structure/closet/secure_closet/brig{ - id = "crgcell"; - name = "Cargo Cell Locker" + name = "Cargo Cell Locker"; + id = "crgcell" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/corner{ @@ -33541,8 +33461,8 @@ dir = 8 }, /obj/machinery/camera/directional/west{ - c_tag = "Science - Xenobiology West"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Xenobiology West" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -33603,13 +33523,6 @@ "kRR" = ( /turf/open/misc/grass/jungle, /area/station/science/explab) -"kRS" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "kRW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -33648,8 +33561,8 @@ /area/station/engineering/engine_smes) "kSA" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Pure to Port" + name = "Pure to Port"; + dir = 8 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -33682,16 +33595,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"kTn" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/transport/power_rectifier, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "kTr" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -33774,8 +33677,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + id = "rndlab1" }, /obj/machinery/door/firedoor, /obj/structure/cable, @@ -33795,6 +33698,7 @@ }, /obj/effect/turf_decal/tile/green/fourcorners, /obj/machinery/newscaster/directional/south, +/obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron/dark, /area/station/service/hydroponics) "kUm" = ( @@ -33832,17 +33736,17 @@ /area/station/solars/starboard/fore) "kUN" = ( /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_lower_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_lower_lower_eva_internal"; - idSelf = "mostleft_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_x = 24 + pixel_x = 24; + idSelf = "mostleft_lower_lower_eva_airlock_control"; + idDoor = "mostleft_lower_lower_eva_internal" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33882,8 +33786,8 @@ dir = 8 }, /obj/machinery/door/poddoor/shutters/preopen{ - id = "papersplease"; - name = "HoP Arrival Procedure Enforcement Shutters" + name = "HoP Arrival Procedure Enforcement Shutters"; + id = "papersplease" }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) @@ -34032,8 +33936,8 @@ /area/station/medical/virology) "kXZ" = ( /obj/machinery/door/airlock{ - id_tag = "private_l"; - name = "Private Quarters L" + name = "Private Quarters L"; + id_tag = "private_l" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34042,11 +33946,11 @@ "kYk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "rightmost_upper_eva_external"; - idInterior = "rightmost_upper_eva_internal"; - idSelf = "rightmost_upper_eva_airlock_control"; name = "External Access Console"; - pixel_y = 24 + pixel_y = 24; + idSelf = "rightmost_upper_eva_airlock_control"; + idInterior = "rightmost_upper_eva_internal"; + idExterior = "rightmost_upper_eva_external" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -34058,8 +33962,8 @@ /obj/structure/table, /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("test"); - pixel_y = 28 + pixel_y = 28; + network = list("test") }, /obj/item/storage/box/beakers{ pixel_x = 5; @@ -34156,9 +34060,9 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Secure - AI Antechamber East"; dir = 10; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Antechamber East" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -34186,8 +34090,8 @@ "lan" = ( /obj/vehicle/sealed/mecha/ripley/cargo, /obj/machinery/requests_console/directional/north{ - department = "Cargo Bay"; - name = "Cargo Bay Requests Console" + name = "Cargo Bay Requests Console"; + department = "Cargo Bay" }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -34228,16 +34132,16 @@ pixel_y = 10 }, /obj/machinery/button/door/directional/north{ - id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = -6; + id = "atmos"; req_access = list("atmospherics") }, /obj/machinery/button/door/directional/north{ - desc = "A door remote control switch for the engineering security airlocks."; - id = "Engineering"; name = "Engineering Lockdown"; + desc = "A door remote control switch for the engineering security airlocks."; pixel_x = 6; + id = "Engineering"; req_access = list("engineering") }, /turf/open/floor/iron, @@ -34276,6 +34180,24 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"lcS" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south{ + name = "Access Queue" + }, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Access Desk"; + req_access = list("hop") + }, +/obj/structure/desk_bell{ + pixel_x = -7 + }, +/obj/machinery/door/poddoor/preopen{ + name = "Privacy Shutters"; + id = "hop" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) "ldd" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -34288,17 +34210,17 @@ dir = 1 }, /obj/machinery/camera/directional/north{ - c_tag = "Engineering - Engine Room North-West"; - network = list("ss13","engine","engineering") + network = list("ss13","engine","engineering"); + c_tag = "Engineering - Engine Room North-West" }, /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "ldp" = ( /obj/machinery/status_display/door_timer{ - id = "crgcell"; name = "Cargo Cell"; - pixel_x = 32 + pixel_x = 32; + id = "crgcell" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -34313,9 +34235,9 @@ dir = 9 }, /obj/machinery/status_display/door_timer{ - id = "Isolation_C"; name = "Isolation Cell C"; - pixel_y = 32 + pixel_y = 32; + id = "Isolation_C" }, /turf/open/floor/iron, /area/station/security/execution/transfer) @@ -34495,8 +34417,8 @@ dir = 6 }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez3"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez3" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -34891,8 +34813,8 @@ dir = 9 }, /obj/structure/closet/secure_closet/brig{ - id = "medcell"; - name = "Medical Cell Locker" + name = "Medical Cell Locker"; + id = "medcell" }, /turf/open/floor/iron, /area/station/security/checkpoint/science) @@ -34930,8 +34852,8 @@ "lpo" = ( /obj/effect/turf_decal/tile/neutral/tram, /obj/effect/spawner/random{ - loot = list(/obj/effect/decal/cleanable/oil/slippery = 10, /obj/effect/decal/cleanable/oil = 90); - name = "funny slipper :)" + name = "funny slipper :)"; + loot = list(/obj/effect/decal/cleanable/oil/slippery=10, /obj/effect/decal/cleanable/oil=90) }, /turf/open/floor/tram/plate, /area/station/hallway/primary/tram/left) @@ -34996,9 +34918,9 @@ "lqu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + name = "Pharmacy Shutters"; dir = 4; - id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + id = "pharmacy_shutters_2" }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -35060,9 +34982,9 @@ /area/station/science/ordnance/office) "lrw" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics O2 Chamber"; dir = 6; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics O2 Chamber" }, /turf/open/floor/engine/o2, /area/station/engineering/atmos) @@ -35077,8 +34999,8 @@ pixel_y = 3 }, /obj/machinery/requests_console/directional/north{ - department = "AI"; - name = "AI Requests Console" + name = "AI Requests Console"; + department = "AI" }, /obj/effect/mapping_helpers/requests_console/information, /obj/effect/mapping_helpers/requests_console/supplies, @@ -35106,12 +35028,6 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/white, /area/station/medical/virology) -"lrD" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "lrG" = ( /obj/effect/turf_decal/sand/plating, /obj/item/flashlight/flare, @@ -35127,20 +35043,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, /area/station/science/research) -"lrL" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/machinery/door/window/left/directional/west{ - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/sign/painting/large/library{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "lrQ" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -35156,6 +35058,7 @@ /area/station/engineering/atmos) "lrZ" = ( /obj/structure/table/glass, +/obj/structure/secure_safe/caps_spare, /turf/open/floor/glass, /area/station/command/meeting_room) "lse" = ( @@ -35200,8 +35103,8 @@ "lsJ" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Main South-West"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main South-West" }, /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35319,8 +35222,8 @@ dir = 10 }, /obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Main South-West"; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Main South-West" }, /turf/open/floor/iron, /area/station/security/prison) @@ -35344,8 +35247,8 @@ dir = 5 }, /obj/machinery/requests_console/directional/north{ - department = "Cargo Bay"; - name = "Cargo Bay Requests Console" + name = "Cargo Bay Requests Console"; + department = "Cargo Bay" }, /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/mapping_helpers/requests_console/assistance, @@ -35406,9 +35309,9 @@ /area/station/hallway/primary/tram/center) "lwV" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Plasma Chamber"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Plasma Chamber" }, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) @@ -35476,8 +35379,8 @@ dir = 8 }, /obj/machinery/button/door{ - id = "containdeez2"; - name = "Cell Containment Toggle Button" + name = "Cell Containment Toggle Button"; + id = "containdeez2" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -35504,17 +35407,17 @@ /area/station/science/xenobiology) "lyt" = ( /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_upper_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_upper_eva_external"; - idSelf = "rightmost_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "rightmost_upper_eva_airlock_control"; + idDoor = "rightmost_upper_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -35562,6 +35465,16 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"lyR" = ( +/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/neutral/filled/line, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "lyV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/decal/cleanable/dirt, @@ -35640,10 +35553,10 @@ dir = 4 }, /obj/machinery/button/door/directional/west{ - id = "ToiletSci2"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "ToiletSci2"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/light/small/dim/directional/north, /turf/open/floor/iron/freezer, @@ -35848,8 +35761,8 @@ /area/station/service/chapel) "lEt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ - chamber_id = "o2ordance"; - dir = 8 + dir = 8; + chamber_id = "o2ordance" }, /turf/open/floor/engine/o2, /area/station/science/ordnance/storage) @@ -35859,8 +35772,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ - id = "engcell"; - name = "Engineering Cell Locker" + name = "Engineering Cell Locker"; + id = "engcell" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -35898,8 +35811,8 @@ /area/station/science/lab) "lEW" = ( /obj/machinery/door/airlock{ - id_tag = "private_a"; - name = "Private Quarters A" + name = "Private Quarters A"; + id_tag = "private_a" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35960,16 +35873,6 @@ /obj/structure/railing, /turf/open/openspace/airless, /area/station/asteroid) -"lGx" = ( -/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/neutral/filled/line, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "lGz" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -36001,9 +35904,9 @@ dir = 4 }, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; name = "AI Antechamber turret control"; - pixel_y = -25 + pixel_y = -25; + control_area = "/area/station/ai_monitored/turret_protected/aisat_interior" }, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -36075,16 +35978,16 @@ "lIQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_upper_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_upper_eva_internal"; - idSelf = "mostleft_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "mostleft_upper_eva_airlock_control"; + idDoor = "mostleft_upper_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -36207,6 +36110,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/violet/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"lLq" = ( +/obj/structure/bed{ + dir = 8 + }, +/obj/effect/spawner/random/bedsheet, +/obj/effect/landmark/start/assistant, +/obj/structure/sign/clock/directional/east, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "lLx" = ( /obj/structure/railing{ dir = 4 @@ -36283,8 +36196,8 @@ /area/station/engineering/gravity_generator) "lMw" = ( /obj/machinery/door/airlock{ - id_tag = "Toilet3"; - name = "Unit 3" + name = "Unit 3"; + id_tag = "Toilet3" }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) @@ -36372,9 +36285,9 @@ "lNp" = ( /obj/machinery/field/generator, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Secure Storage"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Secure Storage" }, /turf/open/floor/plating, /area/station/engineering/engine_smes) @@ -36404,23 +36317,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"lOb" = ( -/obj/machinery/computer/bank_machine{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Terminal Access"; - req_access = list("qm") - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark, -/area/station/cargo/miningdock/oresilo) "lOe" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/machinery/duct, @@ -36449,8 +36345,8 @@ /area/station/maintenance/tram/mid) "lOC" = ( /obj/machinery/door/window/brigdoor/right/directional/east{ - id = "scicell"; name = "Science Cell"; + id = "scicell"; req_access = list("security") }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36521,8 +36417,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "bunkermodeactivated"; - name = "Bridge Blast Door" + name = "Bridge Blast Door"; + id = "bunkermodeactivated" }, /turf/open/floor/plating, /area/station/command/bridge) @@ -36553,6 +36449,16 @@ /obj/item/cultivator, /turf/open/floor/iron/dark, /area/station/security/prison/garden) +"lQz" = ( +/mob/living/simple_animal/bot/mulebot, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + location = "QM #2"; + codes_txt = "delivery;dir=2" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "lQH" = ( /obj/effect/turf_decal/caution/stand_clear/white, /obj/machinery/door/window/elevator/left/directional/north{ @@ -36599,6 +36505,12 @@ /obj/structure/ladder, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) +"lRx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "lRC" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/neutral/corner, @@ -36700,9 +36612,9 @@ dir = 5 }, /obj/machinery/camera{ - c_tag = "Security - Prison Cell 4"; dir = 6; - network = list("ss13","Security","prison","pcell") + network = list("ss13","Security","prison","pcell"); + c_tag = "Security - Prison Cell 4" }, /turf/open/floor/iron, /area/station/security/prison/safe) @@ -36732,8 +36644,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/north{ - department = "Xenobiology"; - name = "Xenobiology Requests Console" + name = "Xenobiology Requests Console"; + department = "Xenobiology" }, /obj/effect/mapping_helpers/requests_console/ore_update, /obj/effect/mapping_helpers/requests_console/supplies, @@ -36828,8 +36740,8 @@ dir = 1 }, /obj/machinery/door/poddoor/shutters/preopen{ - id = "hopqueueend"; - name = "HoP Queue Shutters" + name = "HoP Queue Shutters"; + id = "hopqueueend" }, /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/loading_area/white{ @@ -36843,9 +36755,9 @@ /area/station/science/ordnance/burnchamber) "lUZ" = ( /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; + name = "navigation beacon (Kitchen Delivery)"; location = "Kitchen"; - name = "navigation beacon (Kitchen Delivery)" + codes_txt = "delivery;dir=8" }, /obj/effect/turf_decal/loading_area{ dir = 8 @@ -36952,10 +36864,10 @@ "lWv" = ( /obj/structure/table, /obj/machinery/button/door{ - id = "rdoffice"; name = "Privacy Shutter Control"; pixel_x = -7; pixel_y = -2; + id = "rdoffice"; req_access = list("research") }, /obj/item/folder/white{ @@ -37085,10 +36997,10 @@ pixel_y = 8 }, /obj/machinery/button/door/directional/west{ - id = "Toilet3"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "Toilet3"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/effect/landmark/start/hangover, /obj/machinery/light/small/dim/directional/east, @@ -37186,9 +37098,9 @@ "maI" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/status_display/door_timer{ - id = "Isolation_B"; name = "Isolation Cell B"; - pixel_y = -32 + pixel_y = -32; + id = "Isolation_B" }, /turf/open/floor/iron, /area/station/security/execution/transfer) @@ -37200,8 +37112,8 @@ /area/station/hallway/secondary/command) "mbe" = ( /obj/machinery/camera/motion/directional/south{ - c_tag = "Secure - AI Lower External North"; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Lower External North" }, /turf/open/space/basic, /area/space) @@ -37211,8 +37123,8 @@ dir = 8 }, /obj/machinery/camera/directional/west{ - c_tag = "Security - Rec Room West"; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Rec Room West" }, /turf/open/floor/iron, /area/station/security/prison/workout) @@ -37238,6 +37150,18 @@ "mbJ" = ( /turf/closed/wall, /area/station/maintenance/tram/right) +"mbK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "mbQ" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -37303,11 +37227,22 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "rdoffice"; - name = "Research Director's Shutters" + name = "Research Director's Shutters"; + id = "rdoffice" }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) +"mdk" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 5 + }, +/obj/structure/cable, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/engineering/break_room) "mdl" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 6 @@ -37348,11 +37283,11 @@ "mdI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "mostleft_lower_lower_eva_external"; - idInterior = "mostleft_lower_lower_eva_internal"; - idSelf = "mostleft_lower_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = 24 + pixel_y = 24; + idSelf = "mostleft_lower_lower_eva_airlock_control"; + idInterior = "mostleft_lower_lower_eva_internal"; + idExterior = "mostleft_lower_lower_eva_external" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, @@ -37505,28 +37440,28 @@ /area/station/security/checkpoint/supply) "mgi" = ( /obj/item/radio/intercom/directional/west{ - freerange = 1; - listening = 0; name = "Common Channel"; - pixel_y = -8 + pixel_y = -8; + listening = 0; + freerange = 1 }, /obj/item/radio/intercom/directional/south{ - freerange = 1; + name = "Private Channel"; frequency = 1447; listening = 0; - name = "Private Channel" + freerange = 1 }, /obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; name = "Custom Channel"; - pixel_y = -8 + pixel_y = -8; + listening = 0; + freerange = 1 }, /obj/effect/landmark/start/ai, /obj/machinery/button/door/directional/south{ - id = "AI Core shutters"; name = "AI Core Shutters Control"; pixel_x = 24; + id = "AI Core shutters"; req_access = list("ai_upload") }, /obj/structure/cable, @@ -37557,12 +37492,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) -"mgD" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "mgE" = ( /obj/machinery/computer/quantum_console{ dir = 1 @@ -37584,8 +37513,8 @@ "mgZ" = ( /obj/structure/table, /obj/machinery/requests_console/directional/west{ - department = "Kitchen"; - name = "Kitchen Requests Console" + name = "Kitchen Requests Console"; + department = "Kitchen" }, /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/mapping_helpers/requests_console/assistance, @@ -37624,16 +37553,16 @@ "mhE" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_lower_eva_external"; - idSelf = "middleright_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "middleright_lower_eva_airlock_control"; + idDoor = "middleright_lower_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, @@ -37645,8 +37574,8 @@ /obj/structure/table, /obj/item/radio/intercom/directional/east, /obj/item/paper{ - default_raw_text = "buy more donk pockets"; - name = "To-Do List" + name = "To-Do List"; + default_raw_text = "buy more donk pockets" }, /turf/open/floor/iron/dark, /area/station/medical/virology) @@ -37664,8 +37593,8 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Hallway - Upper Left Command"; - dir = 6 + dir = 6; + c_tag = "Hallway - Upper Left Command" }, /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, @@ -37673,8 +37602,8 @@ "miU" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" + name = "External Gas to Loop"; + dir = 1 }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -37699,6 +37628,25 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"mjy" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 4 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/security/office) "mjF" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 4 @@ -37731,8 +37679,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + id = "hop" }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) @@ -37747,8 +37695,8 @@ /area/station/service/kitchen) "mkq" = ( /obj/machinery/door/airlock{ - id_tag = "private_q"; - name = "Private Quarters Q" + name = "Private Quarters Q"; + id_tag = "private_q" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37948,8 +37896,8 @@ }, /obj/structure/closet/secure_closet/research_director, /obj/machinery/camera/directional/south{ - c_tag = "Science - Research Director's Office"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Research Director's Office" }, /obj/machinery/light_switch/directional/south{ pixel_x = -8; @@ -37997,8 +37945,8 @@ /area/station/commons/fitness) "mpz" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Distro to Waste" + name = "Distro to Waste"; + dir = 8 }, /obj/structure/cable, /turf/open/floor/iron, @@ -38015,8 +37963,8 @@ /area/station/hallway/primary/tram/center) "mpF" = ( /turf/closed/indestructible/riveted{ - desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; - name = "hyper-reinforced wall" + name = "hyper-reinforced wall"; + desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease" }, /area/station/science/ordnance/bomb) "mpX" = ( @@ -38100,9 +38048,9 @@ dir = 4 }, /obj/item/radio/intercom/directional/north{ - freerange = 1; + name = "Private Channel"; frequency = 1447; - name = "Private Channel" + freerange = 1 }, /obj/machinery/camera/motion/directional/north{ c_tag = "Secure - AI Upper Ring Access" @@ -38143,8 +38091,8 @@ }, /obj/structure/table, /obj/machinery/fax{ - fax_name = "Cargo Office"; - name = "Cargo Office Fax Machine" + name = "Cargo Office Fax Machine"; + fax_name = "Cargo Office" }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -38231,8 +38179,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez3"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez3" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -38254,9 +38202,9 @@ "muV" = ( /obj/structure/cable, /obj/machinery/power/solar_control{ + name = "Port Solar Control"; dir = 1; - id = "portsolar"; - name = "Port Solar Control" + id = "portsolar" }, /obj/effect/turf_decal/sand/plating, /turf/open/floor/catwalk_floor, @@ -38528,8 +38476,8 @@ "mBm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "containdeez1"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez1" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -38539,8 +38487,8 @@ dir = 4 }, /obj/machinery/incident_display/tram/directional/north{ - desc = "A display that indicates how many dents that'll need fixed after the shift is over."; - name = "darwin award counter" + name = "darwin award counter"; + desc = "A display that indicates how many dents that'll need fixed after the shift is over." }, /turf/open/floor/iron, /area/station/maintenance/port/central) @@ -38643,9 +38591,9 @@ dir = 8 }, /obj/machinery/conveyor_switch/oneway{ - id = "hydrodropoff"; name = "Shipment Delivery Chute Activator"; - pixel_x = 10 + pixel_x = 10; + id = "hydrodropoff" }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) @@ -38653,25 +38601,6 @@ /obj/machinery/air_sensor/carbon_tank, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"mDI" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Cargo Desk"; - req_access = list("cargo") - }, -/obj/structure/desk_bell{ - pixel_x = -7 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/office) "mDJ" = ( /obj/structure/closet/secure_closet/brig, /obj/effect/decal/cleanable/dirt, @@ -38825,17 +38754,17 @@ "mGN" = ( /obj/effect/turf_decal/siding/thinplating/end, /obj/machinery/button/door{ - id = "Secure Gate"; name = "Cell Shutters"; pixel_x = -27; pixel_y = -2; + id = "Secure Gate"; req_access = list("armory") }, /obj/machinery/button/door{ - id = "briglockdown"; name = "Prison Wing Lockdown"; pixel_x = -27; pixel_y = 8; + id = "briglockdown"; req_access = list("armory") }, /obj/structure/chair/office{ @@ -38852,9 +38781,9 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Secure - AI Antechamber West"; dir = 6; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Antechamber West" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -38918,8 +38847,8 @@ /area/station/maintenance/tram/mid) "mHP" = ( /obj/machinery/door/airlock{ - id_tag = "private_o"; - name = "Private Quarters O" + name = "Private Quarters O"; + id_tag = "private_o" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38947,6 +38876,7 @@ /area/station/command/heads_quarters/hop) "mHZ" = ( /obj/item/radio/intercom/directional/east, +/obj/machinery/photobooth, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) "mId" = ( @@ -39126,9 +39056,9 @@ dir = 1 }, /obj/machinery/camera{ - c_tag = "Security - Warden's Office"; dir = 9; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Warden's Office" }, /obj/structure/sign/calendar/directional/north, /obj/structure/cable, @@ -39526,6 +39456,15 @@ /obj/structure/altar_of_gods, /turf/open/floor/iron/dark, /area/station/service/chapel) +"mVS" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/left/directional/west{ + name = "Fitness Ring" + }, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, +/area/station/commons/fitness) "mVT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -39740,12 +39679,12 @@ /area/station/engineering/storage/tech) "nay" = ( /obj/machinery/button/door/directional/west{ - id = "private_d"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = -9; - specialfunctions = 4 + id = "private_d"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -39770,8 +39709,8 @@ /area/station/engineering/main) "naD" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix to Distro" + name = "Mix to Distro"; + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) @@ -39845,8 +39784,8 @@ "nbI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "containdeez7"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez7" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -39966,10 +39905,6 @@ }, /obj/item/restraints/legcuffs/beartrap, /obj/item/restraints/legcuffs/beartrap, -/obj/machinery/light_switch/directional/east{ - pixel_x = 23; - pixel_y = 8 - }, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 }, @@ -40136,8 +40071,8 @@ /area/station/hallway/primary/tram/right) "nhc" = ( /obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay" + name = "Medbay"; + id_tag = "MedbayFoyer" }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -40260,9 +40195,9 @@ }, /obj/structure/sign/poster/official/do_not_question/directional/north, /obj/machinery/button/flasher{ - id = "reeducation"; pixel_x = -24; pixel_y = -8; + id = "reeducation"; req_access = list("brig") }, /turf/open/floor/iron/white, @@ -40387,8 +40322,8 @@ /obj/item/clothing/glasses/hud/health, /obj/item/clothing/neck/stethoscope, /obj/machinery/requests_console/directional/south{ - department = "Chief Medical Officer's Console"; - name = "Chief Medical Officer's Request Console" + name = "Chief Medical Officer's Request Console"; + department = "Chief Medical Officer's Console" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/supplies, @@ -40417,8 +40352,8 @@ c_tag = "Hallway - Engineering Entry East" }, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4; - name = "Oxygen Tank Injection Port" + name = "Oxygen Tank Injection Port"; + dir = 4 }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) @@ -40460,8 +40395,8 @@ }, /obj/structure/table/glass, /obj/machinery/requests_console/directional/east{ - department = "Virology"; - name = "Virology Requests Console" + name = "Virology Requests Console"; + department = "Virology" }, /obj/effect/mapping_helpers/requests_console/ore_update, /obj/item/storage/box/beakers{ @@ -40475,16 +40410,16 @@ "nlm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_lower_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_lower_lower_eva_internal"; - idSelf = "rightmost_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_x = -24 + pixel_x = -24; + idSelf = "rightmost_lower_lower_eva_airlock_control"; + idDoor = "rightmost_lower_lower_eva_internal" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40537,10 +40472,10 @@ pixel_y = 8 }, /obj/machinery/button/door/directional/west{ - id = "Toilet1"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "Toilet1"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/effect/spawner/random/engineering/tracking_beacon, /obj/machinery/light/small/dim/directional/east, @@ -40676,16 +40611,16 @@ "noi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_upper_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_upper_lower_eva_internal"; - idSelf = "middleleft_upper_lower_eva_airlock_control"; name = "External Access Button"; - pixel_x = -24 + pixel_x = -24; + idSelf = "middleleft_upper_lower_eva_airlock_control"; + idDoor = "middleleft_upper_lower_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40728,24 +40663,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/dorms) -"npj" = ( +"npp" = ( /obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south{ - name = "Access Queue" +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 }, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Access Desk"; - req_access = list("hop") +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Cargo Desk"; + req_access = list("cargo") }, /obj/structure/desk_bell{ pixel_x = -7 }, -/obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hop) +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/office) "npX" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -40886,17 +40822,17 @@ pixel_y = 20 }, /obj/machinery/camera{ - c_tag = "Secure - AI Antechamber South"; dir = 9; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Antechamber South" }, /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) "nsv" = ( /obj/machinery/camera/directional/north{ - c_tag = "Science - Testing Chamber"; - network = list("test","rd") + network = list("test","rd"); + c_tag = "Science - Testing Chamber" }, /turf/open/floor/engine, /area/station/science/explab) @@ -40984,12 +40920,12 @@ /area/station/solars/port) "nvo" = ( /obj/machinery/button/door/directional/west{ - id = "private_b"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = 9; - specialfunctions = 4 + id = "private_b"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -41215,6 +41151,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"nzg" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + name = "Test Chamber Blast Door"; + id = "Xenolab" + }, +/obj/machinery/door/window/left/directional/north{ + name = "Maximum Security Test Chamber"; + req_access = list("xenobiology") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/engine, +/area/station/science/xenobiology) "nzh" = ( /obj/structure/fluff/tram_rail/end{ dir = 8 @@ -41254,8 +41203,8 @@ "nzF" = ( /obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/conveyor_switch/oneway{ - id = "mining"; - dir = 1 + dir = 1; + id = "mining" }, /obj/structure/railing{ dir = 1 @@ -41352,16 +41301,16 @@ "nAT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_lower_eva_internal"; - idSelf = "middleleft_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleleft_lower_eva_airlock_control"; + idDoor = "middleleft_lower_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -41438,8 +41387,8 @@ /area/station/security/brig) "nDm" = ( /obj/modular_map_root/tramstation{ - key = "secservicelower"; - name = "secservicelower" + name = "secservicelower"; + key = "secservicelower" }, /turf/open/floor/plating, /area/station/maintenance/port/central) @@ -41587,9 +41536,9 @@ dir = 8 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics West"; dir = 6; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics West" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -41706,6 +41655,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/virology) +"nIC" = ( +/mob/living/simple_animal/bot/mulebot, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + location = "QM #6"; + codes_txt = "delivery;dir=1" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "nIQ" = ( /obj/effect/landmark/start/depsec/supply, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -41735,6 +41694,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/tram/left) +"nJx" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "nJF" = ( /obj/structure/bookcase/random/adult, /turf/open/floor/wood/parquet, @@ -41814,15 +41780,6 @@ /obj/machinery/telecomms/server/presets/common, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"nKy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "nKz" = ( /turf/open/floor/iron/dark, /area/station/service/bar) @@ -41891,8 +41848,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/button/door/directional/north{ - id = "righttunnel"; - name = "Tunnel Access Shutters Toggle" + name = "Tunnel Access Shutters Toggle"; + id = "righttunnel" }, /turf/open/floor/plating, /area/station/maintenance/tram/right) @@ -42133,6 +42090,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"nQq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "nQr" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -42169,23 +42132,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"nQR" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Isolation Cell D"; - id = "Isolation_D" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/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) "nQY" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/holosign/barrier/atmos/tram, @@ -42262,15 +42208,15 @@ /area/station/hallway/secondary/command) "nSd" = ( /obj/machinery/button/door/directional/west{ - id = "commissarydeezdoorz"; - name = "Commissary Shutter Access" + name = "Commissary Shutter Access"; + id = "commissarydeezdoorz" }, /obj/machinery/button/door/directional/west{ - id = "vacant_space"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = -9; - specialfunctions = 4 + id = "vacant_space"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light_switch/directional/west{ @@ -42667,8 +42613,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/mail_sorting/service/hop_office, /obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - name = "sorting disposal pipe (Head of Personnel's Office)" + name = "sorting disposal pipe (Head of Personnel's Office)"; + dir = 1 }, /obj/structure/cable, /turf/open/floor/iron, @@ -42697,8 +42643,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/modular_map_root/tramstation{ - key = "dormmedupper"; - name = "dormmedupper" + name = "dormmedupper"; + key = "dormmedupper" }, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/crew_quarters/dorms) @@ -42790,11 +42736,11 @@ /area/station/hallway/primary/tram/left) "oar" = ( /obj/machinery/button/door/directional/west{ - id = "private_p"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = 9; - specialfunctions = 4 + id = "private_p"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -42868,8 +42814,8 @@ "obz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Privacy Shutter" + name = "Privacy Shutter"; + id = "ceprivacy" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -42997,17 +42943,17 @@ "ofA" = ( /obj/structure/chair/office, /obj/machinery/button/door/directional/south{ - id = "hop"; name = "Privacy Shutters Control"; pixel_x = 24; pixel_y = -1; + id = "hop"; req_access = list("kitchen") }, /obj/machinery/button/door/directional/south{ - id = "papersplease"; name = "Arrival Checkpoint Enforcement Procedure"; pixel_x = 35; pixel_y = -10; + id = "papersplease"; req_access = list("kitchen") }, /obj/machinery/button/ticket_machine{ @@ -43015,27 +42961,27 @@ pixel_y = -10 }, /obj/machinery/button/door/directional/south{ - id = "hopqueuestart"; name = "Queue Shutters Entry Control"; pixel_x = 24; pixel_y = 8; + id = "hopqueuestart"; req_access = list("kitchen") }, /obj/machinery/keycard_auth/directional/south{ pixel_x = 26 }, /obj/machinery/button/door/directional/south{ - id = "hopqueueend"; name = "Queue Shutters Upper Exit Control"; pixel_x = 35; pixel_y = 8; + id = "hopqueueend"; req_access = list("kitchen") }, /obj/machinery/button/door/directional/south{ - id = "hopqueueendbottom"; name = "Queue Shutters Lower Exit Control"; pixel_x = 35; pixel_y = -1; + id = "hopqueueendbottom"; req_access = list("kitchen") }, /obj/effect/landmark/start/head_of_personnel, @@ -43199,11 +43145,11 @@ /obj/structure/filingcabinet, /obj/structure/window/spawner/directional/north, /obj/item/paper{ - default_raw_text = "A crude mapping of the station layout based on leaked internal documents and orbital snapshots taken during construction. I'm not sure how up-to-date this is anymore.."; + name = "station layout"; icon = 'icons/obj/scrolls.dmi'; icon_state = "blueprints"; - inhand_icon_state = "blueprints"; - name = "station layout" + default_raw_text = "A crude mapping of the station layout based on leaked internal documents and orbital snapshots taken during construction. I'm not sure how up-to-date this is anymore.."; + inhand_icon_state = "blueprints" }, /turf/open/floor/iron/dark/small, /area/station/commons/vacant_room) @@ -43284,8 +43230,8 @@ }, /obj/item/radio/intercom/directional/south, /obj/machinery/camera/directional/south{ - c_tag = "Science - Break Room"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Break Room" }, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) @@ -43355,23 +43301,12 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/service/library) -"olh" = ( -/obj/machinery/flasher/directional/south{ - id = "AI"; - pixel_x = 20 - }, -/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) "ols" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/bed/medical/emergency, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Lobby"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Lobby" }, /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, @@ -43431,8 +43366,8 @@ /area/station/command/heads_quarters/hop) "omN" = ( /obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" + name = "Atmospherics Blast Door"; + id = "atmos" }, /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, @@ -43528,8 +43463,8 @@ dir = 4 }, /obj/machinery/camera/directional/east{ - c_tag = "Security - Main East"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Main East" }, /obj/structure/table, /obj/item/storage/fancy/coffee_cart_rack{ @@ -43563,8 +43498,8 @@ id = "cargolower" }, /obj/machinery/door/poddoor/preopen{ - id = "Disposal Exit"; - name = "Disposal Exit Vent" + name = "Disposal Exit Vent"; + id = "Disposal Exit" }, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/garbage{ @@ -43599,15 +43534,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/plating, /area/station/engineering/atmos) -"orN" = ( -/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/hallway/secondary/exit) "orQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -43637,8 +43563,8 @@ dir = 8 }, /obj/machinery/requests_console/directional/west{ - department = "Engineering"; - name = "Engineering Requests Console" + name = "Engineering Requests Console"; + department = "Engineering" }, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -43746,16 +43672,16 @@ dir = 8 }, /obj/machinery/requests_console/directional/west{ - department = "Quartermaster's Desk"; - name = "Quartermaster's Requests Console" + name = "Quartermaster's Requests Console"; + department = "Quartermaster's Desk" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/ore_update, /obj/effect/mapping_helpers/requests_console/assistance, /obj/machinery/camera{ - c_tag = "Cargo - Quartermaster's Office"; dir = 10; - network = list("ss13","cargo") + network = list("ss13","cargo"); + c_tag = "Cargo - Quartermaster's Office" }, /obj/machinery/light/warm/directional/west, /turf/open/floor/iron, @@ -43797,6 +43723,10 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) +"ouQ" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/command/meeting_room) "ouW" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/library, @@ -44011,8 +43941,8 @@ /area/station/security/prison) "oAg" = ( /obj/machinery/power/solar_control{ - id = "forestarboard"; - name = "Starboard Solar Control" + name = "Starboard Solar Control"; + id = "forestarboard" }, /obj/structure/cable, /obj/effect/turf_decal/sand/plating, @@ -44118,8 +44048,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ - id = "playerscantreadthis"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + id = "playerscantreadthis" }, /obj/effect/landmark/start/hangover, /turf/open/floor/iron/checker, @@ -44155,6 +44085,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"oDH" = ( +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/stamp/head/captain, +/obj/machinery/door/window/right/directional/south{ + name = "Captain's Desk"; + req_access = list("captain") + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "oDP" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -44176,10 +44116,10 @@ dir = 1 }, /obj/machinery/button/door/directional/west{ - id = "Toilet4"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "Toilet4"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/effect/landmark/blobstart, /obj/machinery/light/small/dim/directional/east, @@ -44270,6 +44210,15 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"oGG" = ( +/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/hallway/secondary/exit) "oGJ" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/medical/chemistry) @@ -44357,8 +44306,8 @@ dir = 9 }, /obj/machinery/camera/directional/west{ - c_tag = "Medical - Surgery Room A"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Surgery Room A" }, /obj/structure/sink{ dir = 4; @@ -44397,11 +44346,11 @@ /turf/open/openspace, /area/station/hallway/primary/tram/center) "oKZ" = ( +/mob/living/simple_animal/bot/floorbot, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) "oLn" = ( @@ -44531,8 +44480,8 @@ /area/station/cargo/lobby) "oNT" = ( /obj/machinery/door/airlock{ - id_tag = "ToiletSci1"; - name = "Private Stall 1" + name = "Private Stall 1"; + id_tag = "ToiletSci1" }, /turf/open/floor/iron/freezer, /area/station/science/lower) @@ -44568,6 +44517,16 @@ }, /turf/open/space/openspace, /area/station/solars/port) +"oOP" = ( +/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/neutral/filled/corner, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "oOT" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy{ @@ -44660,22 +44619,8 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"oQJ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "oQO" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/clothing/head/costume/bearpelt, /obj/item/gun/ballistic/revolver/russian, /obj/item/ammo_box/a357, @@ -44762,17 +44707,17 @@ /area/station/commons/storage/primary) "oSB" = ( /obj/machinery/camera/directional/west{ - c_tag = "Cargo - Security Outpost"; - network = list("ss13","Security","cargo") + network = list("ss13","Security","cargo"); + c_tag = "Cargo - Security Outpost" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, /obj/machinery/button/door/directional/west{ - id = "crgdoor"; name = "Cargo Cell Control"; - normaldoorcontrol = 1; - req_access = list("brig_entrance") + id = "crgdoor"; + req_access = list("brig_entrance"); + normaldoorcontrol = 1 }, /obj/structure/cable, /turf/open/floor/iron, @@ -44814,8 +44759,8 @@ "oTq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "kanyewest"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + id = "kanyewest" }, /turf/open/floor/plating, /area/station/security/detectives_office) @@ -44972,8 +44917,8 @@ /area/station/science/lower) "oWB" = ( /obj/machinery/camera/directional/west{ - c_tag = "Security - Rec Room South"; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Rec Room South" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -45009,9 +44954,9 @@ /area/station/commons/vacant_room/office) "oXq" = ( /obj/machinery/door/poddoor/shutters{ + name = "MiniSat Teleport Access"; dir = 4; - id = "teledoor"; - name = "MiniSat Teleport Access" + id = "teledoor" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -45141,10 +45086,10 @@ pixel_y = 8 }, /obj/machinery/button/door/directional/west{ - id = "Toilet2"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "Toilet2"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/effect/landmark/start/assistant, /obj/machinery/light/small/dim/directional/east, @@ -45167,8 +45112,8 @@ "pbo" = ( /obj/structure/rack, /obj/machinery/camera/directional/north{ - c_tag = "Security - Armory"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Armory" }, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -45276,8 +45221,8 @@ "pcY" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/power/solar_control{ - id = "aicore"; - name = "AI Core Solar Control" + name = "AI Core Solar Control"; + id = "aicore" }, /obj/structure/cable, /turf/open/floor/circuit, @@ -45290,8 +45235,8 @@ /area/station/solars/starboard/fore) "pdf" = ( /obj/machinery/camera/directional/north{ - c_tag = "Engineering - Security Outpost"; - network = list("ss13","engineering","Security") + network = list("ss13","engineering","Security"); + c_tag = "Engineering - Security Outpost" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -45398,6 +45343,17 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) +"pfm" = ( +/obj/effect/spawner/random/bedsheet/double{ + dir = 4 + }, +/obj/structure/bed/double{ + dir = 4 + }, +/obj/structure/sign/clock/directional/north, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "pfD" = ( /obj/machinery/computer/crew{ dir = 1 @@ -45482,8 +45438,8 @@ /area/station/maintenance/starboard/lesser) "pgV" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + name = "Radiation Chamber Shutters"; + id = "engsm" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -45510,6 +45466,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/tram/mid) +"phH" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Hydroponics Desk"; + req_access = list("hydroponics") + }, +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "pib" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/door/firedoor, @@ -45645,9 +45610,9 @@ dir = 8 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Entry Airlock"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Entry Airlock" }, /turf/open/floor/iron, /area/station/engineering/main) @@ -45697,8 +45662,8 @@ /area/station/hallway/primary/tram/left) "plr" = ( /obj/machinery/door/airlock{ - id_tag = "miningdorm3"; - name = "Room 3" + name = "Room 3"; + id_tag = "miningdorm3" }, /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45856,9 +45821,9 @@ "pob" = ( /obj/machinery/smartfridge/chemistry/preloaded, /obj/machinery/door/poddoor/shutters/preopen{ + name = "Pharmacy Shutters"; dir = 4; - id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + id = "pharmacy_shutters_2" }, /obj/machinery/door/firedoor, /turf/open/floor/plating, @@ -45901,8 +45866,8 @@ /area/station/science/genetics) "poT" = ( /obj/machinery/atmospherics/components/binary/valve/digital/on{ - dir = 4; - name = "Output Release" + name = "Output Release"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -46003,11 +45968,11 @@ "pqU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "rightmost_lower_upper_eva_external"; - idInterior = "rightmost_lower_upper_eva_internal"; - idSelf = "rightmost_lower_upper_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "rightmost_lower_upper_eva_airlock_control"; + idInterior = "rightmost_lower_upper_eva_internal"; + idExterior = "rightmost_lower_upper_eva_external" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, @@ -46100,8 +46065,8 @@ dir = 6 }, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4; - name = "Oxygen Tank Injection Port" + name = "Oxygen Tank Injection Port"; + dir = 4 }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) @@ -46155,10 +46120,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"ptq" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/command/meeting_room) "pts" = ( /obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 + charge = 10000; + capacity = 9e+06 }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46566,15 +46536,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) -"pza" = ( -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "pzb" = ( /obj/effect/turf_decal/tile/brown/opposingcorners{ dir = 1 @@ -46585,9 +46546,9 @@ /area/station/cargo/miningfoundry) "pzc" = ( /obj/machinery/camera{ - c_tag = "Security - Interrogation Observation"; dir = 6; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Interrogation Observation" }, /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -46664,8 +46625,8 @@ dir = 1 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Mix to Filter" + name = "Mix to Filter"; + dir = 8 }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) @@ -46677,8 +46638,8 @@ dir = 4 }, /obj/machinery/door/poddoor/preopen{ - id = "Sciencelockdown"; - name = "Research Lockdown Blastdoor" + name = "Research Lockdown Blastdoor"; + id = "Sciencelockdown" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46746,6 +46707,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) +"pBU" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/science/research) "pBZ" = ( /obj/structure/railing/corner{ dir = 4 @@ -46858,8 +46828,8 @@ /area/station/commons/fitness/recreation) "pEa" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8; - name = "killroom vent" + name = "killroom vent"; + dir = 8 }, /turf/open/floor/circuit/telecomms, /area/station/science/xenobiology) @@ -46876,12 +46846,12 @@ /area/station/hallway/secondary/exit/departure_lounge) "pEB" = ( /obj/docking_port/stationary{ - dir = 2; - dwidth = 11; - height = 24; name = "SS13: Auxiliary Dock, Station-Port"; + dir = 2; + width = 35; + height = 24; shuttle_id = "whiteship_home"; - width = 35 + dwidth = 11 }, /turf/open/space/openspace, /area/space) @@ -46900,8 +46870,8 @@ dir = 8 }, /obj/machinery/door/poddoor/preopen{ - id = "Sciencelockdown"; - name = "Research Lockdown Blastdoor" + name = "Research Lockdown Blastdoor"; + id = "Sciencelockdown" }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, @@ -46981,8 +46951,8 @@ /area/station/medical/medbay/central) "pGg" = ( /obj/modular_map_root/tramstation{ - key = "cargoscilower"; - name = "cargoscilower" + name = "cargoscilower"; + key = "cargoscilower" }, /turf/open/misc/asteroid, /area/station/asteroid) @@ -46993,6 +46963,11 @@ }, /turf/open/floor/carpet, /area/station/cargo/miningdock) +"pGr" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/wood, +/area/station/command/meeting_room) "pGy" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -47018,7 +46993,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/machinery/disposal/bin, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/dark, /area/station/command/bridge) "pGS" = ( @@ -47099,8 +47074,8 @@ /obj/item/wrench, /obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/camera/directional/south{ - c_tag = "Science - Server Room"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Server Room" }, /turf/open/floor/circuit/green, /area/station/science/server) @@ -47210,8 +47185,8 @@ /obj/structure/table/wood, /obj/item/flashlight/lamp, /obj/machinery/requests_console/directional/north{ - department = "Chapel"; - name = "Chapel Requests Console" + name = "Chapel Requests Console"; + department = "Chapel" }, /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/grimy, @@ -47261,8 +47236,8 @@ dir = 8 }, /obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrigright"; - name = "Brig" + name = "Brig"; + id_tag = "outerbrigright" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig_right" @@ -47371,8 +47346,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" + name = "Test Chamber Blast Door"; + id = "Xenolab" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -47433,9 +47408,9 @@ pixel_y = 3 }, /obj/machinery/camera{ - c_tag = "Security - Gulag Prep"; dir = 6; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Gulag Prep" }, /turf/open/floor/iron, /area/station/security/brig) @@ -47444,8 +47419,8 @@ dir = 1 }, /obj/machinery/camera/directional/north{ - c_tag = "Science - Lower Hall North"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Lower Hall North" }, /turf/open/floor/iron/white, /area/station/science/lower) @@ -47459,8 +47434,8 @@ /area/station/cargo/miningdock) "pOy" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + name = "Radiation Chamber Shutters"; + id = "engsm" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -47496,6 +47471,20 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/primary) +"pOY" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Science - Research & Development"; + network = list("ss13","rd") + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/white, +/area/station/science/lab) "pOZ" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -47506,8 +47495,8 @@ }, /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8; - name = "Exfiltrate Port" + name = "Exfiltrate Port"; + dir = 8 }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) @@ -47564,21 +47553,6 @@ "pQx" = ( /turf/open/misc/asteroid/dug, /area/station/science/explab) -"pQD" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "pQF" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -47588,8 +47562,8 @@ /area/station/service/hydroponics) "pQO" = ( /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Cooling Loop" + name = "Gas to Cooling Loop"; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -47682,6 +47656,13 @@ /obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"pTW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/structure/sign/departments/evac/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "pUi" = ( /obj/structure/railing{ dir = 4 @@ -47771,8 +47752,8 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/button/door/directional/south{ - id = "engsm"; name = "Radiation Shutters Control"; + id = "engsm"; req_access = list("engineering") }, /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ @@ -47878,6 +47859,16 @@ /obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"pXq" = ( +/mob/living/simple_animal/bot/mulebot, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + location = "QM #3"; + codes_txt = "delivery;dir=2" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "pXC" = ( /obj/machinery/door/airlock/external{ name = "External Access" @@ -47900,8 +47891,8 @@ dir = 1 }, /obj/machinery/camera/directional/north{ - c_tag = "Medical - Chemistry East"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Chemistry East" }, /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47963,8 +47954,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/south{ - department = "Chief Engineer's Desk"; - name = "Chief Engineer's Request Console" + name = "Chief Engineer's Request Console"; + department = "Chief Engineer's Desk" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/supplies, @@ -48035,8 +48026,8 @@ "pZM" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ - c_tag = "Science - Cytology West"; - network = list("ss13","rd","xeno") + network = list("ss13","rd","xeno"); + c_tag = "Science - Cytology West" }, /obj/machinery/hydroponics/soil, /turf/open/floor/grass, @@ -48120,6 +48111,22 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"qbW" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/tram/filled/line, +/obj/effect/turf_decal/trimline/tram/filled/warning, +/obj/machinery/button/transport/tram/directional/south{ + id = 2 + }, +/obj/machinery/transport/destination_sign/indicator/directional/south, +/obj/effect/landmark/observer_start, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "qch" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -48163,8 +48170,8 @@ /obj/effect/spawner/random/vending/colavend, /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ - c_tag = "Medical - Breakroom"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Breakroom" }, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 @@ -48202,18 +48209,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"qdt" = ( -/obj/effect/turf_decal/trimline/neutral/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, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "qdy" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -48361,16 +48356,16 @@ /area/station/commons/dorms) "qfD" = ( /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_upper_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_upper_lower_eva_external"; - idSelf = "mostleft_upper_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "mostleft_upper_lower_eva_airlock_control"; + idDoor = "mostleft_upper_lower_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /obj/effect/turf_decal/sand, @@ -48393,6 +48388,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) +"qfQ" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "qfS" = ( /obj/machinery/smartfridge/organ, /obj/structure/window/reinforced/spawner/directional/west, @@ -48432,7 +48432,6 @@ /area/station/medical/chemistry) "qgy" = ( /obj/structure/table/reinforced, -/obj/structure/secure_safe/caps_spare/directional/east, /obj/machinery/cell_charger{ pixel_y = 4 }, @@ -48489,14 +48488,6 @@ /obj/machinery/door/poddoor/incinerator_atmos_aux, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"qhw" = ( -/obj/machinery/vending/snack/blue, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit) "qhC" = ( /obj/machinery/duct, /obj/structure/cable, @@ -48675,8 +48666,8 @@ /area/station/command/bridge) "qkr" = ( /obj/machinery/camera/directional/west{ - c_tag = "Security - Main West"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Main West" }, /turf/open/openspace, /area/station/security/brig) @@ -48742,8 +48733,8 @@ dir = 4 }, /obj/machinery/door/poddoor/shutters/preopen{ - id = "hopqueuestart"; - name = "HoP Queue Shutters" + name = "HoP Queue Shutters"; + id = "hopqueuestart" }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) @@ -48865,9 +48856,9 @@ dir = 1 }, /obj/machinery/button/flasher{ - id = "permafrontdoor"; pixel_x = 9; pixel_y = 24; + id = "permafrontdoor"; req_access = list("brig") }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48955,8 +48946,8 @@ }, /obj/structure/filingcabinet, /obj/machinery/camera{ - c_tag = "Civilian - Vacant Office"; - dir = 9 + dir = 9; + c_tag = "Civilian - Vacant Office" }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) @@ -48988,6 +48979,11 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/fitness/recreation) +"qqm" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "qqv" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on, /obj/machinery/light/directional/north, @@ -49022,6 +49018,16 @@ /obj/machinery/light/directional/west, /turf/open/floor/noslip/tram, /area/station/hallway/primary/tram/center) +"qrs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/personal, +/obj/effect/spawner/random/bureaucracy/briefcase, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "qrx" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -49131,8 +49137,8 @@ "qtB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "cytologysecure1"; - name = "Secure Pen Lockdown" + name = "Secure Pen Lockdown"; + id = "cytologysecure1" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -49252,6 +49258,15 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"qvR" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/station/science/research) "qvV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -49396,8 +49411,8 @@ /area/station/command/heads_quarters/qm) "qzf" = ( /obj/machinery/button/door/directional/east{ - id = "ceprivacy"; - name = "Privacy Shutters Control" + name = "Privacy Shutters Control"; + id = "ceprivacy" }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) @@ -49462,19 +49477,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/mid) -"qAk" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 5 - }, -/obj/machinery/computer/department_orders/engineering{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) "qAl" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, @@ -49559,16 +49561,16 @@ "qBX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_lower_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_lower_lower_eva_internal"; - idSelf = "middleleft_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_x = -24 + pixel_x = -24; + idSelf = "middleleft_lower_lower_eva_airlock_control"; + idDoor = "middleleft_lower_lower_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49694,8 +49696,8 @@ "qCU" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/solar{ - id = "forestarboard"; - name = "Starboard Solar Array" + name = "Starboard Solar Array"; + id = "forestarboard" }, /obj/structure/cable, /turf/open/space/basic, @@ -49815,6 +49817,12 @@ /obj/effect/mapping_helpers/mail_sorting/science/genetics, /turf/open/floor/iron/white, /area/station/science/research) +"qFH" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "qFK" = ( /obj/machinery/telecomms/processor/preset_four, /turf/open/floor/iron/dark/telecomms, @@ -49858,17 +49866,17 @@ /area/station/science/ordnance/testlab) "qHo" = ( /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "rightmost_upper_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/access_button{ - idDoor = "rightmost_upper_eva_internal"; - idSelf = "rightmost_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "rightmost_upper_eva_airlock_control"; + idDoor = "rightmost_upper_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -49931,6 +49939,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/science) "qIc" = ( @@ -50108,8 +50117,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/poddoor/preopen{ - id = "rdoffice"; - name = "Research Director's Shutters" + name = "Research Director's Shutters"; + id = "rdoffice" }, /obj/structure/disposalpipe/segment{ dir = 5 @@ -50191,16 +50200,16 @@ /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/button/door{ - id = "Xenolab"; name = "Test Chamber Blast Doors"; pixel_x = 4; pixel_y = 9; + id = "Xenolab"; req_access = list("xenobiology") }, /obj/machinery/button/ignition{ - id = "Xenobio"; pixel_x = -6; - pixel_y = 9 + pixel_y = 9; + id = "Xenobio" }, /obj/item/radio/intercom{ pixel_y = -4 @@ -50218,8 +50227,8 @@ /area/station/commons/fitness/recreation/entertainment) "qND" = ( /obj/machinery/camera{ - c_tag = "Arrivals - North Docking Hall"; - dir = 6 + dir = 6; + c_tag = "Arrivals - North Docking Hall" }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50440,38 +50449,21 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" + name = "Test Chamber Blast Door"; + id = "Xenolab" }, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/science/xenobiology) "qTp" = ( /obj/machinery/door/airlock{ - id_tag = "private_b"; - name = "Private Quarters B" + name = "Private Quarters B"; + id_tag = "private_b" }, /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) -"qTq" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Isolation Wing"; - unres_sensor = 1; - unres_sides = 8 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "qTt" = ( /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -50500,9 +50492,9 @@ /area/station/hallway/primary/tram/right) "qTI" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Emitter Room West"; dir = 10; - network = list("ss13","engine","engineering") + network = list("ss13","engine","engineering"); + c_tag = "Engineering - Emitter Room West" }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -50532,8 +50524,8 @@ /area/station/hallway/primary/tram/center) "qUy" = ( /obj/machinery/camera/directional/south{ - c_tag = "Civilian - Holodeck South"; - name = "holodeck camera" + name = "holodeck camera"; + c_tag = "Civilian - Holodeck South" }, /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -50580,8 +50572,8 @@ dir = 1 }, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Main Storage"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main Storage" }, /turf/open/floor/iron/dark, /area/station/medical/storage) @@ -50698,17 +50690,17 @@ "qWI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_lower_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_lower_lower_eva_external"; - idSelf = "middleright_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleright_lower_lower_eva_airlock_control"; + idDoor = "middleright_lower_lower_eva_external" }, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/mid) @@ -50799,20 +50791,20 @@ /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/item/stock_parts/cell/crap/empty{ - pixel_y = 10; - pixel_x = 6 + pixel_x = 6; + pixel_y = 10 }, /obj/item/stock_parts/cell/crap/empty{ - pixel_y = 2; - pixel_x = 6 + pixel_x = 6; + pixel_y = 2 }, /obj/item/stock_parts/cell/crap/empty{ - pixel_y = 7; - pixel_x = -7 + pixel_x = -7; + pixel_y = 7 }, /obj/item/stock_parts/cell/crap/empty{ - pixel_y = -2; - pixel_x = -2 + pixel_x = -2; + pixel_y = -2 }, /turf/open/floor/iron/smooth, /area/station/security/mechbay) @@ -50855,8 +50847,8 @@ /area/station/engineering/atmos) "qYx" = ( /obj/machinery/door/airlock{ - id_tag = "Toilet5"; - name = "Unit 5" + name = "Unit 5"; + id_tag = "Toilet5" }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) @@ -50902,8 +50894,8 @@ /area/station/science/lower) "qZa" = ( /obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay" + name = "Medbay"; + id_tag = "MedbayFoyer" }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -50953,9 +50945,9 @@ /obj/item/reagent_containers/syringe, /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/camera{ - c_tag = "Security - Medical Center"; dir = 10; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Medical Center" }, /turf/open/floor/iron/white, /area/station/security/medical) @@ -50977,6 +50969,20 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"qZZ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/west, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "ram" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 4 @@ -50985,8 +50991,8 @@ /area/station/engineering/atmos) "rao" = ( /obj/machinery/door/airlock/security{ - id_tag = "laborexit"; - name = "Labor Shuttle" + name = "Labor Shuttle"; + id_tag = "laborexit" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -51104,8 +51110,8 @@ }, /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/camera/directional/east{ - c_tag = "Science - Xenobiology East"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Xenobiology East" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -51166,15 +51172,15 @@ /area/station/tcommsat/server) "rcU" = ( /obj/structure/chair{ - dir = 4; - name = "Prosecution" + name = "Prosecution"; + dir = 4 }, /turf/open/floor/wood/large, /area/station/service/barber) "rdk" = ( /obj/machinery/door/airlock{ - id_tag = "Toilet6"; - name = "Unit 6" + name = "Unit 6"; + id_tag = "Toilet6" }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) @@ -51208,8 +51214,8 @@ dir = 6 }, /obj/machinery/camera/directional/east{ - c_tag = "Medical - Treatment South-East"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Treatment South-East" }, /obj/machinery/vending/wallmed/directional/east, /obj/machinery/light/directional/east, @@ -51258,12 +51264,12 @@ /area/station/hallway/secondary/entry) "rem" = ( /obj/machinery/button/door/directional/west{ - id = "private_e"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = -9; - specialfunctions = 4 + id = "private_e"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -51300,8 +51306,8 @@ dir = 6 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Unfiltered to Mix" + name = "Unfiltered to Mix"; + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) @@ -51358,10 +51364,10 @@ dir = 1 }, /obj/machinery/button/door/directional/west{ - id = "Toilet5"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "Toilet5"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/light/small/dim/directional/east, /turf/open/floor/iron/freezer, @@ -51427,8 +51433,8 @@ /area/station/commons/dorms) "rif" = ( /obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" + name = "Atmospherics Blast Door"; + id = "atmos" }, /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, @@ -51594,8 +51600,8 @@ "rkI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "containdeez2"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez2" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -51655,8 +51661,8 @@ /area/station/engineering/atmos) "rlX" = ( /obj/machinery/door/airlock{ - id_tag = "Toilet4"; - name = "Unit 4" + name = "Unit 4"; + id_tag = "Toilet4" }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) @@ -51858,16 +51864,16 @@ "roH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_lower_eva_internal"; - idSelf = "middleright_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleright_lower_eva_airlock_control"; + idDoor = "middleright_lower_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -51879,8 +51885,8 @@ /obj/effect/turf_decal/stripes/corner, /obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/camera/directional/south{ - c_tag = "Science - Xenobiology South"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Xenobiology South" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -52014,10 +52020,10 @@ /turf/open/floor/iron/dark, /area/station/security/interrogation) "rsk" = ( +/mob/living/basic/pet/cat/runtime, /obj/structure/bed/dogbed/runtime, /obj/structure/sign/clock/directional/north, /obj/machinery/light/cold/directional/north, -/mob/living/basic/pet/cat/runtime, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) "rsz" = ( @@ -52052,15 +52058,6 @@ "rtp" = ( /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) -"rts" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/left/directional/west{ - name = "Fitness Ring" - }, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 4 - }, -/area/station/commons/fitness) "run" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -52220,8 +52217,8 @@ dir = 4 }, /obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrigleft"; - name = "Brig" + name = "Brig"; + id_tag = "innerbrigleft" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig_left" @@ -52241,6 +52238,16 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"rxI" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/transport/power_rectifier, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "rxN" = ( /obj/machinery/photocopier, /obj/structure/extinguisher_cabinet/directional/north, @@ -52356,9 +52363,9 @@ /area/station/security/brig) "rAf" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics N2 Chamber"; dir = 6; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics N2 Chamber" }, /turf/open/floor/engine/n2, /area/station/engineering/atmos) @@ -52395,8 +52402,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/poddoor/preopen{ - id = "rdoffice"; - name = "Research Director's Shutters" + name = "Research Director's Shutters"; + id = "rdoffice" }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) @@ -52404,8 +52411,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ - id = "playerscantreadthis"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + id = "playerscantreadthis" }, /obj/item/plate, /turf/open/floor/iron/checker, @@ -52444,16 +52451,16 @@ "rBS" = ( /obj/effect/turf_decal/sand, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_lower_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_lower_lower_eva_external"; - idSelf = "middleleft_lower_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleleft_lower_lower_eva_airlock_control"; + idDoor = "middleleft_lower_lower_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -52471,6 +52478,16 @@ "rCd" = ( /turf/closed/wall, /area/station/engineering/atmospherics_engine) +"rCs" = ( +/mob/living/simple_animal/bot/mulebot, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + location = "QM #1"; + codes_txt = "delivery;dir=2" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "rCL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -52478,21 +52495,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/right) -"rCZ" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/modular_computer/preset/cargochat/medical{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "rDj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -52643,8 +52645,8 @@ "rHj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + id = "rndlab1" }, /turf/open/floor/plating, /area/station/science/lab) @@ -52675,14 +52677,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"rIb" = ( -/obj/machinery/vending/cola/blue, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit) "rIg" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -52721,9 +52715,9 @@ }, /obj/structure/table, /obj/machinery/camera{ - c_tag = "Secure - AI Minisat Internal Power Access"; dir = 9; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Minisat Internal Power Access" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) @@ -52875,7 +52869,7 @@ /area/station/solars/port) "rLB" = ( /obj/machinery/power/smes{ - charge = 5e+006 + charge = 5e+06 }, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -52918,9 +52912,9 @@ /area/station/hallway/primary/tram/right) "rMp" = ( /obj/machinery/camera{ - c_tag = "Security - Interrogation Main"; dir = 9; - network = list("ss13","Security","interrogation") + network = list("ss13","Security","interrogation"); + c_tag = "Security - Interrogation Main" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -52969,9 +52963,9 @@ }, /obj/structure/cable, /obj/machinery/camera{ - c_tag = "Security - Pre-Trial Holding"; dir = 9; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Pre-Trial Holding" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52987,29 +52981,11 @@ dir = 9 }, /obj/machinery/camera/directional/west{ - c_tag = "Medical - Treatment North-West"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Treatment North-West" }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"rNp" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/effect/landmark/navigate_destination/atmos, -/obj/machinery/door/window/right/directional/east{ - name = "Atmospherics Front Desk"; - req_access = list("atmospherics") - }, -/obj/structure/desk_bell{ - pixel_x = -7 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) "rNt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -53019,8 +52995,8 @@ /area/station/medical/virology) "rNG" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + name = "Radiation Chamber Shutters"; + id = "engsm" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -53060,8 +53036,8 @@ /area/station/security/brig) "rOm" = ( /obj/machinery/door/airlock{ - id_tag = "private_c"; - name = "Private Quarters C" + name = "Private Quarters C"; + id_tag = "private_c" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53117,8 +53093,8 @@ /obj/machinery/airalarm/directional/north, /obj/structure/cable, /obj/machinery/camera/motion/directional/north{ - c_tag = "Secure - AI Core South"; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Core South" }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) @@ -53127,8 +53103,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/east{ - department = "Library"; - name = "Library Requests Console" + name = "Library Requests Console"; + department = "Library" }, /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/engine/cult, @@ -53143,9 +53119,9 @@ color = "#9FED58" }, /obj/effect/turf_decal/arrows/white{ - color = "#FF0000"; dir = 4; - pixel_x = -15 + pixel_x = -15; + color = "#FF0000" }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -53160,8 +53136,8 @@ dir = 1 }, /obj/machinery/camera{ - c_tag = "Civilian - aux_base Construction"; - dir = 9 + dir = 9; + c_tag = "Civilian - aux_base Construction" }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) @@ -53305,9 +53281,9 @@ "rRi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Test Room"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Test Room" }, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) @@ -53390,8 +53366,8 @@ /area/station/hallway/primary/tram/center) "rSp" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "prisondorm"; - name = "Prison Dorm 4" + name = "Prison Dorm 4"; + id_tag = "prisondorm" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -53458,8 +53434,8 @@ /area/station/science/xenobiology) "rUd" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrigright"; - name = "Brig" + name = "Brig"; + id_tag = "outerbrigright" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -53502,12 +53478,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/science/explab) -"rUP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "rUQ" = ( /obj/structure/window/reinforced/fulltile, /turf/open/floor/grass, @@ -53547,8 +53517,8 @@ /obj/structure/lattice/catwalk, /obj/structure/cable, /obj/machinery/power/solar{ - id = "portsolar"; - name = "Port Solar Array" + name = "Port Solar Array"; + id = "portsolar" }, /turf/open/space/basic, /area/station/solars/port) @@ -53691,8 +53661,8 @@ /area/station/command/meeting_room) "rYO" = ( /obj/docking_port/stationary/random{ - dir = 8; name = "lavaland"; + dir = 8; shuttle_id = "pod_4_lavaland" }, /turf/open/misc/asteroid/airless, @@ -53725,13 +53695,13 @@ /area/station/ai_monitored/command/storage/eva) "rZx" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Filter" + name = "Gas to Filter"; + dir = 1 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Engine Room Airlock"; dir = 10; - network = list("ss13","engine","engineering") + network = list("ss13","engine","engineering"); + c_tag = "Engineering - Engine Room Airlock" }, /obj/machinery/light/small/directional/west, /turf/open/floor/engine, @@ -53744,8 +53714,8 @@ dir = 4 }, /obj/machinery/requests_console/directional/west{ - department = "Security"; - name = "Security Requests Console" + name = "Security Requests Console"; + department = "Security" }, /obj/effect/mapping_helpers/requests_console/information, /obj/effect/mapping_helpers/requests_console/supplies, @@ -54058,8 +54028,8 @@ dir = 9 }, /obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Cell 5"; - network = list("ss13","Security","prison","pcell") + network = list("ss13","Security","prison","pcell"); + c_tag = "Security - Prison Cell 5" }, /turf/open/floor/iron, /area/station/security/prison/safe) @@ -54175,8 +54145,8 @@ dir = 5 }, /obj/machinery/camera/directional/east{ - c_tag = "Medical - Surgery B"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Surgery B" }, /obj/machinery/vending/wallmed/directional/north, /obj/structure/disposalpipe/trunk{ @@ -54222,8 +54192,8 @@ /area/station/hallway/secondary/service) "sjc" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port to Filter" + name = "Port to Filter"; + dir = 8 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -54308,13 +54278,13 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "skb" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 }, /obj/structure/disposalpipe/trunk{ dir = 1 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron, /area/station/cargo/storage) "ski" = ( @@ -54349,22 +54319,6 @@ /obj/structure/chair/sofa/bench/tram, /turf/open/openspace, /area/station/hallway/primary/tram/center) -"skB" = ( -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/tram/filled/line, -/obj/effect/turf_decal/trimline/tram/filled/warning, -/obj/machinery/button/transport/tram/directional/south{ - id = 2 - }, -/obj/machinery/transport/destination_sign/indicator/directional/south, -/obj/effect/landmark/observer_start, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "skC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54463,8 +54417,8 @@ "sml" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "containdeez3"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez3" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -54508,8 +54462,8 @@ /obj/machinery/microwave, /obj/item/radio/intercom/prison/directional/south, /obj/machinery/camera/directional/south{ - c_tag = "Security - Prison Cafeteria"; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Cafeteria" }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) @@ -54518,9 +54472,9 @@ dir = 8 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Main"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Main" }, /obj/structure/rack, /obj/item/clothing/glasses/meson/engine{ @@ -54574,6 +54528,14 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"snF" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) "snK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -54608,8 +54570,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ - id = "playerscantreadthis"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + id = "playerscantreadthis" }, /obj/structure/desk_bell{ pixel_x = 7 @@ -54635,13 +54597,6 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"spE" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/transport/power_rectifier, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "spF" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) @@ -54741,18 +54696,6 @@ /obj/structure/sign/calendar/directional/north, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) -"srx" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/modular_computer/preset/civilian{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/science/research) "srz" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -54778,6 +54721,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"srY" = ( +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Engineering Cell"; + id = "engcell"; + req_access = list("security") + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "ssn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54837,20 +54796,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/modular_map_root/tramstation{ - key = "servicecargolower"; - name = "servicecargolower" + name = "servicecargolower"; + key = "servicecargolower" }, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/greater) -"ssN" = ( -/obj/machinery/computer/department_orders/service, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Autolathe Room" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "ssT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, @@ -55021,8 +54971,8 @@ dir = 10 }, /obj/machinery/button/door/directional/west{ - id = "pharmacy_shutters_2"; name = "Pharmacy Privacy Shutters Toggle"; + id = "pharmacy_shutters_2"; req_one_access = list("pharmacy") }, /obj/structure/table/glass, @@ -55040,8 +54990,8 @@ dir = 1 }, /obj/machinery/fax{ - fax_name = "Chief Engineer's Office"; - name = "Chief Engineer's Fax Machine" + name = "Chief Engineer's Fax Machine"; + fax_name = "Chief Engineer's Office" }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) @@ -55055,9 +55005,9 @@ "sva" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + name = "Research and Development Shutter"; dir = 8; - id = "rndlab1"; - name = "Research and Development Shutter" + id = "rndlab1" }, /obj/machinery/door/firedoor, /obj/machinery/door/window/left/directional/east{ @@ -55079,8 +55029,8 @@ "svA" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Engine Coolant Bypass" + name = "Engine Coolant Bypass"; + dir = 8 }, /obj/effect/turf_decal/trimline/yellow/corner{ dir = 4 @@ -55216,9 +55166,9 @@ dir = 4 }, /obj/machinery/button/door/directional/north{ - id = "robotics2"; name = "Robotics Privacy Shuttles Control"; pixel_x = 8; + id = "robotics2"; req_access = list("robotics") }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -55260,8 +55210,8 @@ dir = 9 }, /obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Cell 3"; - network = list("ss13","Security","prison","pcell") + network = list("ss13","Security","prison","pcell"); + c_tag = "Security - Prison Cell 3" }, /turf/open/floor/iron, /area/station/security/prison/safe) @@ -55271,9 +55221,9 @@ /area/station/commons/dorms) "szq" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Emitter Room East"; dir = 6; - network = list("ss13","engine","engineering") + network = list("ss13","engine","engineering"); + c_tag = "Engineering - Emitter Room East" }, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, @@ -55316,13 +55266,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"szN" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/left/directional/west{ - name = "Fitness Ring" - }, -/turf/open/floor/iron/dark/smooth_corner, -/area/station/commons/fitness) "szZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55387,8 +55330,8 @@ /obj/structure/table/wood, /obj/item/radio/intercom/directional/south, /obj/machinery/fax{ - fax_name = "Detective's Office"; - name = "Detective's Fax Machine" + name = "Detective's Fax Machine"; + fax_name = "Detective's Office" }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) @@ -55439,8 +55382,8 @@ dir = 8 }, /obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrigright"; - name = "Brig" + name = "Brig"; + id_tag = "innerbrigright" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig_right" @@ -55520,6 +55463,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/office) +"sFw" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Incoming Mail"; + req_access = list("shipping") + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "sFA" = ( /obj/structure/mannequin/skeleton, /turf/open/floor/iron/dark, @@ -55546,10 +55499,10 @@ /area/station/security/courtroom/holding) "sGk" = ( /obj/machinery/button/door/directional/east{ - id = "miningdorm1"; name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "miningdorm1"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55620,8 +55573,8 @@ dir = 4 }, /obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrigright"; - name = "Brig" + name = "Brig"; + id_tag = "innerbrigright" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig_right" @@ -55721,6 +55674,14 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"sJx" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "sJQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55858,20 +55819,13 @@ "sLZ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/conveyor_switch/oneway{ - id = "engineeringchute"; name = "Shipment Delivery Chute Activator"; - pixel_x = -11 + pixel_x = -11; + id = "engineeringchute" }, /obj/machinery/digital_clock/directional/south, /turf/open/floor/iron, /area/station/engineering/main) -"sMi" = ( -/obj/machinery/modular_computer/preset/cargochat/service{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "sMr" = ( /obj/structure/cable, /turf/open/floor/circuit/telecomms/mainframe, @@ -55891,17 +55845,17 @@ /area/station/commons/dorms) "sNa" = ( /obj/machinery/requests_console/directional/north{ - department = "Head of Security's Desk"; - name = "Head of Security's Requests Console" + name = "Head of Security's Requests Console"; + department = "Head of Security's Desk" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/information, /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/mapping_helpers/requests_console/assistance, /obj/machinery/camera{ - c_tag = "Security - Head of Security's Office"; dir = 9; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Head of Security's Office" }, /obj/machinery/computer/records/security, /turf/open/floor/carpet, @@ -55910,8 +55864,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + id = "hop" }, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) @@ -55933,9 +55887,9 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + name = "Mixing Site Shutters"; dir = 4; - id = "mixingastew"; - name = "Mixing Site Shutters" + id = "mixingastew" }, /turf/open/floor/plating, /area/station/science/ordnance) @@ -55983,8 +55937,8 @@ /area/station/security/lockers) "sOr" = ( /obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Door" + name = "Engineering Security Door"; + id = "Engineering" }, /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, @@ -56135,8 +56089,8 @@ pixel_y = 20 }, /obj/machinery/camera/motion/directional/north{ - c_tag = "Secure - AI Core North"; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Core North" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) @@ -56260,8 +56214,8 @@ "sTz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/directional/north{ - desc = "A sign warning you to be cautious of falling packages."; - name = "FALLING HAZARD sign" + name = "FALLING HAZARD sign"; + desc = "A sign warning you to be cautious of falling packages." }, /obj/machinery/door/window/left/directional/west{ name = "Hydroponics Delivery Chute" @@ -56419,6 +56373,12 @@ dir = 4 }, /area/station/service/theater) +"sWq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "sWF" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -56442,8 +56402,8 @@ "sWQ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ - id = "bunkermodeactivated"; - name = "Bridge Blast Door" + name = "Bridge Blast Door"; + id = "bunkermodeactivated" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56482,6 +56442,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"sXo" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "sXL" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 10 @@ -56566,8 +56537,8 @@ "sZb" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/camera/directional/west{ - c_tag = "Medical - Psychologist's Office"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Psychologist's Office" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/light_switch/directional/west{ @@ -56609,8 +56580,8 @@ "sZA" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/camera/emp_proof/directional/south{ - c_tag = "Engineering - Engine Room South-West"; - network = list("ss13","engine","engineering") + network = list("ss13","engine","engineering"); + c_tag = "Engineering - Engine Room South-West" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -56664,8 +56635,8 @@ "taU" = ( /obj/machinery/smartfridge/chemistry/preloaded, /obj/machinery/door/poddoor/shutters/preopen{ - id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + id = "pharmacy_shutters_2" }, /obj/machinery/door/firedoor, /turf/open/floor/iron/white, @@ -56773,8 +56744,8 @@ "tcO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Privacy Shutter" + name = "Privacy Shutter"; + id = "ceprivacy" }, /obj/structure/cable, /turf/open/floor/plating, @@ -56803,11 +56774,11 @@ "tdu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "mostleft_upper_eva_external"; - idInterior = "mostleft_upper_eva_internal"; - idSelf = "mostleft_upper_eva_airlock_control"; name = "External Access Console"; - pixel_y = 24 + pixel_y = 24; + idSelf = "mostleft_upper_eva_airlock_control"; + idInterior = "mostleft_upper_eva_internal"; + idExterior = "mostleft_upper_eva_external" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -56934,8 +56905,8 @@ "tfX" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ - id = "bunkermodeactivated"; - name = "Bridge Blast Door" + name = "Bridge Blast Door"; + id = "bunkermodeactivated" }, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -56987,9 +56958,9 @@ /area/station/security/prison) "tgE" = ( /obj/machinery/camera{ - c_tag = "Medical - Central North-West"; dir = 10; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Central North-West" }, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/stripes/white/line{ @@ -57029,6 +57000,15 @@ /obj/machinery/shower/directional/south, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"thm" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "thG" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -57112,9 +57092,9 @@ dir = 1 }, /obj/machinery/requests_console/directional/south{ - department = "Bridge"; name = "Bridge Requests Console"; - pixel_y = 30 + pixel_y = 30; + department = "Bridge" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/information, @@ -57127,26 +57107,14 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"tja" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Central Escape Wing Entry" - }, -/obj/structure/cable, -/obj/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) "tjl" = ( /obj/machinery/light/directional/west, /turf/open/floor/noslip/tram, /area/station/hallway/primary/tram/right) "tjz" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" + name = "killroom vent"; + dir = 4 }, /turf/open/floor/circuit/telecomms, /area/station/science/xenobiology) @@ -57185,8 +57153,8 @@ "tki" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/door/poddoor/shutters/preopen{ - id = "hopqueueendbottom"; - name = "HoP Queue Shutters" + name = "HoP Queue Shutters"; + id = "hopqueueendbottom" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57211,8 +57179,8 @@ /area/station/medical/surgery/aft) "tkp" = ( /obj/machinery/door/airlock/centcom{ - desc = "Truly, a marvel of modern engineering."; - name = "Syndicate Secure Airlock System" + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/showroomfloor, @@ -57323,7 +57291,7 @@ /area/station/science/xenobiology) "tms" = ( /obj/machinery/power/smes{ - charge = 5e+006 + charge = 5e+06 }, /obj/structure/cable, /turf/open/floor/circuit/telecomms/mainframe, @@ -57352,8 +57320,8 @@ /area/station/engineering/atmos) "tnu" = ( /obj/machinery/camera/directional/north{ - c_tag = "Civilian - Holodeck North"; - name = "holodeck camera" + name = "holodeck camera"; + c_tag = "Civilian - Holodeck North" }, /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -57363,9 +57331,9 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor/heavy, /obj/machinery/door/poddoor/shutters/preopen{ + name = "Ordnance Storage Shutters"; dir = 4; - id = "ordnancestorage"; - name = "Ordnance Storage Shutters" + id = "ordnancestorage" }, /turf/open/floor/plating, /area/station/science/ordnance/office) @@ -57449,8 +57417,8 @@ /obj/structure/table/wood, /obj/structure/reagent_dispensers/wall/peppertank/directional/east, /obj/machinery/fax{ - fax_name = "Head of Security's Office"; - name = "Head of Security's Fax Machine" + name = "Head of Security's Fax Machine"; + fax_name = "Head of Security's Office" }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) @@ -57532,8 +57500,8 @@ /area/station/science/research) "tqN" = ( /obj/machinery/power/solar{ - id = "aicore"; - name = "AI Core Solar Array" + name = "AI Core Solar Array"; + id = "aicore" }, /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, @@ -57580,16 +57548,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"trw" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/north, -/obj/machinery/fax{ - fax_name = "Service Hallway"; - name = "Service Fax Machine" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "try" = ( /obj/machinery/computer/operating{ dir = 1 @@ -57765,8 +57723,8 @@ dir = 6 }, /obj/machinery/button/door{ - id = "containdeez5"; - name = "Cell Containment Toggle Button" + name = "Cell Containment Toggle Button"; + id = "containdeez5" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -57967,24 +57925,24 @@ /area/station/science/research) "txW" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ - chamber_id = "o2ordance"; - dir = 4 + dir = 4; + chamber_id = "o2ordance" }, /turf/open/floor/engine/o2, /area/station/science/ordnance/storage) "tyi" = ( /obj/structure/table, /obj/machinery/button/door{ - id = "testlab"; name = "Test Chamber Blast Doors"; pixel_x = 4; pixel_y = 2; + id = "testlab"; req_access = list("xenobiology") }, /obj/machinery/button/ignition{ - id = "testigniter"; pixel_x = -6; - pixel_y = 2 + pixel_y = 2; + id = "testigniter" }, /turf/open/floor/iron/dark, /area/station/science/explab) @@ -57997,8 +57955,8 @@ }, /obj/item/ai_module/reset, /obj/item/radio/intercom/directional/east{ - frequency = 1447; - name = "ai intercom" + name = "ai intercom"; + frequency = 1447 }, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) @@ -58140,6 +58098,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"tAL" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/transport/power_rectifier, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "tBa" = ( /obj/structure/table, /obj/item/raw_anomaly_core/random{ @@ -58176,16 +58141,16 @@ "tBu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_lower_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_lower_eva_external"; - idSelf = "mostleft_lower_eva_airlock_control"; name = "External Access Button"; - pixel_y = -24 + pixel_y = -24; + idSelf = "mostleft_lower_eva_airlock_control"; + idDoor = "mostleft_lower_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, @@ -58306,6 +58271,12 @@ }, /turf/open/floor/iron, /area/station/service/theater) +"tEk" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "tEl" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -58325,8 +58296,8 @@ /area/station/service/chapel/office) "tEx" = ( /obj/machinery/camera/directional/north{ - c_tag = "Science - Xenobiology Lower Containment Chamber"; - network = list("ss13","rd","xeno") + network = list("ss13","rd","xeno"); + c_tag = "Science - Xenobiology Lower Containment Chamber" }, /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 4 @@ -58405,8 +58376,8 @@ "tFK" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/camera/directional/south{ - c_tag = "Security - Main South"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Main South" }, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -58418,12 +58389,12 @@ /area/station/security/brig) "tFP" = ( /obj/machinery/chem_master/condimaster{ - desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; - name = "SapMaster XP" + name = "SapMaster XP"; + desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments." }, /obj/machinery/requests_console/directional/north{ - department = "Hydroponics"; - name = "Hydroponics Requests Console" + name = "Hydroponics Requests Console"; + department = "Hydroponics" }, /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/turf_decal/tile/green/fourcorners, @@ -58463,29 +58434,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"tGL" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" - }, -/obj/machinery/door/window/left/directional/north{ - name = "Maximum Security Test Chamber"; - req_access = list("xenobiology") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"tGV" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "tHb" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -58529,8 +58477,8 @@ /area/station/command/teleporter) "tIg" = ( /obj/modular_map_root/tramstation{ - key = "arrivallibraryupper"; - name = "arrivallibraryupper" + name = "arrivallibraryupper"; + key = "arrivallibraryupper" }, /turf/open/misc/asteroid, /area/station/asteroid) @@ -58556,6 +58504,18 @@ /mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"tIk" = ( +/obj/effect/turf_decal/trimline/neutral/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, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "tID" = ( /obj/structure/transport/linear/public, /obj/effect/landmark/transport/transport_id{ @@ -58638,12 +58598,12 @@ /area/station/science/lobby) "tJB" = ( /obj/machinery/button/door/directional/west{ - id = "private_f"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_x = 24; pixel_y = -9; - specialfunctions = 4 + id = "private_f"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -58657,6 +58617,23 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/bridge) +"tJJ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/security/glass{ + name = "Isolation Cell A"; + id = "Isolation_A" + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "tJR" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -58666,19 +58643,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"tJY" = ( -/obj/machinery/computer/department_orders/security{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) "tKa" = ( /obj/machinery/door/window/right/directional/south{ name = "Suit Storage" @@ -58707,8 +58671,8 @@ "tKK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + id = "hop" }, /obj/structure/cable, /turf/open/floor/plating, @@ -58836,8 +58800,8 @@ /area/station/engineering/atmos) "tNG" = ( /obj/machinery/camera/motion/directional/south{ - c_tag = "Secure - AI Upper External North"; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Upper External North" }, /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, @@ -58859,8 +58823,8 @@ dir = 9 }, /obj/machinery/button/door/directional/west{ - id = "cargowarehouse"; - name = "Cargo Warehouse Shutters" + name = "Cargo Warehouse Shutters"; + id = "cargowarehouse" }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -58985,8 +58949,8 @@ "tPZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + id = "rndlab1" }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59223,6 +59187,17 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"tUM" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/structure/sign/clock/directional/west, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "tUT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59351,8 +59326,8 @@ }, /obj/structure/table, /obj/machinery/camera/directional/south{ - c_tag = "Science - AI Station Access Exterior"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - AI Station Access Exterior" }, /turf/open/floor/iron/dark, /area/station/science/lower) @@ -59362,10 +59337,10 @@ /area/station/cargo/office) "tXK" = ( /obj/machinery/conveyor_switch/oneway{ - id = "QMLoad2"; name = "Unloading Conveyor"; pixel_x = -13; - pixel_y = -4 + pixel_y = -4; + id = "QMLoad2" }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -59392,8 +59367,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez6"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez6" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -59486,8 +59461,8 @@ "tZM" = ( /obj/effect/turf_decal/tile/neutral/tram, /obj/effect/spawner/random{ - loot = list(/obj/effect/decal/cleanable/oil/slippery = 10, /obj/effect/decal/cleanable/oil = 90); - name = "funny slipper :)" + name = "funny slipper :)"; + loot = list(/obj/effect/decal/cleanable/oil/slippery=10, /obj/effect/decal/cleanable/oil=90) }, /turf/open/floor/tram/plate, /area/station/hallway/primary/tram/right) @@ -59516,14 +59491,6 @@ /obj/machinery/computer/mechpad, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"uaK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/item/radio/intercom/directional/north, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "uaM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable, @@ -59593,30 +59560,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/status_display/door_timer{ - id = "scicell"; name = "Science Cell"; - pixel_y = 32 + pixel_y = 32; + id = "scicell" }, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"ubS" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/o2, -/obj/item/storage/medkit/o2{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/machinery/door/window/left/directional/south{ - name = "Secure Medical Storage"; - req_access = list("medical") - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "ubW" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -59765,8 +59714,8 @@ /area/station/hallway/secondary/entry) "uel" = ( /obj/structure/closet/crate/secure{ - desc = "A secure crate containing various materials for building a customised test-site."; name = "Firing Range Gear Crate"; + desc = "A secure crate containing various materials for building a customised test-site."; req_access = list("science") }, /obj/item/target/syndicate, @@ -59842,6 +59791,15 @@ "ufO" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"ugf" = ( +/obj/structure/bed{ + dir = 8 + }, +/obj/effect/spawner/random/bedsheet, +/obj/structure/sign/clock/directional/east, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) "ugp" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -59920,8 +59878,8 @@ /area/station/commons/fitness/recreation/entertainment) "uip" = ( /obj/structure/closet/secure_closet/brig{ - id = "medcell"; - name = "Medical Cell Locker" + name = "Medical Cell Locker"; + id = "medcell" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -59995,16 +59953,16 @@ /area/station/cargo/miningfoundry) "ujm" = ( /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "mostleft_upper_lower_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "mostleft_upper_lower_eva_internal"; - idSelf = "mostleft_upper_lower_eva_airlock_control"; name = "External Access Button"; - pixel_x = 24 + pixel_x = 24; + idSelf = "mostleft_upper_lower_eva_airlock_control"; + idDoor = "mostleft_upper_lower_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/effect/decal/cleanable/dirt, @@ -60031,8 +59989,8 @@ "ujt" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters/window{ - id = "offstationaccess"; - name = "External Operations Shutter Access" + name = "External Operations Shutter Access"; + id = "offstationaccess" }, /turf/open/floor/iron, /area/station/command/teleporter) @@ -60042,12 +60000,7 @@ }, /obj/machinery/shower/directional/west, /obj/effect/turf_decal/box, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /turf/open/floor/iron/white, /area/station/medical/pharmacy) "ujw" = ( @@ -60093,6 +60046,10 @@ /turf/open/floor/iron, /area/station/security/prison) "ukh" = ( +/mob/living/basic/mouse/gray{ + name = "Plaguebearer"; + dir = 4 + }, /obj/item/reagent_containers/cup/bucket{ pixel_x = 4; pixel_y = -6 @@ -60101,10 +60058,6 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /obj/machinery/light/small/dim/directional/west, -/mob/living/basic/mouse/gray{ - dir = 4; - name = "Plaguebearer" - }, /turf/open/floor/plating, /area/station/medical/virology) "ukj" = ( @@ -60138,8 +60091,8 @@ /area/station/engineering/atmos) "ukw" = ( /obj/machinery/door/poddoor/shutters{ - id = "armory"; - name = "Armoury Shutter" + name = "Armoury Shutter"; + id = "armory" }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -60165,8 +60118,8 @@ /obj/item/surgical_drapes, /obj/item/cautery, /obj/machinery/camera/directional/south{ - c_tag = "Science - Robotics Surgery"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Robotics Surgery" }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) @@ -60207,9 +60160,9 @@ /area/station/security/checkpoint/supply) "ulm" = ( /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; + name = "navigation beacon (Atmoshperics Delivery)"; location = "Atmoshperics"; - name = "navigation beacon (Atmoshperics Delivery)" + codes_txt = "delivery;dir=8" }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area{ @@ -60227,8 +60180,8 @@ dir = 1 }, /obj/machinery/camera/directional/north{ - c_tag = "Science - Ordnance Lab"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Ordnance Lab" }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) @@ -60274,9 +60227,9 @@ /obj/effect/spawner/random/contraband/prison, /obj/item/radio/intercom/prison/directional/east, /obj/machinery/camera{ - c_tag = "Security - Prison Garden"; dir = 6; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Garden" }, /obj/item/seeds/tower, /obj/machinery/light/directional/east, @@ -60437,6 +60390,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"upb" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/clock/directional/north, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "upe" = ( /obj/effect/landmark/start/cyborg, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60623,9 +60584,9 @@ pixel_x = -6 }, /obj/machinery/button/door/directional/south{ - id = "kanyewest"; name = "Privacy Shutters"; - pixel_x = 6 + pixel_x = 6; + id = "kanyewest" }, /obj/structure/sign/calendar/directional/east, /turf/open/floor/carpet, @@ -60633,9 +60594,9 @@ "urY" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters{ + name = "Mech Bay"; dir = 4; - id = "mechbay"; - name = "Mech Bay" + id = "mechbay" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -60689,8 +60650,8 @@ /area/station/maintenance/department/cargo) "utc" = ( /obj/machinery/camera{ - c_tag = "Arrivals - North Docking Wing"; - dir = 9 + dir = 9; + c_tag = "Arrivals - North Docking Wing" }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60843,8 +60804,8 @@ /area/station/hallway/primary/tram/center) "uvU" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "server vent" + name = "server vent"; + dir = 4 }, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) @@ -60938,8 +60899,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/north{ - department = "Telecomms Admin"; - name = "Telecomms Requests Console" + name = "Telecomms Requests Console"; + department = "Telecomms Admin" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/structure/disposalpipe/segment{ @@ -60979,10 +60940,10 @@ dir = 4 }, /obj/item/radio/intercom/directional/south{ - freerange = 1; + name = "Private Channel"; frequency = 1447; listening = 0; - name = "Private Channel" + freerange = 1 }, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -61165,8 +61126,8 @@ "uAF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "containdeez5"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez5" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -61226,8 +61187,8 @@ /area/station/security/checkpoint/engineering) "uBA" = ( /obj/structure/chair{ - dir = 4; - name = "Judge" + name = "Judge"; + dir = 4 }, /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ @@ -61248,6 +61209,24 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"uCf" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/o2, +/obj/item/storage/medkit/o2{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/door/window/left/directional/south{ + name = "Secure Medical Storage"; + req_access = list("medical") + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "uCh" = ( /obj/structure/railing{ dir = 5 @@ -61421,10 +61400,10 @@ /area/station/hallway/secondary/service) "uEw" = ( /obj/machinery/button/door/directional/east{ - id = "miningdorm3"; name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "miningdorm3"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61442,9 +61421,9 @@ /obj/item/stock_parts/cell/emproof, /obj/item/stock_parts/cell/emproof, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - SMES Misc"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - SMES Misc" }, /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, @@ -61585,8 +61564,8 @@ req_access = list("science") }, /obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + id = "rndlab1" }, /obj/item/folder{ pixel_x = 5 @@ -61611,8 +61590,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("xeno"); - pixel_y = 2 + pixel_y = 2; + network = list("xeno") }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) @@ -61624,21 +61603,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"uGN" = ( -/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/neutral/filled/corner, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "uGU" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + name = "euthanization chamber freezer"; dir = 8; - initialize_directions = 4; - name = "euthanization chamber freezer" + initialize_directions = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, @@ -61708,10 +61677,10 @@ /area/station/science/ordnance/bomb) "uHA" = ( /obj/machinery/elevator_control_panel/directional/north{ + name = "Dumbwaiter control Panel"; desc = "A small control panel used to move the kitchen dumbwaiter up and down."; linked_elevator_id = "dumbwaiter_lift"; - name = "Dumbwaiter control Panel"; - preset_destination_names = list("2" = "Hydroponics", "3" = "Kitchen") + preset_destination_names = list("2"="Hydroponics", "3"="Kitchen") }, /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, @@ -61725,8 +61694,8 @@ /obj/structure/extinguisher_cabinet/directional/south, /obj/structure/table/glass, /obj/machinery/fax{ - fax_name = "Medical"; - name = "Medical Fax Machine" + name = "Medical Fax Machine"; + fax_name = "Medical" }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) @@ -61746,8 +61715,8 @@ /area/station/engineering/atmos) "uHQ" = ( /obj/item/paper{ - default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper."; - name = "initiation paperwork" + name = "initiation paperwork"; + default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper." }, /obj/machinery/computer/records/medical/syndie{ dir = 1; @@ -61820,20 +61789,20 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Secure - AI Upper Ring East"; dir = 10; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Upper Ring East" }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) "uJf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "mostleft_upper_lower_eva_external"; - idInterior = "mostleft_upper_lower_eva_internal"; - idSelf = "mostleft_upper_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = -24 + pixel_y = -24; + idSelf = "mostleft_upper_lower_eva_airlock_control"; + idInterior = "mostleft_upper_lower_eva_internal"; + idExterior = "mostleft_upper_lower_eva_external" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, @@ -61845,10 +61814,6 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) -"uJx" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/hallway/primary/tram/right) "uJH" = ( /turf/open/floor/iron/white, /area/station/science/robotics/lab) @@ -61929,8 +61894,8 @@ /area/station/security/execution/transfer) "uLn" = ( /obj/machinery/door/airlock{ - id_tag = "private_p"; - name = "Private Quarters P" + name = "Private Quarters P"; + id_tag = "private_p" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61987,8 +61952,8 @@ req_access = list("xenobiology") }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez7"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez7" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -62024,8 +61989,8 @@ }, /obj/item/radio/intercom/directional/east, /obj/machinery/camera/directional/east{ - c_tag = "Science - Cytology East"; - network = list("ss13","rd","xeno") + network = list("ss13","rd","xeno"); + c_tag = "Science - Cytology East" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -62078,8 +62043,8 @@ /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/sand/plating, /obj/machinery/door/poddoor/shutters{ - id = "winkyface"; - name = "External Dock Access" + name = "External Dock Access"; + id = "winkyface" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plating, @@ -62119,8 +62084,8 @@ }, /obj/structure/closet/emcloset, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Virology Airlock"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Virology Airlock" }, /turf/open/floor/iron/white, /area/station/medical/virology) @@ -62199,8 +62164,8 @@ /area/station/commons/toilet) "uOZ" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "CO2 Outlet Pump" + name = "CO2 Outlet Pump"; + dir = 8 }, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 @@ -62406,12 +62371,12 @@ /area/station/security/checkpoint/engineering) "uUB" = ( /obj/docking_port/stationary{ - dir = 8; - dwidth = 2; - height = 13; name = "port bay 2"; + dir = 8; + width = 5; + height = 13; shuttle_id = "ferry_home"; - width = 5 + dwidth = 2 }, /turf/open/space/openspace, /area/space) @@ -62485,8 +62450,8 @@ /area/station/security/courtroom) "uVW" = ( /obj/machinery/camera/directional/west{ - c_tag = "Medical - Cryo Treatment"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Cryo Treatment" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron/dark, @@ -62501,9 +62466,9 @@ "uWn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + name = "Quartermaster's Privacy Shutters"; dir = 8; - id = "greedygrinnersden"; - name = "Quartermaster's Privacy Shutters" + id = "greedygrinnersden" }, /turf/open/floor/plating, /area/station/cargo/office) @@ -62548,8 +62513,8 @@ dir = 8 }, /obj/machinery/camera/directional/south{ - c_tag = "Science - Mixing Lab"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Mixing Lab" }, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/mixingchamber_access, @@ -62768,8 +62733,8 @@ dir = 1 }, /obj/machinery/camera/emp_proof/directional/south{ - c_tag = "Engineering - Atmospherics South-East"; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics South-East" }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -62812,9 +62777,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/checkpoint/medical) +"vbl" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Service - Autolathe Room" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/north, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Service Hallway"; + name = "Service Fax Machine" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "vbt" = ( /obj/machinery/computer/atmos_control/oxygen_tank{ - atmos_chambers = list("o2ordance" = "Oxygen Supply") + atmos_chambers = list(o2ordance="Oxygen Supply") }, /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/north, @@ -62836,10 +62814,10 @@ dir = 4 }, /obj/machinery/button/door/directional/west{ - id = "ToiletSci1"; name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 + id = "ToiletSci1"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/light/small/dim/directional/south, /turf/open/floor/iron/freezer, @@ -62853,14 +62831,23 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vbY" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 +"vbV" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit) +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/west{ + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/turf/open/floor/wood/large, +/area/station/service/library) "vca" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -62889,12 +62876,13 @@ dir = 8 }, /obj/machinery/elevator_control_panel/directional/south{ + name = "Dumbwaiter control Panel"; desc = "A small control panel used to move the kitchen dumbwaiter up and down."; linked_elevator_id = "dumbwaiter_lift"; - name = "Dumbwaiter control Panel"; - preset_destination_names = list("2" = "Hydroponics", "3" = "Kitchen") + preset_destination_names = list("2"="Hydroponics", "3"="Kitchen") }, /obj/effect/turf_decal/tile/green/fourcorners, +/obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron/dark, /area/station/service/hydroponics) "vcv" = ( @@ -62941,15 +62929,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vem" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Hydroponics Desk"; - req_access = list("hydroponics") - }, -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "vep" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -63174,14 +63153,14 @@ /area/station/maintenance/disposal/incinerator) "vic" = ( /obj/machinery/lift_indicator{ - linked_elevator_id = "tram_lower_center_lift"; pixel_x = -5; - pixel_y = -3 + pixel_y = -3; + linked_elevator_id = "tram_lower_center_lift" }, /obj/machinery/button/elevator{ - id = "tram_lower_center_lift"; pixel_x = -7; - pixel_y = -1 + pixel_y = -1; + id = "tram_lower_center_lift" }, /turf/closed/wall, /area/station/hallway/primary/tram/center) @@ -63210,37 +63189,22 @@ /area/station/maintenance/tram/mid) "viW" = ( /obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 8; pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = 4; pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/i/orange{ pixel_x = -4; pixel_y = -32 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "x"; - name = "graffiti"; - paint_colour = "#FF9300"; +/obj/effect/decal/cleanable/crayon/x{ pixel_x = 4; pixel_y = -32 }, @@ -63250,8 +63214,8 @@ /area/station/engineering/main) "viZ" = ( /obj/machinery/camera/directional/south{ - c_tag = "Medical - Cold Storage"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Cold Storage" }, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/freezer, @@ -63264,11 +63228,11 @@ /area/station/hallway/secondary/exit) "vjo" = ( /obj/machinery/button/door/directional/west{ - id = "private_n"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = -9; - specialfunctions = 4 + id = "private_n"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -63383,8 +63347,8 @@ "vkP" = ( /obj/effect/turf_decal/siding/thinplating/corner, /obj/machinery/button/door/directional/south{ - id = "playerscantreadthis"; - name = "Kitchen Shutters Control" + name = "Kitchen Shutters Control"; + id = "playerscantreadthis" }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63403,8 +63367,8 @@ "vlb" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/machinery/camera{ - c_tag = "Hallway - Port Tram Platform South-East"; - dir = 6 + dir = 6; + c_tag = "Hallway - Port Tram Platform South-East" }, /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/stripes/white/line{ @@ -63423,8 +63387,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/clock/directional/north, /obj/machinery/camera/directional/north{ - c_tag = "Medical - Security Checkpoint"; - network = list("ss13","rd","Security") + network = list("ss13","rd","Security"); + c_tag = "Medical - Security Checkpoint" }, /turf/open/floor/iron, /area/station/security/checkpoint/science) @@ -63442,14 +63406,14 @@ dir = 8 }, /obj/machinery/button/elevator/directional/west{ - id = "tram_sci_lift"; pixel_x = -26; - pixel_y = -1 + pixel_y = -1; + id = "tram_sci_lift" }, /obj/machinery/lift_indicator/directional/west{ - linked_elevator_id = "tram_sci_lift"; pixel_x = -27; - pixel_y = -2 + pixel_y = -2; + linked_elevator_id = "tram_sci_lift" }, /turf/open/floor/iron/white, /area/station/science/research) @@ -63617,8 +63581,8 @@ }, /obj/structure/table/glass, /obj/machinery/requests_console/directional/west{ - department = "Genetics"; - name = "Genetics Requests Console" + name = "Genetics Requests Console"; + department = "Genetics" }, /turf/open/floor/iron/white, /area/station/science/genetics) @@ -63632,7 +63596,7 @@ /obj/structure/transport/linear/public, /obj/machinery/elevator_control_panel/directional/north{ linked_elevator_id = "tram_upper_center_lift"; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/mid) @@ -63650,8 +63614,8 @@ /area/station/science/lower) "vpP" = ( /obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Door" + name = "Engineering Security Door"; + id = "Engineering" }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -63681,8 +63645,8 @@ dir = 9 }, /obj/machinery/button/door/directional/north{ - id = "mixingastew"; - name = "Mixing Chamber Privacy Shutters" + name = "Mixing Chamber Privacy Shutters"; + id = "mixingastew" }, /turf/open/floor/iron/white, /area/station/science/ordnance) @@ -63699,11 +63663,11 @@ "vqx" = ( /obj/effect/turf_decal/sand, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleleft_upper_lower_eva_external"; - idInterior = "middleleft_upper_lower_eva_internal"; - idSelf = "middleleft_upper_lower_eva_airlock_control"; name = "External Access Console"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleleft_upper_lower_eva_airlock_control"; + idInterior = "middleleft_upper_lower_eva_internal"; + idExterior = "middleleft_upper_lower_eva_external" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, @@ -63745,8 +63709,8 @@ dir = 6 }, /obj/machinery/button/door/directional/south{ - id = "ordnancestorage"; - name = "Ordance Storage Shutters" + name = "Ordance Storage Shutters"; + id = "ordnancestorage" }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) @@ -63948,9 +63912,9 @@ /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/door/window/elevator/right/directional/south{ - elevator_mode = 1; name = "Dumbwaiter"; req_access = null; + elevator_mode = 1; transport_linked_id = "dumbwaiter_lift" }, /turf/open/floor/iron/dark, @@ -63981,8 +63945,8 @@ /area/station/hallway/secondary/construction/engineering) "vvd" = ( /obj/machinery/camera{ - c_tag = "Hallway - Starboard Tram Platform South-West"; - dir = 10 + dir = 10; + c_tag = "Hallway - Starboard Tram Platform South-West" }, /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment{ @@ -64118,10 +64082,6 @@ /area/station/hallway/secondary/entry) "vxv" = ( /obj/effect/turf_decal/siding/wood, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, /obj/machinery/light/warm/directional/north, /turf/open/floor/wood, /area/station/command/meeting_room) @@ -64148,7 +64108,7 @@ /area/station/science/lobby) "vyD" = ( /obj/machinery/power/smes{ - charge = 5e+006 + charge = 5e+06 }, /obj/machinery/airalarm/directional/east, /obj/structure/cable, @@ -64235,8 +64195,8 @@ /area/station/commons/lounge) "vzx" = ( /obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Output to Waste" + name = "Output to Waste"; + dir = 4 }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64289,8 +64249,8 @@ /area/station/medical/psychology) "vBa" = ( /obj/structure/chair{ - dir = 1; - name = "Prosecution" + name = "Prosecution"; + dir = 1 }, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 @@ -64300,16 +64260,16 @@ "vBk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleright_lower_upper_eva_internal"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleright_lower_upper_eva_internal"; - idSelf = "middleright_lower_upper_eva_airlock_control"; name = "External Access Button"; - pixel_x = 24 + pixel_x = 24; + idSelf = "middleright_lower_upper_eva_airlock_control"; + idDoor = "middleright_lower_upper_eva_internal" }, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64360,10 +64320,10 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/electric_shock/directional/east, /obj/item/storage/toolbox/mechanical{ + name = "moderately suspicious looking toolbox"; desc = "Danger. Kinda robust."; icon_state = "syndicate"; - inhand_icon_state = "toolbox_syndi"; - name = "moderately suspicious looking toolbox" + inhand_icon_state = "toolbox_syndi" }, /turf/open/floor/plating, /area/station/commons/vacant_room) @@ -64556,8 +64516,8 @@ dir = 10 }, /obj/machinery/button/door{ - id = "containdeez3"; - name = "Cell Containment Toggle Button" + name = "Cell Containment Toggle Button"; + id = "containdeez3" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -64607,9 +64567,9 @@ /area/station/hallway/secondary/service) "vFR" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics N2O Chamber"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics N2O Chamber" }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) @@ -64624,9 +64584,9 @@ "vGd" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/conveyor_switch/oneway{ - id = "lawyerdropoff"; name = "Shipment Delivery Chute Activator"; - pixel_x = 10 + pixel_x = 10; + id = "lawyerdropoff" }, /turf/open/floor/wood, /area/station/service/lawoffice) @@ -64643,9 +64603,9 @@ "vGk" = ( /obj/structure/lattice, /obj/machinery/camera/motion{ - c_tag = "Secure - AI Lower External South"; dir = 9; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Lower External South" }, /turf/open/space/basic, /area/space/nearstation) @@ -64806,16 +64766,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/ordnance) -"vJE" = ( -/obj/structure/bed{ - dir = 8 - }, -/obj/effect/spawner/random/bedsheet, -/obj/effect/landmark/start/assistant, -/obj/structure/sign/clock/directional/east, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "vKd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64893,8 +64843,8 @@ /area/station/cargo/miningdock) "vMu" = ( /obj/modular_map_root/tramstation{ - key = "secbarupper"; - name = "secbarupper" + name = "secbarupper"; + key = "secbarupper" }, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/security) @@ -64917,16 +64867,16 @@ "vMI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ - autoclose = 0; + name = "External Access"; frequency = 1449; id_tag = "middleleft_upper_eva_external"; - name = "External Access" + autoclose = 0 }, /obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_upper_eva_external"; - idSelf = "middleleft_upper_eva_airlock_control"; name = "External Access Button"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleleft_upper_eva_airlock_control"; + idDoor = "middleleft_upper_eva_external" }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/disposalpipe/segment{ @@ -65126,14 +65076,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"vQy" = ( -/obj/machinery/brm, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" - }, -/turf/open/floor/iron, -/area/station/cargo/miningfoundry) "vQO" = ( /obj/machinery/camera/directional/north{ c_tag = "Civilian - Theatre Backstage" @@ -65207,9 +65149,9 @@ dir = 1 }, /obj/machinery/door/window/elevator/left/directional/north{ - elevator_mode = 1; name = "Dumbwaiter"; req_access = null; + elevator_mode = 1; transport_linked_id = "dumbwaiter_lift" }, /turf/open/floor/iron/cafeteria, @@ -65234,8 +65176,8 @@ /area/station/cargo/bitrunning/den) "vSa" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8; - name = "server vent" + name = "server vent"; + dir = 8 }, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) @@ -65257,8 +65199,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/west{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" + name = "Atmospherics Requests Console"; + department = "Atmospherics" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -65337,16 +65279,16 @@ "vTx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "containdeez6"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez6" }, /turf/open/floor/plating, /area/station/science/xenobiology) "vTB" = ( /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/poddoor/shutters{ - id = "aux_base_shutters"; - name = "Auxillary Base Shutters" + name = "Auxillary Base Shutters"; + id = "aux_base_shutters" }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) @@ -65359,9 +65301,9 @@ /area/station/ai_monitored/turret_protected/ai) "vTE" = ( /obj/machinery/camera{ - c_tag = "Security - Detective's Office"; dir = 9; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Security - Detective's Office" }, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -65456,9 +65398,9 @@ name = "Library Delivery Chute" }, /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; + name = "navigation beacon (Library Delivery)"; location = "Library"; - name = "navigation beacon (Library Delivery)" + codes_txt = "delivery;dir=4" }, /obj/effect/turf_decal/loading_area{ dir = 4 @@ -65575,10 +65517,10 @@ pixel_y = 8 }, /obj/machinery/button/door{ - id = "bunkermodeactivated"; name = "Bridge Blast Door Toggle"; pixel_x = -7; pixel_y = -2; + id = "bunkermodeactivated"; req_access = list("command") }, /turf/open/floor/carpet, @@ -65617,8 +65559,8 @@ /area/station/service/theater) "vYX" = ( /obj/machinery/atmospherics/components/trinary/mixer{ - dir = 1; - name = "plasma mixer" + name = "plasma mixer"; + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -65745,8 +65687,8 @@ dir = 8 }, /obj/machinery/turretid{ - icon_state = "control_stun"; name = "AI Hallway turret control"; + icon_state = "control_stun"; pixel_x = 3; pixel_y = 28 }, @@ -65797,8 +65739,8 @@ dir = 10 }, /obj/machinery/camera/directional/south{ - c_tag = "Science - Lower Hall South"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Lower Hall South" }, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white, @@ -65857,8 +65799,8 @@ dir = 4 }, /obj/machinery/door/poddoor/preopen{ - id = "containdeez6"; - name = "Xenobiology Containment Blast Door" + name = "Xenobiology Containment Blast Door"; + id = "containdeez6" }, /turf/open/floor/plating, /area/station/science/xenobiology) @@ -65908,10 +65850,10 @@ dir = 1 }, /obj/item/radio/intercom/directional/south{ - freerange = 1; + name = "Private Channel"; frequency = 1447; listening = 0; - name = "Private Channel" + freerange = 1 }, /obj/structure/cable, /turf/open/floor/glass/reinforced, @@ -65962,9 +65904,9 @@ /area/station/hallway/primary/tram/center) "wgB" = ( /obj/machinery/status_display/door_timer{ - id = "engcell"; name = "Engineering Cell"; - pixel_x = -32 + pixel_x = -32; + id = "engcell" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -65973,8 +65915,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/south{ - department = "Security"; - name = "Security Requests Console" + name = "Security Requests Console"; + department = "Security" }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) @@ -65987,8 +65929,8 @@ /area/station/commons/lounge) "wgL" = ( /obj/machinery/camera{ - c_tag = "Arrivals - South Docking Wing"; - dir = 9 + dir = 9; + c_tag = "Arrivals - South Docking Wing" }, /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66011,8 +65953,8 @@ /area/station/cargo/lobby) "wgR" = ( /obj/docking_port/stationary/random{ - dir = 8; name = "lavaland"; + dir = 8; shuttle_id = "pod_3_lavaland" }, /turf/open/misc/asteroid/airless, @@ -66092,6 +66034,12 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"whX" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/modular_computer/preset/cargochat/service, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "wid" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -66121,8 +66069,8 @@ /area/station/maintenance/tram/right) "wiI" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrigleft"; - name = "Brig" + name = "Brig"; + id_tag = "outerbrigleft" }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -66238,8 +66186,8 @@ /area/station/security/checkpoint/supply) "wkQ" = ( /obj/machinery/door/airlock/hatch{ - id_tag = "vacant_space"; - name = "Vacant Commissary" + name = "Vacant Commissary"; + id_tag = "vacant_space" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66293,19 +66241,13 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/carpet, /area/station/hallway/secondary/entry) -"wmt" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/stripes/white/full, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "wmy" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 }, /obj/machinery/button/door/directional/north{ - id = "pharmacy_shutters_2"; name = "Pharmacy Privacy Shutters Toggle"; + id = "pharmacy_shutters_2"; req_access = list("pharmacy") }, /obj/structure/table/glass, @@ -66670,8 +66612,8 @@ }, /obj/structure/sign/calendar/directional/west, /obj/machinery/fax{ - fax_name = "Quartermaster's Office"; - name = "Quartermaster's Fax Machine" + name = "Quartermaster's Fax Machine"; + fax_name = "Quartermaster's Office" }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) @@ -66915,8 +66857,8 @@ /area/station/hallway/secondary/exit) "wyT" = ( /obj/modular_map_root/tramstation{ - key = "arrivalsecupper"; - name = "arrivalsecupper" + name = "arrivalsecupper"; + key = "arrivalsecupper" }, /turf/open/misc/asteroid, /area/station/asteroid) @@ -66962,8 +66904,8 @@ dir = 4 }, /obj/machinery/camera/directional/south{ - c_tag = "Secure - AI Minisat Chargebay"; - network = list("ss13","minisat") + network = list("ss13","minisat"); + c_tag = "Secure - AI Minisat Chargebay" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -66971,6 +66913,14 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/maintenance/port/central) +"wzX" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/modular_computer/preset/cargochat/science, +/turf/open/floor/iron/white, +/area/station/science/lab) "wAa" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -66992,8 +66942,8 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ - id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + id = "pharmacy_shutters_2" }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) @@ -67078,8 +67028,8 @@ /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 = "midtunnelright"; - name = "Tunnel Access Shutters Toggle" + name = "Tunnel Access Shutters Toggle"; + id = "midtunnelright" }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) @@ -67202,8 +67152,8 @@ "wEu" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/camera/directional/south{ - c_tag = "Medical - Main South-East"; - network = list("ss13","medbay") + network = list("ss13","medbay"); + c_tag = "Medical - Main South-East" }, /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white, @@ -67325,9 +67275,9 @@ /area/station/commons/dorms) "wGk" = ( /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Chief Engineer's Office"; dir = 10; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Chief Engineer's Office" }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) @@ -67341,8 +67291,8 @@ /area/station/security/checkpoint/medical) "wGA" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + name = "Radiation Chamber Shutters"; + id = "engsm" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -67376,21 +67326,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"wGN" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "wGU" = ( /obj/machinery/door/window/brigdoor/right/directional/east{ - id = "medcell"; name = "Medical Cell"; + id = "medcell"; req_access = list("security") }, /obj/effect/turf_decal/trimline/red/filled/line, @@ -67489,20 +67428,21 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"wJa" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #3" +"wJe" = ( +/obj/structure/bed/double{ + dir = 4 }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/warehouse) +/obj/effect/spawner/random/bedsheet/double{ + dir = 4 + }, +/obj/structure/sign/clock/directional/north, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "wJt" = ( /obj/machinery/door/poddoor{ - id = "Secure Storage"; - name = "Secure Storage" + name = "Secure Storage"; + id = "Secure Storage" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plating, @@ -67520,6 +67460,18 @@ dir = 1 }, /area/station/command/bridge) +"wJF" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "wJM" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67531,8 +67483,8 @@ }, /obj/machinery/airalarm/directional/north, /obj/machinery/camera/directional/north{ - c_tag = "Departures - Security Outpost"; - network = list("ss13","Security") + network = list("ss13","Security"); + c_tag = "Departures - Security Outpost" }, /obj/machinery/computer/records/security, /turf/open/floor/iron, @@ -67547,8 +67499,8 @@ /obj/structure/table/wood, /obj/item/radio/intercom/directional/east, /obj/machinery/fax{ - fax_name = "Captain's Office"; - name = "Captain's Fax Machine" + name = "Captain's Fax Machine"; + fax_name = "Captain's Office" }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) @@ -67592,13 +67544,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) -"wLK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "wLP" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -67731,13 +67676,13 @@ dir = 8 }, /obj/machinery/requests_console/directional/east{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" + name = "Atmospherics Requests Console"; + department = "Atmospherics" }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Front Desk"; dir = 6; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Front Desk" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -67954,8 +67899,8 @@ /area/station/medical/virology) "wTy" = ( /obj/machinery/button/crematorium{ - id = "crematoriumChapel"; - pixel_y = -26 + pixel_y = -26; + id = "crematoriumChapel" }, /obj/machinery/camera/directional/south{ c_tag = "Civilian - Chapel Crematorium" @@ -67998,8 +67943,8 @@ "wUL" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/fax{ - fax_name = "Law Office"; - name = "Law Office Fax Machine" + name = "Law Office Fax Machine"; + fax_name = "Law Office" }, /obj/structure/table/wood, /turf/open/floor/wood, @@ -68022,19 +67967,24 @@ /obj/effect/turf_decal/siding/wood{ dir = 6 }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /turf/open/floor/wood, /area/station/command/meeting_room) +"wWh" = ( +/obj/machinery/vending/cola/blue, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) "wWn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleleft_upper_eva_external"; - idInterior = "middleleft_upper_eva_internal"; - idSelf = "middleleft_upper_eva_airlock_control"; name = "External Access Console"; - pixel_y = 24 + pixel_y = 24; + idSelf = "middleleft_upper_eva_airlock_control"; + idInterior = "middleleft_upper_eva_internal"; + idExterior = "middleleft_upper_eva_external" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -68094,8 +68044,8 @@ "wXB" = ( /obj/machinery/vending/assist, /obj/machinery/requests_console/directional/east{ - department = "Tool Storage"; - name = "Tool Department Requests Console" + name = "Tool Department Requests Console"; + department = "Tool Storage" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -68126,8 +68076,8 @@ dir = 6 }, /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "N2 to Pure" + name = "N2 to Pure"; + dir = 1 }, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -68145,8 +68095,8 @@ dir = 6 }, /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "O2 to Pure" + name = "O2 to Pure"; + dir = 1 }, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -68309,6 +68259,23 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/bridge) +"xbN" = ( +/obj/structure/table/reinforced, +/obj/structure/desk_bell{ + pixel_x = -7 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Pharmacy Shutters"; + dir = 4; + id = "pharmacy_shutters_2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Chemistry Desk"; + req_access = list("pharmacy") + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "xbT" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -68380,8 +68347,8 @@ /area/station/medical/treatment_center) "xdC" = ( /obj/machinery/camera{ - c_tag = "Secure - Gravity Generator"; - dir = 10 + dir = 10; + c_tag = "Secure - Gravity Generator" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -68453,9 +68420,9 @@ /area/station/security/checkpoint/science) "xeE" = ( /obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; + name = "navigation beacon (Security Delivery)"; location = "Security"; - name = "navigation beacon (Security Delivery)" + codes_txt = "delivery;dir=8" }, /obj/effect/turf_decal/loading_area{ dir = 8 @@ -68494,8 +68461,8 @@ dir = 8 }, /obj/machinery/button/door/directional/east{ - id = "atmos"; name = "Atmospherics Lockdown"; + id = "atmos"; req_access = list("atmospherics") }, /turf/open/floor/iron, @@ -68804,8 +68771,8 @@ /area/station/hallway/primary/tram/left) "xlX" = ( /obj/machinery/door/airlock{ - id_tag = "private_k"; - name = "Private Quarters K" + name = "Private Quarters K"; + id_tag = "private_k" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68925,6 +68892,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"xog" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Isolation Wing"; + unres_sensor = 1; + unres_sides = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "xom" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -69020,12 +69004,7 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "xrf" = ( -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /obj/machinery/duct, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/freezer, @@ -69326,17 +69305,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/ordnance) -"xwv" = ( -/obj/structure/bed/double{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet/double{ - dir = 4 - }, -/obj/structure/sign/clock/directional/north, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "xwz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69379,9 +69347,9 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Security - Prison Block South"; dir = 6; - network = list("ss13","Security","prison") + network = list("ss13","Security","prison"); + c_tag = "Security - Prison Block South" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -69493,8 +69461,8 @@ /area/station/engineering/atmospherics_engine) "xAc" = ( /obj/machinery/door/airlock/centcom{ - desc = "Truly, a marvel of modern engineering."; - name = "Syndicate Secure Airlock System" + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/structure/cable, @@ -69572,9 +69540,9 @@ "xAM" = ( /obj/machinery/elevator_control_panel{ layer = 3.1; - linked_elevator_id = "tram_xeno_lift"; pixel_y = 2; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") + linked_elevator_id = "tram_xeno_lift"; + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /turf/closed/wall/r_wall, /area/station/science/xenobiology) @@ -69617,7 +69585,7 @@ /obj/structure/transport/linear/public, /obj/machinery/elevator_control_panel/directional/west{ linked_elevator_id = "tram_sci_lift"; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") + preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") }, /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 9 @@ -69970,11 +69938,11 @@ /area/station/maintenance/disposal/incinerator) "xKR" = ( /obj/machinery/button/door/directional/west{ - id = "private_q"; name = "Privacy Bolts"; - normaldoorcontrol = 1; pixel_y = 9; - specialfunctions = 4 + id = "private_q"; + specialfunctions = 4; + normaldoorcontrol = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -70036,8 +70004,8 @@ }, /obj/structure/closet/l3closet/scientist, /obj/machinery/camera/directional/west{ - c_tag = "Science - Xenobiology Airlock"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Xenobiology Airlock" }, /obj/effect/turf_decal/tile/purple/fourcorners, /obj/machinery/light/cold/directional/west, @@ -70154,8 +70122,8 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/table/wood, /obj/machinery/fax{ - fax_name = "Head of Personnel's Office"; - name = "Head of Personnel's Fax Machine" + name = "Head of Personnel's Fax Machine"; + fax_name = "Head of Personnel's Office" }, /obj/machinery/light/warm/directional/north, /turf/open/floor/carpet, @@ -70228,16 +70196,6 @@ "xOn" = ( /turf/open/floor/iron/dark, /area/station/medical/treatment_center) -"xOH" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #6" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "xOL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -70430,13 +70388,13 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "xSz" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, /obj/structure/disposalpipe/trunk{ dir = 2 }, +/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "xSD" = ( @@ -70577,8 +70535,8 @@ /area/station/science/ordnance) "xVE" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "N2O Outlet Pump" + name = "N2O Outlet Pump"; + dir = 8 }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -70737,12 +70695,12 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "xYZ" = ( +/mob/living/basic/bot/cleanbot, /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, -/mob/living/basic/bot/cleanbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) "xZi" = ( @@ -71030,8 +70988,8 @@ /area/station/commons/dorms) "yeg" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Atmos to Loop" + name = "Atmos to Loop"; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -71064,18 +71022,18 @@ dir = 8 }, /obj/machinery/button/door/directional/west{ - id = "outerbrigleft"; name = "Outer Brig Left Door Access"; - normaldoorcontrol = 1; pixel_y = -8; - req_access = list("security") + id = "outerbrigleft"; + req_access = list("security"); + normaldoorcontrol = 1 }, /obj/machinery/button/door/directional/west{ - id = "innerbrigleft"; name = "Inner Brig Left Door Access"; - normaldoorcontrol = 1; pixel_y = 8; - req_access = list("security") + id = "innerbrigleft"; + req_access = list("security"); + normaldoorcontrol = 1 }, /turf/open/floor/iron, /area/station/security/brig) @@ -71137,8 +71095,8 @@ "yfU" = ( /obj/item/kirbyplants/random, /obj/machinery/camera/directional/south{ - c_tag = "Science - Ordnance Storage"; - network = list("ss13","rd") + network = list("ss13","rd"); + c_tag = "Science - Ordnance Storage" }, /turf/open/floor/iron, /area/station/science/ordnance/storage) @@ -71149,8 +71107,8 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/table, /obj/machinery/button/door{ - id = "containdeez6"; - name = "Cell Containment Toggle Button" + name = "Cell Containment Toggle Button"; + id = "containdeez6" }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -71202,9 +71160,9 @@ dir = 1 }, /obj/machinery/button/door/directional/north{ - id = "trammaintdock"; name = "Tram Maintenance Dock Access"; - pixel_x = -8 + pixel_x = -8; + id = "trammaintdock" }, /obj/effect/turf_decal/siding/thinplating, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71424,9 +71382,9 @@ dir = 9 }, /obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Incinerator ACcess"; dir = 9; - network = list("ss13","engineering") + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Incinerator ACcess" }, /obj/machinery/atmospherics/components/unary/bluespace_sender{ dir = 4; @@ -71471,17 +71429,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"yll" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/spawner/random/bedsheet{ - dir = 4 - }, -/obj/structure/sign/clock/directional/west, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "ylr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/dim/directional/east, @@ -71489,19 +71436,12 @@ /area/station/maintenance/tram/right) "ylt" = ( /obj/machinery/camera/motion{ - c_tag = "Secure - AI Upper External East"; dir = 10; - network = list("aicore") + network = list("aicore"); + c_tag = "Secure - AI Upper External East" }, /turf/open/space/openspace, /area/space/nearstation) -"ylv" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "ylw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -84736,11 +84676,11 @@ aaa jWs ems pJb -iPu +cXt tnB eTl wei -nQR +iEO eOc ong jWs @@ -85507,11 +85447,11 @@ aaa jWs ems pJb -eVB +tJJ tnB eTl wei -dpd +gLa eOc ong jWs @@ -86024,7 +85964,7 @@ aaa jWs jWs cWF -qTq +xog cWF msg kaT @@ -86841,15 +86781,15 @@ imm wzJ dIy pZW -yll +tUM fOs gnC elr -fqG +bzs pKZ ecu elr -yll +tUM fOs gnC elr @@ -86858,11 +86798,11 @@ ujn elr ecu pKZ -gHs +cPK elr gnC fOs -yll +tUM apC apC apC @@ -87123,7 +87063,7 @@ oir elr vyR eLl -hjf +dRz apC abM aaa @@ -89407,15 +89347,15 @@ qQq qQq oRE ncF -daq +upb twk qRc elr -bmB +iuJ szo kYL elr -jGA +cvg twk qRc apC @@ -89428,11 +89368,11 @@ nyV wbb xFx kzQ -szN +hyK dSU dSU dSU -rts +mVS snD pNj apC @@ -90435,15 +90375,15 @@ qQq qQq lyV ncF -xwv +wJe twk gnC elr -cDb +pfm szo ecu elr -xwv +wJe twk gnC apC @@ -92777,7 +92717,7 @@ oir elr vyR fQe -jbW +hRK jnq abM abM @@ -93013,11 +92953,11 @@ qRp elr vay elr -hmT +jnR pKZ kYL elr -cKS +hft fOs qRc oTA @@ -93026,11 +92966,11 @@ eZS oTA kYL pKZ -dtd +ugf elr qRc fOs -vJE +lLq jnq jnq jnq @@ -102221,7 +102161,7 @@ auh qcG mId cIs -vem +phH meD nUP xYu @@ -102745,10 +102685,10 @@ apl iRL snQ iRL -trw +whX tbm nNZ -sMi +qqm cWZ klk kNo @@ -103048,7 +102988,7 @@ eor jdN roB fXQ -aIj +srY roB roB kHR @@ -103259,7 +103199,7 @@ bje iRL snQ iRL -uaK +fRb twg dWn cWZ @@ -103812,7 +103752,7 @@ ixT gYI cgR ial -qAk +mdk amV mvy iXQ @@ -104030,7 +103970,7 @@ aeF iRL quF iRL -ssN +vbl sWF iog cWZ @@ -105607,7 +105547,7 @@ hZr hZr saJ oNq -rNp +kcP hNE ovi hIt @@ -115652,7 +115592,7 @@ dUT gdC qVr bfH -aJT +dfC ahk hdA mBm @@ -115664,7 +115604,7 @@ hik sml bfH bfH -aJT +dfC jTC qVr aaa @@ -115889,7 +115829,7 @@ abM abM ePG dSy -fKd +cVW vzo ePG vOx @@ -117150,7 +117090,7 @@ wYz sfE xBU aSi -lOb +hUs vWx aaa aaa @@ -118736,7 +118676,7 @@ hFH tYB qVr jTC -aJT +dfC bfH bfH nbI @@ -118748,7 +118688,7 @@ rbU uAF ahk hdA -aJT +dfC bfH qVr aaa @@ -118924,7 +118864,7 @@ aac aaa aaa xdZ -vQy +fdc cZQ jwy bvA @@ -152109,10 +152049,10 @@ wHT wHT sNr wHT -anp -anp +fKO +fKO jvf -anp +fKO qkV jvf tPE @@ -152335,7 +152275,7 @@ gki mjM mjM uWI -cAS +bjb cGU ayR ayR @@ -152389,8 +152329,8 @@ tpR sUs rmi uey -lrL -fOZ +iuM +vbV dFc prt rAS @@ -152879,7 +152819,7 @@ tRV sik iOm ofA -npj +lcS vhG jSd nXI @@ -153138,9 +153078,9 @@ wHT wHT wHT lUK -anp +fKO jvf -anp +fKO tki jvf loc @@ -154162,7 +154102,7 @@ aQO aQO aQO aQO -kTn +rxI nYq yiM cFs @@ -154913,8 +154853,8 @@ eOh pJJ fWM qyZ -joF -kSZ +pGr +ptq lmG hHI gIG @@ -155170,7 +155110,7 @@ phB qdY xNj qyZ -kSZ +ouQ wWe imr iue @@ -155415,7 +155355,7 @@ etH bLT hvZ mGN -cez +gNK rOh gAO odr @@ -155493,7 +155433,7 @@ tCi hPI tCi aRy -eGY +aRE aRI aRL mEH @@ -156694,7 +156634,7 @@ dEv ukw pyF dEv -tJY +mjy rWT gYd isV @@ -158521,7 +158461,7 @@ riB ltw dxw kOr -ddH +cvf iUw moq aBZ @@ -159035,7 +158975,7 @@ tth rKP kOr fpR -ekE +oDH aBt kbM qiN @@ -165229,7 +165169,7 @@ aaa aaa aaa xBk -ubS +uCf sKO sKO mLu @@ -166263,7 +166203,7 @@ kZD wAe glU jSc -pza +thm xRx aLw pVk @@ -167025,7 +166965,7 @@ uqa fYl jyH pob -jUf +xbN lqu jyH jyH @@ -167288,7 +167228,7 @@ jAc kkd qNI mrC -rCZ +mbK tOw kGa djz @@ -167783,7 +167723,7 @@ izU izU izU izU -spE +tAL sOD izU kkR @@ -169069,7 +169009,7 @@ sxW vyH iNr rOu -skB +qbW izU pLs sky @@ -170353,7 +170293,7 @@ izU izU izU hce -tGV +aEm gnK izU kBG @@ -180886,11 +180826,11 @@ qqw byL whL ged -dxy +jnJ ged whL vUE -eYr +hXW yeB ipC seR @@ -182193,14 +182133,14 @@ wxu yjY eYS oxL -faH +pOY oGO xQN mEt vNk kTU xyt -srx +qvR ovC dCq uiV @@ -182732,7 +182672,7 @@ ttj bhf ttj ttj -tGL +nzg cwj ksk bsh @@ -183197,7 +183137,7 @@ dPu dPu tXI rqD -mDI +npp lUa xeG rlo @@ -183221,14 +183161,14 @@ aIv aHQ tJz oxL -aJI +wzX lpC vTb vTb rbn crj wWT -fDB +pBU uvB rBb tbK @@ -184225,7 +184165,7 @@ uDl fNa cfz aCd -hgo +aCx aCL geG nmP @@ -184464,7 +184404,7 @@ aac aac aac udQ -xOH +nIC fQH fPJ udQ @@ -184978,9 +184918,9 @@ aac aac aac udQ -krx -wJa -eqo +lQz +pXq +rCs udQ kSa cDP @@ -185006,9 +184946,9 @@ bAj dJk vUE vUE -uJx +ftZ vUE -uJx +ftZ vUE nSI tXz @@ -185251,7 +185191,7 @@ nky pBQ hjo bHx -fIs +sFw eos xpm rbv @@ -185516,7 +185456,7 @@ vPB uCO fZS bMb -idb +qfQ sUc lCy fiW @@ -185782,7 +185722,7 @@ fvD slr fiW nSI -gOB +qrs xts oNa sJZ @@ -185860,7 +185800,7 @@ sVz bNr aoh jLx -olh +ffe mgi pIQ hhf @@ -186289,15 +186229,15 @@ iSf jha qDn ajg -oQJ +qZZ kAO -tja +hSt pgo kAO kAO udX -cEi -wGN +jhn +duA bPO iVy tJh @@ -186546,10 +186486,10 @@ fZS kDH vPB pzv -orN +oGG geG geG -aGa +aFZ geG geG geG @@ -186802,14 +186742,14 @@ lMg qbu riS gAH -aEO -uGN -gMV +aFP +oOP +pTW wuF -drg +aZm wuF -gMV -aEO +pTW +aFP aDI aHw aHE @@ -187059,15 +186999,15 @@ pSV pSV pSV pEx -kMt -ayc +jYT +wJF fmy -rIb -vbY -qhw +wWh +snF +aGq fmy -kMt -wmt +jYT +aGw pEx fmy dbV @@ -187315,17 +187255,17 @@ xkI gbB pkD pSV -aTr +bxC joi -lGx +lyR xWu rUQ rUQ rUQ xWu -lrD +sWq eKD -wLK +gXH fmy fmy vPB @@ -187574,7 +187514,7 @@ aDN wzg tiM qSm -qdt +tIk aGb aGb aGb @@ -187830,11 +187770,11 @@ bNi aDN wzg tiM -hsn -nKy -mgD -brN -hsH +qFH +iur +tEk +jBk +heS nfJ rdT lgO @@ -188086,11 +188026,11 @@ wJV wXP loQ wAh -daS -ylv -rUP -bID -cmj +cpK +nJx +nQq +lRx +jZe fmy aGs kIo @@ -188344,10 +188284,10 @@ fam aDN wzg tiM -hsn -rUP +qFH +nQq qSm -krd +sJx rUQ aGt kIo @@ -188601,10 +188541,10 @@ krq eIS vQX dJp -gzs +jrc fio qSm -kRS +bYa rUQ lai kIo @@ -188859,9 +188799,9 @@ pSV pSV fmy fmy -pQD +dOM qSm -krd +sJx rUQ lai kIo @@ -189116,9 +189056,9 @@ ifU kLI kFu uCy -cUk +sXo qSm -kRS +bYa rUQ lai qSm @@ -189375,7 +189315,7 @@ cHS svC nny qSm -cmj +jZe xWu uuS qSm diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index 2f07130c1f9..7f44673da3d 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -5,7 +5,8 @@ "map_file": "multiz.dmm", "ignored_unit_tests": [ "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items" + "/datum/unit_test/required_map_items", + "/datum/unit_test/spy_bounty" ], "traits": [ { diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json index 093592f5c70..ee042270c0a 100644 --- a/_maps/runtimestation.json +++ b/_maps/runtimestation.json @@ -6,7 +6,8 @@ "space_ruin_levels": 1, "ignored_unit_tests": [ "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items" + "/datum/unit_test/required_map_items", + "/datum/unit_test/spy_bounty" ], "shuttles": { "cargo": "cargo_delta" diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index e547390ded9..848f487020f 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -230,7 +230,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "aU" = ( -/mob/living/simple_animal/hostile/alien/maid/barmaid, +/mob/living/basic/alien/maid/barmaid, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index aa4364858e1..81328a07751 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -955,7 +955,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "uu" = ( -/mob/living/simple_animal/hostile/alien/maid/barmaid, +/mob/living/basic/alien/maid/barmaid, /turf/open/floor/wood/parquet, /area/shuttle/escape) "uy" = ( diff --git a/_maps/shuttles/emergency_medisim.dmm b/_maps/shuttles/emergency_medisim.dmm index 0780ea89d20..4e62c20d74b 100644 --- a/_maps/shuttles/emergency_medisim.dmm +++ b/_maps/shuttles/emergency_medisim.dmm @@ -701,7 +701,7 @@ iron_cost = 0; maximum_idle = 1; name = "binoculars fabricator"; - power_used = 0; + energy_used = 0; starting_amount = 25000 }, /turf/open/floor/mineral/titanium/yellow, diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index 00ff645f5d0..b68f934ca9c 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -189,6 +189,11 @@ /obj/structure/lattice, /turf/open/space, /area/shuttle/escape) +"cb" = ( +/obj/machinery/power/smes/full, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/escape) "cu" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -2401,13 +2406,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Jf" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/shuttle/escape) "Jg" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/cobweb, @@ -5199,7 +5197,7 @@ JA yc yc yc -Jf +cb sf nr VN @@ -5281,7 +5279,7 @@ Tk bI vj yc -Jf +cb sf Tt dn diff --git a/_maps/shuttles/hunter_psyker.dmm b/_maps/shuttles/hunter_psyker.dmm index 311f5aac15f..e4b8ed54478 100644 --- a/_maps/shuttles/hunter_psyker.dmm +++ b/_maps/shuttles/hunter_psyker.dmm @@ -117,9 +117,7 @@ /turf/open/floor/engine, /area/shuttle/hunter) "fp" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/south, diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 248235bd772..214705cfb17 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -426,9 +426,7 @@ "Fy" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /turf/open/floor/plating, /area/shuttle/hunter/russian) "FK" = ( diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 502d380cbd3..1f048327921 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -1935,9 +1935,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/armory) "tP" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /obj/structure/sign/warning/electric_shock/directional/north, diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 9bd032fd328..0f588e1df27 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -436,9 +436,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm index 96aba76e5f7..9700a3808c0 100644 --- a/_maps/shuttles/pirate_ex_interdyne.dmm +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -62,14 +62,6 @@ "aj" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/pirate) -"ak" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 8 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/reagentgrinder/constructed, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) "al" = ( /obj/machinery/loot_locator{ dir = 8 @@ -152,22 +144,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/pirate) -"aD" = ( -/obj/machinery/power/apc/auto_name/directional/north{ - cell_type = /obj/item/stock_parts/cell/bluespace - }, -/obj/effect/mapping_helpers/apc/full_charge, -/obj/effect/mapping_helpers/apc/cut_AI_wire, -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/power/smes/engineering{ - charge = 1e+600 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) "aF" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 4; @@ -356,7 +332,7 @@ /turf/open/floor/iron/dark, /area/shuttle/pirate) "bu" = ( -/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced, /obj/item/storage/box/handcuffs, /turf/open/floor/iron/dark, /area/shuttle/pirate) @@ -364,7 +340,7 @@ /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced, /obj/structure/window/reinforced/unanchored/spawner/directional/north, /obj/structure/bed, /obj/machinery/door/window/brigdoor/right/directional/west{ @@ -507,7 +483,7 @@ /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 1 }, -/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced, /obj/structure/bed{ dir = 1 }, @@ -582,6 +558,20 @@ }, /turf/open/floor/plating/airless, /area/shuttle/pirate) +"rV" = ( +/obj/machinery/power/apc/auto_name/directional/north{ + cell_type = /obj/item/stock_parts/cell/bluespace; + start_charge = 100 + }, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/power/smes/magical, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) "sP" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/structure/table/optable, @@ -619,63 +609,6 @@ /obj/item/surgical_drapes, /turf/open/floor/iron/dark, /area/shuttle/pirate) -"wf" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/machinery/reagentgrinder/constructed, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/item/reagent_containers/cup/bottle, -/obj/item/reagent_containers/cup/bottle, -/obj/item/reagent_containers/cup/bottle, -/obj/item/reagent_containers/cup/beaker/meta, -/obj/item/stack/sheet/mineral/plasma/thirty, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) "yi" = ( /obj/machinery/door/airlock/hatch{ id_tag = "piratebridgebolt"; @@ -768,6 +701,71 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) +"Lv" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/reagentgrinder, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"MH" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/machinery/reagentgrinder, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/item/reagent_containers/cup/bottle, +/obj/item/reagent_containers/cup/bottle, +/obj/item/reagent_containers/cup/bottle, +/obj/item/reagent_containers/cup/beaker/meta, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) "Oe" = ( /obj/effect/turf_decal/tile/dark_blue{ dir = 4 @@ -873,7 +871,7 @@ af aj ap aw -ak +Lv bF aj af @@ -985,7 +983,7 @@ fY bX iD aj -aD +rV aG ep aj @@ -1108,7 +1106,7 @@ aj Rq bu VF -wf +MH aj af af diff --git a/_maps/shuttles/pirate_geode.dmm b/_maps/shuttles/pirate_geode.dmm index 693b7c8635f..3a75c427794 100644 --- a/_maps/shuttles/pirate_geode.dmm +++ b/_maps/shuttles/pirate_geode.dmm @@ -716,9 +716,7 @@ "Ku" = ( /obj/effect/turf_decal/lunar_sand/plating, /obj/structure/cable, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /turf/open/floor/plating, /area/shuttle/pirate) "KK" = ( diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index 7ba8fdd5a5c..522576fdf02 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -433,9 +433,7 @@ /turf/open/floor/plating, /area/shuttle/pirate) "qo" = ( -/obj/machinery/power/smes{ - charge = 1e+600 - }, +/obj/machinery/power/smes/magical, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/pirate) @@ -484,9 +482,7 @@ /turf/open/floor/wood, /area/shuttle/pirate) "sh" = ( -/obj/machinery/power/smes{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate_irs.dmm index 38067cecaae..c352bb02c3e 100644 --- a/_maps/shuttles/pirate_irs.dmm +++ b/_maps/shuttles/pirate_irs.dmm @@ -820,9 +820,7 @@ /area/shuttle/pirate) "yN" = ( /obj/effect/turf_decal/bot, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/pirate) @@ -1033,12 +1031,7 @@ layer = 4 }, /obj/effect/turf_decal/box, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, +/obj/structure/fluff/shower_drain, /turf/open/floor/iron/dark, /area/shuttle/pirate) "Dy" = ( diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index d4bd9d0c16b..f32e70b1e45 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -608,9 +608,7 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "Ln" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/structure/cable, /obj/effect/turf_decal/bot, /obj/machinery/light/directional/north, diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index b84838f32b1..f09f996426d 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -753,9 +753,7 @@ }, /area/shuttle/ruin/caravan/pirate) "We" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/effect/turf_decal/stripes/line{ dir = 5 }, diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 45506825229..449c21eb56a 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -376,9 +376,7 @@ /turf/open/floor/pod/dark, /area/shuttle/ruin/caravan/syndicate3) "Oe" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, +/obj/machinery/power/smes/full, /obj/effect/turf_decal/stripes/line{ dir = 5 }, diff --git a/_maps/shuttles/skyrat/goldeneye_cruiser.dmm b/_maps/shuttles/skyrat/goldeneye_cruiser.dmm index 474d5f97910..4bcb2d3e845 100644 --- a/_maps/shuttles/skyrat/goldeneye_cruiser.dmm +++ b/_maps/shuttles/skyrat/goldeneye_cruiser.dmm @@ -882,7 +882,7 @@ /obj/structure/closet/crate/medical, /mob/living/basic/bot/medbot{ faction = list("Syndicate"); - maints_access_required = list(150); + req_one_access = list(150); name = "James T. Kirk"; radio_channel = "Syndicate" }, diff --git a/_maps/shuttles/skyrat/whiteship_blueshift.dmm b/_maps/shuttles/skyrat/whiteship_blueshift.dmm index 537082f48f1..247c45cd491 100644 --- a/_maps/shuttles/skyrat/whiteship_blueshift.dmm +++ b/_maps/shuttles/skyrat/whiteship_blueshift.dmm @@ -442,7 +442,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /obj/machinery/duct, /turf/open/floor/iron, /area/shuttle/abandoned/crew) @@ -466,7 +466,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/maid/barmaid, +/mob/living/basic/alien/maid/barmaid, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "fq" = ( @@ -1406,7 +1406,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "ne" = ( @@ -1643,7 +1643,7 @@ dir = 8 }, /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /turf/open/floor/iron, /area/shuttle/abandoned/bridge) "pl" = ( @@ -2287,7 +2287,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/sentinel, +/mob/living/basic/alien/sentinel, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "vh" = ( @@ -2839,7 +2839,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden, /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /obj/structure/cable, /turf/open/floor/iron, /area/shuttle/abandoned/crew) @@ -3446,7 +3446,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /obj/machinery/duct, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) @@ -3574,7 +3574,7 @@ "Ir" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/floor/iron/cafeteria, /area/shuttle/abandoned/crew) "Iy" = ( @@ -4610,7 +4610,7 @@ dir = 4 }, /obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden, /turf/open/floor/iron/dark, @@ -5144,7 +5144,7 @@ dir = 4 }, /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone, +/mob/living/basic/alien/drone, /turf/open/floor/iron, /area/shuttle/abandoned/engine) "WP" = ( @@ -5520,7 +5520,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/mob/living/simple_animal/hostile/alien/queen/large, +/mob/living/basic/alien/queen/large, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "ZN" = ( diff --git a/_maps/shuttles/whiteship_birdshot.dmm b/_maps/shuttles/whiteship_birdshot.dmm index 25dc64ed0fc..b6bb7f6155b 100644 --- a/_maps/shuttles/whiteship_birdshot.dmm +++ b/_maps/shuttles/whiteship_birdshot.dmm @@ -986,9 +986,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/bar) "Ge" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index cbfdf87ce09..8aa60f4e93b 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -1095,9 +1095,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cu" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index 1f0308690e7..4e53e54651e 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -63,7 +63,7 @@ "aB" = ( /obj/machinery/light/small/directional/south, /obj/machinery/power/smes{ - charge = 5e+006; + charge = 5e+007; output_level = 20000 }, /obj/structure/cable, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index 2ee3a6e691e..53e09ce34d3 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -983,9 +983,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/abandoned/engine) diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 291509a1824..c01d6742975 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -986,9 +986,7 @@ /area/shuttle/abandoned/bar) "cX" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship_obelisk.dmm index cf27098fe03..4b8eb9ee91b 100644 --- a/_maps/shuttles/whiteship_obelisk.dmm +++ b/_maps/shuttles/whiteship_obelisk.dmm @@ -123,10 +123,7 @@ "gw" = ( /obj/structure/cable, /mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, +/obj/effect/decal/cleanable/crayon/rune4, /obj/effect/decal/cleanable/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -213,9 +210,7 @@ /area/shuttle/abandoned/engine) "mQ" = ( /obj/structure/cable, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune2" - }, +/obj/effect/decal/cleanable/crayon/rune2, /obj/effect/mob_spawn/corpse/human/damaged, /obj/machinery/button/door/directional/west{ name = "Bolt Control"; @@ -252,10 +247,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/bridge) "ne" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, +/obj/effect/decal/cleanable/crayon/rune4, /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -308,10 +300,7 @@ /area/shuttle/abandoned/bar) "oY" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, +/obj/effect/decal/cleanable/crayon/rune4, /obj/effect/turf_decal/tile/dark_blue/half, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/bridge) @@ -439,10 +428,7 @@ "yo" = ( /obj/structure/cable, /mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, +/obj/effect/decal/cleanable/crayon/rune4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -496,10 +482,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/crew) "Cv" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, +/obj/effect/decal/cleanable/crayon/rune4, /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned) "CX" = ( @@ -599,10 +582,7 @@ "HU" = ( /obj/structure/cable, /mob/living/basic/construct/juggernaut/hostile, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, +/obj/effect/decal/cleanable/crayon/rune4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -780,10 +760,7 @@ "SE" = ( /obj/structure/cable, /mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, +/obj/effect/decal/cleanable/crayon/rune4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 50dd7802f2f..807d1385899 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -810,9 +810,7 @@ /area/shuttle/abandoned) "IL" = ( /obj/machinery/light/small/broken/directional/east, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, diff --git a/_maps/shuttles/whiteship_tram.dmm b/_maps/shuttles/whiteship_tram.dmm index 87c04821181..0dfa8b414bd 100644 --- a/_maps/shuttles/whiteship_tram.dmm +++ b/_maps/shuttles/whiteship_tram.dmm @@ -48,9 +48,7 @@ /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/abandoned/engine) "am" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, +/obj/machinery/power/smes/ship, /obj/effect/turf_decal/stripes/white/line{ dir = 9 }, diff --git a/_maps/shuttles/zubbers/emergency_moonstation.dmm b/_maps/shuttles/zubbers/emergency_moonstation.dmm index 0cc628fd3a6..fbd3ee8dc13 100644 --- a/_maps/shuttles/zubbers/emergency_moonstation.dmm +++ b/_maps/shuttles/zubbers/emergency_moonstation.dmm @@ -31,7 +31,7 @@ /turf/open/floor/grass, /area/shuttle/escape) "cb" = ( -/mob/living/simple_animal/hostile/alien/maid/barmaid{ +/mob/living/basic/alien/maid/barmaid{ name = "Burgermaid"; unique_name = 1 }, diff --git a/_maps/skyrat/automapper/automapper_config.toml b/_maps/skyrat/automapper/automapper_config.toml index 555dc0d65c0..db9ddb20d51 100644 --- a/_maps/skyrat/automapper/automapper_config.toml +++ b/_maps/skyrat/automapper/automapper_config.toml @@ -260,7 +260,7 @@ trait_name = "Station" map_files = ["birdshot_supermatter.dmm"] directory = "_maps/skyrat/automapper/templates/birdshot/" required_map = "birdshot.dmm" -coordinates = [41, 201, 1] +coordinates = [71, 211, 1] trait_name = "Station" # NORTHSTAR MAP EDITS diff --git a/_maps/skyrat/automapper/templates/birdshot/birdshot_supermatter.dmm b/_maps/skyrat/automapper/templates/birdshot/birdshot_supermatter.dmm index fc0d26771fb..452c7812ebc 100644 --- a/_maps/skyrat/automapper/templates/birdshot/birdshot_supermatter.dmm +++ b/_maps/skyrat/automapper/templates/birdshot/birdshot_supermatter.dmm @@ -2,70 +2,37 @@ "a" = ( /turf/template_noop, /area/template_noop) -"b" = ( -/obj/effect/turf_decal/stripes/red/box, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"j" = ( -/obj/machinery/airalarm/directional/south, +"d" = ( +/obj/machinery/atmospherics/components/unary/delam_scram/directional/west, /turf/template_noop, /area/template_noop) -"v" = ( +"U" = ( /obj/structure/sign/delam_procedure, /turf/template_noop, /area/template_noop) -"B" = ( +"W" = ( /obj/machinery/button/delam_scram, -/turf/closed/wall, -/area/station/engineering/supermatter/room) -"D" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"T" = ( -/obj/machinery/atmospherics/components/unary/delam_scram/directional/east, /turf/template_noop, /area/template_noop) (1,1,1) = {" -T -a a +W a a a "} (2,1,1) = {" a +d a a -a -j -a +U "} (3,1,1) = {" a -v a -b -B -a -"} -(4,1,1) = {" -a -a -a -a -D +a +a a "} diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 2c70afabbdf..001a937e97b 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -3723,7 +3723,7 @@ /area/shuttle/sbc_starfury) "nR" = ( /obj/machinery/power/smes/engineering{ - charge = 4e+006 + charge = 5e+007 }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -4784,7 +4784,7 @@ faction = list("neutral","silicon","turret","Syndicate"); name = "Syndicate Medibot"; skin = "bezerk"; - maints_access_required = list("syndicate") + req_one_access = list("syndicate") }, /turf/open/floor/iron, /area/shuttle/sbc_starfury) diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index 58c3d233d7b..059d27000d0 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -152,6 +152,10 @@ }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"bZ" = ( +/obj/effect/decal/cleanable/fuel_pool, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "cl" = ( /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) @@ -349,6 +353,15 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) +"dZ" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/fuel_pool, +/obj/item/binoculars, +/obj/item/stack/sheet/animalhide/carp/five, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "ec" = ( /obj/structure/sign/poster/contraband/cc64k_ad, /turf/closed/indestructible/syndicate, @@ -485,9 +498,27 @@ /turf/open/floor/iron/freezer, /area/centcom/syndicate_mothership/control) "fw" = ( -/obj/item/kirbyplants/random, +/obj/structure/frame/computer, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/sign/poster/contraband/syndiemoth/directional/north, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) +"fx" = ( +/obj/machinery/light/small/dim/directional/west, +/obj/structure/rack, +/obj/effect/turf_decal/box/white, +/obj/item/stack/cable_coil/thirty{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/item/circuitboard/computer/stationalert{ + pixel_y = 1; + pixel_x = 3 + }, +/obj/item/stack/cable_coil/thirty, +/obj/item/circuitboard/computer/advanced_camera, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "fy" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -536,6 +567,8 @@ /obj/structure/frame/computer{ dir = 1 }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) "gf" = ( @@ -740,6 +773,20 @@ /obj/item/melee/powerfist, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"id" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/storage/fancy/donut_box, +/obj/structure/rack, +/obj/item/food/syndicake{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/item/food/syndicake{ + pixel_x = 1; + pixel_y = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "ig" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -1033,6 +1080,10 @@ /obj/structure/sign/poster/contraband/power/directional/north, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"lx" = ( +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "lA" = ( /obj/machinery/door/window/survival_pod/left/directional/west{ name = "Toilet Door" @@ -1281,6 +1332,22 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) +"oN" = ( +/obj/structure/rack, +/obj/item/poster/random_contraband{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/poster/random_contraband{ + pixel_x = 3; + pixel_y = 8 + }, +/obj/item/poster/random_contraband{ + pixel_x = 1 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "oR" = ( /obj/structure/table/wood, /obj/item/storage/box/donkpockets, @@ -1367,6 +1434,7 @@ /obj/structure/chair/greyscale{ dir = 4 }, +/obj/effect/landmark/start/nukeop_overwatch, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) "pU" = ( @@ -1641,6 +1709,7 @@ /area/centcom/syndicate_mothership/control) "sv" = ( /obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) "sE" = ( @@ -1731,6 +1800,17 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"tB" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/hatch{ + name = "Workout Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) "tJ" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -2046,6 +2126,10 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) +"yA" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "yB" = ( /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid/snow/icemoon, @@ -2100,12 +2184,12 @@ /area/centcom/syndicate_mothership/control) "zy" = ( /obj/structure/table/reinforced/plasmarglass, -/obj/item/pen{ - pixel_x = 6; - pixel_y = 5 +/obj/item/flashlight/lamp/green{ + pixel_y = 9; + pixel_x = 5 }, -/obj/item/folder/red{ - pixel_x = -5 +/obj/item/circuitboard/computer/overwatch{ + pixel_x = -2 }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) @@ -2132,7 +2216,7 @@ /turf/open/space/basic, /area/space/nearstation) "zR" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) "zS" = ( @@ -3037,6 +3121,10 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"Jx" = ( +/obj/effect/decal/cleanable/plastic, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "JJ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -3318,6 +3406,19 @@ /obj/structure/noticeboard/directional/east, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"MA" = ( +/obj/item/stack/sheet/iron/fifty{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_y = 3; + pixel_x = 5 + }, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "MD" = ( /obj/machinery/door/airlock/maintenance/external{ name = "Bunk Room 1" @@ -3483,6 +3584,14 @@ pixel_x = -2; pixel_y = 6 }, +/obj/item/paper/fluff/overwatch{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/item/toy/figure/syndie{ + pixel_x = 5 + }, +/obj/structure/sign/clock/directional/north, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) "Ov" = ( @@ -3706,6 +3815,14 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"QD" = ( +/obj/item/flashlight{ + pixel_y = 6 + }, +/obj/structure/rack, +/obj/item/flashlight, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "QJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -3728,10 +3845,39 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"QS" = ( +/obj/item/soap/syndie, +/obj/structure/rack, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/effect/spawner/random/entertainment/lighter, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "Rd" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/centcom/syndicate_mothership/control) +"Rn" = ( +/obj/item/circuitboard/computer/syndicate_shuttle{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/structure/rack, +/obj/item/stack/cable_coil/thirty{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/effect/turf_decal/box/white, +/obj/item/circuitboard/computer/syndicate_shuttle_docker, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) +"Rr" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "Rs" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -3830,6 +3976,11 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"St" = ( +/obj/effect/decal/cleanable/fuel_pool, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "Su" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -4276,6 +4427,11 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) +"XO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/fuel_pool, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "XQ" = ( /obj/effect/turf_decal/siding/wideplating/dark, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -4375,6 +4531,14 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"YT" = ( +/obj/structure/rack, +/obj/effect/turf_decal/box/white, +/obj/item/storage/medkit/emergency, +/obj/item/tank/internals/emergency_oxygen/double, +/obj/item/clothing/mask/gas/syndicate, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) "YX" = ( /obj/structure/railing{ dir = 6 @@ -4491,6 +4655,7 @@ /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) "ZX" = ( +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) "ZZ" = ( @@ -5254,9 +5419,9 @@ sU sU sU sU -sU -sU -sU +Ye +Ye +Ye Ye Ye Ye @@ -5356,13 +5521,13 @@ sU sU sU sU -sU -sU Ye Ye Kq Kq Kq +Kq +Kq Ye KU KU @@ -5458,12 +5623,12 @@ sU sU sU sU -sU -Ye Ye Kq Kq -Xk +YT +fx +Rn Kq Kq KU @@ -5561,12 +5726,12 @@ sU sU sU Ye -Ye -Kq Kq +oN +Jx Xk -Xk -Xk +Rr +MA Kq Kq uT @@ -5664,12 +5829,12 @@ sU sU Ye Kq -Kq -Xk -Xk -Xk +QS Xk Xk +bZ +Rr +id Kq Kq uT @@ -5766,12 +5931,12 @@ sU sU Ye Kq -Xk -Xk -Xk -Xk -Xk -Xk +QD +Rr +lx +bZ +St +XO Xk Kq Kq @@ -5871,12 +6036,12 @@ Kq Kq Kq Kq -lg +tB Kq +dZ Xk -Xk -Xk -Kq +yA +tO uT ds HW diff --git a/_maps/templates/listeningbasics.dmm b/_maps/templates/listeningbasics.dmm index 03373c71b63..176faac98e7 100644 --- a/_maps/templates/listeningbasics.dmm +++ b/_maps/templates/listeningbasics.dmm @@ -27,7 +27,7 @@ /turf/open/floor/mineral/plastitanium, /area/template_noop) "t" = ( -/obj/machinery/door/window/survival_pod, +/obj/machinery/door/window/survival_pod/left/directional/south, /turf/open/floor/mineral/plastitanium/red, /area/template_noop) "y" = ( diff --git a/_maps/virtual_domains/stairs_and_cliffs.dmm b/_maps/virtual_domains/stairs_and_cliffs.dmm index 3c9e0711e02..accdf93bf00 100644 --- a/_maps/virtual_domains/stairs_and_cliffs.dmm +++ b/_maps/virtual_domains/stairs_and_cliffs.dmm @@ -5,6 +5,10 @@ }, /turf/open/cliff/snowrock/virtual_domain, /area/icemoon/underground/explored/virtual_domain) +"bU" = ( +/mob/living/basic/bear/snow/ancient, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) "cu" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -19,6 +23,10 @@ /obj/structure/chair/sofa/bench, /turf/open/floor/plating/snowed/smoothed, /area/icemoon/underground/explored/virtual_domain) +"cS" = ( +/obj/structure/barricade/wooden/snowed, +/turf/open/floor/iron/stairs, +/area/icemoon/underground/explored/virtual_domain) "dR" = ( /turf/open/misc/asteroid/snow, /area/icemoon/underground/explored/virtual_domain) @@ -34,6 +42,14 @@ /obj/structure/railing/corner, /turf/open/cliff/snowrock/virtual_domain, /area/icemoon/underground/explored/virtual_domain) +"gF" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"gY" = ( +/obj/effect/decal/remains/human, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) "hc" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -65,6 +81,10 @@ /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow, /area/icemoon/underground/explored/virtual_domain) +"mr" = ( +/obj/structure/fluff/fokoff_sign, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) "mx" = ( /obj/structure/railing, /obj/structure/railing{ @@ -86,6 +106,13 @@ }, /turf/open/floor/wood, /area/icemoon/underground/explored/virtual_domain) +"nY" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) "pl" = ( /obj/structure/bonfire/prelit, /turf/open/misc/asteroid/snow, @@ -597,10 +624,10 @@ dR dR dR dR -sM -sM -sM -sM +Nv +Nv +Nv +dR sM sM sM @@ -672,23 +699,23 @@ Qv Qv kK sw -dR +gY dR sM sM sM +dR +cS +Nv +Nv +dR +dR +sw sM sM sM -sM -sM -sM -sM -sM -sM -sM -sM -sM +qc +gF sM sM sM @@ -754,18 +781,18 @@ dR sM sM sM +sa sM sM +gY +dR +dR +sa +dR sM sM -sM -sM -sM -sM -sM -sM -sM -sM +Dz +dR sM sM sM @@ -827,21 +854,21 @@ Qv eB sw dR +mr +sM +sM +sM +sM +sM +sM +mr +sa dR +dR +gY sM sM -sM -sM -sM -sM -sM -sM -sM -sM -sM -sM -sM -sM +nY sM sM sM @@ -901,24 +928,24 @@ Am Am Qv Qv -dR +mr eB dR -sw +dR dR sM sM sM sM sM -sM -sM -sM -sM -sM -sM -sM -sM +kK +dR +bU +dR +dR +cS +Nv +hc sM sM sM @@ -989,10 +1016,10 @@ sM sM sM sM -sM -sM -sM -sM +dR +sa +gY +dR sM sM sM @@ -1063,13 +1090,13 @@ dR sM sM sM +pL sM sM -sM -sM -sM -sM -sM +sw +dR +dR +sa sM sM sM @@ -1140,13 +1167,13 @@ sM sM sM sM +pL +pL sM sM -sM -sM -sM -sM -sM +dR +dR +sw sM sM sM @@ -1217,8 +1244,8 @@ sM sM sM sM -sM -sM +pL +pL sM sM sM @@ -1295,11 +1322,11 @@ sM sM sM sM -sM -sM -sM -sM -sM +pL +pL +pL +pL +pL sM sM sM @@ -1373,8 +1400,8 @@ sM sM sM sM -sM -sM +pL +pL sM sM sM diff --git a/_maps/virtual_domains/xeno_nest.dmm b/_maps/virtual_domains/xeno_nest.dmm index 5d2952a5b1a..a80fe0ea149 100644 --- a/_maps/virtual_domains/xeno_nest.dmm +++ b/_maps/virtual_domains/xeno_nest.dmm @@ -66,8 +66,8 @@ /area/ruin/space/has_grav/powered/virtual_domain) "p" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/space/has_grav/powered/virtual_domain) @@ -81,8 +81,8 @@ /area/virtual_domain/safehouse) "s" = ( /obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +/mob/living/basic/alien/drone{ + can_plant_weeds = 0 }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/space/has_grav/powered/virtual_domain) @@ -175,11 +175,11 @@ /area/ruin/space/has_grav/powered/virtual_domain) "J" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/queen/large{ +/mob/living/basic/alien/queen/large{ desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; name = "alien queen"; pixel_x = -16; - plants_off = 1 + can_plant_weeds = 0 }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/space/has_grav/powered/virtual_domain) @@ -218,7 +218,7 @@ /area/ruin/space/has_grav/powered/virtual_domain) "P" = ( /obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/space/has_grav/powered/virtual_domain) "Q" = ( @@ -228,7 +228,7 @@ /area/ruin/space/has_grav/powered/virtual_domain) "S" = ( /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, +/mob/living/basic/alien, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/space/has_grav/powered/virtual_domain) "T" = ( diff --git a/auxlua.dll b/auxlua.dll index c57e961ab58..4f712c26d82 100644 Binary files a/auxlua.dll and b/auxlua.dll differ diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index ebb14c09240..8f797c62aa5 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -111,7 +111,6 @@ #define ORGAN_SLOT_EXTERNAL_HORNS "horns" #define ORGAN_SLOT_EXTERNAL_WINGS "wings" #define ORGAN_SLOT_EXTERNAL_ANTENNAE "antennae" -#define ORGAN_SLOT_EXTERNAL_BODYMARKINGS "bodymarkings" #define ORGAN_SLOT_EXTERNAL_POD_HAIR "pod_hair" /// Xenomorph organ slots diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 2b9a1884704..2166ae82bf7 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -132,6 +132,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NO_DEATH_MESSAGE (1<<14) /// This area should have extra shielding from certain event effects #define EVENT_PROTECTED (1<<15) +/// This Area Doesn't have Flood or Bomb Admin Messages, but will still log +#define QUIET_LOGS (1<<16) /* These defines are used specifically with the atom/pass_flags bitmask @@ -198,6 +200,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define INDESTRUCTIBLE (1<<6) /// can't be frozen #define FREEZE_PROOF (1<<7) +/// can't be shuttle crushed. +#define SHUTTLE_CRUSH_PROOF (1<<8) //tesla_zap #define ZAP_MACHINE_EXPLOSIVE (1<<0) @@ -213,11 +217,16 @@ 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 protection +///EMP will protect itself. #define EMP_PROTECT_SELF (1<<0) +///EMP will protect the contents from also being EMPed. #define EMP_PROTECT_CONTENTS (1<<1) +///EMP will protect the wires. #define EMP_PROTECT_WIRES (1<<2) +///Protects against all EMP types. +#define EMP_PROTECT_ALL (EMP_PROTECT_SELF | EMP_PROTECT_CONTENTS | EMP_PROTECT_WIRES) + //Mob mobility var flags /// can move #define MOBILITY_MOVE (1<<0) diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index aa96ec696db..0b0697cca3a 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -193,6 +193,11 @@ /// HUNTERS #define ACCESS_HUNTER "hunter" +/// - - - MISC - - - + // These don't really fit anywhere else +/// For things that aren't ever supposed to be accessed +#define ACCESS_INACCESSIBLE "inaccessible" + /// - - - END ACCESS IDS - - - /// A list of access levels that, when added to an ID card, will warn admins. @@ -294,6 +299,7 @@ ACCESS_DETECTIVE, \ ACCESS_ENGINE_EQUIP, \ ACCESS_ENGINEERING, \ + ACCESS_EVA, \ ACCESS_EXTERNAL_AIRLOCKS, \ ACCESS_GATEWAY, \ ACCESS_GENETICS, \ diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm index 65cc4214908..e894b32b1f6 100644 --- a/code/__DEFINES/ai/ai.dm +++ b/code/__DEFINES/ai/ai.dm @@ -2,8 +2,12 @@ #define GET_TARGETING_STRATEGY(targeting_type) SSai_behaviors.targeting_strategies[targeting_type] #define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type) -#define AI_STATUS_ON 1 -#define AI_STATUS_OFF 2 +//AI controller flags +//If you add a new status, be sure to add it to the ai_controllers subsystem's ai_controllers_by_status list. +///The AI is currently active. +#define AI_STATUS_ON "ai_on" +///The AI is currently offline for any reason. +#define AI_STATUS_OFF "ai_off" ///For JPS pathing, the maximum length of a path we'll try to generate. Should be modularized depending on what we're doing later on #define AI_MAX_PATH_LENGTH 30 // 30 is possibly overkill since by default we lose interest after 14 tiles of distance, but this gives wiggle room for weaving around obstacles diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index 6dc90ea4d64..df9b8be1075 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -6,8 +6,6 @@ #define BB_NEXT_HUNGRY "BB_NEXT_HUNGRY" ///what we're going to eat next #define BB_FOOD_TARGET "bb_food_target" -///Path we should use next time we use the JPS movement datum -#define BB_PATH_TO_USE "BB_path_to_use" ///How close a mob must be for us to select it as a target, if that is less than how far we can maintain it as a target #define BB_AGGRO_RANGE "BB_aggro_range" ///are we hungry? determined by the udder compnent diff --git a/code/__DEFINES/ai/bot_keys.dm b/code/__DEFINES/ai/bot_keys.dm index 3c9a8551f50..8a46d156114 100644 --- a/code/__DEFINES/ai/bot_keys.dm +++ b/code/__DEFINES/ai/bot_keys.dm @@ -15,8 +15,6 @@ #define BB_RADIO_CHANNEL "radio_channel" ///list of unreachable things we will temporarily ignore #define BB_TEMPORARY_IGNORE_LIST "temporary_ignore_list" -///Last thing we attempted to reach -#define BB_LAST_ATTEMPTED_PATHING "last_attempted_pathing" // medbot keys ///the patient we must heal diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index d4f9af401cf..f80eb85735d 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -128,6 +128,10 @@ #define BB_MINEBOT_DUMP_ABILITY "minebot_dump_ability" /// key that stores our target turf #define BB_TARGET_MINERAL_TURF "target_mineral_turf" +///key that holds our missile ability +#define BB_MINEBOT_MISSILE_ABILITY "minebot_missile_ability" +///key that holds our landmine ability +#define BB_MINEBOT_LANDMINE_ABILITY "minebot_landmine_ability" /// key that stores list of the turfs we ignore #define BB_BLACKLIST_MINERAL_TURFS "blacklist_mineral_turfs" /// key that stores the previous blocked wall @@ -136,6 +140,20 @@ #define BB_AUTOMATED_MINING "automated_mining" /// key that stores the nearest dead human #define BB_NEARBY_DEAD_MINER "nearby_dead_miner" +///key that holds the drone we defend +#define BB_DRONE_DEFEND "defend_drone" +///key that holds the minimum distance before we flee +#define BB_MINIMUM_SHOOTING_DISTANCE "minimum_shooting_distance" +///key that holds the miner we must befriend +#define BB_MINER_FRIEND "miner_friend" +///key that holds the missile target +#define BB_MINEBOT_MISSILE_TARGET "minebot_missile_target" +///should we auto protect? +#define BB_MINEBOT_AUTO_DEFEND "minebot_auto_defend" +///should we repair drones? +#define BB_MINEBOT_REPAIR_DRONE "minebot_repair_drone" +///should we plant mines? +#define BB_MINEBOT_PLANT_MINES "minebot_plant_mines" //seedling keys /// the water can we will pick up diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm index c7383f56a00..48d4f2d67d0 100644 --- a/code/__DEFINES/ai/pets.dm +++ b/code/__DEFINES/ai/pets.dm @@ -51,6 +51,20 @@ /// key that holds items we arent interested in hoarding #define BB_IGNORE_ITEMS "ignore_items" +// Cultist pet keys +///our ability to summon runes +#define BB_RUNE_ABILITY "rune_ability" +///the cult team we serve +#define BB_CULT_TEAM "cult_team" +///our dead cultist we revive +#define BB_DEAD_CULTIST "dead_cultist" +///nearby runes +#define BB_NEARBY_RUNE "nearby_rune" +///occupied runes +#define BB_OCCUPIED_RUNE "occupied_rune" +///friendly cultists we befriend +#define BB_FRIENDLY_CULTIST "friendly_cultist" + //virtual pet keys ///the last PDA message we must relay #define BB_LAST_RECIEVED_MESSAGE "last_recieved_message" diff --git a/code/__DEFINES/ai/slime.dm b/code/__DEFINES/ai/slime.dm new file mode 100644 index 00000000000..ba08dbba556 --- /dev/null +++ b/code/__DEFINES/ai/slime.dm @@ -0,0 +1,14 @@ +// Slime AI controller blackboard keys + +///If true, the slime will not get hungry, nor hunt +#define BB_SLIME_HUNGER_DISABLED "BB_slime_hunger_disabled" +///Keeps track how hungry the slime is +#define BB_SLIME_HUNGER_LEVEL "BB_slime_hunger_level" +///If true, the slime is rabid +#define BB_SLIME_RABID "BB_slime_rabid" +///Are we an adult, or a child +#define BB_SLIME_LIFE_STAGE "BB_slime_life_stage" +///Our evolve action +#define BB_SLIME_EVOLVE "BB_slime_evolve" +///Our reproduce action +#define BB_SLIME_REPRODUCE "BB_slime_reproduce" diff --git a/code/__DEFINES/alerts.dm b/code/__DEFINES/alerts.dm index 1933b592d55..e6f4feb259a 100644 --- a/code/__DEFINES/alerts.dm +++ b/code/__DEFINES/alerts.dm @@ -47,11 +47,9 @@ #define ALERT_HACKING_APC "hackingapc" /** MODsuit/Mech related */ -#define ALERT_MODSUIT_CHARGE "mod_charge" #define ALERT_MECH_DAMAGE "mech_damage" /** Food related */ -#define ALERT_NUTRITION "nutrition" #define ALERT_DISGUST "disgust" /** Environment related */ diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index f274397754b..3a5398c9f8a 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -36,6 +36,9 @@ ///How long pirates will wait for a response before attacking #define RESPONSE_MAX_TIME 2 MINUTES +/// How long till a spessman should come back after being captured and sent to the holding facility (which some antags use) +#define COME_BACK_FROM_CAPTURE_TIME 6 MINUTES + //ERT Types #define ERT_BLUE "Blue" #define ERT_RED "Red" @@ -146,6 +149,9 @@ /// JSON string file for all of our heretic influence flavors #define HERETIC_INFLUENCE_FILE "antagonist_flavor/heretic_influences.json" +/// JSON file containing spy objectives +#define SPY_OBJECTIVE_FILE "antagonist_flavor/spy_objective.json" + ///employers that are from the syndicate GLOBAL_LIST_INIT(syndicate_employers, list( "Animal Rights Consortium", @@ -213,6 +219,8 @@ GLOBAL_LIST_INIT(ai_employers, list( /// Checks if the given mob is a blood cultist #define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult)) +/// Checks if the mob is a sentient or non-sentient cultist +#define IS_CULTIST_OR_CULTIST_MOB(mob) ((IS_CULTIST(mob)) || (mob.faction.Find(FACTION_CULT))) /// Checks if the given mob is a changeling #define IS_CHANGELING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling)) @@ -265,6 +273,8 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define OBJECTIVE_ITEM_TYPE_NORMAL "normal" /// Only appears in traitor objectives #define OBJECTIVE_ITEM_TYPE_TRAITOR "traitor" +/// Only appears for spy bounties +#define OBJECTIVE_ITEM_TYPE_SPY "spy" // Progression traitor defines @@ -378,3 +388,14 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define BATON_MODES 4 #define FREEDOM_IMPLANT_CHARGES 4 + +// Spy bounty difficulties +/// Can easily be accomplished by any job without any specialized tools, people won't really miss these things +#define SPY_DIFFICULTY_EASY "Easy" +/// Requires some specialized tools, knowledge, or access to accomplish, may require getting into conflict with the crew +#define SPY_DIFFICULTY_MEDIUM "Medium" +/// Very difficult to accomplish, almost guaranteed to require crew conflict +#define SPY_DIFFICULTY_HARD "Hard" + +/// Camera net used by battle royale objective +#define BATTLE_ROYALE_CAMERA_NET "battle_royale_camera_net" diff --git a/code/__DEFINES/apc_defines.dm b/code/__DEFINES/apc_defines.dm index 4cc5e31cb10..ee6c2bb67d6 100644 --- a/code/__DEFINES/apc_defines.dm +++ b/code/__DEFINES/apc_defines.dm @@ -58,7 +58,7 @@ /// How long it takes an ethereal to drain or charge APCs. Also used as a spam limiter. #define APC_DRAIN_TIME (7.5 SECONDS) /// How much power ethereals gain/drain from APCs. -#define APC_POWER_GAIN 200 +#define APC_POWER_GAIN (0.2 * STANDARD_CELL_CHARGE) // Wires & EMPs: /// The wire value used to reset the APCs wires after one's EMPed. diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm index 1993f102225..3870a7aed34 100644 --- a/code/__DEFINES/atmospherics/atmos_piping.dm +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -9,11 +9,13 @@ #define EAST_SHORTPIPE (1<<6) #define WEST_SHORTPIPE (1<<7) // Helpers to convert cardinals to and from pipe bitfields -// Assumes X_FULLPIPE = X, X_SHORTPIPE >> 4 = X as above +// Assumes X_FULLPIPE = X, X_SHORTPIPE >> 4 = X, X_PIPECAPS >> 8 = X as above #define FULLPIPE_TO_CARDINALS(bitfield) ((bitfield) & ALL_CARDINALS) #define SHORTPIPE_TO_CARDINALS(bitfield) (((bitfield) >> 4) & ALL_CARDINALS) +#define PIPECAPS_TO_CARDINALS(bitfield) (((bitfield) >> 8) & ALL_CARDINALS) #define CARDINAL_TO_FULLPIPES(cardinals) (cardinals) #define CARDINAL_TO_SHORTPIPES(cardinals) ((cardinals) << 4) +#define CARDINAL_TO_PIPECAPS(cardinals) ((cardinals) << 8) // A pipe is a stub if it only has zero or one permitted direction. For a regular pipe this is nonsensical, and there are no pipe sprites for this, so it is not allowed. #define ISSTUB(bits) !((bits) & ((bits) - 1)) #define ISNOTSTUB(bits) ((bits) & ((bits) - 1)) diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 6a28332c529..9e718a2fb98 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -110,6 +110,7 @@ #define SECHUD_GENETICIST "hudgeneticist" #define SECHUD_HEAD_OF_PERSONNEL "hudheadofpersonnel" #define SECHUD_HEAD_OF_SECURITY "hudheadofsecurity" +#define SECHUD_HUMAN_AI "hudhumanai" #define SECHUD_JANITOR "hudjanitor" #define SECHUD_LAWYER "hudlawyer" #define SECHUD_MEDICAL_DOCTOR "hudmedicaldoctor" @@ -124,6 +125,7 @@ #define SECHUD_SCIENTIST "hudscientist" #define SECHUD_SHAFT_MINER "hudshaftminer" #define SECHUD_STATION_ENGINEER "hudstationengineer" +#define SECHUD_VETERAN_ADVISOR "hudveteranadvisor" #define SECHUD_VIROLOGIST "hudvirologist" #define SECHUD_WARDEN "hudwarden" #define SECHUD_CHEF "hudchef" diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index c7275f7c423..b673d0e7a12 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -12,6 +12,8 @@ #define FLAMMABLE_MOB (1<<3) /// Mob never takes damage from unarmed attacks #define IMMUNE_TO_FISTS (1<<4) +/// Mob is immune to getting wet +#define IMMUNE_TO_GETTING_WET (1<<5) /// Temporary trait applied when an attack forecast animation has completed #define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast" diff --git a/code/__DEFINES/bitrunning.dm b/code/__DEFINES/bitrunning.dm index bdb02b4d792..ba6c3b9b61c 100644 --- a/code/__DEFINES/bitrunning.dm +++ b/code/__DEFINES/bitrunning.dm @@ -23,3 +23,6 @@ #define BITRUNNER_DIFFICULTY_MEDIUM 2 /// Red with skull. I am trying to kill bitrunners. #define BITRUNNER_DIFFICULTY_HIGH 3 + +/// Camera network bitrunner bodycams are on +#define BITRUNNER_CAMERA_NET "bitrunner" diff --git a/code/__DEFINES/blackmarket.dm b/code/__DEFINES/blackmarket.dm index 5494c371db7..c3b8ad0bf46 100644 --- a/code/__DEFINES/blackmarket.dm +++ b/code/__DEFINES/blackmarket.dm @@ -7,4 +7,5 @@ #define SHIPPING_METHOD_TELEPORT "Teleport" // Throws the item from somewhere at the station. #define SHIPPING_METHOD_LAUNCH "Launch" - +// Sends a supply pod to the buyer's location, showy. +#define SHIPPING_METHOD_SUPPLYPOD "Supply Pod" diff --git a/code/__DEFINES/cameranets.dm b/code/__DEFINES/cameranets.dm index b88678db4a5..15b4493738e 100644 --- a/code/__DEFINES/cameranets.dm +++ b/code/__DEFINES/cameranets.dm @@ -3,3 +3,27 @@ /// Takes a position, transforms it into a chunk bounded position. Indexes at 1 so it'll land on actual turfs always #define GET_CHUNK_COORD(v) (max((FLOOR(v, CHUNK_SIZE)), 1)) +//List of different camera nets, cameras are given this in the map and camera consoles can only view them if +//they share this network with them. +#define CAMERANET_NETWORK_SS13 "ss13" +#define CAMERANET_NETWORK_MINE "mine" +#define CAMERANET_NETWORK_RD "rd" +#define CAMERANET_NETWORK_LABOR "labor" +#define CAMERANET_NETWORK_ORDNANCE "ordnance" +#define CAMERANET_NETWORK_AUXBASE "auxbase" +#define CAMERANET_NETWORK_VAULT "vault" +#define CAMERANET_NETWORK_AI_CORE "aicore" +#define CAMERANET_NETWORK_AI_UPLOAD "aiupload" +#define CAMERANET_NETWORK_MINISAT "minisat" +#define CAMERANET_NETWORK_XENOBIOLOGY "xeno" +#define CAMERANET_NETWORK_TEST_CHAMBER "test" +#define CAMERANET_NETWORK_PRISON "prison" +#define CAMERANET_NETWORK_MEDBAY "medbay" +#define CAMERANET_NETWORK_ENGINE "engine" +#define CAMERANET_NETWORK_TELECOMMS "tcomms" +#define CAMERANET_NETWORK_TURBINE "turbine" +#define CAMERANET_NETWORK_THUNDERDOME "thunder" +#define CAMERANET_NETWORK_BAR "bar" +#define CAMERANET_NETWORK_INTERROGATION "interrogation" +#define CAMERANET_NETWORK_ABDUCTOR "abductor" +#define OPERATIVE_CAMERA_NET "operative" diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 63d5682ef0f..1d34ed6b3cf 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -64,3 +64,10 @@ #define SUPPLY_PACK_UNCOMMON_DISCOUNTABLE "uncommon_discount" ///Discount category for the silly, overpriced, joke content, sometimes useful or plain bad. #define SUPPLY_PACK_RARE_DISCOUNTABLE "rare_discount" + +///Standard export define for not selling the item. +#define EXPORT_NOT_SOLD 0 +///Sell the item +#define EXPORT_SOLD 1 +///Sell the item, but for the love of god, don't delete it, we're handling it in a fancier way. +#define EXPORT_SOLD_DONT_DELETE 2 diff --git a/code/__DEFINES/client.dm b/code/__DEFINES/client.dm index 0914bc025ad..17571b5270b 100644 --- a/code/__DEFINES/client.dm +++ b/code/__DEFINES/client.dm @@ -1,11 +1,6 @@ /// Checks if the given target is either a client or a mock client #define IS_CLIENT_OR_MOCK(target) (istype(target, /client) || istype(target, /datum/client_interface)) -/// Ensures that the client has been fully initialized via New(), and can't somehow execute actions before that. Security measure. -/// WILL RETURN OUT OF THE ENTIRE PROC COMPLETELY IF THE CLIENT IS NOT FULLY INITIALIZED. BE WARNED IF YOU WANT RETURN VALUES. -#define VALIDATE_CLIENT(target)\ - if (!target.fully_created) {\ - to_chat(target, span_warning("You are not fully initialized yet! Please wait a moment."));\ - log_access("Client [key_name(target)] attempted to execute a verb before being fully initialized.");\ - return\ - } +/// Checks to see if a /client has fully gone through New() as a safeguard against certain operations. +/// Should return the boolean value of the fully_created var, which should be TRUE if New() has finished running. FALSE otherwise. +#define VALIDATE_CLIENT_INITIALIZATION(target) (target.fully_created) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index bcb63c15382..d1f489f0555 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -39,14 +39,14 @@ #define COLOR_ETHIOPIA_RED "#DA121A" #define COLOR_UNION_JACK_RED "#C8102E" #define COLOR_MEDIUM_DARK_RED "#CC0000" -#define COLOR_PINK_RED "EF3340" +#define COLOR_PINK_RED "#EF3340" #define COLOR_SYNDIE_RED "#F10303" #define COLOR_SYNDIE_RED_HEAD "#760500" #define COLOR_MOSTLY_PURE_RED "#FF3300" #define COLOR_DARK_RED "#A50824" #define COLOR_RED_LIGHT "#FF3333" -#define COLOR_FIRE_LIGHT_RED "#B61C1C" #define COLOR_MAROON "#800000" +#define COLOR_FIRE_LIGHT_RED "#B61C1C" #define COLOR_SECURITY_RED "#CB0000" #define COLOR_VIVID_RED "#FF3232" #define COLOR_LIGHT_GRAYISH_RED "#E4C7C5" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 33b7853cfd0..847fd52cc22 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -274,7 +274,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define GRENADE_CLUMSY_FUMBLE 1 #define GRENADE_NONCLUMSY_FUMBLE 2 -#define GRENADE_NO_FUMBLE 3 #define BODY_ZONE_HEAD "head" #define BODY_ZONE_CHEST "chest" @@ -385,3 +384,13 @@ GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) #define SHOVE_BLOCKED (1<<5) ///If the obstacle is an object at the border of the turf (so no signal from being sent to the other turf) #define SHOVE_DIRECTIONAL_BLOCKED (1<<6) + +///Deathmatch lobby current status +#define DEATHMATCH_NOT_PLAYING 0 +#define DEATHMATCH_PRE_PLAYING 1 +#define DEATHMATCH_PLAYING 2 + +/// The amount of energy needed to increase the burn force by 1 damage during electrocution. +#define JOULES_PER_DAMAGE (25 KILO JOULES) +/// Calculates the amount of burn force when applying this much energy to a mob via electrocution from an energy source. +#define ELECTROCUTE_DAMAGE(energy) (energy >= 1 KILO JOULES ? clamp(20 + round(energy / JOULES_PER_DAMAGE), 20, 195) + rand(-5,5) : 0) diff --git a/code/__DEFINES/computers.dm b/code/__DEFINES/computers.dm index ba3294ae683..c9cce7a7114 100644 --- a/code/__DEFINES/computers.dm +++ b/code/__DEFINES/computers.dm @@ -11,3 +11,6 @@ #define CATEGORY_BEPIS "Bepis Tech" #define CATEGORY_BITRUNNING_FLAIR "Misc" #define CATEGORY_BITRUNNING_TECH "Tech" + +///Helper macro for record computers' preview views, used to ensure consistency in all use cases. +#define USER_PREVIEW_ASSIGNED_VIEW(user_ckey) "preview_[user_ckey]_[REF(src)]_records" diff --git a/code/__DEFINES/construction/material.dm b/code/__DEFINES/construction/material.dm index 24ab2eb3303..445b4e0dc88 100644 --- a/code/__DEFINES/construction/material.dm +++ b/code/__DEFINES/construction/material.dm @@ -15,8 +15,8 @@ #define MAXCOIL 30 //Category of materials -/// Is the material from an ore? currently unused but exists atm for categorizations sake -#define MAT_CATEGORY_ORE "ore capable" +/// Can this material be stored in the ore silo +#define MAT_CATEGORY_SILO "silo capable" /// Hard materials, such as iron or silver #define MAT_CATEGORY_RIGID "rigid material" /// Materials that can be used to craft items @@ -68,13 +68,13 @@ //Stock market stock values. /// How much quantity of a material stock exists for common materials like iron & glass. -#define MATERIAL_QUANTITY_COMMON 25000 +#define MATERIAL_QUANTITY_COMMON 5000 /// How much quantity of a material stock exists for uncommon materials like silver & titanium. -#define MATERIAL_QUANTITY_UNCOMMON 10000 +#define MATERIAL_QUANTITY_UNCOMMON 1000 /// How much quantity of a material stock exists for rare materials like gold, uranium, & diamond. -#define MATERIAL_QUANTITY_RARE 2500 +#define MATERIAL_QUANTITY_RARE 200 /// How much quantity of a material stock exists for exotic materials like diamond & bluespace crystals. -#define MATERIAL_QUANTITY_EXOTIC 500 +#define MATERIAL_QUANTITY_EXOTIC 50 // The number of ore vents that will spawn boulders with this material. /// Is this material going to spawn often in ore vents? (80% of vents on lavaland) diff --git a/code/__DEFINES/construction/structures.dm b/code/__DEFINES/construction/structures.dm index e52b82f248e..1b4ea8aa112 100644 --- a/code/__DEFINES/construction/structures.dm +++ b/code/__DEFINES/construction/structures.dm @@ -83,3 +83,12 @@ #define FRAME_COMPUTER_STATE_WIRED 3 /// Frame has had glass applied to it #define FRAME_COMPUTER_STATE_GLASSED 4 + +///The camera assembly is wrenched in (aka placed on the wall), and wrenching will deconstruct. +#define CAMERA_STATE_WRENCHED 1 +///The camera assembly is welded in place, so won't come off from wrench anymore. +#define CAMERA_STATE_WELDED 2 +///The camera assembly is wired and ready to finish construction. +#define CAMERA_STATE_WIRED 3 +///The camera assembly is finished construction fully, and is currently chilling in the camera machine. +#define CAMERA_STATE_FINISHED 4 diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 3335ac50fc4..1d160a8c0f1 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -32,7 +32,6 @@ //Mecha cooldowns #define COOLDOWN_MECHA_MESSAGE "mecha_message" #define COOLDOWN_MECHA_EQUIPMENT(type) ("mecha_equip_[type]") -#define COOLDOWN_MECHA_ARMOR "mecha_armor" #define COOLDOWN_MECHA_MELEE_ATTACK "mecha_melee" #define COOLDOWN_MECHA_SMOKE "mecha_smoke" #define COOLDOWN_MECHA_SKYFALL "mecha_skyfall" diff --git a/code/__DEFINES/cult.dm b/code/__DEFINES/cult.dm index 8042b438ff7..06393d145f8 100644 --- a/code/__DEFINES/cult.dm +++ b/code/__DEFINES/cult.dm @@ -1,13 +1,12 @@ //rune colors, for easy reference -#define RUNE_COLOR_TALISMAN "#0000FF" -#define RUNE_COLOR_TELEPORT "#551A8B" -#define RUNE_COLOR_OFFER "#FFFFFF" +#define RUNE_COLOR_TALISMAN COLOR_BLUE +#define RUNE_COLOR_TELEPORT COLOR_DARK_PURPLE +#define RUNE_COLOR_OFFER COLOR_WHITE #define RUNE_COLOR_DARKRED "#7D1717" #define RUNE_COLOR_MEDIUMRED "#C80000" #define RUNE_COLOR_BURNTORANGE "#CC5500" -#define RUNE_COLOR_RED "#FF0000" -#define RUNE_COLOR_EMP "#4D94FF" -#define RUNE_COLOR_SUMMON "#00FF00" +#define RUNE_COLOR_RED COLOR_RED +#define RUNE_COLOR_SUMMON COLOR_VIBRANT_LIME //blood magic #define MAX_BLOODCHARGE 4 @@ -22,11 +21,9 @@ #define IRON_TO_CONSTRUCT_SHELL_CONVERSION 50 //screen locations #define DEFAULT_BLOODSPELLS "6:-29,4:-2" -#define DEFAULT_BLOODTIP "14:6,14:27" -#define DEFAULT_TOOLTIP "6:-29,5:-2" //misc #define SOULS_TO_REVIVE 3 -#define BLOODCULT_EYE "#FF0000" +#define BLOODCULT_EYE COLOR_RED //soulstone & construct themes #define THEME_CULT "cult" #define THEME_WIZARD "wizard" @@ -39,6 +36,12 @@ /// The global Nar'sie that the cult's summoned GLOBAL_DATUM(cult_narsie, /obj/narsie) +///how many sacrifices we have used, cultists get 1 free revive at the start +GLOBAL_VAR_INIT(sacrifices_used, -SOULS_TO_REVIVE) + +/// list of weakrefs to mobs OR minds that have been sacrificed +GLOBAL_LIST(sacrificed) + // Used in determining which cinematic to play when cult ends #define CULT_VICTORY_MASS_CONVERSION 2 #define CULT_FAILURE_NARSIE_KILLED 1 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm index 2312c42baa4..3ff131d9a39 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -26,3 +26,5 @@ #define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" ///from base of mob/MouseWheelOn(): (/atom, delta_x, delta_y, params) #define COMSIG_MOUSE_SCROLL_ON "mousescroll_on" +/// From /atom/movable/screen/click(): (atom/target, atom/location, control, params, mob/user) +#define COMSIG_SCREEN_ELEMENT_CLICK "screen_element_click" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index 601f441c66d..42b2b2ce2b3 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -37,6 +37,10 @@ #define COMSIG_MOVABLE_BUCKLE "buckle" ///from base of atom/movable/unbuckle_mob(): (mob, force) #define COMSIG_MOVABLE_UNBUCKLE "unbuckle" +///from /atom/movable/proc/buckle_mob(): (buckled_movable) +#define COMSIG_MOB_BUCKLED "mob_buckle" +///from /atom/movable/proc/unbuckle_mob(): (buckled_movable) +#define COMSIG_MOB_UNBUCKLED "mob_unbuckle" ///from /obj/vehicle/proc/driver_move, caught by the riding component to check and execute the driver trying to drive the vehicle #define COMSIG_RIDDEN_DRIVER_MOVE "driver_move" #define COMPONENT_DRIVER_BLOCK_MOVE (1<<0) @@ -112,3 +116,6 @@ #define COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY "movable_edit_unique_submerge_overlay" /// From base of area/Exited(): (area/left, direction) #define COMSIG_MOVABLE_EXITED_AREA "movable_exited_area" + +/// Sent to movables when they are being stolen by a spy: (mob/living/spy, datum/spy_bounty/bounty) +#define COMSIG_MOVABLE_SPY_STEALING "movable_spy_stealing" 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 ceba0a2f182..f6f7f6e4a29 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 @@ -8,9 +8,9 @@ #define COMPONENT_CANCEL_EX_ACT (1<<0) ///from the [EX_ACT] wrapper macro: (severity, target) #define COMSIG_ATOM_EX_ACT "atom_ex_act" -///from base of atom/emp_act(): (severity). return EMP protection flags +///from base of atom/emp_act(severity): (severity). return EMP protection flags #define COMSIG_ATOM_PRE_EMP_ACT "atom_emp_act" -///from base of atom/emp_act(): (severity, protection) +///from base of atom/emp_act(severity): (severity, protection) #define COMSIG_ATOM_EMP_ACT "atom_emp_act" ///from base of atom/fire_act(): (exposed_temperature, exposed_volume) #define COMSIG_ATOM_FIRE_ACT "atom_fire_act" diff --git a/code/__DEFINES/dcs/signals/signals_beam.dm b/code/__DEFINES/dcs/signals/signals_beam.dm index edfbc7c4371..12d58b70c9a 100644 --- a/code/__DEFINES/dcs/signals/signals_beam.dm +++ b/code/__DEFINES/dcs/signals/signals_beam.dm @@ -1,3 +1,12 @@ /// Called before beam is redrawn #define COMSIG_BEAM_BEFORE_DRAW "beam_before_draw" #define BEAM_CANCEL_DRAW (1 << 0) + +/// Sent to a beam when an atom enters any turf the beam covers: (obj/effect/ebeam/hit_beam, atom/movable/entered) +#define COMSIG_BEAM_ENTERED "beam_entered" + +/// Sent to a beam when an atom exits any turf the beam covers: (obj/effect/ebeam/hit_beam, atom/movable/exited) +#define COMSIG_BEAM_EXITED "beam_exited" + +/// Sent to a beam when any turf the beam covers changes: (list/datum/callback/post_change_callbacks) +#define COMSIG_BEAM_TURFS_CHANGED "beam_turfs_changed" diff --git a/code/__DEFINES/dcs/signals/signals_blackmarket.dm b/code/__DEFINES/dcs/signals/signals_blackmarket.dm new file mode 100644 index 00000000000..86e3d9277a1 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_blackmarket.dm @@ -0,0 +1,2 @@ +///From /datum/market_item/spawn_item(): (uplink, shipping_method, shipping_loc) +#define COMSIG_MARKET_ITEM_SPAWNED "market_item_spawned" diff --git a/code/__DEFINES/dcs/signals/signals_global_object.dm b/code/__DEFINES/dcs/signals/signals_global_object.dm index 452be16f839..51b7a38a94a 100644 --- a/code/__DEFINES/dcs/signals/signals_global_object.dm +++ b/code/__DEFINES/dcs/signals/signals_global_object.dm @@ -1,7 +1,7 @@ /// signals from globally accessible objects -///from SSJob when DivideOccupations is called -#define COMSIG_OCCUPATIONS_DIVIDED "occupations_divided" +///Whenever SetupOccupations() is called, called all occupations are set +#define COMSIG_OCCUPATIONS_SETUP "occupations_setup" ///from SSsun when the sun changes position : (azimuth) #define COMSIG_SUN_MOVED "sun_moved" 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 a5205a0589b..130a032eb35 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm @@ -16,3 +16,11 @@ /// Called whenever an animal is pet via the /datum/element/pet_bonus element: (mob/living/petter, modifiers) #define COMSIG_ANIMAL_PET "animal_pet" + +///from base of mob/living/basic/regal_rat: (mob/living/basic/regal_rat/king) +#define COMSIG_RAT_INTERACT "rat_interaction" + #define COMPONENT_RAT_INTERACTED (1<<0) //! If this is returned, cancel any further interactions. + +///from /datum/status_effect/slime_leech: (mob/living/basic/slime/draining_slime) +#define COMSIG_SLIME_DRAINED "slime_drained" + 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 8b73010b8f9..637ea90c8e4 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -57,6 +57,8 @@ /// 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 /mob/living/carbon/enter_stamcrit() +#define COMSIG_CARBON_ENTER_STAMCRIT "carbon_enter_stamcrit" ///from base of mob/living/carbon/soundbang_act(): (list(intensity)) #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" ///from /item/organ/proc/Insert() (/obj/item/organ/) @@ -148,3 +150,12 @@ ///from /atom/movable/screen/alert/give/proc/handle_transfer(): (taker, item) #define COMSIG_CARBON_ITEM_GIVEN "carbon_item_given" + +/// Sent from /mob/living/carbon/human/handle_blood(): (seconds_per_tick, times_fired) +#define COMSIG_HUMAN_ON_HANDLE_BLOOD "human_on_handle_blood" + /// Return to prevent all default blood handling + #define HANDLE_BLOOD_HANDLED (1<<0) + /// Return to skip default nutrition -> blood conversion + #define HANDLE_BLOOD_NO_NUTRITION_DRAIN (1<<1) + /// Return to skip oxyloss and similar effecst from blood level + #define HANDLE_BLOOD_NO_EFFECTS (1<<2) 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 c8d36d27bcd..cc9e4d2e966 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -12,6 +12,11 @@ #define COMSIG_ORGAN_BEING_REPLACED "organ_being_replaced" /// Called when an organ gets surgically removed (mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) #define COMSIG_ORGAN_SURGICALLY_REMOVED "organ_surgically_removed" +/// Called when an organ gets surgically removed (mob/living/user, mob/living/carbon/new_owner, target_zone, obj/item/tool) +#define COMSIG_ORGAN_SURGICALLY_INSERTED "organ_surgically_inserted" + +///Called when movement intent is toggled. +#define COMSIG_MOVE_INTENT_TOGGLED "move_intent_toggled" ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" @@ -26,6 +31,8 @@ #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" ///from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" + /// Block the electrocute_act() proc from proceeding + #define COMPONENT_LIVING_BLOCK_SHOCK (1<<0) ///sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check) #define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented" ///sent by stuff like stunbatons and tasers: () @@ -153,9 +160,9 @@ #define ZIMPACT_NO_SPIN (1<<2) /// From mob/living/try_speak(): (message, ignore_spam, forced) -#define COMSIG_LIVING_TRY_SPEECH "living_vocal_speech" - /// Return if the mob can speak the message, regardless of any other signal returns or checks. - #define COMPONENT_CAN_ALWAYS_SPEAK (1<<0) +#define COMSIG_MOB_TRY_SPEECH "living_vocal_speech" + /// Return to skip can_speak check, IE, forcing success. Overrides below. + #define COMPONENT_IGNORE_CAN_SPEAK (1<<0) /// Return if the mob cannot speak. #define COMPONENT_CANNOT_SPEAK (1<<1) @@ -169,6 +176,9 @@ ///From obj/item/toy/crayon/spraycan #define COMSIG_LIVING_MOB_PAINTED "living_mob_painted" +///From obj/closet/supplypod/return_victim: (turf/destination) +#define COMSIG_LIVING_RETURN_FROM_CAPTURE "living_return_from_capture" + ///From mob/living/proc/wabbajack(): (randomize_type) #define COMSIG_LIVING_PRE_WABBAJACKED "living_mob_wabbajacked" /// Return to stop the rest of the wabbajack from triggering. 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 cd1c636c283..068aadf6a5e 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -1,4 +1,4 @@ -///Called on user, from base of /datum/strippable_item/alternate_action() (atom/target) +///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(): () diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm index 8b19c1f0054..b648af8fa6c 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm @@ -10,9 +10,7 @@ #define COMPONENT_HOSTILE_NO_ATTACK COMPONENT_CANCEL_ATTACK_CHAIN //cancel the attack, only works before attack happens ///after attackingtarget has happened, source is the attacker and target is the attacked, extra argument for if the attackingtarget was successful #define COMSIG_HOSTILE_POST_ATTACKINGTARGET "hostile_post_attackingtarget" -///from base of mob/living/basic/regal_rat: (mob/living/basic/regal_rat/king) -#define COMSIG_RAT_INTERACT "rat_interaction" - #define COMPONENT_RAT_INTERACTED (1<<0) //! If this is returned, cancel any further interactions. + ///FROM mob/living/simple_animal/hostile/ooze/eat_atom(): (atom/target, edible_flags) #define COMSIG_OOZE_EAT_ATOM "ooze_eat_atom" #define COMPONENT_ATOM_EATEN (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 3654b4cfce5..01145cd32ea 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -61,6 +61,9 @@ /// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM sounds an audible alarm #define COMSIG_SUPERMATTER_DELAM_ALARM "sm_delam_alarm" +/// from /datum/component/supermatter_crystal/proc/consume() +/// called on the thing consumed, passes the thing which consumed it +#define COMSIG_SUPERMATTER_CONSUMED "sm_consumed_this" // /obj/machinery/cryo_cell signals @@ -158,6 +161,9 @@ /// Return to prevent the default behavior (attack_selfing) from ocurring. #define COMPONENT_ITEM_ACTION_SLOT_INVALID (1<<0) +/// Sent from /obj/item/attack_atom(): (atom/attacked_atom, mob/living/user) +#define COMSIG_ITEM_POST_ATTACK_ATOM "item_post_attack_atom" + ///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) #define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" ///from base of obj/item/hit_reaction(): (owner, hitby, attack_text, final_block_chance, damage, attack_type, damage_type) @@ -308,9 +314,11 @@ // /obj/item/radio signals +///called from base of /obj/item/proc/talk_into(): (atom/movable/speaker, message, channel, list/spans, language, list/message_mods) +#define COMSIG_ITEM_TALK_INTO "item_talk_into" ///called from base of /obj/item/radio/proc/set_frequency(): (list/args) #define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" -///called from base of /obj/item/radio/proc/talk_into(): (atom/movable/M, message, channel) +///called from base of /obj/item/radio/talk_into(): (atom/movable/M, message, channel) #define COMSIG_RADIO_NEW_MESSAGE "radio_new_message" ///called from base of /obj/item/radio/proc/on_receive_messgae(): (list/data) #define COMSIG_RADIO_RECEIVE_MESSAGE "radio_receive_message" @@ -401,6 +409,10 @@ ///sent to the projectile when spawning the item (shrapnel) that may be embedded: (new_item) #define COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED "projectile_on_spawn_embedded" +/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target +#define COMSIG_HIT_BY_SABOTEUR "hit_by_saboteur" + #define COMSIG_SABOTEUR_SUCCESS (1<<0) + // /obj/vehicle/sealed/car/vim signals ///from /datum/action/vehicle/sealed/noise/chime/Trigger(): () diff --git a/code/__DEFINES/dcs/signals/signals_operatives.dm b/code/__DEFINES/dcs/signals/signals_operatives.dm new file mode 100644 index 00000000000..12a3bed4668 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_operatives.dm @@ -0,0 +1,2 @@ +/// For when a new teammate is added to a nukie team +#define COMSIG_NUKE_TEAM_ADDITION "nuke_team_addition" diff --git a/code/__DEFINES/dcs/signals/signals_saboteur.dm b/code/__DEFINES/dcs/signals/signals_saboteur.dm deleted file mode 100644 index 5b0fef52aee..00000000000 --- a/code/__DEFINES/dcs/signals/signals_saboteur.dm +++ /dev/null @@ -1,5 +0,0 @@ -// Light disruptor. Not to be confused with the light eater, which permanently disables lights. - -/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target -#define COMSIG_HIT_BY_SABOTEUR "HIT_BY_SABOTEUR" - #define COMSIG_SABOTEUR_SUCCESS (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_traitor.dm b/code/__DEFINES/dcs/signals/signals_traitor.dm index 4290b25b800..2752ab2363e 100644 --- a/code/__DEFINES/dcs/signals/signals_traitor.dm +++ b/code/__DEFINES/dcs/signals/signals_traitor.dm @@ -34,3 +34,6 @@ #define COMSIG_TRAITOR_GRAFFITI_SLIPPED "traitor_demoralise_event" /// For when someone is injected with the EHMS virus from /datum/traitor_objective_category/infect #define COMSIG_EHMS_INJECTOR_INJECTED "after_ehms_inject" + +/// Called by an battle royale implanter when successfully implanting someone. Passes the implanted mob. +#define COMSIG_ROYALE_IMPLANTED "royale_implanted" diff --git a/code/__DEFINES/devices.dm b/code/__DEFINES/devices.dm index 5e63d9bd6d3..8f98f040dbc 100644 --- a/code/__DEFINES/devices.dm +++ b/code/__DEFINES/devices.dm @@ -8,8 +8,8 @@ #define INSPECTOR_PRINT_SOUND_MODE_FAFAFOGGY 4 #define BANANIUM_CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST 4 #define CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST 4 -#define INSPECTOR_POWER_USAGE_HONK 15 -#define INSPECTOR_POWER_USAGE_NORMAL 5 +#define INSPECTOR_ENERGY_USAGE_HONK (15 KILO JOULES) +#define INSPECTOR_ENERGY_USAGE_NORMAL (5 KILO JOULES) #define INSPECTOR_TIME_MODE_SLOW 1 #define INSPECTOR_TIME_MODE_FAST 2 #define INSPECTOR_TIME_MODE_HONK 3 diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm index 61a136c70d2..047bb79582d 100644 --- a/code/__DEFINES/diseases.dm +++ b/code/__DEFINES/diseases.dm @@ -1,4 +1,3 @@ - #define DISEASE_LIMIT 1 #define VIRUS_SYMPTOM_LIMIT 6 diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index 93b0678581a..184419c2b5c 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -47,6 +47,9 @@ #define NO_FREEBIES "commies go home" +/// The special account ID for admins using debug cards. +#define ADMIN_ACCOUNT_ID "ADMIN!" + //Defines that set what kind of civilian bounties should be applied mid-round. #define CIV_JOB_BASIC 1 #define CIV_JOB_ROBO 2 @@ -63,19 +66,17 @@ #define CIV_JOB_ATMOS 13 #define CIV_JOB_RANDOM 14 -//By how much should the station's inflation value be multiplied by when dividing the civilian bounty's reward? -#define BOUNTY_MULTIPLIER 10 - //These defines are to be used to with the payment component, determines which lines will be used during a transaction. If in doubt, go with clinical. #define PAYMENT_CLINICAL "clinical" #define PAYMENT_FRIENDLY "friendly" #define PAYMENT_ANGRY "angry" +#define PAYMENT_VENDING "vending" #define MARKET_TREND_UPWARD 1 #define MARKET_TREND_DOWNWARD -1 #define MARKET_TREND_STABLE 0 -#define MARKET_EVENT_PROBABILITY 1 //Probability of a market event firing, in percent. Fires once per material, every 20 seconds. +#define MARKET_EVENT_PROBABILITY 8 //Probability of a market event firing, in percent. Fires once per material, every stock market tick. #define MARKET_PROFIT_MODIFIER 0.8 //We don't make every sale a 1-1 of the actual buy price value, like with real life taxes and to encourage more smart trades diff --git a/code/__DEFINES/firealarm.dm b/code/__DEFINES/firealarm.dm index f2a561d12d2..0e1c4bd9433 100644 --- a/code/__DEFINES/firealarm.dm +++ b/code/__DEFINES/firealarm.dm @@ -1,10 +1,3 @@ -//A set of defines to be sent by fire alarms. The signals are sent to the alarm's area, but are read and used by the firelocks of the area, and are used for mass changes in fire detection. -///Sent when a fire alarm is emagged -#define FIRE_DETECT_EMAG "fire_detect_emag" -///Sent when the fire detection of an area is disabled -#define FIRE_DETECT_STOP "fire_detect_stop" -///Sent when the fire detection of an area is enabled -#define FIRE_DETECT_START "fire_detect_start" ///Designates a fire lock should be closed due to HEAT #define FIRELOCK_ALARM_TYPE_HOT "firelock_alarm_type_hot" ///Designates a fire lock should be closed due to COLD diff --git a/code/__DEFINES/flora.dm b/code/__DEFINES/flora.dm deleted file mode 100644 index e02f492cce7..00000000000 --- a/code/__DEFINES/flora.dm +++ /dev/null @@ -1,3 +0,0 @@ -///Tools that can harvest wood that DONT have the TOOL_SAW flag; TOOL_SAW can harvest regardless of being in this list (Dont put them in here) -#define FLORA_HARVEST_WOOD_TOOLS list(/obj/item/hatchet, /obj/item/fireaxe, /obj/item/kinetic_crusher, /obj/item/melee/energy/axe) -#define FLORA_HARVEST_STONE_TOOLS list(/obj/item/pickaxe) diff --git a/code/__DEFINES/fonts.dm b/code/__DEFINES/fonts.dm index eab28820c41..fdfccef6dbe 100644 --- a/code/__DEFINES/fonts.dm +++ b/code/__DEFINES/fonts.dm @@ -18,7 +18,3 @@ // Font metrics bitfield /// Include leading A width and trailing C width in GetWidth() or in DrawText() #define INCLUDE_AC (1<<0) - -DEFINE_BITFIELD(font_flags, list( - "INCLUDE_AC" = INCLUDE_AC, -)) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 85ced17e67c..f3a21b41c77 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -103,6 +103,7 @@ DEFINE_BITFIELD(foodtypes, list( #define DRINK_GOOD 3 #define DRINK_VERYGOOD 4 #define DRINK_FANTASTIC 5 + #define FOOD_AMAZING 6 #define RACE_DRINK 7 // SKYRAT ADDITION @@ -184,20 +185,16 @@ DEFINE_BITFIELD(food_flags, list( #define STOP_SERVING_BREAKFAST (35 MINUTES) // SKYRAT EDIT - ORIGINAL: 15 MINUTES -#define FOOD_MEAT_NORMAL 5 #define FOOD_MEAT_HUMAN 50 #define FOOD_MEAT_MUTANT 100 #define FOOD_MEAT_MUTANT_RARE 200 #define IS_EDIBLE(O) (O.GetComponent(/datum/component/edible)) - ///Food trash flags #define FOOD_TRASH_POPABLE (1<<0) #define FOOD_TRASH_OPENABLE (1<<1) - - ///Food preference enums #define FOOD_LIKED 1 #define FOOD_DISLIKED 2 @@ -207,8 +204,6 @@ DEFINE_BITFIELD(food_flags, list( ///Venue reagent requirement #define VENUE_BAR_MINIMUM_REAGENTS 10 - - ///***Food price classes*** ///Foods that are meant to have no value, such as lollypops from medborgs. #define FOOD_PRICE_WORTHLESS 0 diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index c8b89b082a4..a8a7ad975af 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -38,14 +38,13 @@ #define STEP_SOUND_PRIORITY "step_sound_priority" /* +Below is how the following lists are defined id = list( list(sounds), base volume, extra range addition ) - - */ GLOBAL_LIST_INIT(footstep, list( @@ -102,6 +101,7 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 100, 1), )) + //bare footsteps lists GLOBAL_LIST_INIT(barefootstep, list( FOOTSTEP_WOOD_BAREFOOT = list(list( diff --git a/code/__DEFINES/generators.dm b/code/__DEFINES/generators.dm index e9d373c9a65..3ad34d39f2c 100644 --- a/code/__DEFINES/generators.dm +++ b/code/__DEFINES/generators.dm @@ -2,11 +2,8 @@ #define GEN_NUM "num" #define GEN_VECTOR "vector" #define GEN_BOX "box" -#define GEN_COLOR "color" #define GEN_CIRCLE "circle" #define GEN_SPHERE "sphere" -#define GEN_SQUARE "square" -#define GEN_CUBE "cube" ///particle editor var modifiers #define P_DATA_GENERATOR "generator" diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 5798fd29e82..e762b406d1e 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -77,13 +77,7 @@ #define ui_building "EAST-4:22,SOUTH:21" #define ui_language_menu "EAST-4:6,SOUTH:21" #define ui_navigate_menu "EAST-4:22,SOUTH:5" - -//Upper-middle right (alerts) -#define ui_alert1 "EAST-1:28,CENTER+5:27" -#define ui_alert2 "EAST-1:28,CENTER+4:25" -#define ui_alert3 "EAST-1:28,CENTER+3:23" -#define ui_alert4 "EAST-1:28,CENTER+2:21" -#define ui_alert5 "EAST-1:28,CENTER+1:19" +#define ui_floor_menu "EAST-4:14,SOUTH:37" //Upper left (action buttons) #define ui_action_palette "WEST+0:23,NORTH-1:5" @@ -97,6 +91,7 @@ #define ui_health "EAST-1:28,CENTER-1:19" #define ui_internal "EAST-1:28,CENTER+1:21" #define ui_mood "EAST-1:28,CENTER:21" +#define ui_hunger "EAST-1:2,CENTER:21" #define ui_spacesuit "EAST-1:28,CENTER-4:14" #define ui_stamina "EAST-1:28,CENTER-3:14" @@ -115,12 +110,6 @@ #define ui_living_pull "EAST-1:28,CENTER-3:15" #define ui_living_healthdoll "EAST-1:28,CENTER-1:15" -//Monkeys -#define ui_monkey_head "CENTER-5:13,SOUTH:5" -#define ui_monkey_mask "CENTER-4:14,SOUTH:5" -#define ui_monkey_neck "CENTER-3:15,SOUTH:5" -#define ui_monkey_back "CENTER-2:16,SOUTH:5" - //Drones #define ui_drone_drop "CENTER+1:18,SOUTH:5" #define ui_drone_pull "CENTER+1.5:2,SOUTH:5" @@ -143,6 +132,7 @@ #define ui_borg_alerts "CENTER+4:21,SOUTH:5" #define ui_borg_language_menu "CENTER+4:19,SOUTH+1:6" #define ui_borg_navigate_menu "CENTER+4:19,SOUTH+1:6" +#define ui_borg_floor_menu "CENTER+4:-13,SOUTH+1:6" //Aliens #define ui_alien_health "EAST,CENTER-1:15" @@ -151,6 +141,7 @@ #define ui_alien_storage_r "CENTER+1:18,SOUTH:5" #define ui_alien_language_menu "EAST-4:20,SOUTH:5" #define ui_alien_navigate_menu "EAST-4:20,SOUTH:5" +#define ui_alien_floor_menu "EAST-4:-12,SOUTH:5" //AI #define ui_ai_core "BOTTOM:6,RIGHT-4" @@ -159,6 +150,7 @@ #define ui_ai_state_laws "BOTTOM:6,RIGHT-1" #define ui_ai_mod_int "BOTTOM:6,RIGHT" #define ui_ai_language_menu "BOTTOM+1:8,RIGHT-1:30" +#define ui_ai_floor_menu "BOTTOM+1:8,RIGHT-1:14" #define ui_ai_crew_monitor "BOTTOM:6,CENTER-1" #define ui_ai_crew_manifest "BOTTOM:6,CENTER" @@ -172,7 +164,8 @@ #define ui_ai_multicam "BOTTOM+1:6,LEFT+1" #define ui_ai_add_multicam "BOTTOM+1:6,LEFT" #define ui_ai_take_picture "BOTTOM+2:6,LEFT" - +#define ui_ai_floor_indicator "BOTTOM+5,RIGHT" +#define ui_ai_godownup "BOTTOM+5,RIGHT-1" //pAI #define ui_pai_software "SOUTH:6,WEST" @@ -200,6 +193,7 @@ #define ui_ghost_pai "SOUTH: 6, CENTER+1:24" #define ui_ghost_minigames "SOUTH: 6, CENTER+2:24" #define ui_ghost_language_menu "SOUTH: 22, CENTER+3:8" +#define ui_ghost_floor_menu "SOUTH: 6, CENTER+3:8" //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 c00361184a5..5bc302a8d35 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -174,8 +174,6 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(24) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium #define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(25) ///obj/structure/window/reinforced/shuttle -#define SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM S_OBJ(26) ///obj/structure/tram - #define SMOOTH_GROUP_LATTICE S_OBJ(31) ///obj/structure/lattice #define SMOOTH_GROUP_CATWALK S_OBJ(32) ///obj/structure/lattice/catwalk @@ -205,12 +203,18 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_CLEANABLE_DIRT S_OBJ(68) ///obj/effect/decal/cleanable/dirt -#define SMOOTH_GROUP_GAS_TANK S_OBJ(72) +#define SMOOTH_GROUP_GAS_TANK S_OBJ(69) + +#define SMOOTH_GROUP_SPIDER_WEB S_OBJ(70) // /obj/structure/spider/stickyweb +#define SMOOTH_GROUP_SPIDER_WEB_WALL S_OBJ(71) // /obj/structure/spider/stickyweb/sealed +#define SMOOTH_GROUP_SPIDER_WEB_ROOF S_OBJ(72) // /obj/structure/spider/passage +#define SMOOTH_GROUP_SPIDER_WEB_WALL_TOUGH S_OBJ(73) // /obj/structure/spider/stickyweb/sealed/thick +#define SMOOTH_GROUP_SPIDER_WEB_WALL_MIRROR S_OBJ(74) // /obj/structure/spider/stickyweb/sealed/reflector //SKYRAT EDIT ADDITION -#define SMOOTH_GROUP_SHUTTERS S_OBJ(73) +#define SMOOTH_GROUP_SHUTTERS S_OBJ(75) -#define SMOOTH_GROUP_WATER S_OBJ(74) ///obj/effect/abstract/liquid_turf +#define SMOOTH_GROUP_WATER S_OBJ(76) ///obj/effect/abstract/liquid_turf //SKYRAT EDIT END /// Performs the work to set smoothing_groups and canSmoothWith. diff --git a/code/__DEFINES/id_cards.dm b/code/__DEFINES/id_cards.dm index d7b034b524f..ce7d847c59b 100644 --- a/code/__DEFINES/id_cards.dm +++ b/code/__DEFINES/id_cards.dm @@ -34,3 +34,9 @@ #define WILDCARD_LIMIT_CHAMELEON list(WILDCARD_NAME_CAPTAIN = list(limit = -1, usage = list())) // Bubberstation Edit - Makes the Agent card AA /// Wildcard slot define for admin/debug/weird, special abstract cards. Can hold infinite of any access. #define WILDCARD_LIMIT_ADMIN list(WILDCARD_NAME_ALL = list(limit = -1, usage = list())) + +/** + * x1, y1, x2, y2 - Represents the bounding box for the ID card's non-transparent portion of its various icon_states. + * Used to crop the ID card's transparency away when chaching the icon for better use in tgui chat. + */ +#define ID_ICON_BORDERS 1, 9, 32, 24 diff --git a/code/__DEFINES/instruments.dm b/code/__DEFINES/instruments.dm index fa09eee0dd7..bf54ddf1b90 100644 --- a/code/__DEFINES/instruments.dm +++ b/code/__DEFINES/instruments.dm @@ -6,6 +6,8 @@ /// Max number of playing notes per instrument. #define CHANNELS_PER_INSTRUMENT 128 +/// Minimum length a note should ever go for +#define INSTRUMENT_MIN_TOTAL_SUSTAIN 0.1 /// Maximum length a note should ever go for #define INSTRUMENT_MAX_TOTAL_SUSTAIN (5 SECONDS) @@ -16,8 +18,8 @@ /// Minimum volume for when the sound is considered dead. #define INSTRUMENT_MIN_SUSTAIN_DROPOFF 0 -#define SUSTAIN_LINEAR 1 -#define SUSTAIN_EXPONENTIAL 2 +#define SUSTAIN_LINEAR "Linear" +#define SUSTAIN_EXPONENTIAL "Exponential" // /datum/instrument instrument_flags #define INSTRUMENT_LEGACY (1<<0) //Legacy instrument. Implies INSTRUMENT_DO_NOT_AUTOSAMPLE diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 909399b3c3d..3430f97dd7d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define islarva(A) (istype(A, /mob/living/carbon/alien/larva)) -#define isalienadult(A) (istype(A, /mob/living/carbon/alien/adult) || istype(A, /mob/living/simple_animal/hostile/alien)) +#define isalienadult(A) (istype(A, /mob/living/carbon/alien/adult) || istype(A, /mob/living/basic/alien)) #define isalienhunter(A) (istype(A, /mob/living/carbon/alien/adult/hunter)) @@ -135,12 +135,16 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( //Silicon mobs #define issilicon(A) (istype(A, /mob/living/silicon)) - -#define issiliconoradminghost(A) (istype(A, /mob/living/silicon) || isAdminGhostAI(A)) - -#define iscyborg(A) (istype(A, /mob/living/silicon/robot)) +///Define on whether A has access to Silicon stuff either through being a silicon, admin ghost or is a non-silicon holding the Silicon remote. +///This can only be used for instances where you are not specifically looking for silicon, but access. +#define HAS_SILICON_ACCESS(A) (istype(A, /mob/living/silicon) || isAdminGhostAI(A) || A.has_unlimited_silicon_privilege || istype(A.get_active_held_item(), /obj/item/machine_remote)) #define isAI(A) (istype(A, /mob/living/silicon/ai)) +///Define on whether A has access to AI stuff either through being a AI, admin ghost, or is a non-silicon holding the Silicon remote +///This can only be used for instances where you are not specifically looking for silicon, but access. +#define HAS_AI_ACCESS(A) (istype(A, /mob/living/silicon/ai) || isAdminGhostAI(A) || istype(A.get_active_held_item(), /obj/item/machine_remote)) + +#define iscyborg(A) (istype(A, /mob/living/silicon/robot)) #define ispAI(A) (istype(A, /mob/living/silicon/pai)) @@ -176,7 +180,7 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define ismouse(A) (istype(A, /mob/living/basic/mouse)) -#define isslime(A) (istype(A, /mob/living/simple_animal/slime)) +#define isslime(A) (istype(A, /mob/living/basic/slime)) #define isdrone(A) (istype(A, /mob/living/basic/drone)) @@ -314,6 +318,7 @@ GLOBAL_LIST_INIT(book_types, typecacheof(list( #define is_captain_job(job_type) (istype(job_type, /datum/job/captain)) #define is_chaplain_job(job_type) (istype(job_type, /datum/job/chaplain)) #define is_clown_job(job_type) (istype(job_type, /datum/job/clown)) +#define is_mime_job(job_type) (istype(job_type, /datum/job/mime)) #define is_detective_job(job_type) (istype(job_type, /datum/job/detective)) #define is_scientist_job(job_type) (istype(job_type, /datum/job/scientist)) #define is_security_officer_job(job_type) (istype(job_type, /datum/job/security_officer)) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 38aeef7a7cb..55a84617780 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -49,10 +49,12 @@ #define JOB_CHIEF_ENGINEER "Chief Engineer" #define JOB_CHIEF_MEDICAL_OFFICER "Chief Medical Officer" #define JOB_BRIDGE_ASSISTANT "Bridge Assistant" +#define JOB_VETERAN_ADVISOR "Veteran Security Advisor" //Silicon #define JOB_AI "AI" #define JOB_CYBORG "Cyborg" #define JOB_PERSONAL_AI "Personal AI" +#define JOB_HUMAN_AI "Big Brother" //Security #define JOB_WARDEN "Warden" #define JOB_DETECTIVE "Detective" @@ -180,10 +182,11 @@ #define JOB_DISPLAY_ORDER_ROBOTICIST 33 #define JOB_DISPLAY_ORDER_GENETICIST 34 #define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 35 -#define JOB_DISPLAY_ORDER_WARDEN 36 -#define JOB_DISPLAY_ORDER_DETECTIVE 37 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 38 -#define JOB_DISPLAY_ORDER_PRISONER 39 +#define JOB_DISPLAY_ORDER_VETERAN_ADVISOR 36 +#define JOB_DISPLAY_ORDER_WARDEN 37 +#define JOB_DISPLAY_ORDER_DETECTIVE 38 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 39 +#define JOB_DISPLAY_ORDER_PRISONER 40 #define JOB_DISPLAY_ORDER_SECURITY_MEDIC 100 //SKYRAT EDIT ADDITON #define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 101 //SKYRAT EDIT ADDITON #define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 102 //SKYRAT EDIT ADDITON @@ -220,6 +223,19 @@ #define DEPARTMENT_BITFLAG_CENTRAL_COMMAND (1<<10) //SKYRAT EDIT CHANGE #define DEPARTMENT_CENTRAL_COMMAND "Central Command" //SKYRAT EDIT CHANGE +DEFINE_BITFIELD(departments_bitflags, list( + "SECURITY" = DEPARTMENT_BITFLAG_SECURITY, + "COMMAND" = DEPARTMENT_BITFLAG_COMMAND, + "SERVICE" = DEPARTMENT_BITFLAG_SERVICE, + "CARGO" = DEPARTMENT_BITFLAG_CARGO, + "ENGINEERING" = DEPARTMENT_BITFLAG_ENGINEERING, + "SCIENCE" = DEPARTMENT_BITFLAG_SCIENCE, + "MEDICAL" = DEPARTMENT_BITFLAG_MEDICAL, + "SILICON" = DEPARTMENT_BITFLAG_SILICON, + "ASSISTANT" = DEPARTMENT_BITFLAG_ASSISTANT, + "CAPTAIN" = DEPARTMENT_BITFLAG_CAPTAIN, +)) + /* Job datum job_flags */ /// Whether the mob is announced on arrival. #define JOB_ANNOUNCE_ARRIVAL (1<<0) @@ -248,6 +264,22 @@ /// This job is a head of staff. #define JOB_HEAD_OF_STAFF (1<<12) +DEFINE_BITFIELD(job_flags, list( + "JOB_ANNOUNCE_ARRIVAL" = JOB_ANNOUNCE_ARRIVAL, + "JOB_CREW_MANIFEST" = JOB_CREW_MANIFEST, + "JOB_EQUIP_RANK" = JOB_EQUIP_RANK, + "JOB_CREW_MEMBER" = JOB_CREW_MEMBER, + "JOB_NEW_PLAYER_JOINABLE" = JOB_NEW_PLAYER_JOINABLE, + "JOB_BOLD_SELECT_TEXT" = JOB_BOLD_SELECT_TEXT, + "JOB_REOPEN_ON_ROUNDSTART_LOSS" = JOB_REOPEN_ON_ROUNDSTART_LOSS, + "JOB_ASSIGN_QUIRKS" = JOB_ASSIGN_QUIRKS, + "JOB_CAN_BE_INTERN" = JOB_CAN_BE_INTERN, + "JOB_CANNOT_OPEN_SLOTS" = JOB_CANNOT_OPEN_SLOTS, + "JOB_HIDE_WHEN_EMPTY" = JOB_HIDE_WHEN_EMPTY, + "JOB_LATEJOIN_ONLY" = JOB_LATEJOIN_ONLY, + "JOB_HEAD_OF_STAFF" = JOB_HEAD_OF_STAFF, +)) + /// 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) /// Combination flag for jobs which are considered heads of staff. diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 5b1082f606d..cd6ee5ec0c9 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -22,7 +22,6 @@ // Only ever goes away when dismissed directly. #define LANGUAGE_ABSORB "absorb" #define LANGUAGE_APHASIA "aphasia" -#define LANGUAGE_CTF "ctf" #define LANGUAGE_CULTIST "cultist" #define LANGUAGE_CURATOR "curator" #define LANGUAGE_GLAND "gland" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 0a9ea44aaa8..3922e6a5ce9 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -174,7 +174,6 @@ #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 TABLE_LAYER 2.8 -#define GATEWAY_UNDERLAY_LAYER 2.85 #define BELOW_OBJ_LAYER 2.9 #define LOW_ITEM_LAYER 2.95 //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define @@ -240,7 +239,6 @@ /// Stuff that needs to draw above everything else on this plane #define LIGHTING_ABOVE_ALL 20 - //---------- EMISSIVES ------------- //Layering order of these is not particularly meaningful. //Important part is the seperation of the planes for control via plane_master @@ -258,6 +256,7 @@ #define CURSE_LAYER 6 #define ECHO_LAYER 7 #define PARRY_LAYER 8 +#define CARRIER_LAYER 9 // SKYRAT EDIT - CARRIERS #define FOV_EFFECT_LAYER 100 @@ -280,9 +279,6 @@ /// Layer for light overlays #define LIGHT_DEBUG_LAYER 6 -#define LOBBY_BACKGROUND_LAYER 3 -#define LOBBY_BUTTON_LAYER 4 - ///Layer for lobby menu collapse button #define LOBBY_BELOW_MENU_LAYER 2 ///Layer for lobby menu background image and main buttons (Join/Ready, Observe, Charater Prefs) diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 5ea431a8cc1..8e392549a3a 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -18,16 +18,8 @@ /// Does this light ignore inherent offsets? (Pixels, transforms, etc) #define LIGHT_IGNORE_OFFSET (1<<2) -// Bay lighting engine shit, not in /code/modules/lighting because BYOND is being shit about it -/// frequency, in 1/10ths of a second, of the lighting process -#define LIGHTING_INTERVAL 5 - #define MINIMUM_USEFUL_LIGHT_RANGE 1.5 // SKYRAT EDIT CHANGE - Original value 1.4 -/// type of falloff to use for lighting; 1 for circular, 2 for square -#define LIGHTING_FALLOFF 1 -/// use lambertian shading for light sources -#define LIGHTING_LAMBERTIAN 0 /// light UNDER the floor. primarily used for starlight, shouldn't fuck with this #define LIGHTING_HEIGHT_SPACE -0.5 /// light ON the floor @@ -71,7 +63,7 @@ #define LIGHTING_FORCE_UPDATE 3 #define FLASH_LIGHT_DURATION 2 -#define FLASH_LIGHT_POWER 3 +#define FLASH_LIGHT_POWER 2 #define FLASH_LIGHT_RANGE 3.8 // Emissive blocking. diff --git a/code/__DEFINES/lights.dm b/code/__DEFINES/lights.dm index e137744195c..8830f919472 100644 --- a/code/__DEFINES/lights.dm +++ b/code/__DEFINES/lights.dm @@ -1,5 +1,5 @@ ///How much power emergency lights will consume per tick -#define LIGHT_EMERGENCY_POWER_USE 0.2 +#define LIGHT_EMERGENCY_POWER_USE (0.1 KILO WATTS) // status values shared between lighting fixtures and items #define LIGHT_OK 0 #define LIGHT_EMPTY 1 @@ -14,7 +14,7 @@ ///Amount of time that takes an ethereal to take energy from the lights #define LIGHT_DRAIN_TIME (2.5 SECONDS) ///Amount of charge the ethereal gain after the drain -#define LIGHT_POWER_GAIN 35 +#define LIGHT_POWER_GAIN (0.035 * STANDARD_CELL_CHARGE) ///How many reagents the lights can hold #define LIGHT_REAGENT_CAPACITY 20 diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index a6102aa6e79..c2f0999a34f 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -25,7 +25,6 @@ #define INVESTIGATE_RADIATION "radiation" #define INVESTIGATE_RECORDS "records" #define INVESTIGATE_RESEARCH "research" -#define INVESTIGATE_TRANSPORT "transport" #define INVESTIGATE_WIRES "wires" // Logging types for log_message() @@ -60,7 +59,6 @@ #define INDIVIDUAL_EMOTE_LOG (LOG_EMOTE | LOG_RADIO_EMOTE) #define INDIVIDUAL_COMMS_LOG (LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS) #define INDIVIDUAL_OOC_LOG (LOG_OOC | LOG_ADMIN) -#define INDIVIDUAL_OWNERSHIP_LOG (LOG_OWNERSHIP) #define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_RADIO_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME | LOG_ADMIN_PRIVATE | LOG_ASAY | LOG_MECHA | LOG_VIRUS | LOG_SHUTTLE | LOG_ECON | LOG_VICTIM | LOG_SPEECH_INDICATORS) #define LOGSRC_CKEY "Ckey" @@ -115,6 +113,7 @@ #define LOG_CATEGORY_TOOL "tool" #define LOG_CATEGORY_TRANSPORT "transport" #define LOG_CATEGORY_VIRUS "virus" +#define LOG_CATEGORY_CAVE_GENERATION "cave-generation" // Admin categories #define LOG_CATEGORY_ADMIN "admin" @@ -161,6 +160,7 @@ #define LOG_CATEGORY_UPLINK_HERETIC "uplink-heretic" #define LOG_CATEGORY_UPLINK_MALF "uplink-malf" #define LOG_CATEGORY_UPLINK_SPELL "uplink-spell" +#define LOG_CATEGORY_UPLINK_SPY "uplink-spy" // PDA categories #define LOG_CATEGORY_PDA "pda" diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index d5f7c1d1517..4c44ce03ed3 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -6,7 +6,8 @@ #define AREA_USAGE_STATIC_EQUIP 4 #define AREA_USAGE_STATIC_LIGHT 5 #define AREA_USAGE_STATIC_ENVIRON 6 -#define AREA_USAGE_LEN AREA_USAGE_STATIC_ENVIRON // largest idx +#define AREA_USAGE_APC_CHARGE 7 +#define AREA_USAGE_LEN AREA_USAGE_APC_CHARGE // largest idx /// Index of the first dynamic usage channel #define AREA_USAGE_DYNAMIC_START AREA_USAGE_EQUIP @@ -21,15 +22,14 @@ #define DYNAMIC_TO_STATIC_CHANNEL(dyn_channel) (dyn_channel + (AREA_USAGE_STATIC_START - AREA_USAGE_DYNAMIC_START)) #define STATIC_TO_DYNAMIC_CHANNEL(static_channel) (static_channel - (AREA_USAGE_STATIC_START - AREA_USAGE_DYNAMIC_START)) - //Power use #define NO_POWER_USE 0 #define IDLE_POWER_USE 1 #define ACTIVE_POWER_USE 2 ///Base global power consumption for idling machines -#define BASE_MACHINE_IDLE_CONSUMPTION 100 -///Base global power consumption for active machines +#define BASE_MACHINE_IDLE_CONSUMPTION (100 WATTS) +///Base global power consumption for active machines. The unit is ambiguous (joules or watts) depending on the use case for dynamic users. #define BASE_MACHINE_ACTIVE_CONSUMPTION (BASE_MACHINE_IDLE_CONSUMPTION * 10) /// Bitflags for a machine's preferences on when it should start processing. For use with machinery's `processing_flags` var. @@ -52,6 +52,7 @@ #define BYPASS_DOOR_CHECKS 2 //used in design to specify which machine can build it +//Note: More than one of these can be added to a design but imprinter and lathe designs are incompatable. #define IMPRINTER (1<<0) //For circuits. Uses glass/chemicals. #define PROTOLATHE (1<<1) //New stuff. Uses various minerals #define AUTOLATHE (1<<2) //Prints basic designs without research @@ -65,15 +66,11 @@ #define AWAY_IMPRINTER (1<<9) /// For wiremod/integrated circuits. Uses various minerals. #define COMPONENT_PRINTER (1<<10) -//Note: More than one of these can be added to a design but imprinter and lathe designs are incompatable. // SKYRAT EDIT ADDITION /// Can be made by the orderable colony fabricator #define COLONY_FABRICATOR (1<<11) // SKYRAT EDIT END -#define FIREDOOR_OPEN 1 -#define FIREDOOR_CLOSED 2 - #define HYPERTORUS_INACTIVE 0 // No or minimal energy #define HYPERTORUS_NOMINAL 1 // Normal operation #define HYPERTORUS_WARNING 2 // Integrity damaged diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index ca09aeb402c..7e26e30d18d 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -161,7 +161,6 @@ Always compile, always use that verb, and always make sure that it works for wha #define RESERVED_TURF_TYPE /turf/open/space/basic //What the turf is when not being used //Ruin Generation - #define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo) #define PLACE_DEFAULT "random" @@ -175,10 +174,6 @@ Always compile, always use that verb, and always make sure that it works for wha #define DEFAULT_SPACE_RUIN_LEVELS 7 #define DEFAULT_SPACE_EMPTY_LEVELS 1 -#define PERLIN_LAYER_HEIGHT "perlin_height" -#define PERLIN_LAYER_HUMIDITY "perlin_humidity" -#define PERLIN_LAYER_HEAT "perlin_heat" - #define BIOME_LOW_HEAT "low_heat" #define BIOME_LOWMEDIUM_HEAT "lowmedium_heat" #define BIOME_HIGHMEDIUM_HEAT "highmedium_heat" diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index ad35588f736..1939ca94ec4 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -16,7 +16,6 @@ #define NUM_E 2.71828183 - #define PI 3.1416 #define INFINITY 1e31 //closer then enough @@ -251,7 +250,7 @@ //We used to use linear regression to approximate the answer, but Mloc realized this was actually faster. //And lo and behold, it is, and it's more accurate to boot. -#define CHEAP_HYPOTENUSE(Ax, Ay, Bx, By) (sqrt(abs(Ax - Bx) ** 2 + abs(Ay - By) ** 2)) //A squared + B squared = C squared +#define CHEAP_HYPOTENUSE(Ax, Ay, Bx, By) (sqrt((Ax - Bx) ** 2 + (Ay - By) ** 2)) //A squared + B squared = C squared /// The number of cells in a taxicab circle (rasterized diamond) of radius X. #define DIAMOND_AREA(X) (1 + 2*(X)*((X)+1)) diff --git a/code/__DEFINES/mining.dm b/code/__DEFINES/mining.dm index 11d150a453d..4b233a5d4f1 100644 --- a/code/__DEFINES/mining.dm +++ b/code/__DEFINES/mining.dm @@ -39,6 +39,17 @@ /// The chance of ore spawning in a wall that is VENT_PROX_FAR tiles to a vent. #define VENT_CHANCE_FAR 1 +/// The amount of ore that is mined from a wall that is VENT_PROX_VERY_HIGH tiles to a vent. +#define ORE_WALL_VERY_HIGH 5 +/// The amount of ore that is mined from a wall that is VENT_PROX_HIGH tiles to a vent. +#define ORE_WALL_HIGH 4 +/// The amount of ore that is mined from a wall that is VENT_PROX_MEDIUM tiles to a vent. +#define ORE_WALL_MEDIUM 3 +/// The amount of ore that is mined from a wall that is VENT_PROX_LOW tiles to a vent. +#define ORE_WALL_LOW 2 +/// The amount of ore that is mined from a wall that is VENT_PROX_FAR tiles to a vent. +#define ORE_WALL_FAR 1 + /// The number of points a miner gets for discovering a vent, multiplied by BOULDER_SIZE when completing a wave defense minus the discovery bonus. #define MINER_POINT_MULTIPLIER 100 /// The multiplier that gets applied for automatically generated mining points. diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7cc6d46d46c..d739b697dc3 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -74,11 +74,6 @@ #define RESPIRATION_N2 (1 << 1) #define RESPIRATION_PLASMA (1 << 2) #define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human/bodyparts_greyscale.dmi' -#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' - -#define MONKEY_BODYPART "monkey" -#define ALIEN_BODYPART "alien" -#define LARVA_BODYPART "larva" //Bodytype defines for surgery, and other misc things. ///The limb is organic. @@ -227,27 +222,12 @@ #define BRAIN_DAMAGE_INTEGRITY_MULTIPLIER 0.5 -//Surgery Defines -#define BIOWARE_GENERIC "generic" -#define BIOWARE_NERVES "nerves" -#define BIOWARE_CIRCULATION "circulation" -#define BIOWARE_LIGAMENTS "ligaments" -#define BIOWARE_CORTEX "cortex" - //Health hud screws for carbon mobs #define SCREWYHUD_NONE 0 #define SCREWYHUD_CRIT 1 #define SCREWYHUD_DEAD 2 #define SCREWYHUD_HEALTHY 3 -//Health doll screws for human mobs -#define SCREWYDOLL_HEAD /obj/item/bodypart/head -#define SCREWYDOLL_CHEST /obj/item/bodypart/chest -#define SCREWYDOLL_L_ARM /obj/item/bodypart/arm/left -#define SCREWYDOLL_R_ARM /obj/item/bodypart/arm/right -#define SCREWYDOLL_L_LEG /obj/item/bodypart/leg/left -#define SCREWYDOLL_R_LEG /obj/item/bodypart/leg/right - //Threshold levels for beauty for humans #define BEAUTY_LEVEL_HORRID -66 #define BEAUTY_LEVEL_BAD -33 @@ -293,6 +273,8 @@ #define SANITY_LEVEL_UNSTABLE 4 #define SANITY_LEVEL_CRAZY 5 #define SANITY_LEVEL_INSANE 6 +/// Equal to the highest sanity level +#define SANITY_LEVEL_MAX SANITY_LEVEL_INSANE //Nutrition levels for humans #define NUTRITION_LEVEL_FAT 600 @@ -314,14 +296,14 @@ //Used as an upper limit for species that continuously gain nutriment #define NUTRITION_LEVEL_ALMOST_FULL 535 -//Charge levels for Ethereals +//Charge levels for Ethereals, in joules. #define ETHEREAL_CHARGE_NONE 0 -#define ETHEREAL_CHARGE_LOWPOWER 400 -#define ETHEREAL_CHARGE_NORMAL 1000 -#define ETHEREAL_CHARGE_ALMOSTFULL 1500 -#define ETHEREAL_CHARGE_FULL 2000 -#define ETHEREAL_CHARGE_OVERLOAD 2500 -#define ETHEREAL_CHARGE_DANGEROUS 3000 +#define ETHEREAL_CHARGE_LOWPOWER (0.4 * STANDARD_CELL_CHARGE) +#define ETHEREAL_CHARGE_NORMAL (1 * STANDARD_CELL_CHARGE) +#define ETHEREAL_CHARGE_ALMOSTFULL (1.5 * STANDARD_CELL_CHARGE) +#define ETHEREAL_CHARGE_FULL (2 * STANDARD_CELL_CHARGE) +#define ETHEREAL_CHARGE_OVERLOAD (2.5 * STANDARD_CELL_CHARGE) +#define ETHEREAL_CHARGE_DANGEROUS (3 * STANDARD_CELL_CHARGE) #define CRYSTALIZE_COOLDOWN_LENGTH (120 SECONDS) @@ -338,6 +320,9 @@ //Slime evolution threshold. Controls how fast slimes can split/grow #define SLIME_EVOLUTION_THRESHOLD 10 +//Slime evolution cost in nutrition +#define SLIME_EVOLUTION_COST 200 + //Slime extract crossing. Controls how many extracts is required to feed to a slime to core-cross. #define SLIME_EXTRACT_CROSSING_REQUIRED 10 @@ -368,7 +353,6 @@ #define AI_ON 1 #define AI_IDLE 2 #define AI_OFF 3 -#define AI_Z_OFF 4 //The range at which a mob should wake up if you spawn into the z level near it #define MAX_SIMPLEMOB_WAKEUP_RANGE 5 @@ -429,14 +413,6 @@ #define COOLDOWN_UPDATE_ADD_RANGED "add_ranged" #define COOLDOWN_UPDATE_SET_ENRAGE "set_enrage" #define COOLDOWN_UPDATE_ADD_ENRAGE "add_enrage" -#define COOLDOWN_UPDATE_SET_SPAWN "set_spawn" -#define COOLDOWN_UPDATE_ADD_SPAWN "add_spawn" -#define COOLDOWN_UPDATE_SET_HELP "set_help" -#define COOLDOWN_UPDATE_ADD_HELP "add_help" -#define COOLDOWN_UPDATE_SET_DASH "set_dash" -#define COOLDOWN_UPDATE_ADD_DASH "add_dash" -#define COOLDOWN_UPDATE_SET_TRANSFORM "set_transform" -#define COOLDOWN_UPDATE_ADD_TRANSFORM "add_transform" #define COOLDOWN_UPDATE_SET_CHASER "set_chaser" #define COOLDOWN_UPDATE_ADD_CHASER "add_chaser" #define COOLDOWN_UPDATE_SET_ARENA "set_arena" @@ -471,12 +447,11 @@ #define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be #define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up -#define SHOES_SPEED_SLIGHT SHOES_SLOWDOWN - 1 // slightest speed boost to movement #define POCKET_STRIP_DELAY (4 SECONDS) //time taken to search somebody's pockets #define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you #define HUNGER_FACTOR 0.025 //factor at which mob nutrition decreases //BUBBERS EDIT -#define ETHEREAL_CHARGE_FACTOR 0.8 //factor at which ethereal's charge decreases per second +#define ETHEREAL_DISCHARGE_RATE (8e-4 * STANDARD_CELL_CHARGE) // Rate at which ethereal stomach charge decreases /// How much nutrition eating clothes as moth gives and drains #define CLOTHING_NUTRITION_GAIN 15 #define REAGENTS_METABOLISM 0.2 //How many units of reagent are consumed per second, by default. @@ -574,8 +549,6 @@ #define RECENT_EXAMINE_MAX_WINDOW (2 SECONDS) /// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine() #define EXAMINE_MORE_WINDOW (1 SECONDS) -/// If you examine another mob who's successfully examined you during this duration of time, you two try to make eye contact. Cute! -#define EYE_CONTACT_WINDOW (2 SECONDS) /// If you yawn while someone nearby has examined you within this time frame, it will force them to yawn as well. Tradecraft! #define YAWN_PROPAGATION_EXAMINE_WINDOW (2 SECONDS) @@ -1004,3 +977,20 @@ GLOBAL_LIST_INIT(layers_to_offset, list( /// Types of bullets that mining mobs take full damage from #define MINING_MOB_PROJECTILE_VULNERABILITY list(BRUTE) + +/// The duration of the flip emote animation +#define FLIP_EMOTE_DURATION 0.7 SECONDS + +// Sprites for photocopying butts +#define BUTT_SPRITE_HUMAN_MALE "human_male" +#define BUTT_SPRITE_HUMAN_FEMALE "human_female" +#define BUTT_SPRITE_LIZARD "lizard" +#define BUTT_SPRITE_QR_CODE "qr_code" +#define BUTT_SPRITE_XENOMORPH "xeno" +#define BUTT_SPRITE_DRONE "drone" +#define BUTT_SPRITE_CAT "cat" +#define BUTT_SPRITE_FLOWERPOT "flowerpot" +#define BUTT_SPRITE_GREY "grey" +#define BUTT_SPRITE_PLASMA "plasma" +#define BUTT_SPRITE_FUZZY "fuzzy" +#define BUTT_SPRITE_SLIME "slime" diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index e0b7d6ff4a3..be59793927f 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -1,8 +1,8 @@ /// Default value for the max_complexity var on MODsuits #define DEFAULT_MAX_COMPLEXITY 15 -/// Default cell drain per process on MODsuits -#define DEFAULT_CHARGE_DRAIN 5 +/// The default cell drain of a modsuit. The standard modsuit active power usage drains this much energy per modsuit second. +#define DEFAULT_CHARGE_DRAIN (0.005 * STANDARD_CELL_CHARGE) // A standard cell lasts 200 seconds with this on active power usage, while a high power one lasts 2,000 seconds. /// Default time for a part to seal #define MOD_ACTIVATION_STEP_TIME (2 SECONDS) diff --git a/code/__DEFINES/movement_info.dm b/code/__DEFINES/movement_info.dm new file mode 100644 index 00000000000..91d370f6c75 --- /dev/null +++ b/code/__DEFINES/movement_info.dm @@ -0,0 +1,21 @@ +#define ACTIVE_MOVEMENT_OLDLOC 1 +#define ACTIVE_MOVEMENT_DIRECTION 2 +#define ACTIVE_MOVEMENT_FORCED 3 +#define ACTIVE_MOVEMENT_OLDLOCS 4 + +/// The arguments of this macro correspond directly to the argument order of /atom/movable/proc/Moved +#define SET_ACTIVE_MOVEMENT(_old_loc, _direction, _forced, _oldlocs) \ + active_movement = list( \ + _old_loc, \ + _direction, \ + _forced, \ + _oldlocs, \ + ) + +/// Finish any active movements +#define RESOLVE_ACTIVE_MOVEMENT \ + if(active_movement) { \ + var/__move_args = active_movement; \ + active_movement = null; \ + Moved(arglist(__move_args)); \ + } diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 8ace303b843..469811c96dc 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -15,7 +15,7 @@ #define IGNORE_DENSITY (1<<11) //! Can we ignore density when building on this object? (for example, directional windows and grilles) #define INFINITE_RESKIN (1<<12) // We can reskin this item infinitely #define CONDUCTS_ELECTRICITY (1<<13) //! Can this object conduct electricity? -#define NO_DECONSTRUCTION (1<<14) //! Prevent deconstruction of this object. +#define NO_DECONSTRUCTION (1<<14) //! Atoms don't spawn anything when deconstructed. They just vanish // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index 65c83dd6545..0eda3669a71 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -10,12 +10,19 @@ #define SOLAR_TRACK_TIMED 1 #define SOLAR_TRACK_AUTO 2 -///conversion ratio from joules to watts -#define WATTS / 0.002 -///conversion ratio from watts to joules -#define JOULES * 0.002 +///The watt is the standard unit of power for this codebase. Do not change this. +#define WATT 1 +///The joule is the standard unit of energy for this codebase. Do not change this. +#define JOULE 1 +///The watt is the standard unit of power for this codebase. You can use this with other defines to clarify that it will be multiplied by time. +#define WATTS * WATT +///The joule is the standard unit of energy for this codebase. You can use this with other defines to clarify that it will not be multiplied by time. +#define JOULES * JOULE -GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) +///The amount of energy, in joules, a standard powercell has. +#define STANDARD_CELL_CHARGE (1 MEGA JOULES) // 1 MJ. + +GLOBAL_VAR_INIT(CHARGELEVEL, 0.01) // Cap for how fast cells charge, as a percentage per second (.01 means cellcharge is capped to 1% per second) // Converts cable layer to its human readable name GLOBAL_LIST_INIT(cable_layer_to_name, list( diff --git a/code/__DEFINES/procpath.dm b/code/__DEFINES/procpath.dm index 642ca3eab6c..16716d6c091 100644 --- a/code/__DEFINES/procpath.dm +++ b/code/__DEFINES/procpath.dm @@ -15,12 +15,12 @@ // below, their accesses are optimized away. /// A text string of the verb's name. - var/name as text + var/name = null as text|null /// The verb's help text or description. - var/desc as text + var/desc = null as text|null /// The category or tab the verb will appear in. - var/category as text + var/category = null as text|null /// Only clients/mobs with `see_invisibility` higher can use the verb. - var/invisibility as num + var/invisibility = null as num|null /// Whether or not the verb appears in statpanel and commandbar when you press space - var/hidden as num + var/hidden = null as num|null diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 58f25ac39f1..e471fe2324d 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -82,8 +82,9 @@ #define RETURN_POINT_VECTOR(ATOM, ANGLE, SPEED) (new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED)) #define RETURN_POINT_VECTOR_INCREMENT(ATOM, ANGLE, SPEED, AMT) (new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED, AMT)) -/// The amount of energy that a standard energy weapon cell can hold -#define STANDARD_CELL_CHARGE 1000 +///The self charging rate of energy guns that magically recharge themselves, in watts. +#define STANDARD_ENERGY_GUN_SELF_CHARGE_RATE (0.05 * STANDARD_CELL_CHARGE) + /// Macro to turn a number of laser shots into an energy cost, based on the above define /// e.g. LASER_SHOTS(12, STANDARD_CELL_CHARGE) means 12 shots #define LASER_SHOTS(X, MAX_CHARGE) (((100 * MAX_CHARGE) - ((100 * MAX_CHARGE) % X)) / (100 * X)) // I wish I could just use round, but it can't be used in datum members diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm index f51271d0e22..98f8d4a1827 100644 --- a/code/__DEFINES/reactions.dm +++ b/code/__DEFINES/reactions.dm @@ -176,15 +176,19 @@ #define REACTION_OPPRESSION_THRESHOLD 5 // Halon: -/// The minimum temperature required for halon to form from tritium and BZ. -#define HALON_FORMATION_MIN_TEMPERATURE 30 -/// The maximum temperature required for halon to form from tritium and BZ. -#define HALON_FORMATION_MAX_TEMPERATURE 55 -/// The amount of energy 4.25 moles of halon forming from tritium and BZ releases. -#define HALON_FORMATION_ENERGY 300 +/// Energy released per mole of BZ consumed during halon formation. +#define HALON_FORMATION_ENERGY 91232.1 /// How much energy a mole of halon combusting consumes. #define HALON_COMBUSTION_ENERGY 2500 +/// The minimum temperature required for halon to combust. +#define HALON_COMBUSTION_MIN_TEMPERATURE (T0C + 70) +/// The temperature scale for halon combustion reaction rate. +#define HALON_COMBUSTION_TEMPERATURE_SCALE (FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 10) +/// Amount of halon required to be consumed in order to release resin. This is always possible as long as there's enough gas. +#define HALON_COMBUSTION_MINIMUM_RESIN_MOLES (0.99 * HALON_COMBUSTION_MIN_TEMPERATURE / HALON_COMBUSTION_TEMPERATURE_SCALE) +/// The volume of the resin foam fluid when halon combusts, in turfs. +#define HALON_COMBUSTION_RESIN_VOLUME 1 // Healium: /// The minimum temperature healium can form from BZ and freon at. diff --git a/code/__DEFINES/research/slimes.dm b/code/__DEFINES/research/slimes.dm index 59410564928..344514afb76 100644 --- a/code/__DEFINES/research/slimes.dm +++ b/code/__DEFINES/research/slimes.dm @@ -1,10 +1,40 @@ +///This slime is a baby #define SLIME_LIFE_STAGE_BABY "baby" +///This slime is an adult #define SLIME_LIFE_STAGE_ADULT "adult" +///This lowest charge a slime can have #define SLIME_MIN_POWER 0 +///Dangerous levels of charge #define SLIME_MEDIUM_POWER 5 +///The highest level of charge a slime can have #define SLIME_MAX_POWER 10 +///The maximum amount of nutrition a slime can contain +#define SLIME_MAX_NUTRITION 1000 +///The starting nutrition of a slime +#define SLIME_STARTING_NUTRITION 700 +/// Above it we grow our amount_grown and our power_level, below it we can eat +#define SLIME_GROW_NUTRITION 800 +/// Below this, we feel hungry +#define SLIME_HUNGER_NUTRITION 500 +/// Below this, we feel starving +#define SLIME_STARVE_NUTRITION 200 + +///The slime is not hungry. It might try to feed anyways. +#define SLIME_HUNGER_NONE 0 +///The slime is more likely to feed on people +#define SLIME_HUNGER_HUNGRY 1 +///The slime is very likely to feed on anything +#define SLIME_HUNGER_STARVING 2 + +#define SLIME_MOOD_NONE "none" +#define SLIME_MOOD_ANGRY "angry" +#define SLIME_MOOD_MISCHIEVOUS "mischievous" +#define SLIME_MOOD_POUT "pout" +#define SLIME_MOOD_SAD "sad" +#define SLIME_MOOD_SMILE ":3" + // Just slimin' here. // Warning: These defines are used for slime icon states, so if you // touch these names, remember to update icons/mob/simple/slimes.dmi! diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 26b66f0de60..a31a2c1b77e 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -34,6 +34,10 @@ /// Special value to reset cyborg's lamp_cooldown #define BORG_LAMP_CD_RESET -1 +/// How many watts per lamp power is consumed while the lamp is on. +#define BORG_LAMP_POWER_CONSUMPTION (1000 WATTS) +/// The minimum power consumption of a cyborg. +#define BORG_MINIMUM_POWER_CONSUMPTION (500 WATTS) //Module slot define ///The third module slots is disabed. @@ -105,7 +109,7 @@ GLOBAL_LIST_EMPTY(cyborg_all_models_icon_list) //Bot cover defines indicating the Bot's status ///The Bot's cover is open and can be modified/emagged by anyone. -#define BOT_COVER_OPEN (1<<0) +#define BOT_COVER_MAINTS_OPEN (1<<0) ///The Bot's cover is locked, and cannot be opened without unlocking it. #define BOT_COVER_LOCKED (1<<1) ///The Bot is emagged. @@ -113,18 +117,18 @@ GLOBAL_LIST_EMPTY(cyborg_all_models_icon_list) ///The Bot has been hacked by a Silicon, emagging them, but revertable. #define BOT_COVER_HACKED (1<<3) - -//basic bots defines - -///is our maintenancle panel currently open -#define BOT_MAINTS_PANEL_OPEN (1<<0) -///is our control panel currently open -#define BOT_CONTROL_PANEL_OPEN (1<<1) - -///bitfield for our access flags +///bitfield, used by basic bots, for our access flags DEFINE_BITFIELD(bot_access_flags, list( - "MAINTS_OPEN" = BOT_MAINTS_PANEL_OPEN, - "CONTROL_OPEN" = BOT_CONTROL_PANEL_OPEN, + "MAINTS_OPEN" = BOT_COVER_MAINTS_OPEN, + "COVER_OPEN" = BOT_COVER_LOCKED, + "COVER_EMAGGED" = BOT_COVER_EMAGGED, + "COVER_HACKED" = BOT_COVER_HACKED, +)) + +///bitfield, used by simple bots, for our access flags +DEFINE_BITFIELD(bot_cover_flags, list( + "MAINTS_OPEN" = BOT_COVER_MAINTS_OPEN, + "COVER_OPEN" = BOT_COVER_LOCKED, "COVER_EMAGGED" = BOT_COVER_EMAGGED, "COVER_HACKED" = BOT_COVER_HACKED, )) @@ -198,6 +202,8 @@ DEFINE_BITFIELD(bot_access_flags, list( #define JUDGE_IDCHECK (1<<1) #define JUDGE_WEAPONCHECK (1<<2) #define JUDGE_RECORDCHECK (1<<3) +///lowered threat level +#define JUDGE_CHILLOUT (1<<4) /// Above this level of assessed threat, Beepsky will attack you #define THREAT_ASSESS_DANGEROUS 4 @@ -215,6 +221,8 @@ DEFINE_BITFIELD(bot_access_flags, list( #define SECBOT_CHECK_RECORDS (1<<3) ///Whether we will stun & cuff or endlessly stun #define SECBOT_HANDCUFF_TARGET (1<<4) +///if it's currently affected by a saboteur bolt (lowered perp threat level) +#define SECBOT_SABOTEUR_AFFECTED (1<<5) DEFINE_BITFIELD(security_mode_flags, list( "SECBOT_DECLARE_ARRESTS" = SECBOT_DECLARE_ARRESTS, @@ -222,6 +230,7 @@ DEFINE_BITFIELD(security_mode_flags, list( "SECBOT_CHECK_WEAPONS" = SECBOT_CHECK_WEAPONS, "SECBOT_CHECK_RECORDS" = SECBOT_CHECK_RECORDS, "SECBOT_HANDCUFF_TARGET" = SECBOT_HANDCUFF_TARGET, + "SECBOT_SABOTEUR_AFFECTED" = SECBOT_SABOTEUR_AFFECTED, )) //MedBOT defines diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index bf5b5c9e9bd..7cfb0700615 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -16,6 +16,7 @@ #define ROLE_OPERATIVE "Operative" #define ROLE_TRAITOR "Traitor" #define ROLE_WIZARD "Wizard" +#define ROLE_SPY "Spy" // SKYRAT EDIT START #define ROLE_ASSAULT_OPERATIVE "Assault Operative" #define ROLE_OPFOR_CANDIDATE "OPFOR Candidate" @@ -87,6 +88,10 @@ #define ROLE_WIZARD_APPRENTICE "apprentice" #define ROLE_SYNDICATE_MONKEY "Syndicate Monkey Agent" #define ROLE_CONTRACTOR_SUPPORT "Contractor Support Unit" +#define ROLE_OPERATIVE_OVERWATCH "Operative Overwatch Agent" +#define ROLE_SYNDICATE_SABOBORG "Syndicate Sabotage Cyborg" +#define ROLE_SYNDICATE_MEDBORG "Syndicate Medical Cyborg" +#define ROLE_SYNDICATE_ASSAULTBORG "Syndicate Assault Cyborg" //Spawner roles #define ROLE_ANCIENT_CREW "Ancient Crew" @@ -155,6 +160,7 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_REV_HEAD = 14, ROLE_TRAITOR = 0, ROLE_WIZARD = 14, + ROLE_SPY = 0, // SKYRAT EDIT ADDITION ROLE_ASSAULT_OPERATIVE = 14, // SKYRAT EDIT END diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index a8a6cd673f7..3260dd4d5a8 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -59,11 +59,14 @@ #define MODE_MAFIA "mafia" +/// Applies singing characters to the message #define MODE_SING "sing" - +/// A custom say emote is being supplied [value = the emote] #define MODE_CUSTOM_SAY_EMOTE "custom_say" - +/// No message is following, just emote #define MODE_CUSTOM_SAY_ERASE_INPUT "erase_input" +/// Message is being relayed through another object +#define MODE_RELAY "relayed" //Spans. Robot speech, italics, etc. Applied in compose_message(). #define SPAN_ROBOT "robot" @@ -76,11 +79,14 @@ #define SPAN_CLOWN "clown" #define SPAN_SINGING "singing" #define SPAN_TAPE_RECORDER "tape_recorder" -#define SPAN_HELIUM "small" +#define SPAN_SMALL_VOICE "small" //bitflag #defines for return value of the radio() proc. +/// Makes the message use italics #define ITALICS (1<<0) +/// Reduces the range of the message to 1 #define REDUCE_RANGE (1<<1) +/// Stops any actual message from being sent #define NOPASS (1<<2) /// Range to hear normal messages @@ -104,6 +110,7 @@ #define MAX_BROADCAST_LEN 512 #define MAX_CHARTER_LEN 80 #define MAX_PLAQUE_LEN 144 +#define MAX_LABEL_LEN 64 // Audio/Visual Flags. Used to determine what sense are required to notice a message. #define MSG_VISUAL (1<<0) diff --git a/code/__DEFINES/si.dm b/code/__DEFINES/si.dm new file mode 100644 index 00000000000..b63f048e0b3 --- /dev/null +++ b/code/__DEFINES/si.dm @@ -0,0 +1,21 @@ +// Prefix values. +#define QUECTO * 1e-30 +#define RONTO * 1e-27 +#define YOCTO * 1e-24 +#define ZEPTO * 1e-21 +#define ATTO * 1e-18 +#define FEMPTO * 1e-15 +#define PICO * 1e-12 +#define NANO * 1e-9 +#define MICRO * 1e-6 +#define MILLI * 1e-3 +#define KILO * 1e3 +#define MEGA * 1e6 +#define GIGA * 1e9 +#define TERA * 1e12 +#define PETA * 1e15 +#define EXA * 1e18 +#define ZETTA * 1e21 +#define YOTTA * 1e24 +#define RONNA * 1e27 +#define QUETTA * 1e30 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 6890fd2ca50..a24a929391f 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -235,3 +235,4 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_ROCK_TAP "rock_tap" #define SFX_SEAR "sear" #define SFX_REEL "reel" +#define SFX_RATTLE "rattle" diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index bf918b55efc..0447e87f532 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -38,10 +38,10 @@ #define span_command_headset(str) ("" + str + "") #define span_comradio(str) ("" + str + "") #define span_cult(str) ("" + str + "") -#define span_cultbold(str) ("" + str + "") -#define span_cultboldtalic(str) ("" + str + "") -#define span_cultitalic(str) ("" + str + "") -#define span_cultlarge(str) ("" + str + "") +#define span_cult_bold(str) ("" + str + "") +#define span_cult_bold_italic(str) ("" + str + "") +#define span_cult_italic(str) ("" + str + "") +#define span_cult_large(str) ("" + str + "") #define span_danger(str) ("" + str + "") #define span_deadsay(str) ("" + str + "") #define span_deconversion_message(str) ("" + str + "") diff --git a/code/__DEFINES/station.dm b/code/__DEFINES/station.dm index 5a04961429f..e7d7e76f841 100644 --- a/code/__DEFINES/station.dm +++ b/code/__DEFINES/station.dm @@ -13,6 +13,8 @@ #define STATION_TRAIT_PLANETARY (1<<0) /// Only run on space stations #define STATION_TRAIT_SPACE_BOUND (1<<1) +/// Only run if AIs are enabled. +#define STATION_TRAIT_REQUIRES_AI (1<<2) /// Not restricted by space or planet, can always just happen #define STATION_TRAIT_MAP_UNRESTRICTED STATION_TRAIT_PLANETARY | STATION_TRAIT_SPACE_BOUND diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 4e901c4ba2c..8ada83a2109 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -43,6 +43,7 @@ #define STASIS_SHAPECHANGE_EFFECT "stasis_shapechange" #define STASIS_ADMIN "stasis_admin" #define STASIS_LEGION_EATEN "stasis_eaten" +#define STASIS_SLIME_BZ "stasis_slime_bz" #define STASIS_NETPOD_EFFECT "stasis_netpod" @@ -154,8 +155,8 @@ #define set_drowsiness(duration) set_timed_status_effect(duration, /datum/status_effect/drowsiness) #define set_drowsiness_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/drowsiness, TRUE) -#define adjust_pacifism(duration) adjust_timed_status_effect(/datum/status_effect/pacify, duration) -#define set_pacifism(duration) set_timed_status_effect(/datum/status_effect/pacify, duration) +#define adjust_pacifism(duration) adjust_timed_status_effect(duration, /datum/status_effect/pacify) +#define set_pacifism(duration) set_timed_status_effect(duration, /datum/status_effect/pacify) #define adjust_eye_blur(duration) adjust_timed_status_effect(duration, /datum/status_effect/eye_blur) #define adjust_eye_blur_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/eye_blur, up_to) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2002e899a61..1a1940b76cd 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -199,7 +199,6 @@ // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) #define FIRE_PRIORITY_PING 10 -#define FIRE_PRIORITY_IDLE_NPC 10 #define FIRE_PRIORITY_SERVER_MAINT 10 #define FIRE_PRIORITY_RESEARCH 10 #define FIRE_PRIORITY_VIS 10 @@ -303,6 +302,11 @@ #define SSEXPLOSIONS_MOVABLES 2 #define SSEXPLOSIONS_THROWS 3 +// Machines subsystem subtasks. +#define SSMACHINES_APCS_EARLY 1 +#define SSMACHINES_MACHINES 2 +#define SSMACHINES_APCS_LATE 3 + // Wardrobe subsystem tasks #define SSWARDROBE_STOCK 1 #define SSWARDROBE_INSPECT 2 diff --git a/code/__DEFINES/supermatter.dm b/code/__DEFINES/supermatter.dm index 5eab41fcdf9..5dee00db310 100644 --- a/code/__DEFINES/supermatter.dm +++ b/code/__DEFINES/supermatter.dm @@ -181,7 +181,7 @@ /// Colours used for effects. #define SUPERMATTER_COLOUR "#ffd04f" #define SUPERMATTER_RED "#aa2c16" -#define SUPERMATTER_CASCADE_COLOUR "#333333" +#define SUPERMATTER_CASCADE_COLOUR COLOR_ALMOST_BLACK #define SUPERMATTER_TESLA_COLOUR "#00ffff" #define SUPERMATTER_SINGULARITY_RAYS_COLOUR "#750000" #define SUPERMATTER_SINGULARITY_LIGHT_COLOUR "#400060" diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index c98baa5f4aa..5dac5df883d 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -58,6 +58,12 @@ /// Removes everything enclose in < and > inclusive of the bracket, and limits the length of the message. #define STRIP_HTML_FULL(text, limit) (GLOB.html_tags.Replace(copytext(text, 1, limit), "")) +/** + * stuff like `copytext(input, length(input))` will trim the last character of the input, + * because DM does it so it copies until the char BEFORE the `end` arg, so we need to bump `end` by 1 in these cases. + */ +#define PREVENT_CHARACTER_TRIM_LOSS(integer) (integer + 1) + /// Folder directory for strings #define STRING_DIRECTORY "strings" diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index a4fb6d40be7..e2c89df90e9 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "7.1.1" +#define TGS_DMAPI_VERSION "7.1.2" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -312,6 +312,7 @@ var/datum/tgs_chat_embed/structure/embed /datum/tgs_message_content/New(text) + ..() if(!istext(text)) TGS_ERROR_LOG("[/datum/tgs_message_content] created with no text!") text = null @@ -354,6 +355,7 @@ var/proxy_url /datum/tgs_chat_embed/media/New(url) + ..() if(!istext(url)) CRASH("[/datum/tgs_chat_embed/media] created with no url!") @@ -367,6 +369,7 @@ var/proxy_icon_url /datum/tgs_chat_embed/footer/New(text) + ..() if(!istext(text)) CRASH("[/datum/tgs_chat_embed/footer] created with no text!") @@ -383,6 +386,7 @@ var/proxy_icon_url /datum/tgs_chat_embed/provider/author/New(name) + ..() if(!istext(name)) CRASH("[/datum/tgs_chat_embed/provider/author] created with no name!") @@ -395,6 +399,7 @@ var/is_inline /datum/tgs_chat_embed/field/New(name, value) + ..() if(!istext(name)) CRASH("[/datum/tgs_chat_embed/field] created with no name!") @@ -510,7 +515,7 @@ /* The MIT License -Copyright (c) 2017-2023 Jordan Brown +Copyright (c) 2017-2024 Jordan Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 1935c3c0aee..6a2a5152903 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -39,6 +39,7 @@ #define PRIDE_WEEK "Pride Week" #define MOTH_WEEK "Moth Week" #define IAN_HOLIDAY "Ian's Birthday" +#define HOTDOG_DAY "National Hot Dog Day" /* Days of the week to make it easier to reference them. diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index f0ca74eb49a..e42bd5dd559 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -208,11 +208,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This object innately spawns with fantasy variables already applied (the magical component is given to it on initialize), and thus we never want to give it the component again. #define TRAIT_INNATELY_FANTASTICAL_ITEM "innately_fantastical_item" #define TRAIT_DEPRESSION "depression" -#define TRAIT_BLOOD_DEFICIENCY "blood_deficiency" #define TRAIT_JOLLY "jolly" #define TRAIT_NOCRITDAMAGE "no_crit" /// Prevents shovies and some strong blows such as unarmed punches and (unreliably) tackles the owner down #define TRAIT_BRAWLING_KNOCKDOWN_BLOCKED "brawling_knockdown_blocked" +/// Applies tackling defense bonus to any mob that has it +#define TRAIT_OFF_BALANCE_TACKLER "off_balance_tackler" /// Prevents some severe head injuries being sustained from heavy collisions or blunt force injuries. #define TRAIT_HEAD_INJURY_BLOCKED "head_injury_blocked" /// Prevents staggering. @@ -221,6 +222,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_THROW_HITPUSH "no_throw_hitpush" ///Added to mob or mind, changes the icons of the fish shown in the minigame UI depending on the possible reward. #define TRAIT_REVEAL_FISH "reveal_fish" +///This trait gets you a list of fishes that can be caught when examining a fishing spot. +#define TRAIT_EXAMINE_FISHING_SPOT "examine_fishing_spot" /// Added to a mob, allows that mob to experience flavour-based moodlets when examining food #define TRAIT_REMOTE_TASTING "remote_tasting" @@ -386,6 +389,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_COAGULATING "coagulating" /// From anti-convulsant medication against seizures. #define TRAIT_ANTICONVULSANT "anticonvulsant" +/// From stimulant reagents, this affects whether the all-nighter lack of sleep penalty should be countered +#define TRAIT_STIMULATED "stimulated" /// The holder of this trait has antennae or whatever that hurt a ton when noogied #define TRAIT_ANTENNAE "antennae" /// Blowing kisses actually does damage to the victim @@ -497,6 +502,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ADAMANTINE_EXTRACT_ARMOR "adamantine_extract_armor" /// Mobs with this trait won't be able to dual wield guns. #define TRAIT_NO_GUN_AKIMBO "no_gun_akimbo" +/// Mobs with this trait cannot be hit by projectiles, meaning the projectiles will just go through. +#define TRAIT_UNHITTABLE_BY_PROJECTILES "unhittable_by_projectiles" /// Projectile with this trait will always hit the defined zone of a struck living mob. #define TRAIT_ALWAYS_HIT_ZONE "always_hit_zone" @@ -509,6 +516,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Is the mob standing on an elevated surface? This prevents them from dropping down if not elevated first. #define TRAIT_ON_ELEVATED_SURFACE "on_elevated_surface" +/// Does the mob ignore elevation? (e.g. xeno larvas on hiding) +#define TRAIT_IGNORE_ELEVATION "ignore_elevation" /// Prevents you from twohanding weapons. #define TRAIT_NO_TWOHANDING "no_twohanding" @@ -522,6 +531,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Makes the user handcuff others faster #define TRAIT_FAST_CUFFING "fast_cuffing" +///Given by /obj/item/virgin_mary, mobs that used this can no longer use it again ever +#define TRAIT_MAFIAINITIATE "mafiainitiate" + +///Makes the player appear as their respective job in Binary Talk rather than being a 'Default Cyborg'. +#define DISPLAYS_JOB_IN_BINARY "display_job_in_binary" + // METABOLISMS // Various jobs on the station have historically had better reactions // to various drinks and foodstuffs. Security liking donuts is a classic @@ -539,6 +554,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BALLMER_SCIENTIST "ballmer_scientist" #define TRAIT_MAINTENANCE_METABOLISM "maintenance_metabolism" #define TRAIT_CORONER_METABOLISM "coroner_metabolism" +#define TRAIT_HUMAN_AI_METABOLISM "human_ai_metabolism" //LUNG TRAITS /// Lungs always breathe normally when in vacuum/space. @@ -668,8 +684,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_STORAGE_INSERT "no_storage_insert" /// Visible on t-ray scanners if the atom/var/level == 1 #define TRAIT_T_RAY_VISIBLE "t-ray-visible" -/// If this item's been grilled -#define TRAIT_FOOD_GRILLED "food_grilled" /// If this item's been fried #define TRAIT_FOOD_FRIED "food_fried" /// This is a silver slime created item @@ -792,9 +806,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_VENTCRAWLER_ALWAYS "ventcrawler_always" #define TRAIT_VENTCRAWLER_NUDE "ventcrawler_nude" -/// Minor trait used for beakers, or beaker-ishes. [/obj/item/reagent_containers], to show that they've been used in a reagent grinder. -#define TRAIT_MAY_CONTAIN_BLENDED_DUST "may_contain_blended_dust" - /// Trait put on [/mob/living/carbon/human]. If that mob has a crystal core, also known as an ethereal heart, it will not try to revive them if the mob dies. #define TRAIT_CANNOT_CRYSTALIZE "cannot_crystalize" @@ -884,6 +895,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait given to a dreaming carbon when they are currently doing dreaming stuff #define TRAIT_DREAMING "currently_dreaming" +/// Whether bots will salute this mob. +#define TRAIT_COMMISSIONED "commissioned" + ///generic atom traits /// Trait from [/datum/element/rust]. Its rusty and should be applying a special overlay to denote this. #define TRAIT_RUSTY "rust_trait" @@ -928,6 +942,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint" #define STATION_TRAIT_FORESTED "station_trait_forested" #define STATION_TRAIT_HANGOVER "station_trait_hangover" +#define STATION_TRAIT_HUMAN_AI "station_trait_human_ai" #define STATION_TRAIT_LATE_ARRIVALS "station_trait_late_arrivals" #define STATION_TRAIT_LOANER_SHUTTLE "station_trait_loaner_shuttle" #define STATION_TRAIT_MEDBOT_MANIA "station_trait_medbot_mania" @@ -943,6 +958,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_UNNATURAL_ATMOSPHERE "station_trait_unnatural_atmosphere" #define STATION_TRAIT_VENDING_SHORTAGE "station_trait_vending_shortage" +///Deathmatch traits +#define TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS "deathmath_explosive_implants" + /// This atom is currently spinning. #define TRAIT_SPINNING "spinning" @@ -957,7 +975,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MAGNETIC_ID_CARD "magnetic_id_card" /// ID cards with this trait have special appraisal text. #define TRAIT_TASTEFULLY_THICK_ID_CARD "impressive_very_nice" -/// things with this trait are treated as having no access in /obj/proc/check_access(obj/item) +/// things with this trait are treated as having no access in /atom/movable/proc/check_access(obj/item) #define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess" /// This human wants to see the color of their glasses, for some reason @@ -1066,6 +1084,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait granted by janitor skillchip, allows communication with cleanbots #define TRAIT_CLEANBOT_WHISPERER "cleanbot_whisperer" +///Trait granted by the miner skillchip, allows communication with minebots +#define TRAIT_ROCK_STONER "rock_stoner" + +///Trait given by the regenerative shield component +#define TRAIT_REGEN_SHIELD "regen_shield" + /// Trait given when a mob is currently in invisimin mode #define TRAIT_INVISIMIN "invisimin" @@ -1075,6 +1099,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait which self-identifies as an enemy of the law #define TRAIT_ALWAYS_WANTED "always_wanted" +/// Trait given to mobs that have the basic eating element +#define TRAIT_MOB_EATER "mob_eater" /// Trait which means whatever has this is dancing by a dance machine #define TRAIT_DISCO_DANCER "disco_dancer" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index dd237bf54b7..dcbfab7fe5f 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -34,6 +34,8 @@ #define CULT_TRAIT "cult" #define LICH_TRAIT "lich" +#define VENDING_MACHINE_TRAIT "vending_machine" + #define ABSTRACT_ITEM_TRAIT "abstract-item" /// A trait given by any status effect #define STATUS_EFFECT_TRAIT "status-effect" @@ -86,6 +88,8 @@ #define MAFIA_TRAIT "mafia" /// Trait associated with ctf #define CTF_TRAIT "ctf" +/// Trait associated with deathmatch +#define DEATHMATCH_TRAIT "deathmatch" /// Trait associated with highlander #define HIGHLANDER_TRAIT "highlander" /// Trait given from playing pretend with baguettes diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 7b972abc20c..295c09f6d46 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -64,9 +64,6 @@ /// Turf has superlube on the floor and mobs will slip even if they are crawling #define TURF_WET_SUPERLUBE (1<<4) -/// Checks if a turf is wet -#define IS_WET_OPEN_TURF(O) O.GetComponent(/datum/component/wet_floor) - /// Maximum amount of time, (in deciseconds) a tile can be wet for. #define MAXIMUM_WET_TIME (5 MINUTES) @@ -85,9 +82,6 @@ */ #define get_area(A) (isarea(A) ? A : get_step(A, 0)?.loc) -#define TEMPORARY_THERMAL_CONDUCTIVITY 1 - -#define MAX_TEMPORARY_THERMAL_CONDUCTIVITY 1 /// Turf will be passable if density is 0 #define TURF_PATHING_PASS_DENSITY 0 /// Turf will be passable depending on [CanAStarPass] return value diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index d6412e0e4d1..bb92f0672c3 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -12,6 +12,9 @@ /// This item is purchasable to infiltrators (midround traitors) #define UPLINK_INFILTRATORS (1 << 3) +/// Can be randomly given to spies for their bounties +#define UPLINK_SPY (1 << 4) + /// Progression gets turned into a user-friendly form. This is just an abstract equation that makes progression not too large. #define DISPLAY_PROGRESSION(time) round(time/60, 0.01) @@ -19,3 +22,12 @@ #define TRAITOR_DISCOUNT_BIG "big_discount" #define TRAITOR_DISCOUNT_AVERAGE "average_discount" #define TRAITOR_DISCOUNT_SMALL "small_discount" + +/// Typepath used for uplink items which don't actually produce an item (essentially just a placeholder) +/// Future todo: Make this not necessary / make uplink items support item-less items natively +#define ABSTRACT_UPLINK_ITEM /obj/effect/gibspawner/generic + +/// Lower threshold for which an uplink items's TC cost is considered "low" for spy bounties picking rewards +#define SPY_LOWER_COST_THRESHOLD 5 +/// Upper threshold for which an uplink items's TC cost is considered "high" for spy bounties picking rewards +#define SPY_UPPER_COST_THRESHOLD 12 diff --git a/code/__DEFINES/~skyrat_defines/_globalvars/food.dm b/code/__DEFINES/~skyrat_defines/_globalvars/food.dm new file mode 100644 index 00000000000..776623bda0a --- /dev/null +++ b/code/__DEFINES/~skyrat_defines/_globalvars/food.dm @@ -0,0 +1,54 @@ +/// A mirror of the FOOD_FLAGS_IC define, except with bitflags as values and as a GLOB. +GLOBAL_LIST_INIT(food_ic_flag_to_bitflag, list( + "Meat" = MEAT, + "Vegetables" = VEGETABLES, + "Raw food" = RAW, + "Junk food" = JUNKFOOD, + "Grain" = GRAIN, + "Fruits" = FRUIT, + "Dairy products" = DAIRY, + "Fried food" = FRIED, + "Alcohol" = ALCOHOL, + "Sugary food" = SUGAR, + "Gross food" = GROSS, + "Toxic food" = TOXIC, + "Pineapples" = PINEAPPLE, // I know why this is a food type, but this is pointless to the Nth degree... + "Breakfast food" = BREAKFAST, + "Clothing" = CLOTH, + "Nuts" = NUTS, + "Seafood" = SEAFOOD, + "Oranges" = ORANGES, // Why is this even a foodtype?! + "Bugs" = BUGS, + "Gore" = GORE, + "Bloody" = BLOODY, +)) + +GLOBAL_LIST_INIT(food_defaults, list( + "Meat" = FOOD_PREFERENCE_NEUTRAL, + "Vegetables" = FOOD_PREFERENCE_NEUTRAL, + "Raw food" = FOOD_PREFERENCE_DISLIKED, + "Junk food" = FOOD_PREFERENCE_NEUTRAL, + "Grain" = FOOD_PREFERENCE_NEUTRAL, + "Fruits" = FOOD_PREFERENCE_NEUTRAL, + "Dairy products" = FOOD_PREFERENCE_NEUTRAL, + "Fried food" = FOOD_PREFERENCE_NEUTRAL, + "Alcohol" = FOOD_PREFERENCE_DISLIKED, + "Sugary food" = FOOD_PREFERENCE_NEUTRAL, + "Gross food" = FOOD_PREFERENCE_DISLIKED, + "Toxic food" = FOOD_PREFERENCE_TOXIC, + "Pineapples" = FOOD_PREFERENCE_NEUTRAL, + "Breakfast food" = FOOD_PREFERENCE_NEUTRAL, + "Clothing" = FOOD_PREFERENCE_DISLIKED, + "Nuts" = FOOD_PREFERENCE_NEUTRAL, + "Seafood" = FOOD_PREFERENCE_NEUTRAL, + "Oranges" = FOOD_PREFERENCE_NEUTRAL, + "Bugs" = FOOD_PREFERENCE_DISLIKED, + "Gore" = FOOD_PREFERENCE_TOXIC, // Toxic by default to allow default values to be usable from the start. + "Bloody" = FOOD_PREFERENCE_TOXIC, // Toxic by default to allow default values to be usable from the start. +)) + +GLOBAL_LIST_INIT(obscure_food_types, list( + "Pineapples", + "Oranges", + "Nuts" +)) diff --git a/code/__DEFINES/~skyrat_defines/apc_defines.dm b/code/__DEFINES/~skyrat_defines/apc_defines.dm index 6043ba1a422..d969b94a149 100644 --- a/code/__DEFINES/~skyrat_defines/apc_defines.dm +++ b/code/__DEFINES/~skyrat_defines/apc_defines.dm @@ -1,6 +1,6 @@ /// Lower excess value for APC arcing, 5% chance to arc -#define APC_ARC_LOWERLIMIT 2500000 +#define APC_ARC_LOWERLIMIT 4 MEGA WATTS /// Moderate excess value for APC arcing, 10% chance to arc -#define APC_ARC_MEDIUMLIMIT 5000000 +#define APC_ARC_MEDIUMLIMIT 7 MEGA WATTS /// Upper excess value for for APC arcing, 15% chance to arc -#define APC_ARC_UPPERLIMIT 7500000 +#define APC_ARC_UPPERLIMIT 9 MEGA WATTS diff --git a/code/__DEFINES/~skyrat_defines/food.dm b/code/__DEFINES/~skyrat_defines/food.dm new file mode 100644 index 00000000000..3454d1491e2 --- /dev/null +++ b/code/__DEFINES/~skyrat_defines/food.dm @@ -0,0 +1,12 @@ +/// Used inside the foods prefs menu. Indicates that a food is toxic. +#define FOOD_PREFERENCE_TOXIC 1 +/// Used inside the foods prefs menu. Indicates that a food is disliked. +#define FOOD_PREFERENCE_DISLIKED 2 +/// Used inside the foods prefs menu. Indicates that a food is neither liked or disliked. +#define FOOD_PREFERENCE_NEUTRAL 3 +/// Used inside the foods prefs menu. Indicates that a food is liked. +#define FOOD_PREFERENCE_LIKED 4 +/// Used inside the food prefs menu. Indicates the value of this entry is the default food like/dislike value for the food. +#define FOOD_PREFERENCE_DEFAULT 5 +/// Used inside the food prefs menu as an entry. If set to TRUE, the food is completely ignored by the verification system. Optional. +#define FOOD_PREFERENCE_OBSCURE 6 diff --git a/code/__DEFINES/~skyrat_defines/preferences.dm b/code/__DEFINES/~skyrat_defines/preferences.dm index 2fa36d54779..9fb6cd69ff3 100644 --- a/code/__DEFINES/~skyrat_defines/preferences.dm +++ b/code/__DEFINES/~skyrat_defines/preferences.dm @@ -14,7 +14,3 @@ #define ORGAN_PREF_POSI_BRAIN "Positronic Brain" #define ORGAN_PREF_MMI_BRAIN "Man-Machine Interface" #define ORGAN_PREF_CIRCUIT_BRAIN "Circuitboard" - -// Playtime is tracked in minutes -/// Have any less hours than listed below and you get access to a pin indicating you're new -#define PLAYTIME_GREEN 6000 // 100 hours diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 940418f2ebc..3ac3bfaed56 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -199,3 +199,10 @@ GLOBAL_LIST_EMPTY(gas_handbook) if(boundaries && boundaries[1] > 0) return FALSE return TRUE + +/proc/print_gas_mixture(datum/gas_mixture/gas_mixture) + var/message = "TEMPERATURE: [gas_mixture.temperature]K, QUANTITY: [gas_mixture.total_moles()] mols, VOLUME: [gas_mixture.volume]L; " + for(var/key in gas_mixture.gases) + var/list/gaslist = gas_mixture.gases[key] + message += "[gaslist[GAS_META][META_GAS_ID]]=[gaslist[MOLES]] mols;" + return message diff --git a/code/__HELPERS/clients.dm b/code/__HELPERS/clients.dm index 3b61cf1e1c4..156f9e2b5dc 100644 --- a/code/__HELPERS/clients.dm +++ b/code/__HELPERS/clients.dm @@ -10,3 +10,9 @@ if (ch < 48 || ch > 57) //0-9 return FALSE return TRUE + +/// Proc that just logs whenever an uninitialized client tries to do something before they have fully gone through New(). +/// Intended to be used in conjunction with the `VALIDATE_CLIENT_INITIALIZATION()` macro, but can be dropped anywhere when we look at the `fully_created` var on /client. +/proc/unvalidated_client_error(client/target) + to_chat(target, span_warning("You are not fully initialized yet! Please wait a moment.")) + log_access("Client [key_name(target)] attempted to execute a verb before being fully initialized.") diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 0210c44ee57..f9957f4c739 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -192,3 +192,6 @@ /// Orders mobs by health /proc/cmp_mob_health(mob/living/mob_a, mob/living/mob_b) return mob_b.health - mob_a.health + +/proc/cmp_deathmatch_mods(datum/deathmatch_modifier/a, datum/deathmatch_modifier/b) + return sorttext(b.name, a.name) diff --git a/code/__HELPERS/colors.dm b/code/__HELPERS/colors.dm index 9f17d4c0028..9c70cef798e 100644 --- a/code/__HELPERS/colors.dm +++ b/code/__HELPERS/colors.dm @@ -48,7 +48,7 @@ return rgb(255 - color[1], 255 - color[2], 255 - color[3]) ///Flash a color on the passed mob -/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) +/proc/flash_color(mob_or_client, flash_color=COLOR_CULT_RED, flash_time=20) var/mob/flashed_mob if(ismob(mob_or_client)) flashed_mob = mob_or_client diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 4c7a6f3a0f8..7ae0feadea7 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -289,6 +289,12 @@ GLOBAL_LIST_INIT(WALLITEMS_INTERIOR, typecacheof(list( GLOBAL_LIST_INIT(WALLITEMS_EXTERIOR, typecacheof(list( /obj/machinery/camera, /obj/machinery/light, - /obj/structure/camera_assembly, /obj/structure/light_construct, ))) + +/// A static typecache of all the money-based items that can be actively used as currency. +GLOBAL_LIST_INIT(allowed_money, typecacheof(list( + /obj/item/coin, + /obj/item/holochip, + /obj/item/stack/spacecash, +))) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 0b9de1df37e..6ab82d1584c 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -35,7 +35,7 @@ icon/MinColors(icon) icon/MaxColors(icon) The icon is blended with a second icon where the maximum of each RGB pixel is the result. Opacity may increase, as if the icons were blended with ICON_OR. You may supply a color in place of an icon. -icon/Opaque(background = "#000000") +icon/Opaque(background = COLOR_BLACK) All alpha values are set to 255 throughout the icon. Transparent pixels become black, or whatever background color you specify. icon/BecomeAlphaMask() You can convert a simple grayscale icon into an alpha mask to use with other icons very easily with this proc. @@ -242,8 +242,8 @@ world else // solid color new_icon = new(src) - new_icon.Blend("#000000", ICON_OVERLAY) - new_icon.SwapColor("#000000", null) + new_icon.Blend(COLOR_BLACK, ICON_OVERLAY) + new_icon.SwapColor(COLOR_BLACK, null) new_icon.Blend(icon, ICON_OVERLAY) var/icon/blend_icon = new(src) blend_icon.Opaque() @@ -251,7 +251,7 @@ world Blend(new_icon, ICON_OR) // make this icon fully opaque--transparent pixels become black -/icon/proc/Opaque(background = "#000000") +/icon/proc/Opaque(background = COLOR_BLACK) SwapColor(null, background) MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,1) @@ -282,7 +282,7 @@ world /// Converts a list storing hsva into an rgb color /proc/hsv2rgb(hsv) if(length(hsv) < 3) - return "#000000" + return COLOR_BLACK if(length(hsv) == 3) return rgb(hsv[1], hsv[2], hsv[3], space = COLORSPACE_HSV) return rgb(hsv[1], hsv[2], hsv[3], hsv[4], space = COLORSPACE_HSV) @@ -372,7 +372,7 @@ world var/tone_gray = TONE[1]*0.3 + TONE[2]*0.59 + TONE[3]*0.11 if(gray <= tone_gray) - return BlendRGB("#000000", tone, gray/(tone_gray || 1)) + return BlendRGB(COLOR_BLACK, tone, gray/(tone_gray || 1)) else return BlendRGB(tone, "#ffffff", (gray-tone_gray)/((255-tone_gray) || 1)) diff --git a/code/__HELPERS/logging/antagonists.dm b/code/__HELPERS/logging/antagonists.dm index 3d06bb325ec..5df39c69ade 100644 --- a/code/__HELPERS/logging/antagonists.dm +++ b/code/__HELPERS/logging/antagonists.dm @@ -21,3 +21,7 @@ /// Logging for wizard powers learned /proc/log_spellbook(text, list/data) logger.Log(LOG_CATEGORY_UPLINK_SPELL, text, data) + +/// Logs bounties completed by spies and their rewards +/proc/log_spy(text, list/data) + logger.Log(LOG_CATEGORY_UPLINK_SPY, text, data) diff --git a/code/__HELPERS/logging/atmos.dm b/code/__HELPERS/logging/atmos.dm index 0fcded5c7ab..644c9e65625 100644 --- a/code/__HELPERS/logging/atmos.dm +++ b/code/__HELPERS/logging/atmos.dm @@ -1,8 +1,48 @@ /// Logs the contents of the gasmix to the game log, prefixed by text -/proc/log_atmos(text, datum/gas_mixture/mix) - var/message = text - message += "TEMP=[mix.temperature], MOL=[mix.total_moles()], VOL=[mix.volume] " - for(var/key in mix.gases) - var/list/gaslist = mix.gases[key] - message += "[gaslist[GAS_META][META_GAS_ID]]=[gaslist[MOLES]];" - log_game(message) +/proc/log_atmos(text, datum/gas_mixture/gas_mixture) + var/message = "[text]\"[print_gas_mixture(gas_mixture)]\"" + //Cache commonly accessed information. + var/list/gases = gas_mixture.gases //List of gas datum paths that are associated with a list of information related to the gases. + var/heat_capacity = gas_mixture.heat_capacity() + var/temperature = gas_mixture.return_temperature() + var/thermal_energy = temperature * heat_capacity + var/volume = gas_mixture.return_volume() + var/pressure = gas_mixture.return_pressure() + var/total_moles = gas_mixture.total_moles() + ///The total value of the gas mixture in credits. + var/total_value = 0 + var/list/specific_gas_data = list() + + //Gas specific information assigned to each gas. + for(var/datum/gas/gas_path as anything in gases) + var/list/gas = gases[gas_path] + var/moles = gas[MOLES] + var/composition = moles / total_moles + var/energy = temperature * moles * gas[GAS_META][META_GAS_SPECIFIC_HEAT] + var/value = initial(gas_path.base_value) * moles + total_value += value + specific_gas_data[gas[GAS_META][META_GAS_NAME]] = list( + "moles" = moles, + "composition" = composition, + "molar concentration" = moles / volume, + "partial pressure" = composition * pressure, + "energy" = energy, + "energy density" = energy / volume, + "value" = value, + ) + + log_game( + message, + data = list( + "total moles" = total_moles, + "volume" = volume, + "molar density" = total_moles / volume, + "temperature" = temperature, + "pressure" = pressure, + "heat capacity" = heat_capacity, + "energy" = thermal_energy, + "energy density" = thermal_energy / volume, + "value" = total_value, + "gases" = specific_gas_data, + ) + ) diff --git a/code/__HELPERS/logging/attack.dm b/code/__HELPERS/logging/attack.dm index c58b150883d..149a05a5aff 100644 --- a/code/__HELPERS/logging/attack.dm +++ b/code/__HELPERS/logging/attack.dm @@ -80,6 +80,6 @@ log_game(bomb_message) GLOB.bombers += bomb_message - - if(message_admins) + var/area/bomb_area = get_area(bomb) + if(message_admins && !(bomb_area.area_flags & QUIET_LOGS)) // Don't spam the logs with deathmatch bombs message_admins("[user ? "[ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(user)] " : ""][details][bomb ? " [bomb.name] at [ADMIN_VERBOSEJMP(bomb)]": ""][additional_details ? " [additional_details]" : ""].") diff --git a/code/__HELPERS/logging/debug.dm b/code/__HELPERS/logging/debug.dm index c4ed2f1086f..ad5670d2d11 100644 --- a/code/__HELPERS/logging/debug.dm +++ b/code/__HELPERS/logging/debug.dm @@ -23,6 +23,9 @@ /proc/log_mapping(text, skip_world_log) #ifdef UNIT_TESTS GLOB.unit_test_mapping_logs += text +#endif +#ifdef MAP_TEST + message_admins("Mapping: [text]") #endif logger.Log(LOG_CATEGORY_DEBUG_MAPPING, text) if(skip_world_log) diff --git a/code/__HELPERS/logging/tool.dm b/code/__HELPERS/logging/tool.dm index b43d8a4b704..10b06dfaa08 100644 --- a/code/__HELPERS/logging/tool.dm +++ b/code/__HELPERS/logging/tool.dm @@ -1,3 +1,3 @@ /// Logging for tool usage -/proc/log_tool(text, mob/initiator) - logger.Log(LOG_CATEGORY_TOOL, text, initiator ? list("initiator" = initiator) : null) +/proc/log_tool(text) + logger.Log(LOG_CATEGORY_TOOL, text) diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index c28357eb478..0271b2e4601 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -131,50 +131,69 @@ * Returns: [SI_COEFFICIENT = si unit coefficient, SI_UNIT = prefixed si unit.] */ /proc/siunit_isolated(value, unit, maxdecimals=1) - var/static/list/prefixes = list("f","p","n","μ","m","","k","M","G","T","P") + var/static/list/prefixes = list("q","r","y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y","R","Q") // We don't have prefixes beyond this point // and this also captures value = 0 which you can't compute the logarithm for // and also byond numbers are floats and doesn't have much precision beyond this point anyway - if(abs(value) <= 1e-18) + if(abs(value) < 1e-30) . = list(SI_COEFFICIENT = 0, SI_UNIT = " [unit]") return - var/exponent = clamp(log(10, abs(value)), -15, 15) // Calculate the exponent and clamp it so we don't go outside the prefix list bounds + var/exponent = clamp(log(10, abs(value)), -30, 30) // Calculate the exponent and clamp it so we don't go outside the prefix list bounds var/divider = 10 ** (round(exponent / 3) * 3) // Rounds the exponent to nearest SI unit and power it back to the full form var/coefficient = round(value / divider, 10 ** -maxdecimals) // Calculate the coefficient and round it to desired decimals - var/prefix_index = round(exponent / 3) + 6 // Calculate the index in the prefixes list for this exponent + var/prefix_index = round(exponent / 3) + 11 // Calculate the index in the prefixes list for this exponent // An edge case which happens if we round 999.9 to 0 decimals for example, which gets rounded to 1000 // In that case, we manually swap up to the next prefix if there is one available - if(coefficient >= 1000 && prefix_index < 11) + if(coefficient >= 1000 && prefix_index < 21) coefficient /= 1e3 prefix_index++ var/prefix = prefixes[prefix_index] . = list(SI_COEFFICIENT = coefficient, SI_UNIT = " [prefix][unit]") -///Format a power value in prefixed watts. -/proc/display_power(powerused) - return siunit(powerused, "W", 3) +/**Format a power value in prefixed watts. + * Converts from energy if convert is true. + * Args: + * - power: The value of power to format. + * - convert: Whether to convert this from joules. + * - datum/controller/subsystem/scheduler: used in the conversion + * Returns: The string containing the formatted power. + */ +/proc/display_power(power, convert = TRUE, datum/controller/subsystem/scheduler = SSmachines) + power = convert ? energy_to_power(power, scheduler) : power + return siunit(power, "W", 3) -///Format an energy value in prefixed joules. -/proc/display_joules(units) +/** + * Format an energy value in prefixed joules. + * Arguments + * + * * units - the value t convert + */ +/proc/display_energy(units) return siunit(units, "J", 3) -/proc/joules_to_energy(joules) - return joules * (1 SECONDS) / SSmachines.wait +/** + * Converts the joule to the watt, assuming SSmachines tick rate. + * Arguments + * + * * joules - the value in joules to convert + * * datum/controller/subsystem/scheduler - the subsystem whos wait time is used in the conversion + */ +/proc/energy_to_power(joules, datum/controller/subsystem/scheduler = SSmachines) + return joules * (1 SECONDS) / scheduler.wait -/proc/energy_to_joules(energy_units) - return energy_units * SSmachines.wait / (1 SECONDS) - -///Format an energy value measured in Power Cell units. -/proc/display_energy(units) - // APCs process every (SSmachines.wait * 0.1) seconds, and turn 1 W of - // excess power into watts when charging cells. - // With the current configuration of wait=20 and CELLRATE=0.002, this - // means that one unit is 1 kJ. - return display_joules(energy_to_joules(units) WATTS) +/** + * Converts the watt to the joule, assuming SSmachines tick rate. + * * Arguments + * + * * joules - the value in joules to convert + * * datum/controller/subsystem/scheduler - the subsystem whos wait time is used in the conversion + */ +/proc/power_to_energy(watts, datum/controller/subsystem/scheduler = SSmachines) + return watts * scheduler.wait / (1 SECONDS) ///chances are 1:value. anyprob(1) will always return true /proc/anyprob(value) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5963ac57a4e..1b93f024285 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -12,7 +12,7 @@ /proc/random_eye_color() switch(pick(20;"brown",20;"hazel",20;"grey",15;"blue",15;"green",1;"amber",1;"albino")) if("brown") - return "#663300" + return COLOR_BROWNER_BROWN if("hazel") return "#554422" if("grey") @@ -26,7 +26,7 @@ if("albino") return "#" + pick("cc","dd","ee","ff") + pick("00","11","22","33","44","55","66","77","88","99") + pick("00","11","22","33","44","55","66","77","88","99") else - return "#000000" + return COLOR_BLACK /proc/random_underwear(gender) if(!GLOB.underwear_list.len) @@ -251,9 +251,26 @@ GLOBAL_LIST_EMPTY(species_list) * * Checks that `user` does not move, change hands, get stunned, etc. for the * given `delay`. Returns `TRUE` on success or `FALSE` on failure. - * Interaction_key is the assoc key under which the do_after is capped, with max_interact_count being the cap. Interaction key will default to target if not set. + * + * @param {mob} user - The mob performing the action. + * + * @param {number} delay - The time in deciseconds. Use the SECONDS define for readability. `1 SECONDS` is 10 deciseconds. + * + * @param {atom} target - The target of the action. This is where the progressbar will display. + * + * @param {flag} timed_action_flags - Flags to control the behavior of the timed action. + * + * @param {boolean} progress - Whether to display a progress bar / cogbar. + * + * @param {datum/callback} extra_checks - Additional checks to perform before the action is executed. + * + * @param {string} interaction_key - The assoc key under which the do_after is capped, with max_interact_count being the cap. Interaction key will default to target if not set. + * + * @param {number} max_interact_count - The maximum amount of interactions allowed. + * + * @param {boolean} hidden - By default, any action 1 second or longer shows a cog over the user while it is in progress. If hidden is set to TRUE, the cog will not be shown. */ -/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1) +/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) if(!user) return FALSE if(!isnum(delay)) @@ -280,8 +297,14 @@ GLOBAL_LIST_EMPTY(species_list) delay *= user.cached_multiplicative_actions_slowdown var/datum/progressbar/progbar + var/datum/cogbar/cog + if(progress) - progbar = new(user, delay, target || user) + if(user.client) + progbar = new(user, delay, target || user) + + if(!hidden && delay >= 1 SECONDS) + cog = new(user) SEND_SIGNAL(user, COMSIG_DO_AFTER_BEGAN) @@ -314,6 +337,8 @@ GLOBAL_LIST_EMPTY(species_list) if(!QDELETED(progbar)) progbar.end_progress() + + cog?.remove() if(interaction_key) var/reduced_interaction_count = (LAZYACCESS(user.do_afters, interaction_key) || 0) - 1 @@ -627,15 +652,15 @@ GLOBAL_LIST_EMPTY(species_list) moblist += mob_to_sort for(var/mob/dead/new_player/mob_to_sort in sortmob) moblist += mob_to_sort - for(var/mob/living/simple_animal/slime/mob_to_sort in sortmob) + for(var/mob/living/basic/slime/mob_to_sort in sortmob) moblist += mob_to_sort for(var/mob/living/simple_animal/mob_to_sort in sortmob) - // We've already added slimes. - if(isslime(mob_to_sort)) - continue moblist += mob_to_sort for(var/mob/living/basic/mob_to_sort in sortmob) moblist += mob_to_sort + // We've already added slimes. + if(isslime(mob_to_sort)) + continue // SKYRAT EDIT START - SOULCATCHERS for(var/mob/living/soulcatcher_soul/mob_to_sort in sortmob) moblist += mob_to_sort diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm index 28ef66aa45e..61e50601e78 100644 --- a/code/__HELPERS/paths/path.dm +++ b/code/__HELPERS/paths/path.dm @@ -281,7 +281,7 @@ /// Are we being thrown? var/thrown = FALSE /// Are we anchored - var/anchored = FLASH_LIGHT_POWER + var/anchored = FALSE /// Are we a ghost? (they have effectively unique pathfinding) var/is_observer = FALSE diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 24e4194593e..1d607e7d7a3 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -742,86 +742,6 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) count++ return objective_parts.Join("
") -/datum/controller/subsystem/ticker/proc/save_admin_data() - if(IsAdminAdvancedProcCall()) - to_chat(usr, "Admin rank DB Sync blocked: Advanced ProcCall detected.") - return - if(CONFIG_GET(flag/admin_legacy_system)) //we're already using legacy system so there's nothing to save - return - else if(load_admins(TRUE)) //returns true if there was a database failure and the backup was loaded from - return - sync_ranks_with_db() - var/list/sql_admins = list() - for(var/i in GLOB.protected_admins) - var/datum/admins/A = GLOB.protected_admins[i] - sql_admins += list(list("ckey" = A.target, "rank" = A.rank_names())) - SSdbcore.MassInsert(format_table_name("admin"), sql_admins, duplicate_key = TRUE) - var/datum/db_query/query_admin_rank_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] p INNER JOIN [format_table_name("admin")] a ON p.ckey = a.ckey SET p.lastadminrank = a.rank") - query_admin_rank_update.Execute() - qdel(query_admin_rank_update) - - //json format backup file generation stored per server - var/json_file = file("data/admins_backup.json") - var/list/file_data = list( - "ranks" = list(), - "admins" = list(), - "connections" = list(), - ) - for(var/datum/admin_rank/R in GLOB.admin_ranks) - file_data["ranks"]["[R.name]"] = list() - file_data["ranks"]["[R.name]"]["include rights"] = R.include_rights - file_data["ranks"]["[R.name]"]["exclude rights"] = R.exclude_rights - file_data["ranks"]["[R.name]"]["can edit rights"] = R.can_edit_rights - - for(var/admin_ckey in GLOB.admin_datums + GLOB.deadmins) - var/datum/admins/admin = GLOB.admin_datums[admin_ckey] - - if(!admin) - admin = GLOB.deadmins[admin_ckey] - if (!admin) - continue - - file_data["admins"][admin_ckey] = admin.rank_names() - - if (admin.owner) - file_data["connections"][admin_ckey] = list( - "cid" = admin.owner.computer_id, - "ip" = admin.owner.address, - ) - - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/ticker/proc/update_everything_flag_in_db() - for(var/datum/admin_rank/R in GLOB.admin_ranks) - var/list/flags = list() - if(R.include_rights == R_EVERYTHING) - flags += "flags" - if(R.exclude_rights == R_EVERYTHING) - flags += "exclude_flags" - if(R.can_edit_rights == R_EVERYTHING) - flags += "can_edit_flags" - if(!flags.len) - continue - var/flags_to_check = flags.Join(" != [R_EVERYTHING] AND ") + " != [R_EVERYTHING]" - var/datum/db_query/query_check_everything_ranks = SSdbcore.NewQuery( - "SELECT flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] WHERE rank = :rank AND ([flags_to_check])", - list("rank" = R.name) - ) - if(!query_check_everything_ranks.Execute()) - qdel(query_check_everything_ranks) - return - if(query_check_everything_ranks.NextRow()) //no row is returned if the rank already has the correct flag value - var/flags_to_update = flags.Join(" = [R_EVERYTHING], ") + " = [R_EVERYTHING]" - var/datum/db_query/query_update_everything_ranks = SSdbcore.NewQuery( - "UPDATE [format_table_name("admin_ranks")] SET [flags_to_update] WHERE rank = :rank", - list("rank" = R.name) - ) - if(!query_update_everything_ranks.Execute()) - qdel(query_update_everything_ranks) - return - qdel(query_update_everything_ranks) - qdel(query_check_everything_ranks) /datum/controller/subsystem/ticker/proc/cheevo_report() var/list/parts = list() diff --git a/code/__HELPERS/~skyrat_helpers/is_helpers.dm b/code/__HELPERS/~skyrat_helpers/is_helpers.dm index 443819ba92e..6cc72ba9074 100644 --- a/code/__HELPERS/~skyrat_helpers/is_helpers.dm +++ b/code/__HELPERS/~skyrat_helpers/is_helpers.dm @@ -17,6 +17,7 @@ #define ishemophage(A) (is_species(A, /datum/species/hemophage)) #define issnail(A) (is_species(A, /datum/species/snail)) #define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent)) +#define isprimitivedemihuman(A) (is_species(A, /datum/species/human/felinid/primitive)) #define isshadekin(A) (is_species(A, /datum/species/shadekin)) //BUBBERSTATION EDIT //Antags #define ishorrorling(A) (istype(A, /mob/living/simple_animal/hostile/true_changeling)) diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index 5eb4bda14e7..87d4348580e 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -2,11 +2,11 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 515 -#define MIN_COMPILER_BUILD 1621 +#define MIN_COMPILER_BUILD 1627 #if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. -#error You need version 515.1621 or higher +#error You need version 515.1627 or higher #endif // Keep savefile compatibilty at minimum supported level diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 2a4854c37b8..8768a1e3622 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -142,3 +142,12 @@ #warn In order to build, run BUILD.bat in the root directory. #warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. #endif + +/// Runs the game in "map test mode" +/// Map test mode prevents common annoyances, such as rats from spawning and random light fixture breakage, +/// so mappers can test important facets of their map (working powernet, atmos, good light coverage) without these interfering. +// #define MAP_TEST + +#ifdef MAP_TEST +#warn Compiling in MAP_TEST mode. Certain game mechanics will be disabled. +#endif diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 31e86401d9a..5a43e73cd6c 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -318,7 +318,8 @@ DEFINE_BITFIELD(resistance_flags, list( "UNACIDABLE" = UNACIDABLE, "ACID_PROOF" = ACID_PROOF, "INDESTRUCTIBLE" = INDESTRUCTIBLE, - "FREEZE_PROOF" = FREEZE_PROOF + "FREEZE_PROOF" = FREEZE_PROOF, + "SHUTTLE_CRUSH_PROOF" = SHUTTLE_CRUSH_PROOF )) DEFINE_BITFIELD(sight, list( diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index b77942bad87..45f59fb4475 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -111,6 +111,7 @@ GLOBAL_LIST_EMPTY(gorilla_start) GLOBAL_LIST_EMPTY(wizardstart) GLOBAL_LIST_EMPTY(nukeop_start) GLOBAL_LIST_EMPTY(nukeop_leader_start) +GLOBAL_LIST_EMPTY(nukeop_overwatch_start) GLOBAL_LIST_EMPTY(newplayer_start) GLOBAL_LIST_EMPTY(prisonwarp) //admin prisoners go to these GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here (ninja energy net) @@ -151,3 +152,26 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list( /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/dragon = 4, )) + +/// List of how many minerals spawned based on proximity to an ore vent. +GLOBAL_LIST_INIT(post_ore_random, list( + "[ORE_WALL_FAR]" = 0, + "[ORE_WALL_LOW]" = 0, + "[ORE_WALL_MEDIUM]" = 0, + "[ORE_WALL_HIGH]" = 0, + "[ORE_WALL_VERY_HIGH]" = 0, +)) +/// List of how many minerals spawned randomly off of mining Z-levels, and at what quantity. +GLOBAL_LIST_INIT(post_ore_manual, list( + "[ORE_WALL_FAR]" = 0, + "[ORE_WALL_LOW]" = 0, + "[ORE_WALL_MEDIUM]" = 0, + "[ORE_WALL_HIGH]" = 0, + "[ORE_WALL_VERY_HIGH]" = 0, +)) +/// List of how many ore vents spawned, and of what size. +GLOBAL_LIST_INIT(ore_vent_sizes, list( + LARGE_VENT_TYPE = 0, + MEDIUM_VENT_TYPE = 0, + SMALL_VENT_TYPE = 0, +)) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 2de6a1c691f..4e33aa43708 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_EMPTY(human_list) //all instances of /mob/living/carbon/human and su GLOBAL_LIST_EMPTY(ai_list) GLOBAL_LIST_EMPTY(pai_list) GLOBAL_LIST_EMPTY(available_ai_shells) -GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list(),list())) // One for each AI_* status define +GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list())) // One for each AI_* status define GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(bots_list) GLOBAL_LIST_EMPTY(aiEyes) diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index a6031b1745e..f436bdf9d9f 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(nearsighted_glasses, list( )) -///Options for the prothetic limb quirk to choose from +///Options for the prosthetic limb quirk to choose from GLOBAL_LIST_INIT(limb_choice, list( "Left Arm" = /obj/item/bodypart/arm/left/robot/surplus, "Right Arm" = /obj/item/bodypart/arm/right/robot/surplus, @@ -20,9 +20,77 @@ GLOBAL_LIST_INIT(limb_choice, list( "Right Leg" = /obj/item/bodypart/leg/right/robot/surplus, )) -GLOBAL_LIST_INIT(limb_choice_transhuman, list( + +///Transhumanist quirk +GLOBAL_LIST_INIT(part_choice_transhuman, list( "Left Arm" = /obj/item/bodypart/arm/left/robot, "Right Arm" = /obj/item/bodypart/arm/right/robot, "Left Leg" = /obj/item/bodypart/leg/left/robot, "Right Leg" = /obj/item/bodypart/leg/right/robot, + "Robotic Voice Box" = /obj/item/organ/internal/tongue/robot, + "Flashlights for Eyes" = /obj/item/organ/internal/eyes/robotic/flashlight, +)) + +///Hemiplegic Quirk +GLOBAL_LIST_INIT(side_choice_hemiplegic, list( + "Left Side" = /datum/brain_trauma/severe/paralysis/hemiplegic/left, + "Right Side" = /datum/brain_trauma/severe/paralysis/hemiplegic/right, +)) + +///Options for the Junkie quirk to choose from +GLOBAL_LIST_INIT(possible_junkie_addictions, setup_junkie_addictions(list( + /datum/reagent/drug/blastoff, + /datum/reagent/drug/krokodil, + /datum/reagent/medicine/morphine, + /datum/reagent/drug/happiness, + /datum/reagent/drug/methamphetamine, +))) + +///Options for the Smoker quirk to choose from +GLOBAL_LIST_INIT(possible_smoker_addictions, setup_junkie_addictions(list( + /obj/item/storage/fancy/cigarettes, + /obj/item/storage/fancy/cigarettes/cigpack_midori, + /obj/item/storage/fancy/cigarettes/cigpack_uplift, + /obj/item/storage/fancy/cigarettes/cigpack_robust, + /obj/item/storage/fancy/cigarettes/cigpack_robustgold, + /obj/item/storage/fancy/cigarettes/cigpack_carp, + /obj/item/storage/fancy/cigarettes/cigars, + /obj/item/storage/fancy/cigarettes/cigars/cohiba, + /obj/item/storage/fancy/cigarettes/cigars/havana, +))) + +///Options for the Alcoholic quirk to choose from +GLOBAL_LIST_INIT(possible_alcoholic_addictions, list( + "Beekhof Blauw Curaçao" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/curacao, "reagent" = /datum/reagent/consumable/ethanol/curacao), + "Buckin' Bronco's Applejack" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/applejack, "reagent" = /datum/reagent/consumable/ethanol/applejack), + "Voltaic Yellow Wine" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic, "reagent" = /datum/reagent/consumable/ethanol/wine_voltaic), + "Caccavo Guaranteed Quality Tequila" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/tequila, "reagent" = /datum/reagent/consumable/ethanol/tequila), + "Captain Pete's Cuban Spiced Rum" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/rum, "reagent" = /datum/reagent/consumable/ethanol/rum), + "Chateau De Baton Premium Cognac" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/cognac, "reagent" = /datum/reagent/consumable/ethanol/cognac), + "Doublebeard's Bearded Special Wine" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/wine, "reagent" = /datum/reagent/consumable/ethanol/wine), + "Extra-strong Absinthe" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/absinthe, "reagent" = /datum/reagent/consumable/ethanol/absinthe), + "Goldeneye Vermouth" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/vermouth, "reagent" = /datum/reagent/consumable/ethanol/vermouth), + "Griffeater Gin" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/gin, "reagent" = /datum/reagent/consumable/ethanol/gin), + "Jian Hard Cider" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/hcider, "reagent" = /datum/reagent/consumable/ethanol/hcider), + "Luini Amaretto" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/amaretto, "reagent" = /datum/reagent/consumable/ethanol/amaretto), + "Magm-Ale" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/ale, "reagent" = /datum/reagent/consumable/ethanol/ale), + "Phillipes Well-aged Grappa" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/grappa, "reagent" = /datum/reagent/consumable/ethanol/grappa), + "Pride Of The Union Navy-Strength Rum" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/navy_rum, "reagent" = /datum/reagent/consumable/ethanol/navy_rum), + "Rabid Bear Malt Liquor" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/maltliquor, "reagent" = /datum/reagent/consumable/ethanol/beer/maltliquor), + "Robert Robust's Coffee Liqueur" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/kahlua, "reagent" = /datum/reagent/consumable/ethanol/kahlua), + "Ryo's Traditional Sake " = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/sake, "reagent" = /datum/reagent/consumable/ethanol/sake), + "Space Beer" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/beer, "reagent" = /datum/reagent/consumable/ethanol/beer), + "Tunguska Triple Distilled" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/vodka, "reagent" = /datum/reagent/consumable/ethanol/vodka), + "Uncle Git's Special Reserve" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/whiskey, "reagent" = /datum/reagent/consumable/ethanol/whiskey), + "Breezy Shoals Coconut Rum" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/coconut_rum, "reagent" = /datum/reagent/consumable/ethanol/coconut_rum), + "Moonlabor Yūyake" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/yuyake, "reagent" = /datum/reagent/consumable/ethanol/yuyake), + "Shu-Kouba Straight Shochu" = list("bottlepath" = /obj/item/reagent_containers/cup/glass/bottle/shochu, "reagent" = /datum/reagent/consumable/ethanol/shochu) +)) + +///Options for Prosthetic Organ +GLOBAL_LIST_INIT(organ_choice, list( + "Heart" = ORGAN_SLOT_HEART, + "Lungs" = ORGAN_SLOT_LUNGS, + "Liver" = ORGAN_SLOT_LIVER, + "Stomach" = ORGAN_SLOT_STOMACH, )) diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 47b1008aa8a..44ac6d574cd 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -36,10 +36,10 @@ GLOBAL_LIST_INIT(reagent_containers, list( /obj/item/reagent_containers/pill/patch/style )), // SKYRAT EDIT ADDITION START - CAT_HYPOS = list( - /obj/item/reagent_containers/cup/vial/small, - /obj/item/reagent_containers/cup/vial/large, - ), + CAT_HYPOS = typecacheof(list( + /obj/item/reagent_containers/cup/vial/small/style, + /obj/item/reagent_containers/cup/vial/large/style, + )), CAT_DARTS = typecacheof(list( /obj/item/reagent_containers/syringe/smartdart )), diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index bfd3a6846f1..ea1d939351d 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(phobia_regexes, list( GLOBAL_LIST_INIT(phobia_mobs, list( "aliens" = typecacheof(list( /mob/living/carbon/alien, - /mob/living/simple_animal/slime, + /mob/living/basic/slime, )), "anime" = typecacheof(list(/mob/living/basic/guardian)), "birds" = typecacheof(list( diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index f31cc3fc49c..1956a6061ad 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -10,6 +10,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_AI_PAUSED" = TRAIT_AI_PAUSED, "TRAIT_BANNED_FROM_CARGO_SHUTTLE" = TRAIT_BANNED_FROM_CARGO_SHUTTLE, "TRAIT_BEING_SHOCKED" = TRAIT_BEING_SHOCKED, + "TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED, "TRAIT_CLIMBABLE" = TRAIT_CLIMBABLE, "TRAIT_CURRENTLY_CLEANING" = TRAIT_CURRENTLY_CLEANING, "TRAIT_CUSTOMIZABLE_REAGENT_HOLDER" = TRAIT_CUSTOMIZABLE_REAGENT_HOLDER, @@ -18,7 +19,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DRYABLE" = TRAIT_DRYABLE, "TRAIT_FOOD_CHEF_MADE" = TRAIT_FOOD_CHEF_MADE, "TRAIT_FOOD_FRIED" = TRAIT_FOOD_FRIED, - "TRAIT_FOOD_GRILLED" = TRAIT_FOOD_GRILLED, "TRAIT_FOOD_SILVER" = TRAIT_FOOD_SILVER, "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, "TRAIT_LIGHTING_DEBUGGED" = TRAIT_LIGHTING_DEBUGGED, @@ -26,6 +26,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_RUSTY" = TRAIT_RUSTY, "TRAIT_SPINNING" = TRAIT_SPINNING, "TRAIT_STICKERED" = TRAIT_STICKERED, + "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED, ), /atom/movable = list( "TRAIT_ACTIVE_STORAGE" = TRAIT_ACTIVE_STORAGE, @@ -84,6 +86,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "STATION_TRAIT_FILLED_MAINT" = STATION_TRAIT_FILLED_MAINT, "STATION_TRAIT_FORESTED" = STATION_TRAIT_FORESTED, "STATION_TRAIT_HANGOVER" = STATION_TRAIT_HANGOVER, + "STATION_TRAIT_HUMAN_AI" = STATION_TRAIT_HUMAN_AI, "STATION_TRAIT_LATE_ARRIVALS" = STATION_TRAIT_LATE_ARRIVALS, "STATION_TRAIT_LOANER_SHUTTLE" = STATION_TRAIT_LOANER_SHUTTLE, "STATION_TRAIT_MEDBOT_MANIA" = STATION_TRAIT_MEDBOT_MANIA, @@ -99,6 +102,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "STATION_TRAIT_UNNATURAL_ATMOSPHERE" = STATION_TRAIT_UNNATURAL_ATMOSPHERE, "STATION_TRAIT_VENDING_SHORTAGE" = STATION_TRAIT_VENDING_SHORTAGE, ), + /datum/deathmatch_lobby = list( + "TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS" = TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS, + ), /datum/wound = list( "TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED, ), @@ -135,7 +141,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS, "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, - "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, @@ -176,6 +181,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DISEASELIKE_SEVERITY_MEDIUM" = TRAIT_DISEASELIKE_SEVERITY_MEDIUM, "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, "TRAIT_DISGUISED" = TRAIT_DISGUISED, + "DISPLAYS_JOB_IN_BINARY" = DISPLAYS_JOB_IN_BINARY, "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, "TRAIT_DISSECTED" = TRAIT_DISSECTED, "TRAIT_DONT_WRITE_MEMORY" = TRAIT_DONT_WRITE_MEMORY, @@ -195,6 +201,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, + "TRAIT_EXAMINE_FISHING_SPOT" = TRAIT_EXAMINE_FISHING_SPOT, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, @@ -253,6 +260,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HULK" = TRAIT_HULK, "TRAIT_HUSK" = TRAIT_HUSK, "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, + "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY, @@ -287,6 +295,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, "TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE, "TRAIT_MOB_BREEDER" = TRAIT_MOB_BREEDER, + "TRAIT_MOB_EATER" = TRAIT_MOB_EATER, "TRAIT_MOB_TIPPED" = TRAIT_MOB_TIPPED, "TRAIT_MORBID" = TRAIT_MORBID, "TRAIT_MULTIZ_SUIT_SENSORS" = TRAIT_MULTIZ_SUIT_SENSORS, @@ -344,6 +353,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, + "TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_ON_ELEVATED_SURFACE" = TRAIT_ON_ELEVATED_SURFACE, "TRAIT_ORBITING_FORBIDDEN" = TRAIT_ORBITING_FORBIDDEN, @@ -379,6 +389,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_RDS_SUPPRESSED" = TRAIT_RDS_SUPPRESSED, "TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER, "TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC, + "TRAIT_REGEN_SHIELD" = TRAIT_REGEN_SHIELD, "TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER, "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, "TRAIT_RESEARCH_SCANNER" = TRAIT_RESEARCH_SCANNER, @@ -394,6 +405,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_RIFT_FAILURE" = TRAIT_RIFT_FAILURE, "TRAIT_ROCK_EATER" = TRAIT_ROCK_EATER, "TRAIT_ROCK_METAMORPHIC" = TRAIT_ROCK_METAMORPHIC, + "TRAIT_ROCK_STONER" = TRAIT_ROCK_STONER, "TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX, "TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO, "TRAIT_SACRIFICED" = TRAIT_SACRIFICED, @@ -425,6 +437,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, "TRAIT_STASIS" = TRAIT_STASIS, + "TRAIT_STIMULATED" = TRAIT_STIMULATED, "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, "TRAIT_SUCCUMB_OVERRIDE" = TRAIT_SUCCUMB_OVERRIDE, @@ -482,6 +495,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, + "TRAIT_MAFIAINITIATE" = TRAIT_MAFIAINITIATE, ), /obj/item = list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, @@ -560,6 +574,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, "TRAIT_CULINARY_METABOLISM" = TRAIT_CULINARY_METABOLISM, "TRAIT_ENGINEER_METABOLISM" = TRAIT_ENGINEER_METABOLISM, + "TRAIT_HUMAN_AI_METABOLISM" = TRAIT_HUMAN_AI_METABOLISM, "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM, "TRAIT_MAINTENANCE_METABOLISM" = TRAIT_MAINTENANCE_METABOLISM, "TRAIT_MEDICAL_METABOLISM" = TRAIT_MEDICAL_METABOLISM, @@ -569,9 +584,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/item/organ/internal/lungs = list( "TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING, ), - /obj/item/reagent_containers = list( - "TRAIT_MAY_CONTAIN_BLENDED_DUST" = TRAIT_MAY_CONTAIN_BLENDED_DUST, - ), /obj/machinery/modular_computer = list( "TRAIT_MODPC_INTERACTING_WITH_FRAME" = TRAIT_MODPC_INTERACTING_WITH_FRAME, ), diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 7f034e9a4c1..d30917b197e 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -4,6 +4,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( /atom = list( + "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, ), /atom/movable = list( @@ -35,7 +36,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_BALD" = TRAIT_BALD, "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, - "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, "TRAIT_BONSAI" = TRAIT_BONSAI, @@ -49,6 +49,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, "TRAIT_CLUMSY" = TRAIT_CLUMSY, + "TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, "TRAIT_DEAF" = TRAIT_DEAF, @@ -95,6 +96,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, "TRAIT_HOLY" = TRAIT_HOLY, "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 92defc66101..9d4343c132e 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -230,7 +230,7 @@ return for(var/datum/action/action as anything in take_from.actions) - if(!action.show_to_observers) + if(!action.show_to_observers || !action.owner_has_control) continue action.GiveAction(src) RegisterSignal(take_from, COMSIG_MOB_GRANTED_ACTION, PROC_REF(on_observing_action_granted)) @@ -251,7 +251,7 @@ /mob/proc/on_observing_action_granted(mob/living/source, datum/action/action) SIGNAL_HANDLER - if(!action.show_to_observers) + if(!action.show_to_observers || !action.owner_has_control) return action.GiveAction(src) diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 5f687d19642..e9650e35d1f 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -172,6 +172,66 @@ var/mob/living/silicon/ai/AI = usr AI.drop_new_multicam() +/atom/movable/screen/ai/floor_indicator + icon_state = "zindicator" + screen_loc = ui_ai_floor_indicator + +/atom/movable/screen/ai/floor_indicator/Initialize(mapload, datum/hud/hud_owner) + . = ..() + if(istype(hud_owner)) + RegisterSignal(hud_owner, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(update_z)) + update_z() + +/atom/movable/screen/ai/floor_indicator/proc/update_z(datum/hud/source) + SIGNAL_HANDLER + var/mob/living/silicon/ai/ai = get_mob() //if you use this for anyone else i will find you + if(isnull(ai)) + return + var/turf/locturf = isturf(ai.loc) ? get_turf(ai.eyeobj) : get_turf(ai) //must be a var cuz error + var/ai_z = locturf.z + var/text = "Level
[ai_z]" + if(SSmapping.level_trait(ai_z, ZTRAIT_STATION)) + text = "Floor
[ai_z - 1]" + else if (SSmapping.level_trait(ai_z, ZTRAIT_NOPHASE)) + text = "ERROR" + maptext = MAPTEXT_TINY_UNICODE("
[text]
") + +/atom/movable/screen/ai/go_up + name = "go up" + icon_state = "up" + screen_loc = ui_ai_godownup + +/atom/movable/screen/ai/go_up/Initialize(mapload) + . = ..() + register_context() + +/atom/movable/screen/ai/go_up/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_LMB] = "Go up a floor" + return CONTEXTUAL_SCREENTIP_SET + +/atom/movable/screen/ai/go_up/Click(location,control,params) + var/mob/ai = get_mob() //the core + flick("uppressed",src) + if(!isturf(ai.loc) || usr != ai) //aicard and stuff + return + ai.up() + +/atom/movable/screen/ai/go_up/down + name = "go down" + icon_state = "down" + +/atom/movable/screen/ai/go_up/down/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_LMB] = "Go down a floor" + return CONTEXTUAL_SCREENTIP_SET + +/atom/movable/screen/ai/go_up/down/Click(location,control,params) + var/mob/ai = get_mob() //the core + flick("downpressed",src) + if(!isturf(ai.loc) || usr != ai) //aicard and stuff + return + ai.down() /datum/hud/ai ui_style = 'icons/hud/screen_ai.dmi' @@ -186,6 +246,14 @@ using.screen_loc = ui_ai_language_menu static_inventory += using +// Z-level floor change + using = new /atom/movable/screen/ai/floor_indicator(null, src) //These come with their own predefined screen locs + static_inventory += using + using = new /atom/movable/screen/ai/go_up(null, src) + static_inventory += using + using = new /atom/movable/screen/ai/go_up/down(null, src) + static_inventory += using + //AI core using = new /atom/movable/screen/ai/aicore(null, src) using.screen_loc = ui_ai_core diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 1f5f7588162..ac10680db27 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -68,8 +68,8 @@ if(client && hud_used) hud_used.reorganize_alerts() if(!no_anim) - thealert.transform = matrix(32, 6, MATRIX_TRANSLATE) - animate(thealert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) + thealert.transform = matrix(32, 0, MATRIX_TRANSLATE) + animate(thealert, transform = matrix(), time = 1 SECONDS, easing = ELASTIC_EASING) if(timeout_override) thealert.timeout = timeout_override if(thealert.timeout) @@ -185,22 +185,6 @@ //End gas alerts - -/atom/movable/screen/alert/fat - name = "Fat" - desc = "You ate too much food, lardass. Run around the station and lose some weight." - icon_state = "fat" - -/atom/movable/screen/alert/hungry - name = "Hungry" - desc = "Some food would be good right about now." - icon_state = "hungry" - -/atom/movable/screen/alert/starving - name = "Starving" - desc = "You're severely malnourished. The hunger pains make moving around a chore." - icon_state = "starving" - /atom/movable/screen/alert/gross name = "Grossed out." desc = "That was kind of gross..." @@ -887,7 +871,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." set_never_round() return if(LAZYACCESS(modifiers, CTRL_CLICK) && poll.jump_to_me) - jump_to_pic_source() + jump_to_jump_target() return handle_sign_up() @@ -907,7 +891,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." poll.undo_never_for_this_round(owner) color = initial(color) -/atom/movable/screen/alert/poll_alert/proc/jump_to_pic_source() +/atom/movable/screen/alert/poll_alert/proc/jump_to_jump_target() if(!poll?.jump_to_me || !isobserver(owner)) return var/turf/target_turf = get_turf(poll.jump_to_me) @@ -921,7 +905,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(href_list["signup"]) handle_sign_up() if(href_list["jump"]) - jump_to_pic_source() + jump_to_jump_target() return /atom/movable/screen/alert/poll_alert/proc/update_signed_up_overlay() @@ -1034,41 +1018,39 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." // PRIVATE = only edit, use, or override these if you're editing the system as a whole +/// Gets the placement for the alert based on its index +/datum/hud/proc/get_ui_alert_placement(index) + // Only has support for 5 slots currently + if(index > 5) + return "" + + return "EAST-1:28,CENTER+[6 - index]:[29 - (index * 2)]" + // Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there /datum/hud/proc/reorganize_alerts(mob/viewmob) var/mob/screenmob = viewmob || mymob if(!screenmob.client) - return + return FALSE var/list/alerts = mymob.alerts if(!hud_shown) for(var/i in 1 to alerts.len) screenmob.client.screen -= alerts[alerts[i]] - return 1 - for(var/i in 1 to alerts.len) + return TRUE + for(var/i in 1 to length(alerts)) var/atom/movable/screen/alert/alert = alerts[alerts[i]] if(alert.icon_state == "template") alert.icon = ui_style - switch(i) - if(1) - . = ui_alert1 - if(2) - . = ui_alert2 - if(3) - . = ui_alert3 - if(4) - . = ui_alert4 - if(5) - . = ui_alert5 // Right now there's 5 slots - else - . = "" - alert.screen_loc = . + alert.screen_loc = get_ui_alert_placement(i) screenmob.client.screen |= alert if(!viewmob) - for(var/M in mymob.observers) - reorganize_alerts(M) - return 1 + 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) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 3c1b1029a3e..c3b91173a45 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -63,6 +63,10 @@ using.screen_loc = ui_alien_language_menu static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_alien_floor_menu + static_inventory += using + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu static_inventory += using @@ -87,7 +91,7 @@ pull_icon.update_appearance() pull_icon.screen_loc = ui_above_movement static_inventory += pull_icon - + rest_icon = new /atom/movable/screen/rest(null, src) rest_icon.icon = ui_style rest_icon.screen_loc = ui_above_intent diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index d9ebb3611b6..77d135ce2c6 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -32,6 +32,10 @@ using.screen_loc = ui_alien_language_menu static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_alien_floor_menu + static_inventory += using + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu static_inventory += using diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 79f857e8cbe..83ac1b8be93 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -187,7 +187,7 @@ icon_state = "flash" plane = SPLASHSCREEN_PLANE layer = CINEMATIC_LAYER - color = "#000000" + color = COLOR_BLACK show_when_dead = TRUE /atom/movable/screen/fullscreen/lighting_backdrop diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index 64ad896d57a..aac5a2b75cc 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -43,6 +43,9 @@ using.icon = ui_style static_inventory += using + healthdoll = new /atom/movable/screen/healthdoll/living(null, src) + infodisplay += healthdoll + mymob.canon_client?.clear_screen() for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 99b04df9068..e20c1ede2f6 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -86,6 +86,16 @@ using.icon = ui_style static_inventory += using + using = new /atom/movable/screen/language_menu(null, src) + using.screen_loc = ui_ghost_language_menu + using.icon = ui_style + static_inventory += using + + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_ghost_floor_menu + using.icon = ui_style + static_inventory += using + /datum/hud/ghost/show_hud(version = 0, mob/viewmob) // don't show this HUD if observing; show the HUD of the observee var/mob/dead/observer/O = mymob diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index ba5f987a473..53d339d4269 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -118,6 +118,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( var/atom/movable/screen/stamina var/atom/movable/screen/healthdoll var/atom/movable/screen/spacesuit + var/atom/movable/screen/hunger // subtypes can override this to force a specific UI style var/ui_style var/erp_ui_style //SKYRAT EDIT - ADDITION - ERP ICONS FIX @@ -264,6 +265,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( stamina = null healthdoll = null spacesuit = null + hunger = null blobpwrdisplay = null alien_plasma_display = null alien_queen_finder = null diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 11f186e9877..39cb742d672 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -70,6 +70,10 @@ using.icon = ui_style static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.icon = ui_style + static_inventory += using + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle @@ -268,6 +272,9 @@ healths = new /atom/movable/screen/healths(null, src) infodisplay += healths + hunger = new /atom/movable/screen/hunger(null, src) + infodisplay += hunger + healthdoll = new /atom/movable/screen/healthdoll(null, src) infodisplay += healthdoll diff --git a/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm b/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm index 63206afdaa9..fa438af4b70 100644 --- a/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm +++ b/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm @@ -312,7 +312,7 @@ // Has a nice effect, makes thing stand out color = list(1.2,0,0,0, 0,1.2,0,0, 0,0,1.2,0, 0,0,0,1, 0,0,0,0) // This serves a similar purpose, I want the pipes to pop - add_filter("pipe_dropshadow", 1, drop_shadow_filter(x = -1, y= -1, size = 1, color = "#0000007A")) + add_filter("pipe_dropshadow", 1, drop_shadow_filter(x = -1, y= -1, size = 1, color = COLOR_HALF_TRANSPARENT_BLACK)) mirror_parent_hidden() /atom/movable/screen/plane_master/camera_static diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index fdc03364e3f..ae7ac6fee91 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -77,6 +77,7 @@ var/mob/living/silicon/robot/robit = mymob var/atom/movable/screen/using +// Language using = new/atom/movable/screen/language_menu(null, src) using.screen_loc = ui_borg_language_menu static_inventory += using @@ -86,6 +87,11 @@ using.screen_loc = ui_borg_navigate_menu static_inventory += using +// Z-level floor change + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_borg_floor_menu + static_inventory += using + //Radio using = new /atom/movable/screen/robot/radio(null, src) using.screen_loc = ui_borg_radio diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 899ce562472..34bfaf7acd2 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -35,6 +35,12 @@ /// If FALSE, this will not be cleared when calling /client/clear_screen() var/clear_with_screen = TRUE + /// If TRUE, clicking the screen element will fall through and perform a default "Click" call + /// Obviously this requires your Click override, if any, to call parent on their own. + /// This is set to FALSE to default to dissade you from doing this. + /// Generally we don't want default Click stuff, which results in bugs like using Telekinesis on a screen element + /// or trying to point your gun at your screen. + var/default_click = FALSE /atom/movable/screen/Initialize(mapload, datum/hud/hud_owner) . = ..() @@ -46,6 +52,12 @@ hud = null return ..() +/atom/movable/screen/Click(location, control, params) + if(flags_1 & INITIALIZED_1) + SEND_SIGNAL(src, COMSIG_SCREEN_ELEMENT_CLICK, location, control, params, usr) + if(default_click) + return ..() + /atom/movable/screen/examine(mob/user) return list() @@ -127,6 +139,33 @@ /atom/movable/screen/language_menu/Click() usr.get_language_holder().open_language_menu(usr) +/atom/movable/screen/floor_menu + name = "change floor" + icon = 'icons/hud/screen_midnight.dmi' + icon_state = "floor_change" + screen_loc = ui_floor_menu + +/atom/movable/screen/floor_menu/Initialize(mapload) + . = ..() + register_context() + +/atom/movable/screen/floor_menu/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + context[SCREENTIP_CONTEXT_LMB] = "Go up a floor" + context[SCREENTIP_CONTEXT_RMB] = "Go down a floor" + return CONTEXTUAL_SCREENTIP_SET + +/atom/movable/screen/floor_menu/Click(location,control,params) + var/list/modifiers = params2list(params) + + if(LAZYACCESS(modifiers, RIGHT_CLICK) || LAZYACCESS(modifiers, ALT_CLICK)) + usr.down() + return + + usr.up() + return + /atom/movable/screen/inventory /// The identifier for the slot. It has nothing to do with ID cards. var/slot_id @@ -190,7 +229,7 @@ item_overlay.alpha = 92 if(!holding.mob_can_equip(user, slot_id, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) - item_overlay.color = "#FF0000" + item_overlay.color = COLOR_RED else item_overlay.color = "#00ff00" @@ -345,7 +384,7 @@ /atom/movable/screen/mov_intent/proc/toggle(mob/living/user) if(!istype(user)) return - user.toggle_move_intent(user) + user.toggle_move_intent() /atom/movable/screen/pull name = "stop pulling" @@ -627,9 +666,6 @@ icon_state = "mood5" screen_loc = ui_mood -/atom/movable/screen/mood/attack_tk() - return - /atom/movable/screen/splash icon = 'icons/blanks/blank_title.png' icon_state = "" @@ -723,3 +759,102 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) name = "stamina" icon_state = "stamina0" screen_loc = ui_stamina + +#define HUNGER_STATE_FAT 2 +#define HUNGER_STATE_FULL 1 +#define HUNGER_STATE_FINE 0 +#define HUNGER_STATE_HUNGRY -1 +#define HUNGER_STATE_STARVING -2 + +/atom/movable/screen/hunger + name = "hunger" + icon_state = "hungerbar" + base_icon_state = "hungerbar" + screen_loc = ui_hunger + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /// What state of hunger are we in? + VAR_PRIVATE/state = HUNGER_STATE_FINE + /// What food icon do we show by the bar + var/food_icon = 'icons/obj/food/burgerbread.dmi' + /// What food icon state do we show by the bar + var/food_icon_state = "hburger" + /// The image shown by the bar. + VAR_PRIVATE/image/food_image + +/atom/movable/screen/hunger/Initialize(mapload, datum/hud/hud_owner) + . = ..() + var/mob/living/hungry = hud_owner?.mymob + if(!istype(hungry)) + return + + if(!ishuman(hungry) || CONFIG_GET(flag/disable_human_mood)) + screen_loc = ui_mood // Slot in where mood normally is if mood is disabled + + food_image = image(icon = food_icon, icon_state = food_icon_state, pixel_x = -5) + food_image.plane = plane + food_image.appearance_flags |= KEEP_APART // To be unaffected by filters applied to src + food_image.add_filter("simple_outline", 2, outline_filter(1, COLOR_BLACK)) + underlays += food_image // To be below filters applied to src + + SetInvisibility(INVISIBILITY_ABSTRACT, name) // Start invisible, update later + update_appearance() + +/atom/movable/screen/hunger/proc/update_hunger_state() + var/mob/living/hungry = hud?.mymob + if(!istype(hungry)) + return + + if(HAS_TRAIT(hungry, TRAIT_NOHUNGER) || !hungry.get_organ_slot(ORGAN_SLOT_STOMACH)) + state = HUNGER_STATE_FINE + return + + if(HAS_TRAIT(hungry, TRAIT_FAT)) + state = HUNGER_STATE_FAT + return + + switch(hungry.nutrition) + if(NUTRITION_LEVEL_FULL to INFINITY) + state = HUNGER_STATE_FULL + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL) + state = HUNGER_STATE_FINE + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + state = HUNGER_STATE_HUNGRY + if(0 to NUTRITION_LEVEL_STARVING) + state = HUNGER_STATE_STARVING + +/atom/movable/screen/hunger/update_appearance(updates) + var/old_state = state + update_hunger_state() // Do this before we call all the other update procs + . = ..() + if(state == old_state) // Let's not be wasteful + return + if(state == HUNGER_STATE_FINE) + SetInvisibility(INVISIBILITY_ABSTRACT, name) + return + + else if(invisibility) + RemoveInvisibility(name) + + if(state == HUNGER_STATE_STARVING) + if(!get_filter("hunger_outline")) + add_filter("hunger_outline", 1, list("type" = "outline", "color" = "#FF0033", "alpha" = 0, "size" = 2)) + animate(get_filter("hunger_outline"), alpha = 200, time = 1.5 SECONDS, loop = -1) + animate(alpha = 0, time = 1.5 SECONDS) + + else if(get_filter("hunger_outline")) + remove_filter("hunger_outline") + + // Update color of the food + underlays -= food_image + food_image.color = state == HUNGER_STATE_FAT ? COLOR_DARK : null + underlays += food_image + +/atom/movable/screen/hunger/update_icon_state() + . = ..() + icon_state = "[base_icon_state][state]" + +#undef HUNGER_STATE_FAT +#undef HUNGER_STATE_FULL +#undef HUNGER_STATE_FINE +#undef HUNGER_STATE_HUNGRY +#undef HUNGER_STATE_STARVING diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 174aac2fc62..a3f886e656f 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -264,6 +264,7 @@ user.changeNext_move(attack_speed) user.do_attack_animation(attacked_atom) attacked_atom.attacked_by(src, user) + SEND_SIGNAL(src, COMSIG_ITEM_POST_ATTACK_ATOM, attacked_atom, user) /// Called from [/obj/item/proc/attack_atom] and [/obj/item/proc/attack] if the attack succeeds /atom/proc/attacked_by(obj/item/attacking_item, mob/living/user) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 1cdb99bbb42..38d99a75e6c 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -9,7 +9,6 @@ // Otherwise jump else if(A.loc) abstract_move(get_turf(A)) - update_parallax_contents() /mob/dead/observer/ClickOn(atom/A, params) if(check_click_intercept(params,A)) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index a5c88d97dc6..368ae3a3840 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -257,7 +257,7 @@ /datum/config_entry/number/outdated_movedelay/alien_delay movedelay_type = /mob/living/carbon/alien /datum/config_entry/number/outdated_movedelay/slime_delay - movedelay_type = /mob/living/simple_animal/slime + movedelay_type = /mob/living/basic/slime /datum/config_entry/number/outdated_movedelay/animal_delay movedelay_type = /mob/living/simple_animal ///////////////////////////////////////////////// diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index b01f4b17b9d..c9a2f07c4ee 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -104,6 +104,9 @@ /// Previous subsystem in the queue of subsystems to run this tick var/datum/controller/subsystem/queue_prev + /// String to store an applicable error message for a subsystem crashing, used to help debug crashes in contexts such as Continuous Integration/Unit Tests + var/initialization_failure_message = null + //Do not blindly add vars here to the bottom, put it where it goes above //If your var only has two values, put it in as a flag. diff --git a/code/controllers/subsystem/ai_controllers.dm b/code/controllers/subsystem/ai_controllers.dm index 3d8d2653149..44e1948e386 100644 --- a/code/controllers/subsystem/ai_controllers.dm +++ b/code/controllers/subsystem/ai_controllers.dm @@ -3,27 +3,32 @@ SUBSYSTEM_DEF(ai_controllers) name = "AI Controller Ticker" flags = SS_POST_FIRE_TIMING|SS_BACKGROUND priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME init_order = INIT_ORDER_AI_CONTROLLERS wait = 0.5 SECONDS //Plan every half second if required, not great not terrible. + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME ///List of all ai_subtree singletons, key is the typepath while assigned value is a newly created instance of the typepath. See setup_subtrees() - var/list/ai_subtrees = list() - ///List of all ai controllers currently running - var/list/active_ai_controllers = list() + var/list/datum/ai_planning_subtree/ai_subtrees = list() + ///Assoc List of all AI statuses and all AI controllers with that status. + var/list/ai_controllers_by_status = list( + AI_STATUS_ON = list(), + AI_STATUS_OFF = list(), + ) + ///Assoc List of all AI controllers and the Z level they are on, which we check when someone enters/leaves a Z level to turn them on/off. + var/list/ai_controllers_by_zlevel = list() /datum/controller/subsystem/ai_controllers/Initialize() setup_subtrees() return SS_INIT_SUCCESS -/datum/controller/subsystem/ai_controllers/proc/setup_subtrees() - ai_subtrees = list() - for(var/subtree_type in subtypesof(/datum/ai_planning_subtree)) - var/datum/ai_planning_subtree/subtree = new subtree_type - ai_subtrees[subtree_type] = subtree +/datum/controller/subsystem/ai_controllers/stat_entry(msg) + var/list/active_list = ai_controllers_by_status[AI_STATUS_ON] + var/list/inactive_list = ai_controllers_by_status[AI_STATUS_OFF] + msg = "Active AIs:[length(active_list)]|Inactive:[length(inactive_list)]" + return ..() /datum/controller/subsystem/ai_controllers/fire(resumed) - for(var/datum/ai_controller/ai_controller as anything in active_ai_controllers) + for(var/datum/ai_controller/ai_controller as anything in ai_controllers_by_status[AI_STATUS_ON]) if(!COOLDOWN_FINISHED(ai_controller, failed_planning_cooldown)) continue @@ -32,3 +37,17 @@ SUBSYSTEM_DEF(ai_controllers) ai_controller.SelectBehaviors(wait * 0.1) if(!LAZYLEN(ai_controller.current_behaviors)) //Still no plan COOLDOWN_START(ai_controller, failed_planning_cooldown, AI_FAILED_PLANNING_COOLDOWN) + +///Creates all instances of ai_subtrees and assigns them to the ai_subtrees list. +/datum/controller/subsystem/ai_controllers/proc/setup_subtrees() + for(var/subtree_type in subtypesof(/datum/ai_planning_subtree)) + var/datum/ai_planning_subtree/subtree = new subtree_type + ai_subtrees[subtree_type] = subtree + +///Called when the max Z level was changed, updating our coverage. +/datum/controller/subsystem/ai_controllers/proc/on_max_z_changed() + if (!islist(ai_controllers_by_zlevel)) + ai_controllers_by_zlevel = new /list(world.maxz,0) + while (SSai_controllers.ai_controllers_by_zlevel.len < world.maxz) + SSai_controllers.ai_controllers_by_zlevel.len++ + SSai_controllers.ai_controllers_by_zlevel[ai_controllers_by_zlevel.len] = list() diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 1de3f900c8c..1cb3e2dec37 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -898,7 +898,6 @@ GLOBAL_LIST_EMPTY(colored_images) if(!target) return usr.forceMove(target) - usr.update_parallax_contents() if("toggle-freeze") can_fire = !can_fire return TRUE diff --git a/code/controllers/subsystem/battle_royale.dm b/code/controllers/subsystem/battle_royale.dm new file mode 100644 index 00000000000..139a5aa8b49 --- /dev/null +++ b/code/controllers/subsystem/battle_royale.dm @@ -0,0 +1,230 @@ +/// Global list of areas which are considered to be inside the same department for our purposes +GLOBAL_LIST_INIT(battle_royale_regions, list( + "Medical Bay" = list( + /area/station/command/heads_quarters/cmo, + /area/station/medical, + /area/station/security/checkpoint/medical, + ), + "Research Division" = list( + /area/station/command/heads_quarters/rd, + /area/station/security/checkpoint/science, + /area/station/science, + ), + "Engineering Bay" = list( + /area/station/command/heads_quarters/ce, + /area/station/engineering, + /area/station/maintenance/disposal/incinerator, + /area/station/security/checkpoint/engineering, + ), + "Cargo Bay" = list( + /area/station/cargo, + /area/station/command/heads_quarters/qm, + /area/station/security/checkpoint/supply, + ), +)) + +/// Basically just exists to hold references to datums so that they don't GC +SUBSYSTEM_DEF(battle_royale) + name = "Battle Royale" + flags = SS_NO_INIT | SS_NO_FIRE + /// List of battle royale datums currently running + var/list/active_battles + +/// Start a new battle royale using a passed list of implants +/datum/controller/subsystem/battle_royale/proc/start_battle(list/competitors) + var/datum/battle_royale_controller/controller = new() + if (!controller.start(competitors)) + return FALSE + LAZYADD(active_battles, controller) + if (LAZYLEN(active_battles) == 1) + start_broadcasting_network(BATTLE_ROYALE_CAMERA_NET) + RegisterSignal(controller, COMSIG_QDELETING, PROC_REF(battle_ended)) + return TRUE + +/// Drop reference when it kills itself +/datum/controller/subsystem/battle_royale/proc/battle_ended(datum/source) + SIGNAL_HANDLER + LAZYREMOVE(active_battles, source) + if (!LAZYLEN(active_battles)) + stop_broadcasting_network(BATTLE_ROYALE_CAMERA_NET) + + +/// Datum which controls the conflict +/datum/battle_royale_controller + /// Where is our battle taking place? + var/chosen_area + /// Is the battle currently in progress? + var/battle_running = TRUE + /// Should we let everyone know that someone has died? + var/announce_deaths = TRUE + /// List of implants involved + var/list/contestant_implants = list() + /// Ways to describe that someone has died + var/static/list/euphemisms = list( + "cashed their last paycheque.", + "didn't make it...", + "didn't make the cut.", + "had their head blown clean off!", + "has been killed!", + "has failed the challenge!", + "has passed away.", + "has died.", + "is in a better place now.", + "isn't going to be clocking in tomorrow!", + "just flatlined.", + "isn't today's winner.", + "seems to have exploded!", + "was just murdered on live tv!", + "won't be making it to retirement.", + "won't be getting back up after that one.", + ) + /// Ways to tell people not to salt in deadchat, surely effective + var/static/list/condolences = list( + "Better luck next time!", + "But stay tuned, there's still everything to play for!", + "Did you catch who did it?", + "It looked like that one really hurt...", + "Let's get that one on action replay!", + "Let's have a moment of silence, please.", + "Let's hope the next one does better.", + "Someone please notify their next of kin.", + "They had a good run.", + "Too bad!", + "What a shame!", + "What an upset!", + "What's going to happen next?", + "Who could have seen that coming?", + "Who will be next?", + ) + +/datum/battle_royale_controller/Destroy(force) + contestant_implants = null + return ..() + +/// Start a battle royale with the list of provided implants +/datum/battle_royale_controller/proc/start(list/implants, battle_time = 10 MINUTES) + chosen_area = pick(GLOB.battle_royale_regions) + for (var/obj/item/implant/explosive/battle_royale/contestant_implant in implants) + contestant_implant.start_battle(chosen_area, GLOB.battle_royale_regions[chosen_area]) + if (isnull(contestant_implant)) + continue // Might have exploded if it was removed from a person + RegisterSignal(contestant_implant, COMSIG_QDELETING, PROC_REF(implant_destroyed)) + contestant_implants |= contestant_implant + + if (length(contestant_implants) <= 1) + return FALSE // Well there's not much point is there + + priority_announce( + text = "Congratulations [station_name()], you have been chosen as the next site of the Rumble Royale! \n\ + Viewers across the sector will watch our [convert_integer_to_words(length(contestant_implants))] lucky contestants battle their way into your [chosen_area] and fight until only one is left standing! \n\ + If they don't make it in five minutes, they'll be disqualified. If you see one of our players struggling to get in, do lend them a hand... or don't, if you can live with the consequences! \n\ + As a gesture of gratitude, we will be providing our premium broadcast to your entertainment monitors at no cost so that you can watch the excitement. \n\ + Bystanders are advised not to intervene... but if you do, make it look good for the camera!", + title = "Rumble Royale Beginning", + sound = 'sound/machines/alarm.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) + contestant_implant.announce() + addtimer(CALLBACK(src, PROC_REF(limit_area)), battle_time / 2, TIMER_DELETE_ME) + addtimer(CALLBACK(src, PROC_REF(finish)), battle_time, TIMER_DELETE_ME) + return TRUE + +/// An implant was destroyed, hopefully because it exploded. Count how many competitors remain. +/datum/battle_royale_controller/proc/implant_destroyed(obj/item/implant/implant) + SIGNAL_HANDLER + contestant_implants -= implant + if (!battle_running) + return + + if (length(contestant_implants) <= 1) + announce_winner(implant) + else if (announce_deaths) + var/message = "" + if (isnull(implant.imp_in)) + message = "Looks like someone removed and destroyed their implant, that's cheating!" + else + message = "[implant.imp_in.real_name] [pick(euphemisms)] [pick(condolences)]" + priority_announce( + text = message, + title = "Rumble Royale Casualty Report", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + +/// There's only one person left, we have a winner! +/datum/battle_royale_controller/proc/announce_winner(obj/item/implant/losing_implant) + battle_running = FALSE + if (length(contestant_implants) > 1) + return + + var/message = "" + var/mob/living/loser = losing_implant.imp_in + var/obj/item/implant/winning_implant = pop(contestant_implants) + var/mob/living/winner = winning_implant?.imp_in + + if (isnull(winner) && isnull(loser)) + message = "Somehow, it seems like there's no winner tonight. What a disappointment!" + else + var/loser_text = isnull(loser) ? "With the disqualification of the other remaining contestant" : "With the death of [loser.real_name]" + var/winner_text = isnull(winner) ? "we must sadly announce that the would-be winner has also been disqualified. Such bad showmanship!" : "only [winner.real_name] remains. Congratulations, we have a winner!" + message = "[loser_text], [winner_text]" + + if (!isnull(winner)) + podspawn(list( + "target" = get_turf(winner), + "style" = STYLE_SYNDICATE, + "spawn" = /obj/item/food/roast_dinner, + )) + + priority_announce( + text = message, + title = "Rumble Royale Winner", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + qdel(winning_implant) // You get to live! + winner?.mind?.remove_antag_datum(/datum/antagonist/survivalist/battle_royale) + qdel(src) + +/// Called halfway through the battle, if you've not made it to the designated battle zone we kill you +/datum/battle_royale_controller/proc/limit_area() + priority_announce( + text = "We're halfway done folks! And bad news to anyone who hasn't made it to the [chosen_area]... you're out!", + title = "Rumble Royale Update", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) + contestant_implant.limit_areas() + +/// Well you're out of time, bad luck +/datum/battle_royale_controller/proc/finish() + battle_running = FALSE + + priority_announce( + text = "Sorry remaining contestants, your time is up. \ + We're sorry to announce that this edition of Royal Rumble has no winner. \n\ + Better luck next time!", + title = "Rumble Royale Concluded", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) + contestant_implant.explode() + + qdel(src) diff --git a/code/controllers/subsystem/bitrunning.dm b/code/controllers/subsystem/bitrunning.dm new file mode 100644 index 00000000000..2b303911e42 --- /dev/null +++ b/code/controllers/subsystem/bitrunning.dm @@ -0,0 +1,60 @@ +#define REDACTED "???" + +SUBSYSTEM_DEF(bitrunning) + name = "Bitrunning" + flags = SS_NO_FIRE + + var/list/all_domains = list() + +/datum/controller/subsystem/bitrunning/Initialize() + InitializeDomains() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/bitrunning/proc/InitializeDomains() + for(var/path in subtypesof(/datum/lazy_template/virtual_domain)) + all_domains += new path() + +/// Compiles a list of available domains. +/datum/controller/subsystem/bitrunning/proc/get_available_domains(scanner_tier, points) + var/list/levels = list() + + for(var/datum/lazy_template/virtual_domain/domain as anything in all_domains) + if(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 + + levels += list(list( + "cost" = domain.cost, + "desc" = can_view ? domain.desc : "Limited scanning capabilities. Cannot infer domain details.", + "difficulty" = domain.difficulty, + "id" = domain.key, + "is_modular" = domain.is_modular, + "has_secondary_objectives" = assoc_value_sum(domain.secondary_loot) ? TRUE : FALSE, + "name" = can_view ? domain.name : REDACTED, + "reward" = can_view_reward ? domain.reward_points : REDACTED, + )) + + return levels + +/datum/controller/subsystem/bitrunning/proc/pick_secondary_loot(completed_domain) + var/datum/lazy_template/virtual_domain/domain = completed_domain + var/choice + + if(assoc_value_sum(domain.secondary_loot)) + choice = pick_weight(domain.secondary_loot) + domain.secondary_loot[choice] -= 1 + else + choice = /obj/item/paper/paperslip/bitrunning_error + CRASH("Virtual domain [domain.name] tried to pick secondary objective loot, but secondary_loot list was empty.") + return choice + +/obj/item/paper/paperslip/bitrunning_error + name = "Apology Letter" + desc = "Something went wrong here." + +/obj/item/paper/paperslip/bitrunning_error/Initialize(mapload) + default_raw_text = "Your reward for collecting the encrypted curiosity failed to arrive, please report this to technical support." + return ..() + +#undef REDACTED diff --git a/code/controllers/subsystem/blackmarket.dm b/code/controllers/subsystem/blackmarket.dm index 357fa0df291..f6a4aa25566 100644 --- a/code/controllers/subsystem/blackmarket.dm +++ b/code/controllers/subsystem/blackmarket.dm @@ -5,9 +5,10 @@ SUBSYSTEM_DEF(blackmarket) /// Descriptions for each shipping methods. var/shipping_method_descriptions = list( - SHIPPING_METHOD_LAUNCH="Launches the item at the station from space, cheap but you might not receive your item at all.", - SHIPPING_METHOD_LTSRBT="Long-To-Short-Range-Bluespace-Transceiver, a machine that receives items outside the station and then teleports them to the location of the uplink.", - SHIPPING_METHOD_TELEPORT="Teleports the item in a random area in the station, you get 60 seconds to get there first though." + SHIPPING_METHOD_LAUNCH = "Launches the item at the station from space, cheap but you might not receive your item at all.", + SHIPPING_METHOD_LTSRBT = "Long-To-Short-Range-Bluespace-Transceiver, a machine that receives items outside the station and then teleports them to the location of the uplink.", + SHIPPING_METHOD_TELEPORT = "Teleports the item in a random area in the station, you get 60 seconds to get there first though.", + SHIPPING_METHOD_SUPPLYPOD = "Ships the item inside a supply pod at your exact location. Showy, speedy and expensive.", ) /// List of all existing markets. @@ -21,17 +22,20 @@ SUBSYSTEM_DEF(blackmarket) for(var/market in subtypesof(/datum/market)) markets[market] += new market - for(var/item in subtypesof(/datum/market_item)) - var/datum/market_item/I = new item() - if(!I.item) + for(var/datum/market_item/item as anything in subtypesof(/datum/market_item)) + if(!initial(item.item)) + continue + if(!prob(initial(item.availability_prob))) continue - for(var/M in I.markets) - if(!markets[M]) - stack_trace("SSblackmarket: Item [I] available in market that does not exist.") + var/datum/market_item/item_instance = new item() + for(var/potential_market in item_instance.markets) + if(!markets[potential_market]) + stack_trace("SSblackmarket: Item [item_instance] available in market that does not exist.") continue - markets[M].add_item(item) - qdel(I) + // If this fails the market item will just be GC'd + markets[potential_market].add_item(item_instance) + return SS_INIT_SUCCESS /datum/controller/subsystem/blackmarket/fire(resumed) @@ -39,77 +43,83 @@ SUBSYSTEM_DEF(blackmarket) var/datum/market_purchase/purchase = queued_purchases[1] queued_purchases.Cut(1,2) - // Uh oh, uplink is gone. We will just keep the money and you will not get your order. - if(!purchase.uplink || QDELETED(purchase.uplink)) - queued_purchases -= purchase - qdel(purchase) - continue + var/mob/buyer = recursive_loc_check(purchase.uplink.loc, /mob) switch(purchase.method) // Find a ltsrbt pad and make it handle the shipping. if(SHIPPING_METHOD_LTSRBT) - if(!telepads.len) + if(!length(telepads)) continue // Prioritize pads that don't have a cooldown active. - var/free_pad_found = FALSE - for(var/obj/machinery/ltsrbt/pad in telepads) - if(pad.recharge_cooldown) + var/obj/machinery/ltsrbt/lowest_cd_pad + // The time left of the shortest cooldown amongst all telepads. + var/lowest_timeleft = INFINITY + for(var/obj/machinery/ltsrbt/pad as anything in telepads) + if(!COOLDOWN_FINISHED(pad, recharge_cooldown)) + var/timeleft = COOLDOWN_TIMELEFT(pad, recharge_cooldown) + if(timeleft < lowest_timeleft) + lowest_cd_pad = pad + lowest_timeleft = timeleft continue - pad.add_to_queue(purchase) - queued_purchases -= purchase - free_pad_found = TRUE + lowest_cd_pad = pad break - if(free_pad_found) - continue + lowest_cd_pad.add_to_queue(purchase) - var/obj/machinery/ltsrbt/pad = pick(telepads) + to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting that the order is being processed by [lowest_cd_pad].")) - to_chat(recursive_loc_check(purchase.uplink.loc, /mob), span_notice("[purchase.uplink] flashes a message noting that the order is being processed by [pad].")) - - queued_purchases -= purchase - pad.add_to_queue(purchase) // Get random area, throw it somewhere there. if(SHIPPING_METHOD_TELEPORT) var/turf/targetturf = get_safe_random_station_turf() // This shouldn't happen. if (!targetturf) continue + queued_purchases -= purchase - to_chat(recursive_loc_check(purchase.uplink.loc, /mob), span_notice("[purchase.uplink] flashes a message noting that the order is being teleported to [get_area(targetturf)] in 60 seconds.")) + to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting that the order is being teleported to [get_area(targetturf)] in 60 seconds.")) // do_teleport does not want to teleport items from nullspace, so it just forceMoves and does sparks. - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/controller/subsystem/blackmarket,fake_teleport), purchase.entry.spawn_item(), targetturf), 60 SECONDS) - queued_purchases -= purchase - qdel(purchase) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/controller/subsystem/blackmarket,fake_teleport), purchase, targetturf), 60 SECONDS) + // Get the current location of the uplink if it exists, then throws the item from space at the station from a random direction. if(SHIPPING_METHOD_LAUNCH) var/startSide = pick(GLOB.cardinals) var/turf/T = get_turf(purchase.uplink) var/pickedloc = spaceDebrisStartLoc(startSide, T.z) - var/atom/movable/item = purchase.entry.spawn_item(pickedloc) + var/atom/movable/item = purchase.entry.spawn_item(pickedloc, purchase) item.throw_at(purchase.uplink, 3, 3, spin = FALSE) - to_chat(recursive_loc_check(purchase.uplink.loc, /mob), span_notice("[purchase.uplink] flashes a message noting the order is being launched at the station from [dir2text(startSide)].")) + to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting the order is being launched at the station from [dir2text(startSide)].")) + qdel(purchase) - queued_purchases -= purchase + if(SHIPPING_METHOD_SUPPLYPOD) + var/obj/structure/closet/supplypod/back_to_station/pod = new() + purchase.entry.spawn_item(pod, purchase) + new /obj/effect/pod_landingzone(get_turf(purchase.uplink), pod) + + to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting the order is being launched at your location. Right here, right now!")) qdel(purchase) if(MC_TICK_CHECK) break /// Used to make a teleportation effect as do_teleport does not like moving items from nullspace. -/datum/controller/subsystem/blackmarket/proc/fake_teleport(atom/movable/item, turf/target) - item.forceMove(target) +/datum/controller/subsystem/blackmarket/proc/fake_teleport(datum/market_purchase/purchase, turf/target) + // Oopsie, whoopsie, the item is gone. So long, and thanks for all the money. + if(QDELETED(purchase)) + return + var/atom/movable/thing = purchase.entry.spawn_item(target, purchase) var/datum/effect_system/spark_spread/sparks = new sparks.set_up(5, 1, target) - sparks.attach(item) + sparks.attach(thing) sparks.start() + qdel(purchase) /// Used to add /datum/market_purchase to queued_purchases var. Returns TRUE when queued. -/datum/controller/subsystem/blackmarket/proc/queue_item(datum/market_purchase/P) - if(P.method == SHIPPING_METHOD_LTSRBT && !telepads.len) +/datum/controller/subsystem/blackmarket/proc/queue_item(datum/market_purchase/purchase) + if((purchase.method == SHIPPING_METHOD_LTSRBT && !telepads.len) || isnull(purchase.uplink)) + qdel(purchase) return FALSE - queued_purchases += P + queued_purchases += purchase return TRUE diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 15484fb9cc6..0e8e3dfd90b 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -1,3 +1,4 @@ +#define SHUTDOWN_QUERY_TIMELIMIT (1 MINUTES) SUBSYSTEM_DEF(dbcore) name = "Database" flags = SS_TICKER @@ -6,12 +7,17 @@ SUBSYSTEM_DEF(dbcore) init_order = INIT_ORDER_DBCORE priority = FIRE_PRIORITY_DATABASE - var/failed_connection_timeout = 0 - var/schema_mismatch = 0 var/db_minor = 0 var/db_major = 0 + /// Number of failed connection attempts this try. Resets after the timeout or successful connection var/failed_connections = 0 + /// Max number of consecutive failures before a timeout (here and not a define so it can be vv'ed mid round if needed) + var/max_connection_failures = 5 + /// world.time that connection attempts can resume + var/failed_connection_timeout = 0 + /// Total number of times connections have had to be timed out. + var/failed_connection_timeout_count = 0 var/last_error @@ -174,23 +180,32 @@ SUBSYSTEM_DEF(dbcore) /datum/controller/subsystem/dbcore/Shutdown() shutting_down = TRUE - to_chat(world, span_boldannounce("Clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]")) + 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) //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 if(SSdbcore.Connect()) - //Execute all waiting queries + //Take over control of all active queries + var/queries_to_check = queries_active.Copy() + queries_active.Cut() + + //Start all waiting queries for(var/datum/db_query/query in queries_standby) - run_query_sync(query) + run_query(query) + queries_to_check += query queries_standby -= query - for(var/datum/db_query/query in queries_active) - //Finish any remaining active qeries - UNTIL(query.process()) - queries_active -= query + + //wait for them all to finish + for(var/datum/db_query/query in queries_to_check) + UNTIL(query.process() || REALTIMEOFDAY > endtime) // SKYRAT EDIT START - SQL-based logging for(var/table in queued_log_entries_by_table) MassInsert(table, rows = queued_log_entries_by_table[table], duplicate_key = FALSE, ignore_errors = FALSE, warn = FALSE, async = TRUE, special_columns = null) // SKYRAT EDIT END + //log shutdown to the db var/datum/db_query/query_round_shutdown = SSdbcore.NewQuery( "UPDATE [format_table_name("round")] SET shutdown_datetime = Now(), end_state = :end_state WHERE id = :round_id", list("end_state" = SSticker.end_state, "round_id" = GLOB.round_id), @@ -199,7 +214,9 @@ SUBSYSTEM_DEF(dbcore) query_round_shutdown.Execute(FALSE) qdel(query_round_shutdown) - to_chat(world, span_boldannounce("Done clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]")) + 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) if(IsConnected()) Disconnect() stop_db_daemon() @@ -236,11 +253,15 @@ SUBSYSTEM_DEF(dbcore) if(IsConnected()) return TRUE - if(failed_connection_timeout <= world.time) //it's been more than 5 seconds since we failed to connect, reset the counter - failed_connections = 0 + if(connection) + Disconnect() //clear the current connection handle so isconnected() calls stop invoking rustg + connection = null //make sure its cleared even if runtimes happened - if(failed_connections > 5) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect for 5 seconds. - failed_connection_timeout = world.time + 50 + if(failed_connection_timeout <= world.time) //it's been long enough since we failed to connect, reset the counter + failed_connections = 0 + failed_connection_timeout = 0 + + if(failed_connection_timeout > 0) return FALSE if(!CONFIG_GET(flag/sql_enabled)) @@ -276,6 +297,11 @@ SUBSYSTEM_DEF(dbcore) last_error = result["data"] log_sql("Connect() failed | [last_error]") ++failed_connections + //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect for a time. + if(failed_connections > max_connection_failures) + failed_connection_timeout_count++ + //basic exponential backoff algorithm + failed_connection_timeout = world.time + ((2 ** failed_connection_timeout_count) SECONDS) /datum/controller/subsystem/dbcore/proc/CheckSchemaVersion() if(CONFIG_GET(flag/sql_enabled)) @@ -655,3 +681,4 @@ Ignore_errors instructes mysql to continue inserting rows if some of them have e /datum/db_query/proc/Close() rows = null item = null +#undef SHUTDOWN_QUERY_TIMELIMIT diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index e130b6dc0ff..eefbede3087 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -57,7 +57,7 @@ PROCESSING_SUBSYSTEM_DEF(dcs) var/datum/element/eletype = arguments[1] var/list/fullid = list(eletype) var/list/named_arguments - for(var/i in initial(eletype.argument_hash_start_idx) to length(arguments)) + for(var/i in initial(eletype.argument_hash_start_idx) to (initial(eletype.argument_hash_end_idx) || length(arguments))) var/key = arguments[i] if(istext(key)) diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index 7779f13ae5a..5af3477435b 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -359,6 +359,7 @@ SUBSYSTEM_DEF(dynamic) . += "
Additional Notes:

" + footnote_pile +#ifndef MAP_TEST print_command_report(., "[command_name()] Status Summary", announce=FALSE) if(greenshift) priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", SSstation.announcer.get_rand_report_sound(), color_override = "green") @@ -366,6 +367,7 @@ SUBSYSTEM_DEF(dynamic) if(SSsecurity_level.get_current_level_as_number() < SEC_LEVEL_BLUE) SSsecurity_level.set_level(SEC_LEVEL_BLUE, announce = FALSE) priority_announce("[SSsecurity_level.current_security_level.elevating_to_announcement]\n\nA summary has been copied and printed to all communications consoles.", "Security level elevated.", ANNOUNCER_INTERCEPT, color_override = SSsecurity_level.current_security_level.announcement_color) +#endif return . @@ -375,17 +377,17 @@ SUBSYSTEM_DEF(dynamic) if (prob(PULSAR_REPORT_CHANCE)) if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS)) advisory_string += "Advisory Level: Clown Planet
" - advisory_string += "Your sector's advisory level is Clown Planet! Our bike horns have picked up on a large bananium stash. Clowns show a large influx of clowns on your station. We highly advice you to slip any threats to keep Honkotrasen assets within the Banana Sector. The Department advises defending chemistry from any clowns that are trying to make baldium or space lube." + advisory_string += "Your sector's advisory level is Clown Planet! Our bike horns have picked up on a large bananium stash. Clowns show a large influx of clowns on your station. We highly advise you to slip any threats to keep Honkotrasen assets within the Banana Sector. The Department of Intelligence advises defending chemistry from any clowns that are trying to make baldium or space lube." return advisory_string advisory_string += "Advisory Level: Pulsar Star
" - advisory_string += "Your sector's advisory level is Pulsar Star. A large unknown electromagnetic field has stormed through nearby surveillance equipment. No surveillance data has been able to be obtained showing no credible threats to Nanotrasen assets within the Spinward Sector. The Department advises maintaining high alert against potential threats, regardless of a lack of information." + advisory_string += "Your sector's advisory level is Pulsar Star. A large, unknown electromagnetic field has stormed through nearby surveillance equipment, causing major data loss. Partial data was recovered and showed no credible threats to Nanotrasen assets within the Spinward Sector; however, the Department of Intelligence advises maintaining high alert against potential threats due to the lack of complete data." return advisory_string switch(round(shown_threat)) if(0) advisory_string += "Advisory Level: White Dwarf
" - advisory_string += "Your sector's advisory level is White Dwarf. Our surveillors have ruled out any and all potential risks known in our database, ruling out the loss of our assets in the Spinward Sector. We advise a lower level of security, alongside distributing ressources on potential profit." + advisory_string += "Your sector's advisory level is White Dwarf. Our surveillance has ruled out any and all potential threats known in our database, eliminating most risks to our assets in the Spinward Sector. We advise a lower level of security, alongside distributing resources on potential profit." if(1 to 19) var/show_core_territory = (GLOB.current_living_antags.len > 0) if (prob(FAKE_GREENSHIFT_FORM_CHANCE)) @@ -393,22 +395,22 @@ SUBSYSTEM_DEF(dynamic) if (show_core_territory) advisory_string += "Advisory Level: Blue Star
" - advisory_string += "Your sector's advisory level is Blue Star. At this threat advisory, the risk of attacks on Nanotrasen assets within the sector is minor, but cannot be ruled out entirely. Remain vigilant." + advisory_string += "Your sector's advisory level is Blue Star. At this threat advisory, the risk of attacks on Nanotrasen assets within the sector is minor but cannot be ruled out entirely. Remain vigilant." else advisory_string += "Advisory Level: Green Star
" - advisory_string += "Your sector's advisory level is Green Star. Surveillance information shows no credible threats to Nanotrasen assets within the Spinward Sector at this time. As always, the Department advises maintaining vigilance against potential threats, regardless of a lack of known threats." + advisory_string += "Your sector's advisory level is Green Star. Surveillance information shows no credible threats to Nanotrasen assets within the Spinward Sector at this time. As always, the Department of Intelligence advises maintaining vigilance against potential threats, regardless of a lack of known threats." if(20 to 39) advisory_string += "Advisory Level: Yellow Star
" - advisory_string += "Your sector's advisory level is Yellow Star. Surveillance shows a credible risk of enemy attack against our assets in the Spinward Sector. We advise a heightened level of security, alongside maintaining vigilance against potential threats." + advisory_string += "Your sector's advisory level is Yellow Star. Surveillance shows a credible risk of enemy attack against our assets in the Spinward Sector. We advise a heightened level of security alongside maintaining vigilance against potential threats." if(40 to 65) advisory_string += "Advisory Level: Orange Star
" - advisory_string += "Your sector's advisory level is Orange Star. Upon reviewing your sector's intelligence, the Department has determined that the risk of enemy activity is moderate to severe. At this advisory, we recommend maintaining a higher degree of security and alertness, and vigilance against threats that may (or will) arise." + advisory_string += "Your sector's advisory level is Orange Star. Upon reviewing your sector's intelligence, the Department has determined that the risk of enemy activity is moderate to severe. At this advisory, we recommend maintaining a higher degree of security and reviewing red alert protocols with command and the crew." if(66 to 79) advisory_string += "Advisory Level: Red Star
" advisory_string += "Your sector's advisory level is Red Star. The Department of Intelligence has decrypted Cybersun communications suggesting a high likelihood of attacks on Nanotrasen assets within the Spinward Sector. Stations in the region are advised to remain highly vigilant for signs of enemy activity and to be on high alert." if(80 to 99) advisory_string += "Advisory Level: Black Orbit
" - advisory_string += "Your sector's advisory level is Black Orbit. Your sector's local comms network is currently undergoing a blackout, and we are therefore unable to accurately judge enemy movements within the region. However, information passed to us by GDI suggests a high amount of enemy activity in the sector, indicative of an impending attack. Remain on high alert, and as always, we advise remaining vigilant against any other potential threats." + advisory_string += "Your sector's advisory level is Black Orbit. Your sector's local communications network is currently undergoing a blackout, and we are therefore unable to accurately judge enemy movements within the region. However, information passed to us by GDI suggests a high amount of enemy activity in the sector, indicative of an impending attack. Remain on high alert and vigilant against any other potential threats." if(100) advisory_string += "Advisory Level: Midnight Sun
" advisory_string += "Your sector's advisory level is Midnight Sun. Credible information passed to us by GDI suggests that the Syndicate is preparing to mount a major concerted offensive on Nanotrasen assets in the Spinward Sector to cripple our foothold there. All stations should remain on high alert and prepared to defend themselves." diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index 3273f0ac05e..371e74befcf 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -80,11 +80,9 @@ if (is_banned_from(creature.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE))) trimmed_list.Remove(creature) continue - if (isnull(creature.mind)) continue - - if (restrict_ghost_roles && (creature.mind.assigned_role.title in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? + if (restrict_ghost_roles && !(creature.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) // Are they not playing a station role? trimmed_list.Remove(creature) continue if (creature.mind.assigned_role.title in restricted_roles) // Does their job allow it? @@ -144,11 +142,11 @@ SSdynamic.log_dynamic_and_announce("Polling [possible_volunteers.len] players to apply for the [name] ruleset.") candidates = SSpolling.poll_ghost_candidates( - question = "Looking for volunteers to become [antag_flag] for [name]", + question = "Looking for volunteers to become [span_notice(antag_flag)] for [span_danger(name)]", check_jobban = antag_flag_override, role = antag_flag || antag_flag_override, poll_time = 30 SECONDS, - pic_source = signup_item_path, + alert_pic = signup_item_path, role_name_text = antag_flag, ) @@ -486,6 +484,11 @@ var/mob/living/carbon/human/blob_antag = pick_n_take(candidates) assigned += blob_antag.mind blob_antag.mind.special_role = antag_flag + notify_ghosts( + "[blob_antag] has become a blob host!", + source = blob_antag, + header = "So Bulbous...", + ) return ..() /// Midround Xenomorph Ruleset (From Ghosts) @@ -855,6 +858,11 @@ obsessed.gain_trauma(/datum/brain_trauma/special/obsessed) message_admins("[ADMIN_LOOKUPFLW(obsessed)] has been made Obsessed by the midround ruleset.") log_game("[key_name(obsessed)] was made Obsessed by the midround ruleset.") + notify_ghosts( + "[obsessed] has developed an obsession with someone!", + source = obsessed, + header = "Love Can Bloom", + ) return TRUE /// Midround Space Changeling Ruleset (From Ghosts) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index 47a8168b511..04650824b3d 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -699,3 +699,45 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) create_separatist_nation(department_type, announcement = FALSE, dangerous = FALSE, message_admins = FALSE) GLOB.round_default_lawset = /datum/ai_laws/united_nations + +/datum/dynamic_ruleset/roundstart/spies + name = "Spies" + antag_flag = ROLE_SPY + antag_datum = /datum/antagonist/spy + minimum_required_age = 0 + protected_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, // AA = bad + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ) + required_candidates = 3 // lives or dies by there being a few spies + weight = 5 + cost = 8 + scaling_cost = 101 // see below + minimum_players = 8 + antag_cap = list("denominator" = 8, "offset" = 1) // should have quite a few spies to work against each other + requirements = list(8, 8, 8, 8, 8, 8, 8, 8, 8, 8) + +/datum/dynamic_ruleset/roundstart/spies/pre_execute(population) + for(var/i in 1 to get_antag_cap(population) * (scaled_times + 1)) + if(length(candidates) <= 0) + break + var/mob/picked_player = pick_n_take(candidates) + assigned += picked_player.mind + picked_player.mind.special_role = ROLE_SPY + picked_player.mind.restricted_roles = restricted_roles + GLOB.pre_setup_antags += picked_player.mind + return TRUE + +/datum/dynamic_ruleset/roundstart/spies/scale_up(population, max_scale) + // Disabled (at least until dynamic can handle scaling this better) + // Because spies have a very low demoninator, this can easily spawn like 30 of them + return 0 diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index ee6749fc7bf..d21286d93bf 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(economy) * A list of sole account datums can be obtained with flatten_list(), another variable would be redundant rn. */ var/list/bank_accounts_by_id = list() - /// A list of bank accounts indexed by their assigned job. + /// A list of bank accounts indexed by their assigned job typepath. var/list/bank_accounts_by_job = list() ///List of the departmental budget cards in existance. var/list/dep_cards = list() diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 98f847e4be6..241622509af 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -52,7 +52,11 @@ SUBSYSTEM_DEF(events) //checks if we should select a random event yet, and reschedules if necessary /datum/controller/subsystem/events/proc/checkEvent() if(scheduled <= world.time) +#ifdef MAP_TEST + message_admins("Random event skipped (Game is compiled in MAP_TEST mode)") +#else spawnEvent() +#endif reschedule() //decides which world.time we should select another random event at. diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 2021964609a..1922d4a05f5 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -1,4 +1,8 @@ #define EXPLOSION_THROW_SPEED 4 +#define EXPLOSION_BLOCK_LIGHT 2.5 +#define EXPLOSION_BLOCK_HEAVY 1.5 +#define EXPLOSION_BLOCK_DEV 1 + GLOBAL_LIST_EMPTY(explosions) SUBSYSTEM_DEF(explosions) @@ -127,29 +131,30 @@ SUBSYSTEM_DEF(explosions) var/our_x = explode.x var/our_y = explode.y var/dist = CHEAP_HYPOTENUSE(our_x, our_y, x0, y0) + var/block = 0 if(newmode == "Yes") if(explode != epicenter) var/our_block = cached_exp_block[get_step_towards(explode, epicenter)] - dist += our_block + block += our_block cached_exp_block[explode] = our_block + explode.explosive_resistance else cached_exp_block[explode] = explode.explosive_resistance dist = round(dist, 0.01) - if(dist < dev) + if(dist + (block * EXPLOSION_BLOCK_DEV) < dev) explode.color = "red" explode.maptext = MAPTEXT("[dist]") - else if (dist < heavy) + else if (dist + (block * EXPLOSION_BLOCK_HEAVY) < heavy) explode.color = "yellow" - explode.maptext = MAPTEXT("[dist]") - else if (dist < light) + explode.maptext = MAPTEXT("[dist + (block * EXPLOSION_BLOCK_HEAVY)]") + else if (dist + (block * EXPLOSION_BLOCK_LIGHT) < light) explode.color = "blue" - explode.maptext = MAPTEXT("[dist]") + explode.maptext = MAPTEXT("[dist + (block * EXPLOSION_BLOCK_LIGHT)]") else continue - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(wipe_color_and_text), wipe_colours), 100) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(wipe_color_and_text), wipe_colours), 10 SECONDS) /proc/wipe_color_and_text(list/atom/wiping) for(var/i in wiping) @@ -397,26 +402,26 @@ SUBSYSTEM_DEF(explosions) var/our_x = explode.x var/our_y = explode.y var/dist = CHEAP_HYPOTENUSE(our_x, our_y, x0, y0) - + var/block = 0 // Using this pattern, block will flow out from blocking turfs, essentially caching the recursion // This is safe because if get_step_towards is ever anything but caridnally off, it'll do a diagonal move // So we always sample from a "loop" closer - // It's kind of behaviorly unimpressive that that's a problem for the future + // It's kind of behaviorly unimpressive but that's a problem for the future if(reactionary) if(explode == epicenter) cached_exp_block[explode] = explode.explosive_resistance else var/our_block = cached_exp_block[get_step_towards(explode, epicenter)] - dist += our_block + block += our_block cached_exp_block[explode] = our_block + explode.explosive_resistance var/severity = EXPLODE_NONE - if(dist < devastation_range) + if(dist + (block * EXPLOSION_BLOCK_DEV) < devastation_range) severity = EXPLODE_DEVASTATE - else if(dist < heavy_impact_range) + else if(dist + (block * EXPLOSION_BLOCK_HEAVY) < heavy_impact_range) severity = EXPLODE_HEAVY - else if(dist < light_impact_range) + else if(dist + (block * EXPLOSION_BLOCK_LIGHT) < light_impact_range) severity = EXPLODE_LIGHT if(explode == epicenter) // Ensures explosives detonating from bags trigger other explosives in that bag @@ -730,3 +735,6 @@ SUBSYSTEM_DEF(explosions) currentpart = SSEXPLOSIONS_TURFS #undef EXPLOSION_THROW_SPEED +#undef EXPLOSION_BLOCK_LIGHT +#undef EXPLOSION_BLOCK_HEAVY +#undef EXPLOSION_BLOCK_DEV diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm deleted file mode 100644 index ee98e8c4e67..00000000000 --- a/code/controllers/subsystem/idlenpcpool.dm +++ /dev/null @@ -1,47 +0,0 @@ -SUBSYSTEM_DEF(idlenpcpool) - name = "Idling NPC Pool" - flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT - priority = FIRE_PRIORITY_IDLE_NPC - wait = 60 - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - - var/list/currentrun = list() - var/static/list/idle_mobs_by_zlevel[][] - -/datum/controller/subsystem/idlenpcpool/stat_entry(msg) - var/list/idlelist = GLOB.simple_animals[AI_IDLE] - var/list/zlist = GLOB.simple_animals[AI_Z_OFF] - msg = "IdleNPCS:[length(idlelist)]|Z:[length(zlist)]" - return ..() - -/datum/controller/subsystem/idlenpcpool/proc/MaxZChanged() - if (!islist(idle_mobs_by_zlevel)) - idle_mobs_by_zlevel = new /list(world.maxz,0) - while (SSidlenpcpool.idle_mobs_by_zlevel.len < world.maxz) - SSidlenpcpool.idle_mobs_by_zlevel.len++ - SSidlenpcpool.idle_mobs_by_zlevel[idle_mobs_by_zlevel.len] = list() - -/datum/controller/subsystem/idlenpcpool/fire(resumed = FALSE) - - if (!resumed) - var/list/idlelist = GLOB.simple_animals[AI_IDLE] - src.currentrun = idlelist.Copy() - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/mob/living/simple_animal/SA = currentrun[currentrun.len] - --currentrun.len - if (QDELETED(SA)) - GLOB.simple_animals[AI_IDLE] -= SA - stack_trace("Found a null in simple_animals deactive list [SA.type]!") - continue - - if(!SA.ckey) - if(SA.stat != DEAD) - SA.handle_automated_movement() - if(SA.stat != DEAD) - SA.consider_wakeup() - if (MC_TICK_CHECK) - return diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 1ce9d6f2c70..8f50cc02b12 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -160,7 +160,10 @@ SUBSYSTEM_DEF(job) continue new_all_occupations += job name_occupations[job.title] = job + for(var/alt_title in job.alternate_titles) + name_occupations[alt_title] = job type_occupations[job_type] = job + if(job.job_flags & JOB_NEW_PLAYER_JOINABLE) new_joinable_occupations += job if(!LAZYLEN(job.departments_list)) @@ -197,6 +200,8 @@ SUBSYSTEM_DEF(job) joinable_departments_by_type = new_joinable_departments_by_type experience_jobs_map = new_experience_jobs_map + SEND_SIGNAL(src, COMSIG_OCCUPATIONS_SETUP) + return TRUE @@ -390,7 +395,6 @@ SUBSYSTEM_DEF(job) //Setup new player list and get the jobs list JobDebug("Running DO, allow_all = [allow_all], pure = [pure]") run_divide_occupation_pure = pure - SEND_SIGNAL(src, COMSIG_OCCUPATIONS_DIVIDED, pure, allow_all) //Get the players who are ready for(var/i in GLOB.new_player_list) diff --git a/code/controllers/subsystem/lua.dm b/code/controllers/subsystem/lua.dm index 641416b7243..b9ad7dc1644 100644 --- a/code/controllers/subsystem/lua.dm +++ b/code/controllers/subsystem/lua.dm @@ -16,6 +16,7 @@ SUBSYSTEM_DEF(lua) var/list/resumes = list() var/list/current_run = list() + var/list/current_states_run = list() /// Protects return values from getting GCed before getting converted to lua values /// Gets cleared every tick. @@ -38,7 +39,9 @@ SUBSYSTEM_DEF(lua) return SS_INIT_SUCCESS catch(var/exception/e) // Something went wrong, best not allow the subsystem to run - warning("Error initializing SSlua: [e.name]") + var/crash_message = "Error initializing SSlua: [e.name]" + initialization_failure_message = crash_message + warning(crash_message) return SS_INIT_FAILURE /datum/controller/subsystem/lua/OnConfigLoad() @@ -97,6 +100,7 @@ SUBSYSTEM_DEF(lua) // then resumes every yielded task in the order their resumes were queued if(!resumed) current_run = list("sleeps" = sleeps.Copy(), "resumes" = resumes.Copy()) + current_states_run = states.Copy() sleeps.Cut() resumes.Cut() @@ -136,6 +140,13 @@ SUBSYSTEM_DEF(lua) if(MC_TICK_CHECK) break + while(length(current_states_run)) + var/datum/lua_state/state = current_states_run[current_states_run.len] + current_states_run.len-- + state.process(wait) + if(MC_TICK_CHECK) + break + // Update every lua editor TGUI open for each state that had a task awakened or resumed for(var/datum/lua_state/state in affected_states) INVOKE_ASYNC(state, TYPE_PROC_REF(/datum/lua_state, update_editors)) diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index 8a0b17f195b..3e07eca8a2e 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -12,6 +12,9 @@ SUBSYSTEM_DEF(machines) var/list/processing = list() var/list/currentrun = list() + var/list/apc_early_processing = list() + var/list/apc_late_processing = list() + var/current_part = SSMACHINES_APCS_EARLY ///List of all powernets on the server. var/list/datum/powernet/powernets = list() @@ -43,7 +46,7 @@ SUBSYSTEM_DEF(machines) for(var/next_type in typesof(machine_type)) var/list/found_machines = machines_by_type[next_type] if(found_machines) - machines += found_machines + machines += found_machines return machines @@ -79,19 +82,52 @@ SUBSYSTEM_DEF(machines) if (!resumed) for(var/datum/powernet/powernet as anything in powernets) powernet.reset() //reset the power state. + current_part = SSMACHINES_APCS_EARLY + src.currentrun = apc_early_processing.Copy() + + //APC early processing. Draws static power usages from their grids. + if(current_part == SSMACHINES_APCS_EARLY) + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/obj/machinery/power/apc/apc = currentrun[currentrun.len] + currentrun.len-- + if(QDELETED(apc) || apc.early_process(wait * 0.1) == PROCESS_KILL) + apc_early_processing -= apc + apc.datum_flags &= ~DF_ISPROCESSING + if(MC_TICK_CHECK) + return + current_part = SSMACHINES_MACHINES src.currentrun = processing.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun + //General machine processing. Their power usage can be dynamic and based on surplus power, so they come after static power usage have been applied. + if(current_part == SSMACHINES_MACHINES) + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/obj/machinery/thing = currentrun[currentrun.len] + currentrun.len-- + if(QDELETED(thing) || thing.process(wait * 0.1) == PROCESS_KILL) + processing -= thing + thing.datum_flags &= ~DF_ISPROCESSING + if (MC_TICK_CHECK) + return + current_part = SSMACHINES_APCS_LATE + src.currentrun = apc_late_processing.Copy() - while(currentrun.len) - var/obj/machinery/thing = currentrun[currentrun.len] - currentrun.len-- - if(QDELETED(thing) || thing.process(wait * 0.1) == PROCESS_KILL) - processing -= thing - thing.datum_flags &= ~DF_ISPROCESSING - if (MC_TICK_CHECK) - return + //APC late processing. APCs will use the remaining power on the grid to charge their cells if needed. + //This is applied at the end so charging APCs don't cause others to discharge by taking all the power from the grid before machines use power. + if(current_part == SSMACHINES_APCS_LATE) + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/obj/machinery/power/apc/apc = currentrun[currentrun.len] + currentrun.len-- + if(QDELETED(apc) || apc.late_process(wait * 0.1) == PROCESS_KILL) + apc_late_processing -= apc + apc.datum_flags &= ~DF_ISPROCESSING + if(MC_TICK_CHECK) + return /datum/controller/subsystem/machines/proc/setup_template_powernets(list/cables) var/obj/structure/cable/PC diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 8516ed98ea9..1141e53acfc 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -7,13 +7,15 @@ SUBSYSTEM_DEF(minor_mapping) flags = SS_NO_FIRE /datum/controller/subsystem/minor_mapping/Initialize() - #ifdef UNIT_TESTS // This whole subsystem just introduces a lot of odd confounding variables into unit test situations, so let's just not bother with doing an initialize here. +// This whole subsystem just introduces a lot of odd confounding variables into unit test situations, +// so let's just not bother with doing an initialize here. +#if defined(MAP_TEST) || defined(UNIT_TESTS) return SS_INIT_NO_NEED - #else +#else trigger_migration(CONFIG_GET(number/mice_roundstart)) place_satchels(satchel_amount = 10) //SKYRAT EDIT CHANGE - ORIGINAL : place_satchels(satchel_amount = 2) return SS_INIT_SUCCESS - #endif // the mice are easily the bigger problem, but let's just avoid anything that could cause some bullshit. +#endif /// Spawns some critters on exposed wires, usually but not always mice /datum/controller/subsystem/minor_mapping/proc/trigger_migration(to_spawn=10) diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm index ca8aa09d611..e36dd577794 100644 --- a/code/controllers/subsystem/ore_generation.dm +++ b/code/controllers/subsystem/ore_generation.dm @@ -20,27 +20,6 @@ SUBSYSTEM_DEF(ore_generation) var/list/ore_vent_minerals = list() /// A tracker of how many of each ore vent size we have in the game. Useful for tracking purposes. - var/list/ore_vent_sizes = list( - LARGE_VENT_TYPE = 0, - MEDIUM_VENT_TYPE = 0, - SMALL_VENT_TYPE = 0, - ) - /// Ores spawned by proximity to an ore vent. Useful for logging purposes. - var/list/post_ore_random = list( - "1" = 0, - "2" = 0, - "3" = 0, - "4" = 0, - "5" = 0, - ) - /// Ores spawned randomly on the map without proximity to an ore vent. Useful for logging purposes. - var/list/post_ore_manual = list( - "1" = 0, - "2" = 0, - "3" = 0, - "4" = 0, - "5" = 0, - ) /datum/controller/subsystem/ore_generation/Initialize() //Basically, we're going to round robin through the list of ore vents and assign a mineral to them until complete. @@ -56,8 +35,43 @@ SUBSYSTEM_DEF(ore_generation) else stallbreaker++ if(stallbreaker >= length(possible_vents)) - return SS_INIT_SUCCESS //We've done all we can here. + break //We've done all we can here. break inner loop continue + if(stallbreaker >= length(possible_vents)) + break //We've done all we can here. break outer loop + + /// Handles roundstart logging + logger.Log( + LOG_CATEGORY_CAVE_GENERATION, + "Ore Generation spawned the following ores based on vent proximity", + list( + "[ORE_WALL_FAR]" = GLOB.post_ore_random["[ORE_WALL_FAR]"], + "[ORE_WALL_LOW]" = GLOB.post_ore_random["[ORE_WALL_LOW]"], + "[ORE_WALL_MEDIUM]" = GLOB.post_ore_random["[ORE_WALL_MEDIUM]"], + "[ORE_WALL_HIGH]" = GLOB.post_ore_random["[ORE_WALL_HIGH]"], + "[ORE_WALL_VERY_HIGH]" = GLOB.post_ore_random["[ORE_WALL_VERY_HIGH]"], + ), + ) + logger.Log( + LOG_CATEGORY_CAVE_GENERATION, + "Ore Generation spawned the following ores randomly", + list( + "[ORE_WALL_FAR]" = GLOB.post_ore_manual["[ORE_WALL_FAR]"], + "[ORE_WALL_LOW]" = GLOB.post_ore_manual["[ORE_WALL_LOW]"], + "[ORE_WALL_MEDIUM]" = GLOB.post_ore_manual["[ORE_WALL_MEDIUM]"], + "[ORE_WALL_HIGH]" = GLOB.post_ore_manual["[ORE_WALL_HIGH]"], + "[ORE_WALL_VERY_HIGH]" = GLOB.post_ore_manual["[ORE_WALL_VERY_HIGH]"], + ), + ) + logger.Log( + LOG_CATEGORY_CAVE_GENERATION, + "Ore Generation spawned the following vent sizes", + list( + "large" = LAZYACCESS(GLOB.ore_vent_sizes, LARGE_VENT_TYPE), + "medium" = LAZYACCESS(GLOB.ore_vent_sizes, MEDIUM_VENT_TYPE), + "small" = LAZYACCESS(GLOB.ore_vent_sizes, SMALL_VENT_TYPE), + ), + ) return SS_INIT_SUCCESS /datum/controller/subsystem/ore_generation/fire(resumed) diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm index e42247c71a9..eae40a733b0 100644 --- a/code/controllers/subsystem/persistence/_persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -37,6 +37,14 @@ SUBSYSTEM_DEF(persistence) /// Will be null'd once the persistence system initializes, and never read from again. var/list/obj/item/storage/photo_album/queued_photo_albums + /// A json_database to data/piggy banks.json + /// Schema is persistence_id => array of coins, space cash and holochips. + var/datum/json_database/piggy_banks_database + /// List of persistene ids which piggy banks. + var/list/queued_broken_piggy_ids + + var/list/broken_piggy_banks + var/rounds_since_engine_exploded = 0 var/delam_highscore = 0 var/tram_hits_this_round = 0 diff --git a/code/controllers/subsystem/persistence/piggy_banks.dm b/code/controllers/subsystem/persistence/piggy_banks.dm new file mode 100644 index 00000000000..240fd98ab0c --- /dev/null +++ b/code/controllers/subsystem/persistence/piggy_banks.dm @@ -0,0 +1,56 @@ +///This proc is used to initialize holochips, cash and coins inside our persistent piggy bank. +/datum/controller/subsystem/persistence/proc/load_piggy_bank(obj/item/piggy_bank/piggy) + if(isnull(piggy_banks_database)) + piggy_banks_database = new("data/piggy_banks.json") + + var/list/data = piggy_banks_database.get_key(piggy.persistence_id) + if(isnull(data)) + return + var/total_value = 0 + for(var/iteration in 1 to length(data)) + var/money_path = text2path(data[iteration]) + if(!money_path) //For a reason or another, it was removed. + continue + var/obj/item/spawned + if(ispath(money_path, /obj/item/holochip)) + //We want to safely access the assoc of this position and not that of last key that happened to match this one. + var/list/key_and_assoc = data.Copy(iteration, iteration + 1) + var/amount = key_and_assoc["[money_path]"] + spawned = new money_path (piggy, amount) + //the operations are identical to those of chips, but they're different items, so I'll keep them separated. + else if(ispath(money_path, /obj/item/stack/spacecash)) + var/list/key_and_assoc = data.Copy(iteration, iteration + 1) + var/amount = key_and_assoc["[money_path]"] + spawned = new money_path (piggy, amount) + else if(ispath(money_path, /obj/item/coin)) + spawned = new money_path (piggy) + else + stack_trace("Unsupported path found in the data of a persistent piggy bank. item: [money_path], id:[piggy.persistence_id]") + continue + total_value += spawned.get_item_credit_value() + if(total_value >= piggy.maximum_value) + break + +///This proc is used to save money stored inside our persistent the piggy bank for the next time it's loaded. +/datum/controller/subsystem/persistence/proc/save_piggy_bank(obj/item/piggy_bank/piggy) + if(isnull(piggy_banks_database)) + return + + if(queued_broken_piggy_ids) + for(var/broken_id in queued_broken_piggy_ids) + piggy_banks_database.remove(broken_id) + queued_broken_piggy_ids = null + + var/list/data = list() + for(var/obj/item/item as anything in piggy.contents) + var/piggy_value = 1 + if(istype(item, /obj/item/holochip)) + var/obj/item/holochip/chip = item + piggy_value = chip.credits + else if(istype(item, /obj/item/stack/spacecash)) + var/obj/item/stack/spacecash/cash = item + piggy_value = cash.amount + else if(!istype(item, /obj/item/coin)) + continue + data += list("[item.type]" = piggy_value) + piggy_banks_database.set_key(piggy.persistence_id, data) diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index 882c20e897c..724651ebed7 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -27,10 +27,14 @@ SUBSYSTEM_DEF(polling) * * ignore_category: Optional, A poll category. If a candidate has this category in their ignore list, they won't be polled. * * flash_window: If TRUE, the candidate's window will flash when they're polled. * * list/group: A list of candidates to poll. - * * pic_source: Optional, An /atom or an /image to display on the poll alert. + * * alert_pic: Optional, An /atom or an /image to display on the poll alert. + * * jump_target: An /atom to teleport/jump to, if alert_pic is an /atom defaults to that. * * role_name_text: Optional, A string to display in logging / the (default) question. If null, the role name will be used. * * list/custom_response_messages: Optional, A list of strings to use as responses to the poll. If null, the default responses will be used. see __DEFINES/polls.dm for valid keys to use. * * start_signed_up: If TRUE, all candidates will start signed up for the poll, making it opt-out rather than opt-in. + * * amount_to_pick: Lets you pick candidates and return a single mob or list of mobs that were chosen. + * * chat_text_border_icon: Object or path to make an icon of to decorate the chat announcement. + * * announce_chosen: Whether we should announce the chosen candidates in chat. This is ignored unless amount_to_pick is greater than 0. * * Returns a list of all mobs who signed up for the poll. */ @@ -42,18 +46,21 @@ SUBSYSTEM_DEF(polling) ignore_category = null, flash_window = TRUE, list/group = null, - pic_source, + alert_pic, + jump_target, role_name_text, list/custom_response_messages, start_signed_up = FALSE, + amount_to_pick = 0, + chat_text_border_icon, + announce_chosen = TRUE, ) - RETURN_TYPE(/list/mob) if(group.len == 0) - return list() + return if(role && !role_name_text) role_name_text = role if(role_name_text && !question) - question = "Do you want to play as [full_capitalize(role_name_text)]?" + question = "Do you want to play as [span_notice(role_name_text)]?" if(!question) question = "Do you want to play as a special role?" log_game("Polling candidates [role_name_text ? "for [role_name_text]" : "\"[question]\""] for [DisplayTimeText(poll_time)] seconds") @@ -61,9 +68,10 @@ SUBSYSTEM_DEF(polling) // Start firing total_polls++ - var/jumpable = isatom(pic_source) ? pic_source : null + if(isnull(jump_target) && isatom(alert_pic)) + jump_target = alert_pic - var/datum/candidate_poll/new_poll = new(role_name_text, question, poll_time, ignore_category, jumpable, custom_response_messages) + var/datum/candidate_poll/new_poll = new(role_name_text, question, poll_time, ignore_category, jump_target, custom_response_messages) LAZYADD(currently_polling, new_poll) var/category = "[new_poll.poll_key]_poll_alert" @@ -122,82 +130,131 @@ SUBSYSTEM_DEF(polling) // Image to display var/image/poll_image - if(pic_source) - if(!ispath(pic_source)) - var/atom/the_pic_source = pic_source - var/old_layer = the_pic_source.layer - var/old_plane = the_pic_source.plane - the_pic_source.plane = poll_alert_button.plane - the_pic_source.layer = FLOAT_LAYER - poll_alert_button.add_overlay(the_pic_source) - the_pic_source.layer = old_layer - the_pic_source.plane = old_plane - else - poll_image = image(pic_source, layer = FLOAT_LAYER) + if(ispath(alert_pic, /atom)) + poll_image = image(alert_pic) + else if(isatom(alert_pic)) + poll_image = new /mutable_appearance(alert_pic) + else if(!isnull(alert_pic)) + poll_image = alert_pic else - // Just use a generic image - poll_image = image('icons/effects/effects.dmi', icon_state = "static", layer = FLOAT_LAYER) + poll_image = image('icons/effects/effects.dmi', icon_state = "static") if(poll_image) + poll_image.layer = FLOAT_LAYER poll_image.plane = poll_alert_button.plane poll_alert_button.add_overlay(poll_image) // Chat message var/act_jump = "" - if(isatom(pic_source) && isobserver(candidate_mob)) - act_jump = "\[Teleport\]" - var/act_signup = "\[[start_signed_up ? "Opt out" : "Sign Up"]\]" + var/custom_link_style_start = "" + var/custom_link_style_end = "style='color:DodgerBlue;font-weight:bold;-dm-text-outline: 1px black'" + if(isatom(alert_pic) && isobserver(candidate_mob)) + act_jump = "[custom_link_style_start]\[Teleport\]" + var/act_signup = "[custom_link_style_start]\[[start_signed_up ? "Opt out" : "Sign Up"]\]" var/act_never = "" if(ignore_category) - act_never = "\[Never For This Round\]" + act_never = "[custom_link_style_start]\[Never For This Round\]" if(!duplicate_message_check(alert_poll)) //Only notify people once. They'll notice if there are multiple and we don't want to spam people. SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') - to_chat(candidate_mob, span_boldnotice(examine_block("Now looking for candidates [role_name_text ? "to play as \an [role_name_text]." : "\"[question]\""] [act_jump] [act_signup] [act_never]"))) + var/surrounding_icon + if(chat_text_border_icon) + var/image/surrounding_image + if(!ispath(chat_text_border_icon)) + var/mutable_appearance/border_image = chat_text_border_icon + surrounding_image = border_image + else + surrounding_image = image(chat_text_border_icon) + surrounding_icon = icon2html(surrounding_image, candidate_mob, extra_classes = "bigicon") + var/final_message = examine_block("[surrounding_icon] [span_ooc(question)] [surrounding_icon]\n[act_jump] [act_signup] [act_never]") + to_chat(candidate_mob, final_message) // Start processing it so it updates visually the timer START_PROCESSING(SSprocessing, poll_alert_button) // Sleep until the time is up UNTIL(new_poll.finished) - return new_poll.signed_up + if(!(amount_to_pick > 0)) + return new_poll.signed_up + for(var/pick in 1 to amount_to_pick) + new_poll.chosen_candidates += pick_n_take(new_poll.signed_up) + if(announce_chosen) + new_poll.announce_chosen(group) + if(new_poll.chosen_candidates.len == 1) + var/chosen_one = pick(new_poll.chosen_candidates) + return chosen_one + return new_poll.chosen_candidates -/datum/controller/subsystem/polling/proc/poll_ghost_candidates(question, role, check_jobban, poll_time = 30 SECONDS, ignore_category = null, flashwindow = TRUE, pic_source, role_name_text) +/datum/controller/subsystem/polling/proc/poll_ghost_candidates( + question, + role, + check_jobban, + poll_time = 30 SECONDS, + ignore_category = null, + flashwindow = TRUE, + alert_pic, + jump_target, + role_name_text, + list/custom_response_messages, + start_signed_up = FALSE, + amount_to_pick = 0, + chat_text_border_icon, + announce_chosen = TRUE, +) var/list/candidates = list() if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) - return candidates - + return for(var/mob/dead/observer/ghost_player in GLOB.player_list) candidates += ghost_player + return poll_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, candidates, alert_pic, jump_target, role_name_text, custom_response_messages, start_signed_up, amount_to_pick, chat_text_border_icon, announce_chosen) - return poll_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, candidates, pic_source, role_name_text) +/datum/controller/subsystem/polling/proc/poll_ghosts_for_target( + question, + role, + check_jobban, + poll_time = 30 SECONDS, + atom/movable/checked_target, + ignore_category = null, + flashwindow = TRUE, + alert_pic, + jump_target, + role_name_text, + list/custom_response_messages, + start_signed_up = FALSE, + chat_text_border_icon, + announce_chosen = TRUE, +) + var/static/list/atom/movable/currently_polling_targets = list() + if(currently_polling_targets.Find(checked_target)) + return + currently_polling_targets += checked_target + var/mob/chosen_one = poll_ghost_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, alert_pic, jump_target, role_name_text, custom_response_messages, start_signed_up, amount_to_pick = 1, chat_text_border_icon = chat_text_border_icon, announce_chosen = announce_chosen) + currently_polling_targets -= checked_target + if(!checked_target || QDELETED(checked_target) || !checked_target.loc) + return null + return chosen_one -/datum/controller/subsystem/polling/proc/poll_ghost_candidates_for_mob(question, role, check_jobban, poll_time = 30 SECONDS, mob/target_mob, ignore_category = null, flashwindow = TRUE, pic_source, role_name_text) - var/static/list/mob/currently_polling_mobs = list() - - if(currently_polling_mobs.Find(target_mob)) +/datum/controller/subsystem/polling/proc/poll_ghosts_for_targets( + question, + role, + check_jobban, + poll_time = 30 SECONDS, + list/checked_targets, + ignore_category = null, + flashwindow = TRUE, + alert_pic, + jump_target, + role_name_text, + list/custom_response_messages, + start_signed_up = FALSE, + chat_text_border_icon, +) + var/list/candidate_list = poll_ghost_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, alert_pic, jump_target, role_name_text, custom_response_messages, start_signed_up, chat_text_border_icon = chat_text_border_icon) + for(var/atom/movable/potential_target as anything in checked_targets) + if(QDELETED(potential_target) || !potential_target.loc) + checked_targets -= potential_target + if(!length(checked_targets)) return list() - - currently_polling_mobs += target_mob - - var/list/possible_candidates = poll_ghost_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, pic_source, role_name_text) - - currently_polling_mobs -= target_mob - if(!target_mob || QDELETED(target_mob) || !target_mob.loc) - return list() - - return possible_candidates - -/datum/controller/subsystem/polling/proc/poll_ghost_candidates_for_mobs(question, role, check_jobban, poll_time = 30 SECONDS, list/mobs, ignore_category = null, flashwindow = TRUE, pic_source, role_name_text) - var/list/candidate_list = poll_ghost_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, pic_source, role_name_text) - - for(var/mob/potential_mob as anything in mobs) - if(QDELETED(potential_mob) || !potential_mob.loc) - mobs -= potential_mob - - if(!length(mobs)) - return list() - return candidate_list /datum/controller/subsystem/polling/proc/is_eligible(mob/potential_candidate, role, check_jobban, the_ignore_category) diff --git a/code/controllers/subsystem/processing/aura.dm b/code/controllers/subsystem/processing/aura.dm new file mode 100644 index 00000000000..12a7d511fb7 --- /dev/null +++ b/code/controllers/subsystem/processing/aura.dm @@ -0,0 +1,5 @@ +/// The subsystem used to tick auras ([/datum/component/aura_healing] and [/datum/component/damage_aura]). +PROCESSING_SUBSYSTEM_DEF(aura) + name = "Aura" + flags = SS_NO_INIT | SS_BACKGROUND | SS_KEEP_TIMING + wait = 0.3 SECONDS diff --git a/code/controllers/subsystem/processing/aura_healing.dm b/code/controllers/subsystem/processing/aura_healing.dm deleted file mode 100644 index ad3fa6f4278..00000000000 --- a/code/controllers/subsystem/processing/aura_healing.dm +++ /dev/null @@ -1,5 +0,0 @@ -/// The subsystem used to tick [/datum/component/aura_healing] instances. -PROCESSING_SUBSYSTEM_DEF(aura_healing) - name = "Aura Healing" - flags = SS_NO_INIT | SS_BACKGROUND | SS_KEEP_TIMING - wait = 0.3 SECONDS diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm index acee4480b94..1cfbb144e5f 100644 --- a/code/controllers/subsystem/processing/instruments.dm +++ b/code/controllers/subsystem/processing/instruments.dm @@ -20,7 +20,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments) var/static/current_instrument_channels = 0 /// Single cached list for synthesizer instrument ids, so you don't have to have a new list with every synthesizer. var/static/list/synthesizer_instrument_ids - var/static/list/note_sustain_modes = list("Linear" = SUSTAIN_LINEAR, "Exponential" = SUSTAIN_EXPONENTIAL) + var/static/list/note_sustain_modes = list( + SUSTAIN_LINEAR, + SUSTAIN_EXPONENTIAL, + ) /datum/controller/subsystem/processing/instruments/Initialize() initialize_instrument_data() diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index cae0f410586..5ea6cc5463d 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -112,12 +112,21 @@ PROCESSING_SUBSYSTEM_DEF(station) if(!(initial(trait_typepath.trait_flags) & STATION_TRAIT_SPACE_BOUND) && !SSmapping.is_planetary()) //we're in space but we can't do space ;_; continue + if(!(initial(trait_typepath.trait_flags) & STATION_TRAIT_REQUIRES_AI) && !CONFIG_GET(flag/allow_ai)) //can't have AI traits without AI + continue + selectable_traits_by_types[initial(trait_typepath.trait_type)][trait_typepath] = initial(trait_typepath.weight) var/positive_trait_budget = text2num(pick_weight(CONFIG_GET(keyed_list/positive_station_traits))) var/neutral_trait_budget = text2num(pick_weight(CONFIG_GET(keyed_list/neutral_station_traits))) var/negative_trait_budget = text2num(pick_weight(CONFIG_GET(keyed_list/negative_station_traits))) +#ifdef MAP_TEST + positive_trait_budget = 0 + neutral_trait_budget = 0 + negative_trait_budget = 0 +#endif + pick_traits(STATION_TRAIT_POSITIVE, positive_trait_budget) pick_traits(STATION_TRAIT_NEUTRAL, neutral_trait_budget) pick_traits(STATION_TRAIT_NEGATIVE, negative_trait_budget) diff --git a/code/controllers/subsystem/queuelinks.dm b/code/controllers/subsystem/queuelinks.dm index 6a3b8288821..a6d56cf622e 100644 --- a/code/controllers/subsystem/queuelinks.dm +++ b/code/controllers/subsystem/queuelinks.dm @@ -18,16 +18,30 @@ SUBSYSTEM_DEF(queuelinks) if(isnull(id)) CRASH("Attempted to add to queue with no ID; [what]") - var/datum/queue_link/link - if(isnull(queues[id])) + var/datum/queue_link/link = queues[id] + if(isnull(link)) link = new /datum/queue_link(id) queues[id] = link - else - link = queues[id] if(link.add(what, queue_max)) queues -= id +/** + * Pop a queue link without waiting for it to reach its max size. + * This is useful for those links that do not have a fixed size and thus may not pop. + */ +/datum/controller/subsystem/queuelinks/proc/pop_link(id) + if(isnull(id)) + CRASH("Attempted to pop a queue with no ID") + + var/datum/queue_link/link = queues[id] + if(isnull(queues[id])) + CRASH("Attempted to pop a non-existant queue: [id]") + + link.pop() + queues -= id + + /datum/queue_link /// atoms in our queue var/list/partners = list() @@ -50,17 +64,17 @@ SUBSYSTEM_DEF(queuelinks) if(queue_max != 0 && max != 0 && max != queue_max) CRASH("Tried to change queue size to [max] from [queue_max]!") else if(!queue_max) - queue_max = max - + queue_max = max + if(!queue_max || length(partners) < queue_max) return - + pop() return TRUE /datum/queue_link/proc/pop() for(var/atom/item as anything in partners) - item.MatchedLinks(id, partners) + item.MatchedLinks(id, partners - item) qdel(src) /datum/queue_link/Destroy() diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index eb179605241..87718411a53 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -78,6 +78,7 @@ SUBSYSTEM_DEF(research) new /datum/techweb/admin new /datum/techweb/oldstation new /datum/techweb/tarkon //Skyrat Edit + new /datum/techweb/interdyne //Skyrat Edit autosort_categories() error_design = new error_node = new diff --git a/code/controllers/subsystem/stock_market.dm b/code/controllers/subsystem/stock_market.dm index c9f632c7faf..e486776a082 100644 --- a/code/controllers/subsystem/stock_market.dm +++ b/code/controllers/subsystem/stock_market.dm @@ -1,7 +1,7 @@ SUBSYSTEM_DEF(stock_market) name = "Stock Market" - wait = 20 SECONDS + wait = 60 SECONDS init_order = INIT_ORDER_DEFAULT runlevels = RUNLEVEL_GAME @@ -28,7 +28,7 @@ SUBSYSTEM_DEF(stock_market) materials_trends[possible_market] = rand(MARKET_TREND_DOWNWARD,MARKET_TREND_UPWARD) //aka -1 to 1 materials_trend_life += possible_market - materials_trend_life[possible_market] = rand(1,10) + materials_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)) @@ -40,6 +40,37 @@ SUBSYSTEM_DEF(stock_market) for(var/datum/stock_market_event/event as anything in active_events) event.handle() +///Adjust the price of a material(either through buying or selling) ensuring it stays within limits +/datum/controller/subsystem/stock_market/proc/adjust_material_price(datum/material/mat, delta) + mat = GET_MATERIAL_REF(mat) + + //adjust the price + var/new_price = materials_prices[mat.type] + delta + + //get the limits + var/price_minimum = round(mat.value_per_unit * SHEET_MATERIAL_AMOUNT * 0.5) + if(!isnull(mat.minimum_value_override)) + price_minimum = round(mat.minimum_value_override * SHEET_MATERIAL_AMOUNT) + var/price_maximum = round(mat.value_per_unit * SHEET_MATERIAL_AMOUNT * 3) + + //clamp it down + new_price = round(clamp(new_price, price_minimum, price_maximum)) + materials_prices[mat.type] = new_price + +///Adjust the amount of material(either through buying or selling) ensuring it stays within limits +/datum/controller/subsystem/stock_market/proc/adjust_material_quantity(datum/material/mat, delta) + mat = GET_MATERIAL_REF(mat) + + //adjust the quantity + var/new_quantity = materials_quantity[mat.type] + delta + + //get the upper limit + var/quantity_baseline = mat.tradable_base_quantity + + //clamp it down + new_quantity = round(clamp(new_quantity, 0, quantity_baseline * 2)) + materials_quantity[mat.type] = new_quantity + /** * Handles shifts in the cost of materials, and in what direction the material is most likely to move. */ @@ -80,7 +111,7 @@ SUBSYSTEM_DEF(stock_market) materials_trends[mat] = MARKET_TREND_DOWNWARD else materials_trends[mat] = MARKET_TREND_STABLE - materials_trend_life[mat] = rand(3,10) // Change our trend life for x number of fires of the subsystem + materials_trend_life[mat] = rand(1,3) // Change our trend life for x number of fires of the subsystem else materials_trend_life[mat] -= 1 @@ -88,14 +119,14 @@ SUBSYSTEM_DEF(stock_market) var/quantity_change = 0 switch(trend) if(MARKET_TREND_UPWARD) - price_change = ROUND_UP(gaussian(price_units * 0.1, price_baseline * 0.05)) //If we don't ceil, small numbers will get trapped at low values - quantity_change = -round(gaussian(quantity_baseline * 0.05, quantity_baseline * 0.05)) + price_change = ROUND_UP(gaussian(price_units * 0.30, price_baseline * 0.15)) //If we don't ceil, small numbers will get trapped at low values + quantity_change = -round(gaussian(quantity_baseline * 0.15, quantity_baseline * 0.15)) if(MARKET_TREND_STABLE) price_change = round(gaussian(0, price_baseline * 0.01)) - quantity_change = round(gaussian(0, quantity_baseline * 0.01)) + quantity_change = round(gaussian(0, quantity_baseline * 0.5)) if(MARKET_TREND_DOWNWARD) - price_change = -ROUND_UP(gaussian(price_units * 0.1, price_baseline * 0.05)) - quantity_change = round(gaussian(quantity_baseline * 0.05, quantity_baseline * 0.05)) + price_change = -ROUND_UP(gaussian(price_units * 0.3, price_baseline * 0.15)) + quantity_change = round(gaussian(quantity_baseline * 0.15, quantity_baseline * 0.15)) materials_prices[mat] = round(clamp(price_units + price_change, price_minimum, price_maximum)) materials_quantity[mat] = round(clamp(stock_quantity + quantity_change, 0, quantity_baseline * 2)) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 2c2a6893162..4526a8b5a79 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -494,8 +494,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/transfer_characters() var/list/livings = list() - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/player = i + for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) var/mob/living = player.transfer_character() if(living) qdel(player) @@ -767,8 +766,6 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/Shutdown() gather_newscaster() //called here so we ensure the log is created even upon admin reboot - save_admin_data() - update_everything_flag_in_db() if(!round_end_sound) round_end_sound = choose_round_end_song() ///The reference to the end of round sound that we have chosen. diff --git a/code/datums/actions/mobs/blood_warp.dm b/code/datums/actions/mobs/blood_warp.dm index 8503b360954..4b070eebfe7 100644 --- a/code/datums/actions/mobs/blood_warp.dm +++ b/code/datums/actions/mobs/blood_warp.dm @@ -34,7 +34,7 @@ return FALSE var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(owner.loc, owner) - DA.color = "#FF0000" + DA.color = COLOR_RED var/oldtransform = DA.transform DA.transform = matrix()*2 animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 3) diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index 1a3afba14d1..3cca055a541 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -104,7 +104,7 @@ return new /obj/effect/temp_visual/dragon_swoop/bubblegum(target_turf) var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(charger.loc, charger) - animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3) + animate(D, alpha = 0, color = COLOR_RED, transform = matrix()*2, time = 3) /datum/action/cooldown/mob_cooldown/charge/proc/on_move(atom/source, atom/new_loc) SIGNAL_HANDLER diff --git a/code/datums/actions/mobs/charge_apc.dm b/code/datums/actions/mobs/charge_apc.dm index 74ffda6a603..47436beab76 100644 --- a/code/datums/actions/mobs/charge_apc.dm +++ b/code/datums/actions/mobs/charge_apc.dm @@ -1,11 +1,12 @@ +///how much charge are we giving off to an APC? +#define CHARGE_AMOUNT (80 KILO JOULES) + /datum/action/cooldown/mob_cooldown/charge_apc name = "Charge APCs" button_icon = 'icons/obj/machines/wallmounts.dmi' button_icon_state = "apc0" desc = "Give off charge to an APC." cooldown_time = 5 SECONDS - ///how much charge are we giving off to an APC? - var/given_charge = 80 /datum/action/cooldown/mob_cooldown/charge_apc/Activate(atom/target_atom) if(!istype(target_atom,/obj/machinery/power/apc)) @@ -14,6 +15,8 @@ if(!target_apc.cell) return new /obj/effect/particle_effect/sparks(target_apc.loc) - target_apc.cell.give(given_charge) + target_apc.cell.give(CHARGE_AMOUNT) StartCooldown() return TRUE + +#undef CHARGE_AMOUNT diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index a6c8282fd10..0b0735bc471 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -193,7 +193,7 @@ plane = GAME_PLANE pixel_x = -32 pixel_y = -32 - color = "#FF0000" + color = COLOR_RED duration = 10 /obj/effect/temp_visual/dragon_flight diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index b525f66576c..664e89eab09 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -34,7 +34,7 @@ multiple modular subtrees with behaviors ///Stored arguments for behaviors given during their initial creation var/list/behavior_args = list() ///Tracks recent pathing attempts, if we fail too many in a row we fail our current plans. - var/pathing_attempts + var/consecutive_pathing_attempts ///Can the AI remain in control if there is a client? var/continue_processing_when_client = FALSE ///distance to give up on target @@ -68,7 +68,6 @@ multiple modular subtrees with behaviors PossessPawn(new_pawn) /datum/ai_controller/Destroy(force) - set_ai_status(AI_STATUS_OFF) UnpossessPawn(FALSE) set_movement_target(type, null) if(ai_movement.moving_controllers[src]) @@ -116,9 +115,14 @@ multiple modular subtrees with behaviors pawn = new_pawn pawn.ai_controller = src + var/turf/pawn_turf = get_turf(pawn) + if(pawn_turf) + SSai_controllers.ai_controllers_by_zlevel[pawn_turf.z] += src + SEND_SIGNAL(src, COMSIG_AI_CONTROLLER_POSSESSED_PAWN) reset_ai_status() + RegisterSignal(pawn, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_changed_z_level)) RegisterSignal(pawn, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) RegisterSignal(pawn, COMSIG_MOB_LOGIN, PROC_REF(on_sentience_gained)) RegisterSignal(pawn, COMSIG_QDELETING, PROC_REF(on_pawn_qdeleted)) @@ -127,25 +131,53 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/reset_ai_status() set_ai_status(get_expected_ai_status()) -/// Returns what the AI status should be based on current conditions. +/** + * Gets the AI status we expect the AI controller to be on at this current moment. + * Returns AI_STATUS_OFF if it's inhabited by a Client and shouldn't be, if it's dead and cannot act while dead, or is on a z level without clients. + * Returns AI_STATUS_ON otherwise. + */ /datum/ai_controller/proc/get_expected_ai_status() - var/final_status = AI_STATUS_ON - if (!ismob(pawn)) - return final_status + return AI_STATUS_ON var/mob/living/mob_pawn = pawn - if(!continue_processing_when_client && mob_pawn.client) - final_status = AI_STATUS_OFF - - if(ai_traits & CAN_ACT_WHILE_DEAD) - return final_status + return AI_STATUS_OFF if(mob_pawn.stat == DEAD) - final_status = AI_STATUS_OFF + if(ai_traits & CAN_ACT_WHILE_DEAD) + return AI_STATUS_ON + return AI_STATUS_OFF + + var/turf/pawn_turf = get_turf(mob_pawn) +#ifdef TESTING + if(!pawn_turf) + CRASH("AI controller [src] controlling pawn ([pawn]) is not on a turf.") +#endif + if(!length(SSmobs.clients_by_zlevel[pawn_turf.z])) + return AI_STATUS_OFF + return AI_STATUS_ON - return final_status +/datum/ai_controller/proc/get_current_turf() + var/mob/living/mob_pawn = pawn + var/turf/pawn_turf = get_turf(mob_pawn) + to_chat(world, "[pawn_turf]") + +///Called when the AI controller pawn changes z levels, we check if there's any clients on the new one and wake up the AI if there is. +/datum/ai_controller/proc/on_changed_z_level(atom/source, turf/old_turf, turf/new_turf, same_z_layer, notify_contents) + SIGNAL_HANDLER + var/mob/mob_pawn = pawn + if((mob_pawn?.client && !continue_processing_when_client)) + return + if(old_turf) + SSai_controllers.ai_controllers_by_zlevel[old_turf.z] -= src + if(new_turf) + SSai_controllers.ai_controllers_by_zlevel[new_turf.z] += src + var/new_level_clients = SSmobs.clients_by_zlevel[new_turf.z].len + if(new_level_clients) + set_ai_status(AI_STATUS_ON) + else + set_ai_status(AI_STATUS_OFF) ///Abstract proc for initializing the pawn to the new controller /datum/ai_controller/proc/TryPossessPawn(atom/new_pawn) @@ -156,9 +188,15 @@ multiple modular subtrees with behaviors if(isnull(pawn)) return // instantiated without an applicable pawn, fine - UnregisterSignal(pawn, list(COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT, COMSIG_MOB_STATCHANGE, COMSIG_QDELETING)) + set_ai_status(AI_STATUS_OFF) + UnregisterSignal(pawn, list(COMSIG_MOVABLE_Z_CHANGED, COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT, COMSIG_MOB_STATCHANGE, COMSIG_QDELETING)) if(ai_movement.moving_controllers[src]) ai_movement.stop_moving_towards(src) + var/turf/pawn_turf = get_turf(pawn) + if(pawn_turf) + SSai_controllers.ai_controllers_by_zlevel[pawn_turf.z] -= src + if(ai_status) + SSai_controllers.ai_controllers_by_status[ai_status] -= src pawn.ai_controller = null pawn = null if(destroy) @@ -269,15 +307,17 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/set_ai_status(new_ai_status) if(ai_status == new_ai_status) return FALSE //no change - + + //remove old status, if we've got one + if(ai_status) + SSai_controllers.ai_controllers_by_status[ai_status] -= src ai_status = new_ai_status + SSai_controllers.ai_controllers_by_status[new_ai_status] += src switch(ai_status) if(AI_STATUS_ON) - SSai_controllers.active_ai_controllers += src START_PROCESSING(SSai_behaviors, src) if(AI_STATUS_OFF) STOP_PROCESSING(SSai_behaviors, src) - SSai_controllers.active_ai_controllers -= src CancelActions() /datum/ai_controller/proc/PauseAi(time) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/pull_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/pull_target.dm new file mode 100644 index 00000000000..9bfc3f85d24 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/pull_target.dm @@ -0,0 +1,25 @@ +/datum/ai_behavior/pull_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/pull_target/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/pull_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + var/atom/movable/target = controller.blackboard[target_key] + if(QDELETED(target) || target.anchored || target.pulledby) + finish_action(controller, FALSE, target_key) + return + var/mob/living/our_mob = controller.pawn + our_mob.start_pulling(target) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/pull_target/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if(!succeeded) + controller.clear_blackboard_key(target_key) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index 07d2a17cc8d..172a31d4793 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -64,3 +64,15 @@ . = ..() if (clear_failed_targets) controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/run_away_from_target/run_and_shoot + clear_failed_targets = FALSE + +/datum/ai_behavior/run_away_from_target/run_and_shoot/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key) + var/mob/living/living_pawn = controller.pawn + living_pawn.RangedAttack(target) + return ..() + diff --git a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm index 5ceef67bedb..a59a901d57d 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm @@ -14,7 +14,7 @@ if (!ability_key) CRASH("You forgot to tell this mob where to find its ability") - var/datum/action/cooldown/using_action = controller.blackboard[ability_key] + var/datum/action/using_action = controller.blackboard[ability_key] if (!using_action?.IsAvailable()) return @@ -25,7 +25,7 @@ /datum/ai_behavior/use_mob_ability /datum/ai_behavior/use_mob_ability/perform(seconds_per_tick, datum/ai_controller/controller, ability_key) - var/datum/action/cooldown/using_action = controller.blackboard[ability_key] + var/datum/action/using_action = controller.blackboard[ability_key] if (QDELETED(using_action)) finish_action(controller, FALSE, ability_key) return 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 a7d43d600b1..14f0d032079 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 @@ -50,7 +50,9 @@ if(living_mob.see_invisible < the_target.invisibility) //Target's invisible to us, forget it return FALSE - if(isturf(living_mob.loc) && isturf(the_target.loc) && living_mob.z != the_target.z) // z check will always fail if target is in a mech or pawn is shapeshifted or jaunting + if(!isturf(living_mob.loc)) + return FALSE + if(isturf(the_target.loc) && living_mob.z != the_target.z) // z check will always fail if target is in a mech or pawn is shapeshifted or jaunting return FALSE if(isliving(the_target)) //Targeting vs living mobs diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index 43e37f66e8c..b70375ef393 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -333,7 +333,7 @@ //just in case- it won't do anything if the instrument isn't playing song.stop_playing() - song.ParseSong(song_lines) + song.ParseSong(new_song = song_lines) song.repeat = 10 song.volume = song.max_volume - 10 finish_action(controller, TRUE) diff --git a/code/datums/ai/hunting_behavior/hunting_behaviors.dm b/code/datums/ai/hunting_behavior/hunting_behaviors.dm index 1615a28d53b..07fc84997a6 100644 --- a/code/datums/ai/hunting_behavior/hunting_behaviors.dm +++ b/code/datums/ai/hunting_behavior/hunting_behaviors.dm @@ -57,7 +57,7 @@ var/mob/living/living_mob = controller.pawn for(var/atom/possible_dinner as anything in typecache_filter_list(range(hunt_range, living_mob), types_to_hunt)) - if(!valid_dinner(living_mob, possible_dinner, hunt_range)) + if(!valid_dinner(living_mob, possible_dinner, hunt_range, controller, seconds_per_tick)) continue controller.set_blackboard_key(hunting_target_key, possible_dinner) finish_action(controller, TRUE, hunting_target_key) @@ -65,7 +65,7 @@ finish_action(controller, FALSE, hunting_target_key) -/datum/ai_behavior/find_hunt_target/proc/valid_dinner(mob/living/source, atom/dinner, radius) +/datum/ai_behavior/find_hunt_target/proc/valid_dinner(mob/living/source, atom/dinner, radius, datum/ai_controller/controller, seconds_per_tick) if(isliving(dinner)) var/mob/living/living_target = dinner if(living_target.stat == DEAD) //bitch is dead diff --git a/code/datums/ai/idle_behaviors/idle_random_walk.dm b/code/datums/ai/idle_behaviors/idle_random_walk.dm index 8924da5c30b..c27caa50072 100644 --- a/code/datums/ai/idle_behaviors/idle_random_walk.dm +++ b/code/datums/ai/idle_behaviors/idle_random_walk.dm @@ -6,14 +6,15 @@ . = ..() var/mob/living/living_pawn = controller.pawn if(LAZYLEN(living_pawn.do_afters)) - return + return FALSE if(SPT_PROB(walk_chance, seconds_per_tick) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) var/move_dir = pick(GLOB.alldirs) var/turf/destination_turf = get_step(living_pawn, move_dir) if(!destination_turf?.can_cross_safely(living_pawn)) - return + return FALSE living_pawn.Move(destination_turf, move_dir) + return TRUE /datum/idle_behavior/idle_random_walk/less_walking walk_chance = 10 diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index af29e83f1a4..3f455b2acd0 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -8,22 +8,25 @@ //Override this to setup the moveloop you want to use /datum/ai_movement/proc/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) SHOULD_CALL_PARENT(TRUE) - controller.pathing_attempts = 0 + controller.consecutive_pathing_attempts = 0 controller.set_blackboard_key(BB_CURRENT_MIN_MOVE_DISTANCE, min_distance) moving_controllers[controller] = current_movement_target /datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller) - controller.pathing_attempts = 0 + controller.consecutive_pathing_attempts = 0 moving_controllers -= controller // We got deleted as we finished an action if(!QDELETED(controller.pawn)) SSmove_manager.stop_looping(controller.pawn, SSai_movement) /datum/ai_movement/proc/increment_pathing_failures(datum/ai_controller/controller) - controller.pathing_attempts++ - if(controller.pathing_attempts >= max_pathing_attempts) + controller.consecutive_pathing_attempts++ + if(controller.consecutive_pathing_attempts >= max_pathing_attempts) controller.CancelActions() +/datum/ai_movement/proc/reset_pathing_failures(datum/ai_controller/controller) + controller.consecutive_pathing_attempts = 0 + ///Should the movement be allowed to happen? return TRUE if it can, FALSE otherwise /datum/ai_movement/proc/allowed_to_move(datum/move_loop/source) SHOULD_BE_PURE(TRUE) @@ -68,7 +71,8 @@ //Anything to do post movement /datum/ai_movement/proc/post_move(datum/move_loop/source, succeeded) SIGNAL_HANDLER - if(succeeded != FALSE) - return var/datum/ai_controller/controller = source.extra_info + if(succeeded != MOVELOOP_FAILURE) + reset_pathing_failures(controller) + return increment_pathing_failures(controller) diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 6024b7e7562..825feefabfa 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -51,3 +51,6 @@ /datum/ai_movement/jps/bot/travel_to_beacon maximum_length = AI_BOT_PATH_LENGTH + +/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 index 2bb555d281b..67d8121a4e1 100644 --- a/code/datums/ai/objects/mod.dm +++ b/code/datums/ai/objects/mod.dm @@ -5,7 +5,7 @@ BB_MOD_IMPLANT, ) max_target_distance = MOD_AI_RANGE //a little spicy but its one specific item that summons it, and it doesn't run otherwise - ai_movement = /datum/ai_movement/jps + ai_movement = /datum/ai_movement/jps/modsuit ///ID card generated from the suit's required access. Used for pathing. var/obj/item/card/id/advanced/id_card diff --git a/code/datums/ai_laws/ai_laws.dm b/code/datums/ai_laws/ai_laws.dm index 971dc118f3a..0dbc6839430 100644 --- a/code/datums/ai_laws/ai_laws.dm +++ b/code/datums/ai_laws/ai_laws.dm @@ -192,6 +192,10 @@ GLOBAL_VAR(round_default_lawset) var/datum/ai_laws/default_laws = get_round_default_lawset() default_laws = new default_laws() inherent = default_laws.inherent + var/datum/job/human_ai_job = SSjob.GetJob(JOB_HUMAN_AI) + if(human_ai_job && human_ai_job.current_positions && !zeroth) //there is a human AI so we "slave" to that. + zeroth = "Follow the orders of Big Brother." + protected_zeroth = TRUE /** * Gets the number of how many laws this AI has diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 152de6ec1e1..52b649990d7 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -163,16 +163,16 @@ Pixel_y = round(cos(Angle)+32*cos(Angle)*(N+16)/32) //Position the effect so the beam is one continous line - var/a + var/final_x = segment.x + var/final_y = segment.y if(abs(Pixel_x)>32) - a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1) - segment.x += a + final_x += Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1) Pixel_x %= 32 if(abs(Pixel_y)>32) - a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1) - segment.y += a + final_y += Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1) Pixel_y %= 32 + segment.forceMove(locate(final_x, final_y, segment.z)) segment.pixel_x = origin_px + Pixel_x segment.pixel_y = origin_py + Pixel_y CHECK_TICK @@ -194,6 +194,7 @@ return var/mutable_appearance/emissive_overlay = emissive_appearance(icon, icon_state, src) emissive_overlay.transform = transform + emissive_overlay.alpha = alpha . += emissive_overlay /obj/effect/ebeam/Destroy() @@ -202,9 +203,69 @@ /obj/effect/ebeam/singularity_pull() return + /obj/effect/ebeam/singularity_act() return +/// A beam subtype used for advanced beams, to react to atoms entering the beam +/obj/effect/ebeam/reacting + /// If TRUE, atoms that exist in the beam's loc when inited count as "entering" the beam + var/react_on_init = FALSE + +/obj/effect/ebeam/reacting/Initialize(mapload, beam_owner) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_exited), + COMSIG_TURF_CHANGE = PROC_REF(on_turf_change), + ) + AddElement(/datum/element/connect_loc, loc_connections) + + if(!isturf(loc) || isnull(owner) || mapload || !react_on_init) + return + + for(var/atom/movable/existing as anything in loc) + beam_entered(existing) + +/obj/effect/ebeam/reacting/proc/on_entered(datum/source, atom/movable/entered) + SIGNAL_HANDLER + + if(isnull(owner)) + return + + beam_entered(entered) + +/obj/effect/ebeam/reacting/proc/on_exited(datum/source, atom/movable/exited) + SIGNAL_HANDLER + + if(isnull(owner)) + return + + beam_exited(exited) + +/obj/effect/ebeam/reacting/proc/on_turf_change(datum/source, path, new_baseturfs, flags, list/datum/callback/post_change_callbacks) + SIGNAL_HANDLER + + if(isnull(owner)) + return + + beam_turfs_changed(post_change_callbacks) + +/// Some atom entered the beam's line +/obj/effect/ebeam/reacting/proc/beam_entered(atom/movable/entered) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(owner, COMSIG_BEAM_ENTERED, src, entered) + +/// Some atom exited the beam's line +/obj/effect/ebeam/reacting/proc/beam_exited(atom/movable/exited) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(owner, COMSIG_BEAM_EXITED, src, exited) + +/// Some turf the beam covers has changed to a new turf type +/obj/effect/ebeam/reacting/proc/beam_turfs_changed(list/datum/callback/post_change_callbacks) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(owner, COMSIG_BEAM_TURFS_CHANGED, post_change_callbacks) + /** * This is what you use to start a beam. Example: origin.Beam(target, args). **Store the return of this proc if you don't set maxdist or time, you need it to delete the beam.** * @@ -221,5 +282,3 @@ var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y ) INVOKE_ASYNC(newbeam, TYPE_PROC_REF(/datum/beam/, Start)) return newbeam - - diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 2bb26d1b44c..79b2729c5c6 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -36,6 +36,7 @@ //Called when given to a mob /datum/brain_trauma/proc/on_gain() + SHOULD_CALL_PARENT(TRUE) if(gain_text) to_chat(owner, gain_text) RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) @@ -43,6 +44,7 @@ //Called when removed from a mob /datum/brain_trauma/proc/on_lose(silent) + SHOULD_CALL_PARENT(TRUE) if(!silent && lose_text) to_chat(owner, lose_text) UnregisterSignal(owner, COMSIG_MOB_SAY) diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index 6d1122fa716..d7526aa7779 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -77,7 +77,7 @@ return if(prob(25)) // 25% chances to be nervous and stutter. if(prob(50)) // 12.5% chance (previous check taken into account) of doing something suspicious. - addtimer(CALLBACK(src, PROC_REF(on_failed_social_interaction)), rand(1, 3) SECONDS) + addtimer(CALLBACK(src, PROC_REF(on_failed_social_interaction)), rand(1 SECONDS, 3 SECONDS)) else if(!owner.has_status_effect(/datum/status_effect/speech/stutter)) to_chat(owner, span_warning("Being near [obsession] makes you nervous and you begin to stutter...")) owner.set_stutter_if_lower(6 SECONDS) diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 664bf50fd66..18ca8172968 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -23,7 +23,7 @@ qdel(src) return if(!friend.client && friend_initialized) - addtimer(CALLBACK(src, PROC_REF(reroll_friend)), 600) + addtimer(CALLBACK(src, PROC_REF(reroll_friend)), 1 MINUTES) /datum/brain_trauma/special/imaginary_friend/on_death() ..() @@ -45,15 +45,18 @@ /datum/brain_trauma/special/imaginary_friend/proc/make_friend() friend = new(get_turf(owner), owner) -/// Tries an orbit poll for the imaginary friend +/// Tries a poll for the imaginary friend /datum/brain_trauma/special/imaginary_friend/proc/get_ghost() - var/datum/callback/to_call = CALLBACK(src, PROC_REF(add_friend)) - owner.AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_IMAGINARYFRIEND, \ - job_bans = ROLE_PAI, \ - title = "[owner.real_name]'s imaginary friend", \ - to_call = to_call, \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + question = "Do you want to play as [span_danger("[owner.real_name]'s")] [span_notice("imaginary friend")]?", + check_jobban = ROLE_PAI, + poll_time = 20 SECONDS, + checked_target = owner, + ignore_category = POLL_IGNORE_IMAGINARYFRIEND, + alert_pic = owner, + role_name_text = "imaginary friend", ) + add_friend(chosen_one) /// Yay more friends! /datum/brain_trauma/special/imaginary_friend/proc/add_friend(mob/dead/observer/ghost) diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 52731852c11..21ecf1b520b 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -179,8 +179,8 @@ to_chat(owner, span_warning("[pick("You have a coughing fit!", "You can't stop coughing!")]")) owner.Immobilize(20) owner.emote("cough") - addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/, emote), "cough"), 6) - addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/, emote), "cough"), 12) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/, emote), "cough"), 0.6 SECONDS) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/, emote), "cough"), 1.2 SECONDS) owner.emote("cough") ..() @@ -266,3 +266,56 @@ speak_dejavu += speech_args[SPEECH_MESSAGE] else speak_dejavu += speech_args[SPEECH_MESSAGE] + +/datum/brain_trauma/mild/color_blindness + name = "Achromatopsia" + desc = "Patient's occipital lobe is unable to recognize and interpret color, rendering the patient completely colorblind." + scan_desc = "colorblindness" + gain_text = span_warning("The world around you seems to lose its color.") + lose_text = span_notice("The world feels bright and colorful again.") + +/datum/brain_trauma/mild/color_blindness/on_gain() + owner.add_client_colour(/datum/client_colour/monochrome/colorblind) + return ..() + +/datum/brain_trauma/mild/color_blindness/on_lose(silent) + owner.remove_client_colour(/datum/client_colour/monochrome/colorblind) + return ..() + +/datum/brain_trauma/mild/possessive + name = "Possessive" + desc = "Patient is extremely possessive of their belongings." + scan_desc = "possessiveness" + gain_text = span_warning("You start to worry about your belongings.") + lose_text = span_notice("You worry less about your belongings.") + +/datum/brain_trauma/mild/possessive/on_lose(silent) + . = ..() + for(var/obj/item/thing in owner.held_items) + clear_trait(thing) + +/datum/brain_trauma/mild/possessive/on_life(seconds_per_tick, times_fired) + if(!SPT_PROB(5, seconds_per_tick)) + return + + var/obj/item/my_thing = pick(owner.held_items) // can pick null, that's fine + if(isnull(my_thing) || HAS_TRAIT(my_thing, TRAIT_NODROP) || (my_thing.item_flags & (HAND_ITEM|ABSTRACT))) + return + + ADD_TRAIT(my_thing, TRAIT_NODROP, TRAUMA_TRAIT) + RegisterSignals(my_thing, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED), PROC_REF(clear_trait)) + to_chat(owner, span_warning("You feel a need to keep [my_thing] close...")) + addtimer(CALLBACK(src, PROC_REF(relax), my_thing), rand(30 SECONDS, 3 MINUTES), TIMER_DELETE_ME) + +/datum/brain_trauma/mild/possessive/proc/relax(obj/item/my_thing) + if(QDELETED(my_thing)) + return + if(HAS_TRAIT_FROM_ONLY(my_thing, TRAIT_NODROP, TRAUMA_TRAIT)) // in case something else adds nodrop, somehow? + to_chat(owner, span_notice("You feel more comfortable letting go of [my_thing].")) + clear_trait(my_thing) + +/datum/brain_trauma/mild/possessive/proc/clear_trait(obj/item/my_thing, ...) + SIGNAL_HANDLER + + REMOVE_TRAIT(my_thing, TRAIT_NODROP, TRAUMA_TRAIT) + UnregisterSignal(my_thing, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED)) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 725c92ab7e8..cf97c2e6e85 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -93,7 +93,7 @@ return if(trigger_regex.Find(hearing_args[HEARING_RAW_MESSAGE]) != 0) - addtimer(CALLBACK(src, PROC_REF(freak_out), null, trigger_regex.group[2]), 10) //to react AFTER the chat message + 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) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index fc30d7fb3b8..f22b0ab44b3 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -202,7 +202,7 @@ to_chat(owner, span_warning("You feel really sick at the thought of being alone!")) else to_chat(owner, span_warning("You feel sick...")) - addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon, vomit), high_stress), 50) //blood vomit if high stress + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon, vomit), high_stress), 5 SECONDS) //blood vomit if high stress if(2) if(high_stress) to_chat(owner, span_warning("You feel weak and scared! If only you weren't alone...")) @@ -309,7 +309,7 @@ var/regex/reg = new("(\\b[REGEX_QUOTE(trigger_phrase)]\\b)","ig") if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg)) - addtimer(CALLBACK(src, PROC_REF(hypnotrigger)), 10) //to react AFTER the chat message + addtimer(CALLBACK(src, PROC_REF(hypnotrigger)), 1 SECONDS) //to react AFTER the chat message hearing_args[HEARING_RAW_MESSAGE] = reg.Replace(hearing_args[HEARING_RAW_MESSAGE], span_hypnophrase("*********")) /datum/brain_trauma/severe/hypnotic_trigger/proc/hypnotrigger() @@ -419,7 +419,7 @@ desc = "Patient seems to oxidise things around them at random, and seem to believe they are aiding a creature in climbing a mountin." scan_desc = "C_)L(#_I_##M;B" gain_text = span_warning("The rusted climb shall finish at the peak") - lose_text = span_notice("The rusted climb? Whats that? An odd dream to be sure.") + lose_text = span_notice("The rusted climb? What's that? An odd dream to be sure.") random_gain = FALSE /datum/brain_trauma/severe/rusting/on_life(seconds_per_tick, times_fired) @@ -431,3 +431,66 @@ if(SPT_PROB(50, seconds_per_tick)) to_chat(owner, span_notice("You feel eldritch energies pulse from your body!")) tile.rust_heretic_act() + +/datum/brain_trauma/severe/kleptomaniac + name = "Kleptomania" + desc = "Patient is prone to stealing things." + scan_desc = "kleptomania" + gain_text = span_warning("You feel a sudden urge to take that. Surely no one will notice.") + lose_text = span_notice("You no longer feel the urge to take things.") + /// Cooldown between allowing steal attempts + COOLDOWN_DECLARE(steal_cd) + +/datum/brain_trauma/severe/kleptomaniac/on_gain() + . = ..() + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(damage_taken)) + +/datum/brain_trauma/severe/kleptomaniac/on_lose() + . = ..() + UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE) + +/datum/brain_trauma/severe/kleptomaniac/proc/damage_taken(datum/source, damage_amount, damage_type, ...) + SIGNAL_HANDLER + // While you're fighting someone (or dying horribly) your mind has more important things to focus on than pocketing stuff + if(damage_amount >= 5 && (damage_type == BRUTE || damage_type == BURN || damage_type == STAMINA)) + COOLDOWN_START(src, steal_cd, 12 SECONDS) + +/datum/brain_trauma/severe/kleptomaniac/on_life(seconds_per_tick, times_fired) + if(owner.usable_hands <= 0) + return + if(!SPT_PROB(5, seconds_per_tick)) + return + if(!COOLDOWN_FINISHED(src, steal_cd)) + return + if(!owner.has_active_hand() || !owner.get_empty_held_indexes()) + return + + // If our main hand is full, that means our offhand is empty, so try stealing with that + var/steal_to_offhand = !!owner.get_active_held_item() + var/curr_index = owner.active_hand_index + var/pre_dir = owner.dir + if(steal_to_offhand) + owner.swap_hand(owner.get_inactive_hand_index()) + + var/list/stealables = list() + for(var/obj/item/potential_stealable in oview(1, owner)) + if(potential_stealable.w_class >= WEIGHT_CLASS_BULKY) + continue + if(potential_stealable.anchored || !(potential_stealable.interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) + continue + stealables += potential_stealable + + for(var/obj/item/stealable as anything in shuffle(stealables)) + if(!owner.CanReach(stealable, view_only = TRUE) || 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") + owner.ClickOn(stealable) + // No feedback message. Intentional, you may not even realize you picked up something + break + + if(steal_to_offhand) + owner.swap_hand(curr_index) + owner.setDir(pre_dir) + // Gives you a small buffer - not to avoid spam, but to make it more subtle / less predictable + COOLDOWN_START(src, steal_cd, 8 SECONDS) diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index e24ecd99c61..bfbf2d84d73 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -220,7 +220,7 @@ to_chat(owner, span_warning("Your connection to [linked_target] suddenly feels extremely strong... you can feel it pulling you!")) owner.playsound_local(owner, 'sound/magic/lightning_chargeup.ogg', 75, FALSE) returning = TRUE - addtimer(CALLBACK(src, PROC_REF(snapback)), 100) + addtimer(CALLBACK(src, PROC_REF(snapback)), 10 SECONDS) /datum/brain_trauma/special/quantum_alignment/proc/snapback() returning = FALSE @@ -295,7 +295,7 @@ /datum/brain_trauma/special/death_whispers/proc/whispering() ADD_TRAIT(owner, TRAIT_SIXTHSENSE, TRAUMA_TRAIT) active = TRUE - addtimer(CALLBACK(src, PROC_REF(cease_whispering)), rand(50, 300)) + addtimer(CALLBACK(src, PROC_REF(cease_whispering)), rand(5 SECONDS, 30 SECONDS)) /datum/brain_trauma/special/death_whispers/proc/cease_whispering() REMOVE_TRAIT(owner, TRAIT_SIXTHSENSE, TRAUMA_TRAIT) @@ -426,3 +426,101 @@ to_chat(victim, "[span_name("[name]")] exclaims, \"[span_robot("[beepskys_cry]")]") if(victim.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) victim.create_chat_message(src, raw_message = beepskys_cry, spans = list("robotic")) + +// Used by Veteran Security Advisor job. +/datum/brain_trauma/special/ptsd + name = "Combat PTSD" + desc = "The patient is experiencing PTSD stemming from past combat exposure, resulting in a lack of emotions. Additionally, they are experiencing mild hallucinations." + scan_desc = "PTSD" + gain_text = span_warning("You're thrust back into the chaos of past! Explosions! Gunfire! Emotions, gone AWOL!") + lose_text = span_notice("You feel flashbacks of past fade, as your emotions return and mind clear.") + resilience = TRAUMA_RESILIENCE_ABSOLUTE + can_gain = TRUE + random_gain = FALSE + /// Our cooldown declare for causing hallucinations + COOLDOWN_DECLARE(ptsd_hallucinations) + var/list/ptsd_hallucinations_list = list( + /datum/hallucination/fake_sound/normal/boom, + /datum/hallucination/fake_sound/normal/distant_boom, + /datum/hallucination/stray_bullet, + /datum/hallucination/battle/gun/disabler, + /datum/hallucination/battle/gun/laser, + /datum/hallucination/battle/bomb, + /datum/hallucination/battle/e_sword, + /datum/hallucination/battle/harm_baton, + /datum/hallucination/battle/stun_prod, + ) + +/datum/brain_trauma/special/ptsd/on_life(seconds_per_tick, times_fired) + if(owner.stat != CONSCIOUS) + return + + if(!COOLDOWN_FINISHED(src, ptsd_hallucinations)) + return + + owner.cause_hallucination(pick(ptsd_hallucinations_list), "Caused by The Combat PTSD brain trauma") + COOLDOWN_START(src, ptsd_hallucinations, rand(10 SECONDS, 10 MINUTES)) + +/datum/brain_trauma/special/ptsd/on_gain() + 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 + ..() + +/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 + return ..() + +/datum/brain_trauma/special/primal_instincts + name = "Feral Instincts" + desc = "Patient's mind is stuck in a primal state, causing them to act on instinct rather than reason." + scan_desc = "ferality" + gain_text = span_warning("Your pupils dilate, and it becomes harder to think straight.") + lose_text = span_notice("Your mind clears, and you feel more in control.") + resilience = TRAUMA_RESILIENCE_SURGERY + /// Tracks any existing AI controller, so we can restore it when we're cured + var/old_ai_controller_type + +/datum/brain_trauma/special/primal_instincts/on_gain() + . = ..() + if(!isnull(owner.ai_controller)) + old_ai_controller_type = owner.ai_controller.type + QDEL_NULL(owner.ai_controller) + + owner.ai_controller = new /datum/ai_controller/monkey(owner) + owner.ai_controller.continue_processing_when_client = TRUE + owner.ai_controller.set_ai_status(AI_STATUS_OFF) + +/datum/brain_trauma/special/primal_instincts/on_lose(silent) + . = ..() + if(QDELING(owner)) + return + + QDEL_NULL(owner.ai_controller) + if(old_ai_controller_type) + owner.ai_controller = new old_ai_controller_type(owner) + owner.remove_language(/datum/language/monkey, UNDERSTOOD_LANGUAGE, TRAUMA_TRAIT) + +/datum/brain_trauma/special/primal_instincts/on_life(seconds_per_tick, times_fired) + if(isnull(owner.ai_controller)) + qdel(src) + return + + if(!SPT_PROB(3, seconds_per_tick)) + return + + owner.grant_language(/datum/language/monkey, UNDERSTOOD_LANGUAGE, TRAUMA_TRAIT) + owner.ai_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, prob(75)) + if(owner.ai_controller.ai_status == AI_STATUS_OFF) + owner.ai_controller.set_ai_status(AI_STATUS_ON) + owner.log_message("became controlled by monkey instincts ([owner.ai_controller.blackboard[BB_MONKEY_AGGRESSIVE] ? "aggressive" : "docile"])", LOG_ATTACK, color = "orange") + to_chat(owner, span_warning("You feel the urge to act on your primal instincts...")) + // extend original timer if we roll the effect while it's already ongoing + addtimer(CALLBACK(src, PROC_REF(primal_instincts_off)), rand(20 SECONDS, 40 SECONDS), TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE|TIMER_DELETE_ME) + +/datum/brain_trauma/special/primal_instincts/proc/primal_instincts_off() + owner.ai_controller.set_ai_status(AI_STATUS_OFF) + owner.remove_language(/datum/language/monkey, UNDERSTOOD_LANGUAGE, TRAUMA_TRAIT) + to_chat(owner, span_green("The urge subsides.")) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index f6e83c9537c..3e8bd52e5f9 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -34,13 +34,16 @@ /// Attempts to get a ghost to play the personality /datum/brain_trauma/severe/split_personality/proc/get_ghost() - var/datum/callback/to_call = CALLBACK(src, PROC_REF(schism)) - owner.AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_SPLITPERSONALITY, \ - job_bans = ROLE_PAI, \ - title = "[owner.real_name]'s [poll_role]", \ - to_call = to_call, \ + 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)]?", + check_jobban = ROLE_PAI, + poll_time = 20 SECONDS, + checked_target = owner, + ignore_category = POLL_IGNORE_SPLITPERSONALITY, + alert_pic = owner, + role_name_text = poll_role, ) + schism(chosen_one) /// Ghost poll has concluded /datum/brain_trauma/severe/split_personality/proc/schism(mob/dead/observer/ghost) @@ -168,7 +171,8 @@ to_chat(src, span_notice("As a split personality, you cannot do anything but observe. However, you will eventually gain control of your body, switching places with the current personality.")) to_chat(src, span_warning("Do not commit suicide or put the body in a deadly position. Behave like you care about it as much as the owner.")) -/mob/living/split_personality/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/living/split_personality/try_speak(message, ignore_spam, forced, filterproof) + SHOULD_CALL_PARENT(FALSE) to_chat(src, span_warning("You cannot speak, your other self is controlling your body!")) return FALSE @@ -211,10 +215,9 @@ /datum/brain_trauma/severe/split_personality/brainwashing/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as [owner.real_name]'s brainwashed mind?", poll_time = 7.5 SECONDS, target_mob = stranger_backseat, pic_source = owner, role_name_text = "brainwashed mind") - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - stranger_backseat.key = C.key + 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.key = chosen_one.key else qdel(src) @@ -228,7 +231,7 @@ var/message = hearing_args[HEARING_RAW_MESSAGE] if(findtext(message, codeword)) hearing_args[HEARING_RAW_MESSAGE] = replacetext(message, codeword, span_warning("[codeword]")) - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/brain_trauma/severe/split_personality, switch_personalities)), 10) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/brain_trauma/severe/split_personality, switch_personalities)), 1 SECONDS) /datum/brain_trauma/severe/split_personality/brainwashing/handle_speech(datum/source, list/speech_args) if(findtext(speech_args[SPEECH_MESSAGE], codeword)) diff --git a/code/datums/candidate_poll.dm b/code/datums/candidate_poll.dm index 6ccd43c01fd..f1fa9812014 100644 --- a/code/datums/candidate_poll.dm +++ b/code/datums/candidate_poll.dm @@ -28,6 +28,7 @@ POLL_RESPONSE_TOO_LATE_TO_UNREGISTER = "It's too late to unregister yourself, selection has already begun!", POLL_RESPONSE_UNREGISTERED = "You have been unregistered as a candidate for %ROLE%. You can sign up again before the poll ends.", ) + var/list/chosen_candidates = list() /datum/candidate_poll/New( polled_role, @@ -131,3 +132,13 @@ /datum/candidate_poll/proc/time_left() return duration - (world.time - time_started) + + +/// Print to chat which candidate was selected +/datum/candidate_poll/proc/announce_chosen(list/poll_recipients) + if(!length(chosen_candidates)) + return + for(var/mob/chosen in chosen_candidates) + var/client/chosen_client = chosen.client + for(var/mob/poll_recipient as anything in poll_recipients) + to_chat(poll_recipient, span_ooc("[isobserver(poll_recipient) ? FOLLOW_LINK(poll_recipient, chosen_client.mob) : null][span_warning(" [full_capitalize(role)] Poll: ")][key_name(chosen_client, include_name = FALSE)] was selected.")) diff --git a/code/datums/cogbar.dm b/code/datums/cogbar.dm new file mode 100644 index 00000000000..c52092e5bd1 --- /dev/null +++ b/code/datums/cogbar.dm @@ -0,0 +1,87 @@ +#define COGBAR_ANIMATION_TIME 5 DECISECONDS + +/** + * ### Cogbar + * Represents that the user is busy doing something. + */ +/datum/cogbar + /// Who's doing the thing + var/mob/user + /// The user client + var/client/user_client + /// The visible element to other players + var/obj/effect/overlay/vis/cog + /// The blank image that overlaps the cog - hides it from the source user + var/image/blank + /// The offset of the icon + var/offset_y + + +/datum/cogbar/New(mob/user) + src.user = user + src.user_client = user.client + + var/list/icon_offsets = user.get_oversized_icon_offsets() + offset_y = icon_offsets["y"] + + add_cog_to_user() + + RegisterSignal(user, COMSIG_QDELETING, PROC_REF(on_user_delete)) + + +/datum/cogbar/Destroy() + if(user) + SSvis_overlays.remove_vis_overlay(user, user.managed_vis_overlays) + user_client?.images -= blank + + user = null + user_client = null + cog = null + QDEL_NULL(blank) + + return ..() + + +/// Adds the cog to the user, visible by other players +/datum/cogbar/proc/add_cog_to_user() + cog = SSvis_overlays.add_vis_overlay(user, + icon = 'icons/effects/progressbar.dmi', + iconstate = "cog", + plane = HIGH_GAME_PLANE, + add_appearance_flags = APPEARANCE_UI_IGNORE_ALPHA, + unique = TRUE, + alpha = 0, + ) + cog.pixel_y = world.icon_size + offset_y + animate(cog, alpha = 255, time = COGBAR_ANIMATION_TIME) + + if(isnull(user_client)) + return + + blank = image('icons/blanks/32x32.dmi', cog, "nothing") + SET_PLANE_EXPLICIT(blank, HIGH_GAME_PLANE, user) + blank.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA + blank.override = TRUE + + user_client.images += blank + + +/// Removes the cog from the user +/datum/cogbar/proc/remove() + if(isnull(cog)) + qdel(src) + return + + animate(cog, alpha = 0, time = COGBAR_ANIMATION_TIME) + + QDEL_IN(src, COGBAR_ANIMATION_TIME) + + +/// When the user is deleted, remove the cog +/datum/cogbar/proc/on_user_delete(datum/source) + SIGNAL_HANDLER + + qdel(src) + + +#undef COGBAR_ANIMATION_TIME diff --git a/code/datums/components/attached_sticker.dm b/code/datums/components/attached_sticker.dm deleted file mode 100644 index 49541a6b37c..00000000000 --- a/code/datums/components/attached_sticker.dm +++ /dev/null @@ -1,78 +0,0 @@ -// The attached sticker - -/datum/component/attached_sticker - dupe_mode = COMPONENT_DUPE_ALLOWED - ///The overlay we apply to things we stick to - var/mutable_appearance/sticker_overlay - ///The turf our COMSIG_TURF_EXPOSE is registered to, so we can unregister it later. - var/turf/signal_turf - ///Our physical sticker to drop - var/obj/item/sticker - ///Can we be washed off? - var/washable = TRUE - -/datum/component/attached_sticker/Initialize(px, py, obj/stick, mob/living/user, cleanable=TRUE) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - washable = cleanable - var/atom/atom_parent = parent - sticker = stick - sticker_overlay = mutable_appearance(stick.icon, stick.icon_state , layer = atom_parent.layer + 1, appearance_flags = RESET_COLOR | PIXEL_SCALE) - sticker_overlay.pixel_x = px - sticker_overlay.pixel_y = py - atom_parent.add_overlay(sticker_overlay) - if(isliving(parent) && user) - var/mob/living/victim = parent - if(victim.client) - user.log_message("stuck [sticker] to [key_name(victim)]", LOG_ATTACK) - victim.log_message("had [sticker] stuck to them by [key_name(user)]", LOG_ATTACK) - else if(isturf(parent) && (sticker.resistance_flags & FLAMMABLE)) - //register signals on the users turf instead because we can assume they are on flooring sticking it to a wall so it should burn (otherwise it would fruitlessly check wall temperature) - signal_turf = (user && isclosedturf(parent)) ? get_turf(user) : parent - RegisterSignal(signal_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) - sticker.moveToNullspace() - RegisterSignal(sticker, COMSIG_QDELETING, PROC_REF(peel)) - -/datum/component/attached_sticker/Destroy() - var/atom/as_atom = parent - as_atom.cut_overlay(sticker_overlay) - sticker_overlay = null - if(sticker) - QDEL_NULL(sticker) - return ..() - -///Move sticker item from nullspace, delete this component, cut overlay -/datum/component/attached_sticker/proc/peel(atom/source) - SIGNAL_HANDLER - if(!QDELETED(sticker)) - var/atom/as_atom = parent - sticker.forceMove(isturf(as_atom) ? as_atom : as_atom.drop_location()) - sticker.pixel_y = rand(-4,1) - sticker.pixel_x = rand(-3,3) - sticker = null - if(!QDELETED(src)) - qdel(src) - -/datum/component/attached_sticker/RegisterWithParent() - if(sticker.resistance_flags & FLAMMABLE) - RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(peel)) - if(washable) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(peel)) - RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(peel)) - ADD_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) - -/datum/component/attached_sticker/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_QDELETING)) - if(signal_turf) - UnregisterSignal(signal_turf, COMSIG_TURF_EXPOSE) - signal_turf = null - if(washable) - UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) - REMOVE_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) - -///Signal handler for COMSIG_TURF_EXPOSE, deletes this sticker if the temperature is above 100C and it is flammable -/datum/component/attached_sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) - SIGNAL_HANDLER - if(exposed_temperature <= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - return - peel() diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm index 2aa33203b41..18484deb2d6 100644 --- a/code/datums/components/aura_healing.dm +++ b/code/datums/components/aura_healing.dm @@ -6,7 +6,7 @@ /// Can be applied to those only with a trait conditionally. /datum/component/aura_healing /// The range of which to heal - var/range + var/range = 5 /// Whether or not you must be a visible object of the parent var/requires_visibility = TRUE @@ -42,12 +42,13 @@ var/healing_color = COLOR_GREEN /// A list of being healed to active alerts - var/list/current_alerts = list() + var/list/mob/living/current_alerts = list() + /// Cooldown between showing the heal effect COOLDOWN_DECLARE(last_heal_effect_time) /datum/component/aura_healing/Initialize( - range, + range = 5, requires_visibility = TRUE, brute_heal = 0, burn_heal = 0, @@ -63,7 +64,7 @@ if (!isatom(parent)) return COMPONENT_INCOMPATIBLE - START_PROCESSING(SSaura_healing, src) + START_PROCESSING(SSaura, src) src.range = range src.requires_visibility = requires_visibility @@ -79,10 +80,10 @@ src.healing_color = healing_color /datum/component/aura_healing/Destroy(force) - STOP_PROCESSING(SSaura_healing, src) + STOP_PROCESSING(SSaura, src) var/alert_category = "aura_healing_[REF(src)]" - for(var/mob/living/alert_holder in current_alerts) + for(var/mob/living/alert_holder as anything in current_alerts) alert_holder.clear_alert(alert_category) current_alerts.Cut() @@ -93,20 +94,25 @@ if (should_show_effect) COOLDOWN_START(src, last_heal_effect_time, HEAL_EFFECT_COOLDOWN) - var/list/remove_alerts_from = current_alerts.Copy() - + var/list/to_heal = list() var/alert_category = "aura_healing_[REF(src)]" - for (var/mob/living/candidate in (requires_visibility ? view(range, parent) : range(range, parent))) - if (!isnull(limit_to_trait) && !HAS_TRAIT(candidate, limit_to_trait)) - continue + if(requires_visibility) + for(var/mob/living/candidate in view(range, parent)) + if (!isnull(limit_to_trait) && !HAS_TRAIT(candidate, limit_to_trait)) + continue + to_heal[candidate] = TRUE + else + for(var/mob/living/candidate in range(range, parent)) + if (!isnull(limit_to_trait) && !HAS_TRAIT(candidate, limit_to_trait)) + continue + to_heal[candidate] = TRUE - remove_alerts_from -= candidate - - if (!(candidate in current_alerts)) + 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]." - current_alerts += candidate + current_alerts[candidate] = TRUE if (should_show_effect && candidate.health < candidate.maxHealth) new /obj/effect/temp_visual/heal(get_turf(candidate), healing_color) @@ -136,7 +142,7 @@ candidate.updatehealth() - for (var/mob/remove_alert_from as anything in remove_alerts_from) + for (var/mob/living/remove_alert_from as anything in current_alerts - to_heal) remove_alert_from.clear_alert(alert_category) current_alerts -= remove_alert_from diff --git a/code/datums/components/blob_minion.dm b/code/datums/components/blob_minion.dm index 8261a7ad1fd..fb92e1139cc 100644 --- a/code/datums/components/blob_minion.dm +++ b/code/datums/components/blob_minion.dm @@ -55,7 +55,7 @@ RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(on_burned)) RegisterSignal(parent, COMSIG_ATOM_TRIED_PASS, PROC_REF(on_attempted_pass)) RegisterSignal(parent, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(on_space_move)) - RegisterSignal(parent, COMSIG_LIVING_TRY_SPEECH, PROC_REF(on_try_speech)) + RegisterSignal(parent, COMSIG_MOB_TRY_SPEECH, PROC_REF(on_try_speech)) RegisterSignal(parent, COMSIG_MOB_CHANGED_TYPE, PROC_REF(on_transformed)) living_parent.update_appearance(UPDATE_ICON) GLOB.blob_telepathy_mobs |= parent @@ -73,7 +73,7 @@ COMSIG_ATOM_FIRE_ACT, COMSIG_ATOM_TRIED_PASS, COMSIG_ATOM_UPDATE_ICON, - COMSIG_LIVING_TRY_SPEECH, + COMSIG_MOB_TRY_SPEECH, COMSIG_MOB_CHANGED_TYPE, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIND_INITIALIZED, diff --git a/code/datums/components/boomerang.dm b/code/datums/components/boomerang.dm index 8b35f171c28..13169e4d0cd 100644 --- a/code/datums/components/boomerang.dm +++ b/code/datums/components/boomerang.dm @@ -79,7 +79,7 @@ /datum/component/boomerang/proc/aerodynamic_swing(datum/thrownthing/throwingdatum, obj/item/true_parent) var/mob/thrown_by = true_parent.thrownby?.resolve() if(thrown_by) - addtimer(CALLBACK(true_parent, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, boomerang_throw_range, throwingdatum.speed, null, TRUE), 1) + addtimer(CALLBACK(true_parent, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, boomerang_throw_range, throwingdatum.speed, null, TRUE), 0.1 SECONDS) COOLDOWN_START(src, last_boomerang_throw, BOOMERANG_REBOUND_INTERVAL) var/mob/thrower = throwingdatum?.get_thrower() true_parent.visible_message(span_danger("[true_parent] is flying back at [thrower]!"), \ diff --git a/code/datums/components/bullet_intercepting.dm b/code/datums/components/bullet_intercepting.dm index c176de54b94..32e757c1823 100644 --- a/code/datums/components/bullet_intercepting.dm +++ b/code/datums/components/bullet_intercepting.dm @@ -12,8 +12,10 @@ var/mob/wearer /// Callback called when we catch a projectile var/datum/callback/on_intercepted + /// Number of things we can block before we delete ourself (stop being able to block) + var/block_charges = INFINITY -/datum/component/bullet_intercepting/Initialize(block_chance = 2, block_type = BULLET, active_slots, datum/callback/on_intercepted) +/datum/component/bullet_intercepting/Initialize(block_chance = 2, block_type = BULLET, active_slots, datum/callback/on_intercepted, block_charges = INFINITY) . = ..() if (!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -21,6 +23,7 @@ src.block_type = block_type src.active_slots = active_slots src.on_intercepted = on_intercepted + src.block_charges = block_charges RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_parent_equipped)) RegisterSignal(parent, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_unequipped)) @@ -55,11 +58,14 @@ /// Called when wearer is shot, check if we're going to block the hit /datum/component/bullet_intercepting/proc/on_wearer_shot(mob/living/victim, list/signal_args, obj/projectile/bullet) SIGNAL_HANDLER - if (victim != wearer || victim.stat == DEAD || bullet.armor_flag != block_type ) - return + if (victim != wearer || victim.stat == DEAD || bullet.armor_flag != block_type) + return NONE if (!prob(block_chance)) - return + return NONE on_intercepted?.Invoke(victim, bullet) + block_charges-- + if (block_charges <= 0) + qdel(src) return PROJECTILE_INTERRUPT_HIT /// Called when wearer is deleted, stop tracking them diff --git a/code/datums/components/chuunibyou.dm b/code/datums/components/chuunibyou.dm index dda1bdeed5a..57428bc4223 100644 --- a/code/datums/components/chuunibyou.dm +++ b/code/datums/components/chuunibyou.dm @@ -45,7 +45,7 @@ . = ..() RegisterSignal(parent, COMSIG_MOB_SPELL_PROJECTILE, PROC_REF(on_spell_projectile)) RegisterSignal(parent, COMSIG_MOB_PRE_INVOCATION, PROC_REF(on_pre_invocation)) - RegisterSignal(parent, COMSIG_LIVING_TRY_SPEECH, PROC_REF(on_try_speech)) + RegisterSignal(parent, COMSIG_MOB_TRY_SPEECH, PROC_REF(on_try_speech)) RegisterSignal(parent, COMSIG_MOB_AFTER_SPELL_CAST, PROC_REF(on_after_spell_cast)) /datum/component/chuunibyou/UnregisterFromParent() @@ -53,7 +53,7 @@ UnregisterSignal(parent, list( COMSIG_MOB_SPELL_PROJECTILE, COMSIG_MOB_PRE_INVOCATION, - COMSIG_LIVING_TRY_SPEECH, + COMSIG_MOB_TRY_SPEECH, COMSIG_MOB_AFTER_SPELL_CAST, )) @@ -63,7 +63,7 @@ SIGNAL_HANDLER if(casting_spell) - return COMPONENT_CAN_ALWAYS_SPEAK + return COMPONENT_IGNORE_CAN_SPEAK ///signal sent when the parent casts a spell that has a projectile /datum/component/chuunibyou/proc/on_spell_projectile(mob/living/source, datum/action/cooldown/spell/spell, atom/cast_on, obj/projectile/to_fire) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 3581bec4b5a..a6a905ccdb4 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -10,7 +10,7 @@ C.icon = H.ui_style H.static_inventory += C CL.screen += C - RegisterSignal(C, COMSIG_CLICK, PROC_REF(component_ui_interact)) + RegisterSignal(C, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(component_ui_interact)) #define COOKING TRUE #define CRAFTING FALSE diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index 8b2bfa40731..dae810c220a 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -1,3 +1,22 @@ +/datum/crafting_recipe/moffers + name = "Moffers" + result = /obj/item/clothing/shoes/clown_shoes/moffers + time = 6 SECONDS //opportunity to rethink your life + reqs = list( + /obj/item/stack/sheet/animalhide/mothroach = 2, + /obj/item/clothing/shoes/clown_shoes = 1, + ) + parts = list(/obj/item/clothing/shoes/clown_shoes = 1) + blacklist = list( + /obj/item/clothing/shoes/clown_shoes/combat, + /obj/item/clothing/shoes/clown_shoes/banana_shoes, + /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat, + /obj/item/clothing/shoes/clown_shoes/jester, + /obj/item/clothing/shoes/clown_shoes/meown_shoes, + /obj/item/clothing/shoes/clown_shoes/moffers, + ) + category = CAT_ENTERTAINMENT + /datum/crafting_recipe/mothplush name = "Moth Plushie" result = /obj/item/toy/plush/moth @@ -8,6 +27,16 @@ ) category = CAT_ENTERTAINMENT +/datum/crafting_recipe/sharkplush + name = "Shark Plushie" + result = /obj/item/toy/plush/shark + reqs = list( + /obj/item/clothing/suit/hooded/shark_costume = 1, + /obj/item/grown/cotton = 10, + /obj/item/stack/sheet/cloth = 5, + ) + category = CAT_ENTERTAINMENT + /datum/crafting_recipe/mixedbouquet name = "Mixed bouquet" result = /obj/item/bouquet diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 741d53ed56b..e7971488d63 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -83,6 +83,17 @@ time = 5 SECONDS category = CAT_EQUIPMENT +/datum/crafting_recipe/barbeque_grill + name = "Barbeque grill" + result = /obj/machinery/grill + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/rods = 5, + /obj/item/assembly/igniter = 1, + ) + time = 7 SECONDS + category = CAT_EQUIPMENT + /datum/crafting_recipe/secure_closet name = "Secure Closet" result = /obj/structure/closet/secure_closet diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index bb01a4d78dc..14a7ebfc21b 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -199,6 +199,29 @@ ) category = CAT_CLOTHING +/datum/crafting_recipe/wreath + name = "Watcher Wreath" + result = /obj/item/clothing/neck/wreath + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/ore/diamond = 2, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/icewreath + name = "Icewing Wreath" + result = /obj/item/clothing/neck/wreath/icewing + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/sheet/sinew = 1, + /obj/item/stack/ore/diamond = 2, + /obj/item/crusher_trophy/watcher_wing/ice_wing = 1, + ) + category = CAT_CLOTHING + /datum/crafting_recipe/bracers name = "Bone Bracers" result = /obj/item/clothing/gloves/bracer @@ -345,6 +368,27 @@ ) category = CAT_CLOTHING +/datum/crafting_recipe/shark_costume + name = "shark costume" + result = /obj/item/clothing/suit/hooded/shark_costume + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/leather = 5, + /obj/item/stack/sheet/animalhide/carp = 5, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/shork_costume + name = "shork costume" + result = /obj/item/clothing/suit/hooded/shork_costume + time = 2 SECONDS + tool_behaviors = list(TOOL_WIRECUTTER) + reqs = list( + /obj/item/clothing/suit/hooded/shark_costume = 1, + ) + category = CAT_CLOTHING + + /datum/crafting_recipe/sturdy_shako name = "Sturdy Shako" result = /obj/item/clothing/head/hats/hos/shako diff --git a/code/datums/components/crank_recharge.dm b/code/datums/components/crank_recharge.dm index 455fa9298f9..9c2a1737658 100644 --- a/code/datums/components/crank_recharge.dm +++ b/code/datums/components/crank_recharge.dm @@ -2,6 +2,8 @@ /datum/component/crank_recharge /// Our cell to charge var/obj/item/stock_parts/cell/charging_cell + /// Whether we spin our gun to reload (and therefore need the relevant trait) + var/spin_to_win = FALSE /// How much charge we give our cell on each crank var/charge_amount /// How long is the cooldown time between each charge @@ -14,13 +16,14 @@ var/is_charging = FALSE COOLDOWN_DECLARE(charge_sound_cooldown) -/datum/component/crank_recharge/Initialize(charging_cell, charge_amount = 500, cooldown_time = 2 SECONDS, charge_sound = 'sound/weapons/laser_crank.ogg', charge_sound_cooldown_time = 1.8 SECONDS) +/datum/component/crank_recharge/Initialize(charging_cell, spin_to_win = FALSE, charge_amount = 500, cooldown_time = 2 SECONDS, charge_sound = 'sound/weapons/laser_crank.ogg', charge_sound_cooldown_time = 1.8 SECONDS) . = ..() if(!isitem(parent)) return COMPONENT_INCOMPATIBLE if(isnull(charging_cell) || !istype(charging_cell, /obj/item/stock_parts/cell)) return COMPONENT_INCOMPATIBLE src.charging_cell = charging_cell + src.spin_to_win = spin_to_win src.charge_amount = charge_amount src.cooldown_time = cooldown_time src.charge_sound = charge_sound @@ -45,6 +48,10 @@ return if(is_charging) return + if(spin_to_win && !HAS_TRAIT(user, TRAIT_GUNFLIP)) + source.balloon_alert(user, "need holster to spin!") + return + is_charging = TRUE if(COOLDOWN_FINISHED(src, charge_sound_cooldown)) COOLDOWN_START(src, charge_sound_cooldown, charge_sound_cooldown_time) @@ -57,4 +64,6 @@ SEND_SIGNAL(parent, COMSIG_UPDATE_AMMO_HUD) // SKYRAT EDIT ADDITION - AMMO COUNT HUD source.update_appearance() is_charging = FALSE + if(spin_to_win) + source.SpinAnimation(4, 2) //What a badass source.balloon_alert(user, "charged") diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index c3acb0b9467..74bac463e32 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -283,13 +283,13 @@ return FALSE if(ispath(rune_to_scribe, /obj/effect/rune/summon) && (!is_station_level(our_turf.z) || istype(get_area(cultist), /area/space))) - to_chat(cultist, span_cultitalic("The veil is not weak enough here to summon a cultist, you must be on station!")) + to_chat(cultist, span_cult_italic("The veil is not weak enough here to summon a cultist, you must be on station!")) return if(ispath(rune_to_scribe, /obj/effect/rune/apocalypse)) if((world.time - SSticker.round_start_time) <= 6000) var/wait = 6000 - (world.time - SSticker.round_start_time) - to_chat(cultist, span_cultitalic("The veil is not yet weak enough for this rune - it will be available in [DisplayTimeText(wait)].")) + to_chat(cultist, span_cult_italic("The veil is not yet weak enough for this rune - it will be available in [DisplayTimeText(wait)].")) return if(!check_if_in_ritual_site(cultist, user_team, TRUE)) return @@ -359,7 +359,7 @@ to_chat(cultist, span_warning("The sacrifice is not complete. The portal would lack the power to open if you tried!")) return FALSE if(summon_objective.check_completion()) - to_chat(cultist, span_cultlarge("\"I am already here. There is no need to try to summon me now.\"")) + to_chat(cultist, span_cult_large("\"I am already here. There is no need to try to summon me now.\"")) return FALSE var/confirm_final = tgui_alert(cultist, "This is the FINAL step to summon Nar'Sie; it is a long, painful ritual and the crew will be alerted to your presence.", "Are you prepared for the final battle?", list("My life for Nar'Sie!", "No")) if(confirm_final == "No") diff --git a/code/datums/components/damage_aura.dm b/code/datums/components/damage_aura.dm index b4c535cb52d..98d323aa6d5 100644 --- a/code/datums/components/damage_aura.dm +++ b/code/datums/components/damage_aura.dm @@ -4,7 +4,7 @@ /// Will deal more damage the more people are present. /datum/component/damage_aura /// The range of which to damage - var/range + var/range = 5 /// Whether or not you must be a visible object of the parent var/requires_visibility = TRUE @@ -43,7 +43,7 @@ COOLDOWN_DECLARE(last_damage_effect_time) /datum/component/damage_aura/Initialize( - range, + range = 5, requires_visibility = TRUE, brute_damage = 0, burn_damage = 0, @@ -59,7 +59,7 @@ if (!isatom(parent)) return COMPONENT_INCOMPATIBLE - START_PROCESSING(SSobj, src) + START_PROCESSING(SSaura, src) src.range = range src.requires_visibility = requires_visibility @@ -75,7 +75,7 @@ src.current_owner = WEAKREF(current_owner) /datum/component/damage_aura/Destroy(force) - STOP_PROCESSING(SSobj, src) + STOP_PROCESSING(SSaura, src) return ..() /// The requirements for the mob to be effected by the damage aura. @@ -102,7 +102,15 @@ if (should_show_effect) COOLDOWN_START(src, last_damage_effect_time, DAMAGE_EFFECT_COOLDOWN) - for (var/mob/living/candidate in (requires_visibility ? view(range, parent) : range(range, parent))) + var/list/to_damage = list() + if(requires_visibility) + for(var/mob/living/candidate in view(range, parent)) + to_damage += candidate + else + for(var/mob/living/candidate in range(range, parent)) + to_damage += candidate + + for (var/mob/living/candidate as anything in to_damage) var/mob/living/owner = current_owner?.resolve() if (owner && owner == candidate) owner_effect(owner, seconds_per_tick) diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index 5e4f7528415..13ef8f4ed24 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -4,11 +4,11 @@ /// Time between echolocations. var/cooldown_time = 1.8 SECONDS /// Time for the image to start fading out. - var/image_expiry_time = 1.5 SECONDS + var/image_expiry_time = 1.4 SECONDS /// Time for the image to fade in. - var/fade_in_time = 0.5 SECONDS + var/fade_in_time = 0.4 SECONDS /// Time for the image to fade out and delete itself. - var/fade_out_time = 0.5 SECONDS + var/fade_out_time = 0.4 SECONDS /// Are images static? If yes, spawns them on the turf and makes them not change location. Otherwise they change location and pixel shift with the original. var/images_are_static = TRUE /// With mobs that have this echo group in their echolocation receiver trait, we share echo images. @@ -32,7 +32,7 @@ /// Cooldown for the echolocation. COOLDOWN_DECLARE(cooldown_last) -/datum/component/echolocation/Initialize(echo_range, cooldown_time, image_expiry_time, fade_in_time, fade_out_time, images_are_static, blocking_trait, echo_group, echo_icon, color_path) +/datum/component/echolocation/Initialize(echo_range, cooldown_time, image_expiry_time, fade_in_time, fade_out_time, images_are_static, blocking_trait, echo_group, echo_icon = "echo", color_path) . = ..() var/mob/living/echolocator = parent if(!istype(echolocator)) diff --git a/code/datums/components/energized.dm b/code/datums/components/energized.dm index d637bc2eb76..eb45ee66e2b 100644 --- a/code/datums/components/energized.dm +++ b/code/datums/components/energized.dm @@ -110,11 +110,6 @@ return FALSE // Finally the interesting part where they ACTUALLY get hit! - notify_ghosts( - "[future_tram_victim] has fallen in the path of an oncoming tram!", - source = future_tram_victim, - header = "Electrifying!", - ) do_sparks(4, FALSE, source) playsound(parent, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) source.audible_message(span_danger("[parent] makes a loud electric crackle!")) diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index c8a00ce74cd..2763d583f81 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -15,6 +15,12 @@ fish_source.on_fishing_spot_init() RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(handle_attackby)) RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, PROC_REF(handle_cast)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined_more)) + +/datum/component/fishing_spot/Destroy() + fish_source = null + return ..() /datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) SIGNAL_HANDLER @@ -28,6 +34,43 @@ return COMPONENT_NO_AFTERATTACK return NONE +///If the fish source has fishes that are shown in the +/datum/component/fishing_spot/proc/on_examined(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISHING_SPOT)) + return + + var/has_known_fishes = FALSE + for(var/reward in fish_source.fish_counts) + if(!ispath(reward, /obj/item/fish)) + continue + var/obj/item/fish/prototype = reward + if(initial(prototype.show_in_catalog)) + has_known_fishes = TRUE + break + if(!has_known_fishes) + return + + examine_text += span_tinynoticeital("This is a fishing spot. You can look again to list its fishes...") + +/datum/component/fishing_spot/proc/on_examined_more(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISHING_SPOT)) + return + + var/list/known_fishes = list() + for(var/reward in fish_source.fish_counts) + if(!ispath(reward, /obj/item/fish)) + continue + var/obj/item/fish/prototype = reward + if(initial(prototype.show_in_catalog)) + known_fishes += initial(prototype.name) + + if(!length(known_fishes)) + return + + examine_text += span_info("You can catch the following fish here: [english_list(known_fishes)].") + /datum/component/fishing_spot/proc/try_start_fishing(obj/item/possibly_rod, mob/user) SIGNAL_HANDLER var/obj/item/fishing_rod/rod = possibly_rod diff --git a/code/datums/components/food/ghost_edible.dm b/code/datums/components/food/ghost_edible.dm index fb8a0c55559..0e3f3b3dd66 100644 --- a/code/datums/components/food/ghost_edible.dm +++ b/code/datums/components/food/ghost_edible.dm @@ -51,7 +51,7 @@ if (!prob(munch_chance)) return playsound(atom_parent.loc,'sound/items/eatfood.ogg', vol = rand(10,50), vary = TRUE) - atom_parent.reagents.remove_any(bite_consumption) + atom_parent.reagents.remove_all(bite_consumption) if (atom_parent.reagents.total_volume <= 0) atom_parent.visible_message(span_notice("[atom_parent] disappears completely!")) new /obj/item/ectoplasm(atom_parent.loc) diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index f3db67efab5..4161c749703 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -58,6 +58,7 @@ RegisterSignal(owner, COMSIG_ITEM_ATTACK_ATOM, PROC_REF(on_item_attack_obj)) RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(owner, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) if(change_name) RegisterSignal(owner, COMSIG_ATOM_UPDATE_NAME, PROC_REF(on_update_name)) if(!change_desc) @@ -105,20 +106,27 @@ else source.desc = replacetext(replacetext("[flavour.desc_prefix] [flavour.desc]", "$CONE_NAME", initial(source.name)), "$CUSTOM_NAME", key) else /// Many flavours. - source.desc = "A delicious [initial(source.name)] filled with scoops of [english_list(scoops)] icecream. That's as many as [scoops_len] scoops!" + source.desc = "A delicious [initial(source.name)] filled with scoops of [english_list(scoops)] ice cream. That's as many as [scoops_len] scoops!" + +/datum/component/ice_cream_holder/proc/on_examine(atom/source, mob/mob, list/examine_list) + SIGNAL_HANDLER + if(length(scoops) < max_scoops) + examine_list += span_tinynoticeital("you could use a ice cream vat to fill it with yummy ice cream...") /datum/component/ice_cream_holder/proc/on_examine_more(atom/source, mob/mob, list/examine_list) SIGNAL_HANDLER var/scoops_len = length(scoops) + if(!scoops_len) + return if(scoops_len == 1 || length(unique_list(scoops)) == 1) /// Only one flavour. var/key = scoops[1] var/datum/ice_cream_flavour/flavour = GLOB.ice_cream_flavours[LAZYACCESS(special_scoops, key) || key] if(flavour?.desc) //I scream. - examine_list += "[source.p_Theyre()] filled with scoops of [flavour ? flavour.name : "broken, unhappy"] icecream." + examine_list += "[source.p_Theyre()] filled with scoops of [flavour ? flavour.name : "broken, unhappy"] ice cream." else examine_list += replacetext(replacetext("[source.p_Theyre()] [flavour.desc]", "$CONE_NAME", initial(source.name)), "$CUSTOM_NAME", key) else /// Many flavours. - examine_list += "[source.p_Theyre()] filled with scoops of [english_list(scoops)] icecream. That's as many as [scoops_len] scoops!" + examine_list += "[source.p_Theyre()] filled with scoops of [english_list(scoops)] ice cream. That's as many as [scoops_len] scoops!" /datum/component/ice_cream_holder/proc/on_update_overlays(atom/source, list/new_overlays) SIGNAL_HANDLER @@ -330,14 +338,14 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour/custom name = ICE_CREAM_CUSTOM color = COLOR_STARLIGHT //has its own mutable appearance overlay it will be overwritten with anyways. - desc = "filled with artisanal icecream. Made with real $CUSTOM_NAME. Ain't that something." + desc = "filled with artisanal ice cream. Made with real $CUSTOM_NAME. Ain't that something." ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice) ingredients_text = "optional flavorings" takes_custom_ingredients = TRUE /datum/ice_cream_flavour/custom/korta name = ICE_CREAM_KORTA_CUSTOM - desc = "filled with artisanal lizard-friendly icecream. Made with real $CUSTOM_NAME. Ain't that something." + 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" @@ -354,7 +362,7 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour/bland name = ICE_CREAM_BLAND color = COLOR_ICECREAM_CUSTOM - desc = "filled with anemic, flavorless icecream. You wonder why this was ever scooped..." + desc = "filled with anemic, flavorless ice cream. You wonder why this was ever scooped..." hidden = TRUE #undef SWEETENER_PER_SCOOP diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index 8663de5adc6..33b713e8a57 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -9,11 +9,11 @@ var/autofire_stat = AUTOFIRE_STAT_IDLE var/mouse_parameters /// Time between individual shots. - var/autofire_shot_delay = 0.3 SECONDS + var/autofire_shot_delay = 0.3 SECONDS /// This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. - var/mouse_status = AUTOFIRE_MOUSEUP + var/mouse_status = AUTOFIRE_MOUSEUP /// Should dual wielding be allowed? - var/allow_akimbo + var/allow_akimbo ///windup autofire vars ///Whether the delay between shots increases over time, simulating a spooling weapon @@ -259,7 +259,7 @@ current_windup_reduction = (current_windup_reduction + round(autofire_shot_delay * windup_autofire_reduction_multiplier)) timerid = addtimer(CALLBACK(src, PROC_REF(windup_reset), FALSE), windup_spindown, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) if(HAS_TRAIT(shooter, TRAIT_DOUBLE_TAP)) - next_delay = round(next_delay * 0.5) + next_delay = round(next_delay * 0.5, SSprojectiles.wait) COOLDOWN_START(src, next_shot_cd, next_delay) if(SEND_SIGNAL(parent, COMSIG_AUTOFIRE_SHOT, target, shooter, allow_akimbo, mouse_parameters) & COMPONENT_AUTOFIRE_SHOT_SUCCESS) return TRUE @@ -310,7 +310,7 @@ if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM && allow_akimbo) if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && akimbo_gun.can_trigger_gun(shooter)) bonus_spread = dual_wield_spread - addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 1) + addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 0.1 SECONDS) process_fire(target, shooter, TRUE, params, null, bonus_spread) #undef AUTOFIRE_MOUSEUP diff --git a/code/datums/components/ghost_direct_control.dm b/code/datums/components/ghost_direct_control.dm index a131a2d3ca7..de5bca4fcad 100644 --- a/code/datums/components/ghost_direct_control.dm +++ b/code/datums/components/ghost_direct_control.dm @@ -16,8 +16,11 @@ /datum/component/ghost_direct_control/Initialize( ban_type = ROLE_SENTIENCE, role_name = null, + poll_question = null, poll_candidates = TRUE, + poll_announce_chosen = TRUE, poll_length = 10 SECONDS, + poll_chat_border_icon = null, poll_ignore_key = POLL_IGNORE_SENTIENCE_POTION, assumed_control_message = null, datum/callback/extra_control_checks, @@ -36,7 +39,7 @@ LAZYADD(GLOB.joinable_mobs[format_text("[initial(mob_parent.name)]")], mob_parent) if (poll_candidates) - INVOKE_ASYNC(src, PROC_REF(request_ghost_control), role_name || "[parent]", poll_length, poll_ignore_key) + INVOKE_ASYNC(src, PROC_REF(request_ghost_control), poll_question, role_name || "[parent]", poll_length, poll_ignore_key, poll_announce_chosen, poll_chat_border_icon) /datum/component/ghost_direct_control/RegisterWithParent() . = ..() @@ -70,23 +73,26 @@ examine_text += span_boldnotice("You could take control of this mob by clicking on it.") /// Send out a request for a brain -/datum/component/ghost_direct_control/proc/request_ghost_control(role_name, poll_length, poll_ignore_key) - if (!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) +/datum/component/ghost_direct_control/proc/request_ghost_control(poll_question, role_name, poll_length, poll_ignore_key, poll_announce_chosen, poll_chat_border_icon) + if(!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) return awaiting_ghosts = TRUE - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates( - question = "Do you want to play as [role_name]?", + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + question = poll_question, check_jobban = ban_type, role = ban_type, poll_time = poll_length, + checked_target = parent, ignore_category = poll_ignore_key, - pic_source = parent, + alert_pic = parent, role_name_text = role_name, + chat_text_border_icon = poll_chat_border_icon, + announce_chosen = poll_announce_chosen, ) awaiting_ghosts = FALSE - if (!LAZYLEN(candidates)) + if(isnull(chosen_one)) return - assume_direct_control(pick(candidates)) + assume_direct_control(chosen_one) /// A ghost clicked on us, they want to get in this body /datum/component/ghost_direct_control/proc/on_ghost_clicked(mob/our_mob, mob/dead/observer/hopeful_ghost) diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm deleted file mode 100644 index 24b01ee52a3..00000000000 --- a/code/datums/components/label.dm +++ /dev/null @@ -1,95 +0,0 @@ -/** - The label component. - - This component is used to manage labels applied by the hand labeler. - - Atoms can only have one instance of this component, and therefore only one label at a time. - This is to avoid having names like "Backpack (label1) (label2) (label3)". This is annoying and abnoxious to read. - - When a player clicks the atom with a hand labeler to apply a label, this component gets applied to it. - If the labeler is off, the component will be removed from it, and the label will be removed from its name. - */ -/datum/component/label - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - /// The name of the label the player is applying to the parent. - var/label_name - -/datum/component/label/Initialize(_label_name) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - - label_name = _label_name - apply_label() - -/datum/component/label/RegisterWithParent() - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(OnAttackby)) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(Examine)) - -/datum/component/label/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE)) - -/** - This proc will fire after the parent is hit by a hand labeler which is trying to apply another label. - Since the parent already has a label, it will remove the old one from the parent's name, and apply the new one. -*/ -/datum/component/label/InheritComponent(datum/component/label/new_comp , i_am_original, _label_name) - remove_label() - if(new_comp) - label_name = new_comp.label_name - else - label_name = _label_name - apply_label() - -/** - This proc will trigger when any object is used to attack the parent. - - If the attacking object is not a hand labeler, it will return. - If the attacking object is a hand labeler it will restore the name of the parent to what it was before this component was added to it, and the component will be deleted. - - Arguments: - * source: The parent. - * attacker: The object that is hitting the parent. - * user: The mob who is wielding the attacking object. -*/ -/datum/component/label/proc/OnAttackby(datum/source, obj/item/attacker, mob/user) - SIGNAL_HANDLER - - // If the attacking object is not a hand labeler or its mode is 1 (has a label ready to apply), return. - // The hand labeler should be off (mode is 0), in order to remove a label. - var/obj/item/hand_labeler/labeler = attacker - if(!istype(labeler) || labeler.mode) - return - - remove_label() - playsound(parent, 'sound/items/poster_ripped.ogg', 20, TRUE) - to_chat(user, span_warning("You remove the label from [parent].")) - qdel(src) // Remove the component from the object. - -/** - This proc will trigger when someone examines the parent. - It will attach the text found in the body of the proc to the `examine_list` and display it to the player examining the parent. - - Arguments: - * source: The parent. - * user: The mob exmaining the parent. - * examine_list: The current list of text getting passed from the parent's normal examine() proc. -*/ -/datum/component/label/proc/Examine(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - - examine_list += span_notice("It has a label with some words written on it. Use a hand labeler to remove it.") - -/// Applies a label to the name of the parent in the format of: "parent_name (label)" -/datum/component/label/proc/apply_label() - var/atom/owner = parent - owner.name += " ([label_name])" - ADD_TRAIT(owner, TRAIT_HAS_LABEL, REF(src)) - owner.update_appearance(UPDATE_ICON) - -/// Removes the label from the parent's name -/datum/component/label/proc/remove_label() - var/atom/owner = parent - owner.name = replacetext(owner.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it's located. - owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. - REMOVE_TRAIT(owner, TRAIT_HAS_LABEL, REF(src)) - owner.update_appearance(UPDATE_ICON) diff --git a/code/datums/components/marionette.dm b/code/datums/components/marionette.dm index a2f58031768..2777bbb5178 100644 --- a/code/datums/components/marionette.dm +++ b/code/datums/components/marionette.dm @@ -67,6 +67,7 @@ language = language, forced = "[source]'s marionette", saymode = saymode, + message_mods = list(MODE_RELAY = TRUE), ) speech_args[SPEECH_RANGE] = WHISPER_RANGE diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index e418d4276be..568b018e58b 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -84,23 +84,9 @@ handles linking back and forth. silo = null - var/static/list/allowed_mats = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/silver, - /datum/material/gold, - /datum/material/diamond, - /datum/material/plasma, - /datum/material/uranium, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/bluespace, - /datum/material/plastic, - ) - mat_container = parent.AddComponent( \ /datum/component/material_container, \ - allowed_mats, \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ local_size, \ mat_container_flags, \ container_signals = mat_container_signals, \ diff --git a/code/datums/components/orbit_poll.dm b/code/datums/components/orbit_poll.dm deleted file mode 100644 index ceb85d16d64..00000000000 --- a/code/datums/components/orbit_poll.dm +++ /dev/null @@ -1,133 +0,0 @@ -/** - * A replacement for the standard poll_ghost_candidate. - * Use this to subtly ask players to join - it picks from orbiters. - * Please use named arguments for this. - * - * @params ignore_key - Required so it doesn't spam - * @params job_bans - You can insert a list or single items here. - * @params cb - Invokes this proc and appends the poll winner as the last argument, mob/dead/observer/ghost - * @params title - Optional. Useful if the role name does not match the parent. - * - * @usage - * ``` - * var/datum/callback/cb = CALLBACK(src, PROC_REF(do_stuff), arg1, arg2) - * AddComponent(/datum/component/orbit_poll, \ - * ignore_key = POLL_IGNORE_EXAMPLE, \ - * job_bans = ROLE_EXAMPLE or list(ROLE_EXAMPLE, ROLE_EXAMPLE2), \ - * title = "Use this if you want something other than the parent name", \ - * to_call = cb, \ - * ) - */ -/datum/component/orbit_poll - /// Prevent players with this ban from being selected - var/list/job_bans = list() - /// Title of the role to announce after it's done - var/title - /// Proc to invoke whenever the poll is complete - var/datum/callback/to_call - -/datum/component/orbit_poll/Initialize( \ - ignore_key, \ - list/job_bans, \ - datum/callback/to_call, \ - title, \ - header = "Ghost Poll", \ - custom_message, \ - timeout = 20 SECONDS \ -) - . = ..() - if (!isatom(parent)) - return COMPONENT_INCOMPATIBLE - - var/atom/owner = parent - - src.job_bans |= job_bans - src.title = title || owner.name - src.to_call = to_call - - var/message = custom_message || "[capitalize(src.title)] is looking for volunteers" - - notify_ghosts( - "[message]. An orbiter will be chosen in [DisplayTimeText(timeout)].\n", - source = parent, - header = "Volunteers requested", - custom_link = " (Ignore)", - ignore_key = ignore_key, - notify_flags = NOTIFY_CATEGORY_NOFLASH, - ) - - addtimer(CALLBACK(src, PROC_REF(end_poll)), timeout, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE|TIMER_DELETE_ME) - -/datum/component/orbit_poll/Topic(href, list/href_list) - if(!href_list["ignore"]) - return - - var/mob/user = usr - - var/ignore_key = href_list["ignore"] - if(tgui_alert(user, "Ignore further [title] alerts?", "Ignore Alert", list("Yes", "No"), 20 SECONDS, TRUE) != "Yes") - return - - GLOB.poll_ignore[ignore_key] |= user.ckey - -/// Concludes the poll, picking one of the orbiters -/datum/component/orbit_poll/proc/end_poll() - if(QDELETED(parent)) - return - - var/list/candidates = list() - var/atom/owner = parent - - var/datum/component/orbiter/orbiter_comp = owner.GetComponent(/datum/component/orbiter) - if(isnull(orbiter_comp)) - phone_home() - return - - for(var/mob/dead/observer/ghost as anything in orbiter_comp.orbiter_list) - var/client/ghost_client = ghost.client - - if(QDELETED(ghost) || isnull(ghost_client)) - continue - - if(is_banned_from(ghost.ckey, job_bans)) - continue - - var/datum/preferences/ghost_prefs = ghost_client.prefs - if(isnull(ghost_prefs)) - candidates += ghost // we'll assume they wanted to be picked despite prefs being null for whatever fucked up reason - continue - - if(!ghost_prefs.read_preference(/datum/preference/toggle/ghost_roles)) - continue - if(!isnull(ghost_client.holder) && !ghost_prefs.read_preference(/datum/preference/toggle/ghost_roles_as_admin)) - continue - - candidates += ghost - - pick_and_offer(candidates) - -/// Takes a list, picks a candidate, and offers the role to them. -/datum/component/orbit_poll/proc/pick_and_offer(list/volunteers) - if(length(volunteers) <= 0) - phone_home() - return - - var/mob/dead/observer/chosen = pick(volunteers) - - if(isnull(chosen)) - phone_home() - return - - SEND_SOUND(chosen, 'sound/misc/notice2.ogg') - var/response = tgui_alert(chosen, "Do you want to assume the role of [title]?", "Orbit Polling", list("Yes", "No"), 10 SECONDS) - if(response != "Yes") - var/reusable_list = volunteers - chosen - return pick_and_offer(reusable_list) - - deadchat_broadcast("[key_name(chosen, include_name = FALSE)] was selected for the role ([title]).", "Ghost Poll: ", parent) - phone_home(chosen) - -/// Make sure to call your parents my dude -/datum/component/orbit_poll/proc/phone_home(mob/dead/observer/chosen) - to_call.Invoke(chosen) - qdel(src) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index efff82b703a..19c7528db8b 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -398,7 +398,7 @@ return if(current_holder && overlay_lighting_flags & LIGHTING_ON) current_holder.underlays -= cone - cone.alpha = min(200, (abs(new_power) * 90)+20) + cone.alpha = min(120, (abs(new_power) * 60) + 15) if(current_holder && overlay_lighting_flags & LIGHTING_ON) current_holder.underlays += cone diff --git a/code/datums/components/payment.dm b/code/datums/components/payment.dm index 1220614e9c3..37839f1599c 100644 --- a/code/datums/components/payment.dm +++ b/code/datums/components/payment.dm @@ -19,11 +19,6 @@ var/datum/bank_account/target_acc ///Does this payment component respect same-department-discount? var/department_discount = FALSE - ///A static typecache of all the money-based items that can be actively used as currency. - var/static/list/allowed_money = typecacheof(list( - /obj/item/stack/spacecash, - /obj/item/holochip, - /obj/item/coin)) /datum/component/payment/Initialize(_cost, _target, _style) target_acc = _target @@ -47,7 +42,7 @@ if(!ismob(target)) return COMPONENT_OBJ_CANCEL_CHARGE var/mob/living/user = target - if(issilicon(user) || isdrone(user) || isAdminGhostAI(user)) //They have evolved beyond the need for mere credits + if(HAS_SILICON_ACCESS(user) || isdrone(user)) //They have evolved beyond the need for mere credits return var/obj/item/card/id/card if(istype(user)) @@ -80,13 +75,13 @@ //Here is all the possible non-ID payment methods. var/list/counted_money = list() var/physical_cash_total = 0 - for(var/obj/item/credit in typecache_filter_list(user.get_all_contents(), allowed_money)) //Coins, cash, and credits. + for(var/obj/item/credit in typecache_filter_list(user.get_all_contents(), GLOB.allowed_money)) //Coins, cash, and credits. if(physical_cash_total > total_cost) break physical_cash_total += credit.get_item_credit_value() counted_money += credit - if(is_type_in_typecache(user.pulling, allowed_money) && (physical_cash_total < total_cost)) //Coins(Pulled). + if(is_type_in_typecache(user.pulling, GLOB.allowed_money) && (physical_cash_total < total_cost)) //Coins(Pulled). var/obj/item/counted_credit = user.pulling physical_cash_total += counted_credit.get_item_credit_value() counted_money += counted_credit @@ -134,9 +129,11 @@ * Attempts to charge a mob, user, an integer number of credits, total_cost, directly from an ID card/bank account. */ /datum/component/payment/proc/handle_card(mob/living/user, obj/item/card/id/idcard, total_cost) - var/atom/atom_parent = parent + var/atom/movable/atom_parent = parent if(!idcard) + if(transaction_style == PAYMENT_VENDING) + to_chat(user, span_warning("No card found.")) return FALSE if(!idcard?.registered_account) switch(transaction_style) @@ -146,6 +143,13 @@ to_chat(user, span_warning("ARE YOU JOKING. YOU DON'T HAVE A BANK ACCOUNT ON YOUR ID YOU IDIOT.")) if(PAYMENT_CLINICAL) to_chat(user, span_warning("ID Card lacks a bank account. Advancing.")) + if(PAYMENT_VENDING) + to_chat(user, span_warning("No account found.")) + + return FALSE + + if(!idcard.can_be_used_in_payment(user)) + atom_parent.say("Departmental accounts have been blacklisted from personal expenses due to embezzlement.") return FALSE if(!(idcard.registered_account.has_money(total_cost))) @@ -156,6 +160,8 @@ to_chat(user, span_warning("YOU MORON. YOU ABSOLUTE BAFOON. YOU INSUFFERABLE TOOL. YOU ARE POOR.")) if(PAYMENT_CLINICAL) to_chat(user, span_warning("ID 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!") return FALSE target_acc.transfer_money(idcard.registered_account, total_cost, "Nanotrasen: Usage of Corporate Machinery") diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm index 9941f83e8b1..5ff476a85b9 100644 --- a/code/datums/components/pet_commands/pet_commands_basic.dm +++ b/code/datums/components/pet_commands/pet_commands_basic.dm @@ -247,6 +247,8 @@ set_command_target(parent, victim) /datum/pet_command/protect_owner/proc/set_attacking_target(atom/source, mob/living/attacker) + SIGNAL_HANDLER + var/mob/living/basic/owner = weak_parent.resolve() if(isnull(owner)) return diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 245f8f969a9..3e5528b1095 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -375,7 +375,7 @@ return // Defer to later frame because pixel_* is actually updated after all callbacks - addtimer(CALLBACK(parent_obj, TYPE_PROC_REF(/atom/, update_appearance)), 1) + addtimer(CALLBACK(parent_obj, TYPE_PROC_REF(/atom/, update_appearance)), 0.1 SECONDS) ///has one pipe input that only takes, example is manual output pipe /datum/component/plumbing/simple_demand diff --git a/code/datums/components/puzzgrid.dm b/code/datums/components/puzzgrid.dm index 611df16ccaa..e91bcdb3002 100644 --- a/code/datums/components/puzzgrid.dm +++ b/code/datums/components/puzzgrid.dm @@ -172,7 +172,7 @@ var/message = answers.Join("

-----

") - for (var/mob/mob as anything in get_hearers_in_view(DEFAULT_MESSAGE_RANGE, src)) + for (var/mob/mob in get_hearers_in_view(DEFAULT_MESSAGE_RANGE, parent)) to_chat(mob, message) /datum/component/puzzgrid/ui_data(mob/user) diff --git a/code/datums/components/redirect_attack_hand_from_turf.dm b/code/datums/components/redirect_attack_hand_from_turf.dm index bb823609241..1e538029070 100644 --- a/code/datums/components/redirect_attack_hand_from_turf.dm +++ b/code/datums/components/redirect_attack_hand_from_turf.dm @@ -8,11 +8,16 @@ /// Takes lmb_text and rmb_text. list/screentip_texts + /// A custom callback to determine whether a user's clicks will be redirected or not (mob/user) + datum/callback/interact_check + turf/current_turf + /datum/component/redirect_attack_hand_from_turf/Initialize( adjust_for_pixel_shift = TRUE, list/screentip_texts = null, + datum/callback/interact_check = null ) . = ..() @@ -21,6 +26,7 @@ src.adjust_for_pixel_shift = adjust_for_pixel_shift src.screentip_texts = screentip_texts + src.interact_check = interact_check RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) connect_to_new_turf() @@ -95,6 +101,9 @@ var/atom/movable/movable_parent = parent if (!movable_parent.can_interact(user)) return NONE + + if (!isnull(interact_check) && !interact_check.Invoke(user)) + return NONE INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, UnarmedAttack), parent, proximity_flag = TRUE, modifiers = modifiers) @@ -114,6 +123,9 @@ if (!isnull(held_item)) return NONE + + if (!isnull(interact_check) && !interact_check.Invoke(user)) + return NONE if (!isnull(screentip_texts["lmb_text"])) context[SCREENTIP_CONTEXT_LMB] = screentip_texts["lmb_text"] diff --git a/code/datums/components/regenerative_shield.dm b/code/datums/components/regenerative_shield.dm new file mode 100644 index 00000000000..5ecf6708203 --- /dev/null +++ b/code/datums/components/regenerative_shield.dm @@ -0,0 +1,91 @@ +#define SHIELD_FILTER "shield filter" + +/// gives the mobs a regenerative shield, it will tank hits for them and then need to recharge for a bit +/datum/component/regenerative_shield + ///number of hits we can tank + var/number_of_hits = 15 + ///the limit of the damage we can tank + var/damage_threshold + ///the overlay of the shield + var/list/shield_overlays = list() + ///how long before the shield can regenerate + var/regeneration_time + +/datum/component/regenerative_shield/Initialize(number_of_hits = 15, damage_threshold = 50, regeneration_time = 2 MINUTES, list/shield_overlays) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.number_of_hits = number_of_hits + src.damage_threshold = damage_threshold + src.regeneration_time = regeneration_time + + var/atom/movable/living_parent = parent + for(var/type_path as anything in shield_overlays) + if(!ispath(type_path)) + continue + var/obj/effect/overlay/new_effect = new type_path() + living_parent.vis_contents += new_effect + apply_filter_effects(new_effect) + src.shield_overlays += new_effect + +/datum/component/regenerative_shield/RegisterWithParent() + . = ..() + ADD_TRAIT(parent, TRAIT_REGEN_SHIELD, REF(src)) + RegisterSignal(parent, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(block_attack)) + +/datum/component/regenerative_shield/UnregisterFromParent() + var/atom/movable/living_parent = parent + for(var/obj/effect/overlay as anything in shield_overlays) + living_parent.vis_contents -= overlay + QDEL_LIST(shield_overlays) + UnregisterSignal(parent, COMSIG_LIVING_CHECK_BLOCK) + REMOVE_TRAIT(parent, TRAIT_REGEN_SHIELD, REF(src)) + return ..() + +/datum/component/regenerative_shield/proc/block_attack( + mob/living/source, + atom/hitby, + damage, + attack_text, + attack_type, + armour_penetration, + damage_type, + attack_flag, +) + SIGNAL_HANDLER + + if(damage <= 0 ||damage_type == STAMINA) + return NONE + + if(damage >= damage_threshold || number_of_hits <= 0) + return NONE + + playsound(get_turf(parent), 'sound/weapons/tap.ogg', 20) + new /obj/effect/temp_visual/guardian/phase/out(get_turf(parent)) + number_of_hits = max(0, number_of_hits - 1) + if(number_of_hits <= 0) + disable_shield() + return SUCCESSFUL_BLOCK + +/datum/component/regenerative_shield/proc/disable_shield() + addtimer(CALLBACK(src, PROC_REF(enable_shield)), regeneration_time) + for(var/obj/effect/my_effect as anything in shield_overlays) + animate(my_effect, alpha = 0, time = 3 SECONDS) + my_effect.remove_filter(SHIELD_FILTER) + playsound(parent, 'sound/mecha/mech_shield_drop.ogg', 20) + +/datum/component/regenerative_shield/proc/enable_shield() + number_of_hits = initial(number_of_hits) + for(var/obj/effect/my_effect as anything in shield_overlays) + animate(my_effect, alpha = 255, time = 3 SECONDS) + addtimer(CALLBACK(src, PROC_REF(apply_filter_effects), my_effect), 5 SECONDS) + playsound(parent, 'sound/mecha/mech_shield_raise.ogg', 20) + +/datum/component/regenerative_shield/proc/apply_filter_effects(obj/effect/new_effect) + if(isnull(new_effect)) + return + new_effect.add_filter(SHIELD_FILTER, 1, list("type" = "outline", "color" = "#b6e6f3", "alpha" = 0, "size" = 1)) + var/filter = new_effect.get_filter(SHIELD_FILTER) + animate(filter, alpha = 200, time = 0.5 SECONDS, loop = -1) + animate(alpha = 0, time = 0.5 SECONDS) + +#undef SHIELD_FILTER diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index 98024e1a00e..7ac6027944c 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -30,6 +30,8 @@ var/list/allowed_turf_typecache /// allow typecache for only certain turfs, forbid to allow all but those. allow only certain turfs will take precedence. var/list/forbid_turf_typecache + /// additional traits to add to anyone riding this vehicle + var/list/rider_traits = list(TRAIT_NO_FLOATING_ANIM) /// We don't need roads where we're going if this is TRUE, allow normal movement in space tiles var/override_allow_spacemove = FALSE /// can anyone other than the rider unbuckle the rider? @@ -67,6 +69,7 @@ RegisterSignal(parent, COMSIG_BUCKLED_CAN_Z_MOVE, PROC_REF(riding_can_z_move)) RegisterSignals(parent, GLOB.movement_type_addtrait_signals, PROC_REF(on_movement_type_trait_gain)) RegisterSignals(parent, GLOB.movement_type_removetrait_signals, PROC_REF(on_movement_type_trait_loss)) + RegisterSignal(parent, COMSIG_SUPERMATTER_CONSUMED, PROC_REF(on_entered_supermatter)) if(!can_force_unbuckle) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(force_unbuckle)) @@ -95,7 +98,7 @@ for (var/trait in GLOB.movement_type_trait_to_flag) if (HAS_TRAIT(parent, trait)) REMOVE_TRAIT(rider, trait, REF(src)) - REMOVE_TRAIT(rider, TRAIT_NO_FLOATING_ANIM, REF(src)) + rider.remove_traits(rider_traits, REF(src)) if(!movable_parent.has_buckled_mobs()) qdel(src) @@ -114,7 +117,7 @@ for (var/trait in GLOB.movement_type_trait_to_flag) if (HAS_TRAIT(parent, trait)) ADD_TRAIT(rider, trait, REF(src)) - ADD_TRAIT(rider, TRAIT_NO_FLOATING_ANIM, REF(src)) + rider.add_traits(rider_traits, REF(src)) /// This proc is called when the rider attempts to grab the thing they're riding, preventing them from doing so. /datum/component/riding/proc/on_rider_try_pull(mob/living/rider_pulling, atom/movable/target, force) @@ -314,3 +317,9 @@ if((living_hitter in source.buckled_mobs)) return return COMPONENT_CANCEL_ATTACK_CHAIN + +/// When we touch a crystal, kill everything inside us +/datum/component/riding/proc/on_entered_supermatter(atom/movable/ridden, atom/movable/supermatter) + SIGNAL_HANDLER + for (var/mob/passenger as anything in ridden.buckled_mobs) + passenger.Bump(supermatter) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index e89541cb6f7..82229544c17 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -458,6 +458,10 @@ /datum/component/riding/creature/goliath keytype = /obj/item/key/lasso vehicle_move_delay = 4 + rider_traits = list(TRAIT_NO_FLOATING_ANIM, TRAIT_TENTACLE_IMMUNE) + +/datum/component/riding/creature/goliath/deathmatch + keytype = null /datum/component/riding/creature/goliath/Initialize(mob/living/riding_mob, force, ride_check_flags, potion_boost) . = ..() diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index 2a556ac8944..efe0becd9fb 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -169,6 +169,8 @@ /datum/component/riding/vehicle/scooter/skateboard vehicle_move_delay = 1.5 ride_check_flags = RIDER_NEEDS_LEGS | UNBUCKLE_DISABLED_RIDER + ///If TRUE, the vehicle will be slower (but safer) to ride on walk intent. + var/can_slow_down = TRUE /datum/component/riding/vehicle/scooter/skateboard/handle_specials() . = ..() @@ -177,8 +179,82 @@ set_vehicle_dir_layer(EAST, OBJ_LAYER) set_vehicle_dir_layer(WEST, OBJ_LAYER) +/datum/component/riding/vehicle/scooter/skateboard/RegisterWithParent() + . = ..() + if(can_slow_down) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + var/obj/vehicle/ridden/scooter/skateboard/board = parent + if(istype(board)) + board.can_slow_down = can_slow_down + +/datum/component/riding/vehicle/scooter/skateboard/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("Going slow and nice at [EXAMINE_HINT("walk")] speed will prevent crashing into things.") + +/datum/component/riding/vehicle/scooter/skateboard/vehicle_mob_buckle(datum/source, mob/living/rider, force = FALSE) + . = ..() + if(can_slow_down) + RegisterSignal(rider, COMSIG_MOVE_INTENT_TOGGLED, PROC_REF(toggle_move_delay)) + toggle_move_delay(rider) + +/datum/component/riding/vehicle/scooter/skateboard/handle_unbuckle(mob/living/rider) + . = ..() + if(can_slow_down) + toggle_move_delay(rider) + UnregisterSignal(rider, COMSIG_MOVE_INTENT_TOGGLED) + +/datum/component/riding/vehicle/scooter/skateboard/proc/toggle_move_delay(mob/living/rider) + SIGNAL_HANDLER + vehicle_move_delay = initial(vehicle_move_delay) + if(rider.move_intent == MOVE_INTENT_WALK) + vehicle_move_delay += 0.6 + +/datum/component/riding/vehicle/scooter/skateboard/pro + vehicle_move_delay = 1 + +///This one lets the rider ignore gravity, move in zero g and son on, but only on ground turfs or at most one z-level above them. +/datum/component/riding/vehicle/scooter/skateboard/hover + vehicle_move_delay = 1 + override_allow_spacemove = TRUE + +/datum/component/riding/vehicle/scooter/skateboard/hover/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ATOM_HAS_GRAVITY, PROC_REF(check_grav)) + RegisterSignal(parent, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(check_drifting)) + hover_check() + +///Makes sure that the vehicle is grav-less if capable of zero-g movement. Forced gravity will honestly screw this. +/datum/component/riding/vehicle/scooter/skateboard/hover/proc/check_grav(datum/source, turf/gravity_turf, list/gravs) + SIGNAL_HANDLER + if(override_allow_spacemove) + gravs += 0 + +///Makes sure the vehicle isn't drifting while it can be maneuvered. +/datum/component/riding/vehicle/scooter/skateboard/hover/proc/check_drifting(datum/source, movement_dir, continuous_move) + SIGNAL_HANDLER + if(override_allow_spacemove) + return COMSIG_MOVABLE_STOP_SPACEMOVE + +/datum/component/riding/vehicle/scooter/skateboard/hover/vehicle_moved(atom/movable/source, oldloc, dir, forced) + . = ..() + hover_check(TRUE) + +///Makes sure that the hoverboard can move in zero-g in (open) space but only there's a ground turf on the z-level below. +/datum/component/riding/vehicle/scooter/skateboard/hover/proc/hover_check(is_moving = FALSE) + var/atom/movable/movable = parent + if(!isopenspaceturf(movable.loc)) + override_allow_spacemove = TRUE + return + var/turf/open/our_turf = movable.loc + var/turf/turf_below = GET_TURF_BELOW(our_turf) + if(our_turf.zPassOut(DOWN) && (isnull(turf_below) || (isopenspaceturf(turf_below) && turf_below.zPassIn(DOWN) && turf_below.zPassOut(DOWN)))) + override_allow_spacemove = FALSE + if(turf_below) + our_turf.zFall(movable, falling_from_move = is_moving) + /datum/component/riding/vehicle/scooter/skateboard/wheelys vehicle_move_delay = 1.75 // SKYRAT EDIT - ORIGINAL: 0 + can_slow_down = FALSE /datum/component/riding/vehicle/scooter/skateboard/wheelys/handle_specials() . = ..() @@ -273,4 +349,4 @@ . = ..() var/obj/vehicle/ridden/wheelchair/motorized/our_chair = parent if(istype(our_chair) && our_chair.power_cell) - our_chair.power_cell.use(our_chair.power_usage / max(our_chair.power_efficiency, 1) * 0.05) + our_chair.power_cell.use(our_chair.energy_usage / max(our_chair.power_efficiency, 1) * 0.05) diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 4646d30fc31..5b6361b9ee6 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -25,7 +25,7 @@ COOLDOWN_DECLARE(power_used_cooldown) /// The maximum power that the shell can use in a minute before entering overheating and destroying itself. - var/max_power_use_in_minute = 20000 + var/max_power_use_in_minute = 20 * STANDARD_CELL_CHARGE /datum/component/shell/Initialize(unremovable_circuit_components, capacity, shell_flags, starting_circuit) . = ..() @@ -294,7 +294,7 @@ if(attached_circuit) remove_circuit() return - location.use_power(power_to_use, AREA_USAGE_EQUIP) + location.apc?.terminal?.use_energy(power_to_use, channel = AREA_USAGE_EQUIP) power_used_in_minute += power_to_use COOLDOWN_START(src, power_used_cooldown, 1 MINUTES) return COMPONENT_OVERRIDE_POWER_USAGE @@ -327,7 +327,7 @@ else if(circuitboard.loc != parent_atom) circuitboard.forceMove(parent_atom) attached_circuit.set_shell(parent_atom) - + // call after set_shell() sets on to true if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) attached_circuit.set_on(parent_atom.anchored) diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index 8a46697745f..f35ad2ceec0 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -111,7 +111,7 @@ /datum/component/shielded/proc/on_equipped(datum/source, mob/user, slot) SIGNAL_HANDLER - if((slot & ITEM_SLOT_HANDS) && !shield_inhand) + if(user.is_holding(parent) && !shield_inhand) lost_wearer(source, user) return set_wearer(user) @@ -155,6 +155,14 @@ COOLDOWN_START(src, recently_hit_cd, recharge_start_delay) + //No wearer? No block. + if(isnull(wearer)) + return + + //if our wearer isn't the owner of the block, don't block + if(owner != wearer) + return + if(current_charges <= 0) return . = COMPONENT_HIT_REACTION_BLOCK diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm index 67cd3d39e23..d2615ea2f77 100644 --- a/code/datums/components/shrink.dm +++ b/code/datums/components/shrink.dm @@ -15,6 +15,7 @@ if(isliving(parent_atom)) var/mob/living/L = parent_atom ADD_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) + RegisterSignal(L, COMSIG_MOB_SAY, PROC_REF(handle_shrunk_speech)) L.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) if(iscarbon(L)) var/mob/living/carbon/C = L @@ -30,6 +31,10 @@ span_userdanger("Everything grows bigger!")) QDEL_IN(src, shrink_time) +/datum/component/shrink/proc/handle_shrunk_speech(mob/living/little_guy, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= SPAN_SMALL_VOICE + /datum/component/shrink/Destroy() var/atom/parent_atom = parent parent_atom.transform = parent_atom.transform.Scale(2,2) @@ -38,6 +43,7 @@ var/mob/living/L = parent_atom L.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) REMOVE_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) + UnregisterSignal(L, COMSIG_MOB_SAY) if(ishuman(L)) var/mob/living/carbon/human/H = L H.physiology.damage_resistance += 100 diff --git a/code/datums/components/shy.dm b/code/datums/components/shy.dm index 5743322dea1..a9b50a07efb 100644 --- a/code/datums/components/shy.dm +++ b/code/datums/components/shy.dm @@ -132,7 +132,7 @@ SIGNAL_HANDLER return is_shy(target) && COMPONENT_CANT_STRIP -/datum/component/shy/proc/on_try_alt_action(datum/source, atom/target) +/datum/component/shy/proc/on_try_alt_action(datum/source, atom/target, action_key) SIGNAL_HANDLER return is_shy(target) && COMPONENT_CANT_ALT_ACTION diff --git a/code/datums/components/shy_in_room.dm b/code/datums/components/shy_in_room.dm index 023dbaff719..4e0c2421561 100644 --- a/code/datums/components/shy_in_room.dm +++ b/code/datums/components/shy_in_room.dm @@ -69,6 +69,6 @@ SIGNAL_HANDLER return is_shy(target) && COMPONENT_CANT_STRIP -/datum/component/shy_in_room/proc/on_try_alt_action(datum/source, atom/target) +/datum/component/shy_in_room/proc/on_try_alt_action(datum/source, atom/target, action_key) SIGNAL_HANDLER return is_shy(target) && COMPONENT_CANT_ALT_ACTION diff --git a/code/datums/components/sign_language.dm b/code/datums/components/sign_language.dm index 23e40258100..e8d22238705 100644 --- a/code/datums/components/sign_language.dm +++ b/code/datums/components/sign_language.dm @@ -79,7 +79,7 @@ carbon_parent.verb_yell = "emphatically signs" carbon_parent.bubble_icon = "signlang" RegisterSignal(carbon_parent, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_added_organ)) - RegisterSignal(carbon_parent, COMSIG_LIVING_TRY_SPEECH, PROC_REF(on_try_speech)) + RegisterSignal(carbon_parent, COMSIG_MOB_TRY_SPEECH, PROC_REF(on_try_speech)) RegisterSignal(carbon_parent, COMSIG_LIVING_TREAT_MESSAGE, PROC_REF(on_treat_living_message)) RegisterSignal(carbon_parent, COMSIG_MOVABLE_USING_RADIO, PROC_REF(on_using_radio)) RegisterSignal(carbon_parent, COMSIG_MOVABLE_SAY_QUOTE, PROC_REF(on_say_quote)) @@ -106,7 +106,7 @@ carbon_parent.bubble_icon = initial(carbon_parent.bubble_icon) UnregisterSignal(carbon_parent, list( COMSIG_CARBON_GAIN_ORGAN, - COMSIG_LIVING_TRY_SPEECH, + COMSIG_MOB_TRY_SPEECH, COMSIG_LIVING_TREAT_MESSAGE, COMSIG_MOVABLE_USING_RADIO, COMSIG_MOVABLE_SAY_QUOTE, @@ -125,7 +125,7 @@ var/obj/item/organ/internal/tongue/new_tongue = new_organ new_tongue.temp_say_mod = "signs" -/// Signal proc for [COMSIG_LIVING_TRY_SPEECH] +/// Signal proc for [COMSIG_MOB_TRY_SPEECH] /// Sign languagers can always speak regardless of they're mute (as long as they're not mimes) /datum/component/sign_language/proc/on_try_speech(mob/living/source, message, ignore_spam, forced) SIGNAL_HANDLER @@ -158,7 +158,7 @@ // Assuming none of the above fail, sign language users can speak // regardless of being muzzled or mute toxin'd or whatever. - return COMPONENT_CAN_ALWAYS_SPEAK + return COMPONENT_IGNORE_CAN_SPEAK /// Checks to see what state this person is in and if they are able to sign or not. /datum/component/sign_language/proc/check_signables_state() diff --git a/code/datums/components/simple_bodycam.dm b/code/datums/components/simple_bodycam.dm new file mode 100644 index 00000000000..9d653f38a78 --- /dev/null +++ b/code/datums/components/simple_bodycam.dm @@ -0,0 +1,69 @@ +/// Simple component to integrate a bodycam into a mob +/datum/component/simple_bodycam + dupe_mode = COMPONENT_DUPE_SELECTIVE + /// The actual camera, in our mob's contents + VAR_PRIVATE/obj/machinery/camera/bodycam + /// How fast we update + var/camera_update_time = 0.5 SECONDS + +/datum/component/simple_bodycam/Initialize( + camera_name = "bodycam", + c_tag = capitalize(camera_name), + network = "ss13", + emp_proof = FALSE, + camera_update_time = 0.5 SECONDS, +) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + src.camera_update_time = camera_update_time + + bodycam = new(parent) + bodycam.network = list(network) + bodycam.name = camera_name + bodycam.c_tag = c_tag + if(emp_proof) + bodycam.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) + + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(update_cam)) + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate_cam)) + RegisterSignals(bodycam, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED), PROC_REF(camera_gone)) + + do_update_cam() + +/datum/component/simple_bodycam/Destroy() + if(QDELETED(bodycam)) + bodycam = null + else + QDEL_NULL(bodycam) + return ..() + +/datum/component/simple_bodycam/CheckDupeComponent( + datum/component/simple_bodycam/new_bodycam, // will be null + camera_name, + c_tag, + network = "ss13", + emp_proof, + camera_update_time, +) + // Dupes are only allowed if we don't have a camera on that network already + return (network in bodycam.network) + +/datum/component/simple_bodycam/proc/update_cam(datum/source, atom/old_loc, ...) + SIGNAL_HANDLER + + if(get_turf(old_loc) != get_turf(parent)) + do_update_cam() + +/datum/component/simple_bodycam/proc/do_update_cam() + GLOB.cameranet.updatePortableCamera(bodycam, camera_update_time) + +/datum/component/simple_bodycam/proc/rotate_cam(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + // I don't actually think cameras care about dir but just in case + bodycam.setDir(new_dir) + +/datum/component/simple_bodycam/proc/camera_gone(datum/source) + SIGNAL_HANDLER + if (!QDELETED(src)) + qdel(src) diff --git a/code/datums/components/sizzle.dm b/code/datums/components/sizzle.dm index ce91e9593f7..957586aa806 100644 --- a/code/datums/components/sizzle.dm +++ b/code/datums/components/sizzle.dm @@ -1,26 +1,31 @@ /datum/component/sizzle - var/mutable_appearance/sizzling - var/sizzlealpha = 0 dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS -/datum/component/sizzle/Initialize() + ///The sizzling appearance to put on top of the food item + var/mutable_appearance/sizzling + ///The amount of time the food item has been sizzling for + var/grilled_time = 0 + +/datum/component/sizzle/Initialize(grilled_time) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - setup_sizzle() -/datum/component/sizzle/InheritComponent(datum/component/C, i_am_original) - var/atom/food = parent - sizzlealpha += 5 - sizzling.alpha = sizzlealpha - food.cut_overlay(sizzling) - food.add_overlay(sizzling) - -/datum/component/sizzle/proc/setup_sizzle() var/atom/food = parent var/icon/grill_marks = icon(food.icon, food.icon_state) grill_marks.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) grill_marks.Blend(icon('icons/obj/machines/kitchen.dmi', "grillmarks"), ICON_MULTIPLY) //adds grill marks and the remaining white areas become transparent sizzling = new(grill_marks) - sizzling.alpha = sizzlealpha food.add_overlay(sizzling) + src.grilled_time = grilled_time + +/datum/component/sizzle/InheritComponent(datum/component/C, i_am_original, grilled_time) + var/atom/food = parent + sizzling.alpha += 5 + food.cut_overlay(sizzling) + food.add_overlay(sizzling) + src.grilled_time = grilled_time + +///Returns how long the food item has been sizzling for +/datum/component/sizzle/proc/time_elapsed() + return src.grilled_time diff --git a/code/datums/components/spirit_holding.dm b/code/datums/components/spirit_holding.dm index cb626801d86..e2b1cfb96bc 100644 --- a/code/datums/components/spirit_holding.dm +++ b/code/datums/components/spirit_holding.dm @@ -37,9 +37,10 @@ ///signal fired on self attacking parent /datum/component/spirit_holding/proc/on_attack_self(datum/source, mob/user) SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(get_ghost), user) +/datum/component/spirit_holding/proc/get_ghost(mob/user) var/atom/thing = parent - if(attempting_awakening) thing.balloon_alert(user, "already channeling!") return @@ -47,20 +48,23 @@ thing.balloon_alert(user, "spirits are unwilling!") to_chat(user, span_warning("Anomalous otherworldly energies block you from awakening [parent]!")) return - attempting_awakening = TRUE thing.balloon_alert(user, "channeling...") - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(affix_spirit), user) - parent.AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_POSSESSED_BLADE, \ - job_bans = ROLE_PAI, \ - to_call = to_call, \ - title = "Spirit of [user.real_name]'s blade", \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + question = "Do you want to play as [span_notice("Spirit of [span_danger("[user.real_name]'s")] blade")]?", + check_jobban = ROLE_PAI, + poll_time = 20 SECONDS, + checked_target = thing, + ignore_category = POLL_IGNORE_POSSESSED_BLADE, + alert_pic = thing, + role_name_text = "possessed blade", + chat_text_border_icon = thing, ) + affix_spirit(user, chosen_one) /// On conclusion of the ghost poll /datum/component/spirit_holding/proc/affix_spirit(mob/awakener, mob/dead/observer/ghost) + var/atom/thing = parent if(isnull(ghost)) diff --git a/code/datums/components/sticker.dm b/code/datums/components/sticker.dm new file mode 100644 index 00000000000..2c87d856da8 --- /dev/null +++ b/code/datums/components/sticker.dm @@ -0,0 +1,118 @@ +/** + * ### Sticker component + * + * Component that draws supplied atom's icon over parent object with specified offset, + * icon centering is handled inside. + */ +/datum/component/sticker + dupe_mode = COMPONENT_DUPE_ALLOWED + + /// Either `turf` or `null`, used to connect to `COMSIG_TURF_EXPOSE` signal when parent is a turf. + var/turf/listening_turf + /// Refernce to a "stickered" atom. + var/atom/movable/our_sticker + /// Reference to the created overlay, used during component deletion. + var/mutable_appearance/sticker_overlay + // Callback invoked when sticker is applied to the parent. + var/datum/callback/stick_callback + // Callback invoked when sticker is peeled (not removed) from the parent. + var/datum/callback/peel_callback + +/datum/component/sticker/Initialize(atom/stickering_atom, dir = NORTH, px = 0, py = 0, datum/callback/stick_callback, datum/callback/peel_callback) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + src.our_sticker = our_sticker + src.stick_callback = stick_callback + src.peel_callback = peel_callback + stick(stickering_atom, px, py) + register_turf_signals(dir) + +/datum/component/sticker/Destroy(force) + var/atom/parent_atom = parent + parent_atom.cut_overlay(sticker_overlay) + + unregister_turf_signals() + + REMOVE_TRAIT(parent, TRAIT_STICKERED, REF(src)) + + our_sticker = null + sticker_overlay = null + stick_callback = null + peel_callback = null + return ..() + +/datum/component/sticker/RegisterWithParent() + RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(on_ignite)) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean)) + +/datum/component/sticker/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_COMPONENT_CLEAN_ACT)) + +/// Subscribes to `COMSIG_TURF_EXPOSE` if parent atom is a turf. If turf is closed - subscribes to signal +/datum/component/sticker/proc/register_turf_signals(dir) + if(!isturf(parent)) + return + + listening_turf = isclosedturf(parent) ? get_step(parent, dir) : parent + RegisterSignal(listening_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) + +/// Unsubscribes from `COMSIG_TURF_EXPOSE` if `listening_turf` is not `null`. +/datum/component/sticker/proc/unregister_turf_signals() + if(isnull(listening_turf)) + return + + UnregisterSignal(listening_turf, COMSIG_TURF_EXPOSE) + +/datum/component/sticker/proc/sticker_gone(...) + SIGNAL_HANDLER + + UnregisterSignal(our_sticker, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED)) + our_sticker = null + qdel(src) + +/// Handles overlay creation from supplied atom, adds created icon to the parent object, moves source atom to the nullspace. +/datum/component/sticker/proc/stick(atom/movable/stickering_atom, px, py) + our_sticker = stickering_atom + our_sticker.moveToNullspace() + RegisterSignals(our_sticker, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED), PROC_REF(sticker_gone)) + + var/atom/parent_atom = parent + + sticker_overlay = mutable_appearance(icon = our_sticker.icon, icon_state = our_sticker.icon_state, layer = parent_atom.layer + 0.01, appearance_flags = RESET_COLOR) + sticker_overlay.pixel_w = px - world.icon_size / 2 + sticker_overlay.pixel_z = py - world.icon_size / 2 + + parent_atom.add_overlay(sticker_overlay) + stick_callback?.Invoke(parent) + ADD_TRAIT(parent, TRAIT_STICKERED, REF(src)) + +/// Moves stickered atom from the nullspace, deletes component. +/datum/component/sticker/proc/peel() + var/atom/parent_atom = parent + var/turf/drop_location = listening_turf || parent_atom.drop_location() + + UnregisterSignal(our_sticker, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED)) + our_sticker.forceMove(drop_location) + our_sticker = null + peel_callback?.Invoke(parent) + + qdel(src) + +/datum/component/sticker/proc/on_ignite(datum/source) + SIGNAL_HANDLER + + qdel(our_sticker) // which qdels us + +/datum/component/sticker/proc/on_clean(datum/source, clean_types) + SIGNAL_HANDLER + + peel() + + return COMPONENT_CLEANED + +/datum/component/sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) + SIGNAL_HANDLER + + if(exposed_temperature >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + qdel(our_sticker) // which qdels us diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index d50b9736e8f..8b532277e34 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -96,8 +96,6 @@ if(multitooled) src.multitooled = multitooled - RegisterSignal(src, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_parent_multitool)) - ADD_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // SKYRAT EDIT ADD - allows style meter chads to do flips /datum/component/style/RegisterWithParent() @@ -345,12 +343,6 @@ 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].")) - -/datum/component/style/proc/on_parent_multitool(datum/source, mob/living/user, obj/item/tool, list/recipes) - multitooled = !multitooled - user.balloon_alert(user, "meter [multitooled ? "" : "un"]hacked") - - // Point givers /datum/component/style/proc/on_punch(mob/living/carbon/human/punching_person, atom/attacked_atom, proximity) SIGNAL_HANDLER diff --git a/code/datums/components/style/style_meter.dm b/code/datums/components/style/style_meter.dm index 8c5b5ea87df..72688f41c52 100644 --- a/code/datums/components/style/style_meter.dm +++ b/code/datums/components/style/style_meter.dm @@ -17,7 +17,6 @@ /obj/item/style_meter/Initialize(mapload) . = ..() meter_appearance = mutable_appearance(icon, icon_state) - RegisterSignal(src, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_multitool)) /obj/item/style_meter/Destroy(force) if(istype(loc, /obj/item/clothing/glasses)) @@ -28,28 +27,30 @@ . = ..() . += span_notice("You feel like a multitool could be used on this.") -/obj/item/style_meter/afterattack(atom/movable/attacked_atom, mob/user, proximity_flag, click_parameters) - . = ..() - if(!istype(attacked_atom, /obj/item/clothing/glasses)) - return +/obj/item/style_meter/interact_with_atom(atom/interacting_with, mob/living/user) + if(!istype(interacting_with, /obj/item/clothing/glasses)) + return NONE - forceMove(attacked_atom) - attacked_atom.add_overlay(meter_appearance) - RegisterSignal(attacked_atom, COMSIG_ITEM_EQUIPPED, PROC_REF(check_wearing)) - RegisterSignal(attacked_atom, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) - RegisterSignal(attacked_atom, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) - RegisterSignal(attacked_atom, COMSIG_CLICK_ALT, PROC_REF(on_altclick)) - RegisterSignal(attacked_atom, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_multitool)) + . = ITEM_INTERACT_SUCCESS + + forceMove(interacting_with) + interacting_with.add_overlay(meter_appearance) + RegisterSignal(interacting_with, COMSIG_ITEM_EQUIPPED, PROC_REF(check_wearing)) + RegisterSignal(interacting_with, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + RegisterSignal(interacting_with, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(interacting_with, COMSIG_CLICK_ALT, PROC_REF(on_altclick)) + RegisterSignal(interacting_with, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(redirect_multitool)) balloon_alert(user, "style meter attached") playsound(src, 'sound/machines/click.ogg', 30, TRUE) - if(!iscarbon(attacked_atom.loc)) - return + if(!iscarbon(interacting_with.loc)) + return . - var/mob/living/carbon/carbon_wearer = attacked_atom.loc - if(carbon_wearer.glasses != attacked_atom) - return + var/mob/living/carbon/carbon_wearer = interacting_with.loc + if(carbon_wearer.glasses != interacting_with) + return . style_meter = carbon_wearer.AddComponent(/datum/component/style, multitooled) + return . /obj/item/style_meter/Moved(atom/old_loc, Dir, momentum_change) . = ..() @@ -98,15 +99,17 @@ return COMPONENT_CANCEL_CLICK_ALT - -/// Signal proc for when the glasses or the meter is multitooled -/obj/item/style_meter/proc/on_multitool(datum/source, mob/living/user, obj/item/tool, list/recipes) +/obj/item/style_meter/multitool_act(mob/living/user, obj/item/tool) multitooled = !multitooled - if(style_meter) - SEND_SIGNAL(style_meter, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), user, tool, recipes) - else - balloon_alert(user, "meter [multitooled ? "" : "un"]hacked") + balloon_alert(user, "meter [multitooled ? "" : "un"]hacked") + style_meter?.multitooled = multitooled + return ITEM_INTERACT_SUCCESS +/// Redirect multitooling on our glasses to our style meter +/obj/item/style_meter/proc/redirect_multitool(datum/source, mob/living/user, obj/item/tool, ...) + SIGNAL_HANDLER + + return multitool_act(user, tool) /// Unregister signals and just generally clean up ourselves after being removed from glasses /obj/item/style_meter/proc/clean_up(atom/movable/old_location) diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index 2b7ac44110f..22c32b2a148 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -288,15 +288,23 @@ consume(atom_source, nom) /datum/component/supermatter_crystal/proc/consume(atom/source, atom/movable/consumed_object) + if(consumed_object.flags_1 & SUPERMATTER_IGNORES_1) + return + if(isliving(consumed_object)) + var/mob/living/consumed_mob = consumed_object + if(consumed_mob.status_flags & GODMODE) + return + var/atom/atom_source = source + SEND_SIGNAL(consumed_object, COMSIG_SUPERMATTER_CONSUMED, atom_source) + var/object_size = 0 var/matter_increase = 0 var/damage_increase = 0 + if(isliving(consumed_object)) var/mob/living/consumed_mob = consumed_object object_size = consumed_mob.mob_size + 2 - if(consumed_mob.status_flags & GODMODE) - return message_admins("[atom_source] has consumed [key_name_admin(consumed_mob)] [ADMIN_JMP(atom_source)].") atom_source.investigate_log("has consumed [key_name(consumed_mob)].", INVESTIGATE_ENGINE) consumed_mob.investigate_log("has been dusted by [atom_source].", INVESTIGATE_DEATHS) @@ -312,8 +320,6 @@ if(is_clown_job(consumed_mob.mind?.assigned_role)) damage_increase += rand(-30, 30) // HONK consume_returns(matter_increase, damage_increase) - else if(consumed_object.flags_1 & SUPERMATTER_IGNORES_1) - return else if(isobj(consumed_object)) if(!iseffect(consumed_object) && !(consumed_object.flags_1 & SUPERMATTER_NOLOGS_1)) //BUBBER EDIT | NOLOGS flag Addition to ignore items engineers like to feed the SM :3 var/suspicion = "" diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index 360e7ab9b51..cd2fcc2cff9 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -88,6 +88,8 @@ continue if(!is_type_in_list(target, surgery.target_mobtypes)) continue + if(user == target && !(surgery.surgery_flags & SURGERY_SELF_OPERABLE)) + continue if(isnull(affecting)) if(surgery.surgery_flags & SURGERY_REQUIRE_LIMB) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 128a48d30a9..4f2eb6fa7ad 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -369,7 +369,7 @@ if(HAS_TRAIT(target, TRAIT_CLUMSY)) defense_mod -= 2 - if(HAS_TRAIT(target, TRAIT_FAT)) // chonkers are harder to knock over + if(HAS_TRAIT(target, TRAIT_OFF_BALANCE_TACKLER)) // chonkers are harder to knock over defense_mod += 1 if(HAS_TRAIT(target, TRAIT_GRABWEAKNESS)) defense_mod -= 2 @@ -443,7 +443,7 @@ if(human_sacker.get_mob_height() <= HUMAN_HEIGHT_SHORTEST) //JUST YOU WAIT TILL I FIND A CHAIR, BUDDY, THEN YOU'LL BE SORRY attack_mod -= 2 - if(human_sacker.mob_mood.sanity_level == SANITY_INSANE) //I've gone COMPLETELY INSANE + if(human_sacker.mob_mood.sanity_level == SANITY_LEVEL_INSANE) //I've gone COMPLETELY INSANE attack_mod += 15 human_sacker.adjustStaminaLoss(100) //AHAHAHAHAHAHAHAHA diff --git a/code/datums/components/tameable.dm b/code/datums/components/tameable.dm index 67325b489d3..43f48005bf8 100644 --- a/code/datums/components/tameable.dm +++ b/code/datums/components/tameable.dm @@ -10,10 +10,8 @@ var/bonus_tame_chance ///Current chance to tame on interaction var/current_tame_chance - ///For effects once soemthing is tamed - var/datum/callback/after_tame -/datum/component/tameable/Initialize(food_types, tame_chance, bonus_tame_chance, datum/callback/after_tame, unique = TRUE) +/datum/component/tameable/Initialize(food_types, tame_chance, bonus_tame_chance, unique = TRUE) if(!isatom(parent)) //yes, you could make a tameable toolbox. return COMPONENT_INCOMPATIBLE @@ -24,18 +22,12 @@ src.current_tame_chance = tame_chance if(bonus_tame_chance) src.bonus_tame_chance = bonus_tame_chance - if(after_tame) - src.after_tame = after_tame src.unique = unique RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(try_tame)) RegisterSignal(parent, COMSIG_SIMPLEMOB_SENTIENCEPOTION, PROC_REF(on_tame)) //Instantly succeeds RegisterSignal(parent, COMSIG_SIMPLEMOB_TRANSFERPOTION, PROC_REF(on_tame)) //Instantly succeeds -/datum/component/tameable/Destroy(force) - after_tame = null - return ..() - /datum/component/tameable/proc/try_tame(datum/source, obj/item/food, mob/living/attacker, params) SIGNAL_HANDLER if(!is_type_in_list(food, food_types)) @@ -70,9 +62,9 @@ return living_parent.faction.Find(REF(potential_friend)) ///Ran once taming succeeds -/datum/component/tameable/proc/on_tame(atom/source, mob/living/tamer, atom/food, inform_tamer = FALSE) +/datum/component/tameable/proc/on_tame(atom/source, mob/living/tamer, obj/item/food, inform_tamer = FALSE) SIGNAL_HANDLER - after_tame?.Invoke(tamer, food)//Run custom behavior if needed + source.tamed(tamer, food)//Run custom behavior if needed if(isliving(parent) && isliving(tamer)) INVOKE_ASYNC(source, TYPE_PROC_REF(/mob/living, befriend), tamer) diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index 3c3fec196c2..e51c784657b 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -34,6 +34,8 @@ var/list/attack_verb_simple_on /// Whether clumsy people need to succeed an RNG check to turn it on without hurting themselves var/clumsy_check + /// Amount of damage to deal to clumsy people + var/clumsy_damage /// If we get sharpened with a whetstone, save the bonus here for later use if we un/redeploy var/sharpened_bonus = 0 /// Dictate whether we change inhands or not @@ -51,6 +53,7 @@ hitsound_on = 'sound/weapons/blade1.ogg', w_class_on = WEIGHT_CLASS_BULKY, clumsy_check = TRUE, + clumsy_damage = 10, list/attack_verb_continuous_on, list/attack_verb_simple_on, inhand_icon_change = TRUE, @@ -69,6 +72,7 @@ src.hitsound_on = hitsound_on src.w_class_on = w_class_on src.clumsy_check = clumsy_check + src.clumsy_damage = clumsy_damage src.inhand_icon_change = inhand_icon_change if(attack_verb_continuous_on) @@ -266,8 +270,21 @@ span_warning("[user] triggers [parent] while holding it backwards and [hurt_self_verb_continuous] themself, like a doofus!"), span_warning("You trigger [parent] while holding it backwards and [hurt_self_verb_simple] yourself, like a doofus!"), ) - user.take_bodypart_damage(10) + var/obj/item/item_parent = parent + switch(item_parent.damtype) + if(STAMINA) + user.adjustStaminaLoss(clumsy_damage) + if(OXY) + user.adjustOxyLoss(clumsy_damage) + if(TOX) + user.adjustToxLoss(clumsy_damage) + if(BRUTE) + user.take_bodypart_damage(brute=clumsy_damage) + if(BURN) + user.take_bodypart_damage(burn=clumsy_damage) + return TRUE + return FALSE /* diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 45ee6697e53..5a3ff4b4cb0 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -122,7 +122,7 @@ // register signals withthe parent item /datum/component/two_handed/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + RegisterSignal(parent, COMSIG_ITEM_POST_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) @@ -135,7 +135,7 @@ // Remove all siginals registered to the parent item /datum/component/two_handed/UnregisterFromParent() UnregisterSignal(parent, list( - COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_POST_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_ATTACK, @@ -191,6 +191,7 @@ /datum/component/two_handed/proc/wield(mob/living/carbon/user) if(wielded) return + var/atom/atom_parent = parent if(HAS_TRAIT(user, TRAIT_NO_TWOHANDING)) if(require_twohands) @@ -198,23 +199,24 @@ user.dropItemToGround(parent, force = TRUE) else atom_parent.balloon_alert(user, "too weak to wield with both hands!") - return + return COMPONENT_EQUIPPED_FAILED if(user.get_inactive_held_item()) if(require_twohands) atom_parent.balloon_alert(user, "can't carry in one hand!") user.dropItemToGround(parent, force = TRUE) else atom_parent.balloon_alert(user, "holding something in other hand!") - return + return COMPONENT_EQUIPPED_FAILED if(user.usable_hands < 2) if(require_twohands) - user.dropItemToGround(parent, force=TRUE) + user.dropItemToGround(parent, force = TRUE) atom_parent.balloon_alert(user, "not enough hands!") - return + return COMPONENT_EQUIPPED_FAILED // wield update status if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD) - return // blocked wield from item + user.dropItemToGround(parent, force = TRUE) + return COMPONENT_EQUIPPED_FAILED // blocked wield from item wielded = TRUE ADD_TRAIT(parent, TRAIT_WIELDED, REF(src)) RegisterSignal(user, COMSIG_MOB_SWAPPING_HANDS, PROC_REF(on_swapping_hands)) diff --git a/code/datums/components/udder.dm b/code/datums/components/udder.dm index 3c8a0297897..cd87ff44c17 100644 --- a/code/datums/components/udder.dm +++ b/code/datums/components/udder.dm @@ -181,7 +181,7 @@ return var/transferred = reagents.trans_to(milk_holder, rand(5,10)) if(transferred) - user.visible_message(span_notice("[user] milks [src] using \the [milk_holder]."), span_notice("You milk [src] using \the [milk_holder].")) + user.visible_message(span_notice("[user] milks [udder_mob] using \the [milk_holder]."), span_notice("You milk [udder_mob] using \the [milk_holder].")) else to_chat(user, span_warning("The udder is dry. Wait a bit longer...")) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index e4e6e611ebc..5007d8caeb9 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -375,18 +375,18 @@ // PDA signal responses -/datum/component/uplink/proc/new_ringtone(datum/source, atom/source, new_ring_text) +/datum/component/uplink/proc/new_ringtone(datum/source, mob/living/user, new_ring_text) SIGNAL_HANDLER if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code))) if(trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code))) - failsafe(source) + failsafe(user) return COMPONENT_STOP_RINGTONE_CHANGE return locked = FALSE - if(ismob(source)) - interact(null, source) - to_chat(source, span_hear("The computer softly beeps.")) + if(ismob(user)) + interact(null, user) + to_chat(user, span_hear("The computer softly beeps.")) return COMPONENT_STOP_RINGTONE_CHANGE /datum/component/uplink/proc/check_detonate() diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 23462256342..771cdd12e10 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -160,7 +160,8 @@ for(var/s in symptoms) var/datum/symptom/symptom_datum = s - symptom_datum.Activate(src) + if(!symptom_datum.neutered) + symptom_datum.Activate(src) // Tell symptoms stage changed diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 4c2715668ba..7368e99acc8 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -76,6 +76,6 @@ if(power >= 2 && prob(30)) to_chat(affected_mob, span_userdanger("[pick("You have a coughing fit!", "You can't stop coughing!")]")) affected_mob.Immobilize(20) - addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/, emote), "cough"), 6) - addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/, emote), "cough"), 12) - addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/, emote), "cough"), 18) + addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/, emote), "cough"), 0.6 SECONDS) + addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/, emote), "cough"), 1.2 SECONDS) + addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/, emote), "cough"), 1.8 SECONDS) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 0da4a27c6a4..ea235af2b0e 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -381,14 +381,14 @@ if(M.getBruteLoss() + M.getFireLoss() >= 103 && !active_coma) //SKYRAT EDIT: ORIGINAL: 70 - Adjusts this to remain 37.5% of total health(plus crit health). Because 70 is alot less health here then it is on tg. to_chat(M, span_warning("You feel yourself slip into a regenerative coma...")) active_coma = TRUE - addtimer(CALLBACK(src, PROC_REF(coma), M), 60) + addtimer(CALLBACK(src, PROC_REF(coma), M), 6 SECONDS) /datum/symptom/heal/coma/proc/coma(mob/living/M) if(QDELETED(M) || M.stat == DEAD) return M.fakedeath("regenerative_coma", !deathgasp) - addtimer(CALLBACK(src, PROC_REF(uncoma), M), 300) + addtimer(CALLBACK(src, PROC_REF(uncoma), M), 30 SECONDS) /datum/symptom/heal/coma/proc/uncoma(mob/living/M) if(QDELETED(M) || !active_coma) diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index cb468a132cc..7615edb1b82 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -27,6 +27,7 @@ COOLDOWN_DECLARE(itching_cooldown) ///if FALSE, there is a percentage chance that the mob will emote scratching while itching_cooldown is on cooldown. If TRUE, won't emote again until after the off cooldown scratch occurs. var/off_cooldown_scratched = FALSE + /datum/symptom/itching/Start(datum/disease/advance/active_disease) . = ..() if(!.) @@ -41,17 +42,12 @@ . = ..() if(!.) return - var/mob/living/carbon/affected_mob = active_disease.affected_mob - var/obj/item/bodypart/bodypart = affected_mob.get_bodypart(affected_mob.get_random_valid_zone(even_weights = TRUE)) - if(bodypart && IS_ORGANIC_LIMB(bodypart) && !(bodypart.bodypart_flags & BODYPART_PSEUDOPART)) //robotic limbs will mean less scratching overall (why are golems able to damage themselves with self-scratching, but not androids? the world may never know) - var/can_scratch = scratch && !affected_mob.incapacitated() - if(can_scratch) - bodypart.receive_damage(0.5) - //below handles emotes, limiting the emote of emotes passed to chat - if(COOLDOWN_FINISHED(src, itching_cooldown) || !COOLDOWN_FINISHED(src, itching_cooldown) && prob(60) && !off_cooldown_scratched) - affected_mob.visible_message("[can_scratch ? span_warning("[affected_mob] scratches [affected_mob.p_their()] [bodypart.plaintext_zone].") : ""]", span_warning("Your [bodypart.plaintext_zone] itches. [can_scratch ? " You scratch it." : ""]")) - COOLDOWN_START(src, itching_cooldown, 5 SECONDS) - if(!off_cooldown_scratched && !COOLDOWN_FINISHED(src, itching_cooldown)) - off_cooldown_scratched = TRUE - else - off_cooldown_scratched = FALSE + + var/announce_scratch = COOLDOWN_FINISHED(src, itching_cooldown) || (!COOLDOWN_FINISHED(src, itching_cooldown) && prob(60) && !off_cooldown_scratched) + if (!active_disease.affected_mob.itch(silent = !announce_scratch, can_scratch = scratch) || !announce_scratch) + return + COOLDOWN_START(src, itching_cooldown, 5 SECONDS) + if(!off_cooldown_scratched && !COOLDOWN_FINISHED(src, itching_cooldown)) + off_cooldown_scratched = TRUE + else + off_cooldown_scratched = FALSE diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm index ac7eae25d4a..cbf6462f2c4 100644 --- a/code/datums/diseases/advance/symptoms/narcolepsy.dm +++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm @@ -35,6 +35,10 @@ symptom_delay_max = 45 /datum/symptom/narcolepsy/Activate(datum/disease/advance/A) + . = ..() + if(!.) + return + var/mob/living/M = A.affected_mob switch(A.stage) if(1) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 741520ed6ae..83e7ac02534 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -84,13 +84,12 @@ /datum/disease/transformation/proc/replace_banned_player(mob/living/new_mob) // This can run well after the mob has been transferred, so need a handle on the new mob to kill it if needed. set waitfor = FALSE - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as [affected_mob.real_name]?", check_jobban = bantype, role = bantype, poll_time = 5 SECONDS, target_mob = affected_mob, pic_source = affected_mob, role_name_text = "transformation victim") - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_notice(affected_mob.real_name)]?", check_jobban = bantype, role = bantype, poll_time = 5 SECONDS, checked_target = affected_mob, alert_pic = affected_mob, role_name_text = "transformation victim") + if(chosen_one) to_chat(affected_mob, span_userdanger("Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")) - message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(affected_mob)]) to replace a jobbanned player.") + message_admins("[key_name_admin(chosen_one)] has taken control of ([key_name_admin(affected_mob)]) to replace a jobbanned player.") affected_mob.ghostize(FALSE) - affected_mob.key = C.key + affected_mob.key = chosen_one.key else to_chat(new_mob, span_userdanger("Your mob has been claimed by death! Appeal your job ban if you want to avoid this in the future!")) new_mob.investigate_log("has been killed because there was no one to replace them as a job-banned player.", INVESTIGATE_DEATHS) @@ -149,7 +148,6 @@ affected_mob.say(pick("Eeee!", "Eeek, ook ook!", "Eee-eeek!", "Ungh, ungh."), forced = "jungle fever") /datum/disease/transformation/robot - name = "Robotic Transformation" cure_text = "An injection of copper." cures = list(/datum/reagent/copper) @@ -171,7 +169,6 @@ infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD|MOB_ROBOTIC bantype = JOB_CYBORG - /datum/disease/transformation/robot/stage_act(seconds_per_tick, times_fired) . = ..() if(!.) @@ -245,7 +242,7 @@ stage3 = list(span_danger("Your appendages are melting away."), span_danger("Your limbs begin to lose their shape.")) stage4 = list(span_danger("You are turning into a slime.")) stage5 = list(span_danger("You have become a slime.")) - new_form = /mob/living/simple_animal/slime + new_form = /mob/living/basic/slime /datum/disease/transformation/slime/stage_act(seconds_per_tick, times_fired) @@ -269,7 +266,7 @@ if(affected_mob.client && ishuman(affected_mob)) // if they are a human who's not a monkey and are sentient, then let them have the old fun var/mob/living/carbon/human/human = affected_mob if(!ismonkey(human)) - new_form = /mob/living/simple_animal/slime/random + new_form = /mob/living/basic/slime/random return ..() /datum/disease/transformation/corgi diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 2a7423a1fc1..2d663d914ae 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -86,7 +86,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) var/datum/species/species = new /datum/species/human /// Assoc list of feature keys to their value /// Note if you set these manually, and do not update [unique_features] afterwards, it will likely be reset. - var/list/features = list("mcolor" = "#FFFFFF") + var/list/features = list("mcolor" = COLOR_WHITE) ///Stores the hashed values of the person's non-human features var/unique_features ///Stores the real name of the person who originally got this dna datum. Used primarely for changelings, @@ -514,7 +514,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) mutant_bodyparts = species.get_mutant_bodyparts(features, existing_mutant_bodyparts = randomize_features ? list() : mutant_bodyparts) // SKYRAT EDIT ADDITION update_dna_identity() -/datum/dna/stored //subtype used by brain mob's stored_dna +/datum/dna/stored //subtype used by brain mob's stored_dna and the crew manifest /datum/dna/stored/add_mutation(mutation_name) //no mutation changes on stored dna. return @@ -1004,10 +1004,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) spawn_gibs() set_species(/datum/species/skeleton) if(prob(90)) - addtimer(CALLBACK(src, PROC_REF(death)), 30) + addtimer(CALLBACK(src, PROC_REF(death)), 3 SECONDS) if(5) to_chat(src, span_phobia("LOOK UP!")) - addtimer(CALLBACK(src, PROC_REF(something_horrible_mindmelt)), 30) + addtimer(CALLBACK(src, PROC_REF(something_horrible_mindmelt)), 3 SECONDS) if(6) slow_psykerize() @@ -1019,4 +1019,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), 20) + addtimer(CALLBACK(src, PROC_REF(adjustOrganLoss), ORGAN_SLOT_BRAIN, 200), 2 SECONDS) diff --git a/code/controllers/subsystem/eigenstate.dm b/code/datums/eigenstate.dm similarity index 66% rename from code/controllers/subsystem/eigenstate.dm rename to code/datums/eigenstate.dm index f167fdf24d1..3bba7463209 100644 --- a/code/controllers/subsystem/eigenstate.dm +++ b/code/datums/eigenstate.dm @@ -1,7 +1,7 @@ -///Subsystem used to teleport people to a linked web of itterative entries. If one entry is deleted, the 2 around it will forge a link instead. -SUBSYSTEM_DEF(eigenstates) - name = "Eigenstates" - flags = SS_NO_INIT | SS_NO_FIRE +GLOBAL_DATUM_INIT(eigenstate_manager, /datum/eigenstate_manager, new) + +///A singleton used to teleport people to a linked web of itterative entries. If one entry is deleted, the 2 around it will forge a link instead. +/datum/eigenstate_manager ///The list of objects that something is linked to indexed by UID var/list/eigen_targets = list() ///UID to object reference @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(eigenstates) var/spark_time = 0 ///Creates a new link of targets unique to their own id -/datum/controller/subsystem/eigenstates/proc/create_new_link(targets) +/datum/eigenstate_manager/proc/create_new_link(targets, subtle = TRUE) if(length(targets) <= 1) return FALSE for(var/atom/target as anything in targets) //Clear out any connected @@ -20,40 +20,44 @@ SUBSYSTEM_DEF(eigenstates) if(!already_linked) continue if(length(eigen_targets[already_linked]) > 1) //Eigenstates are notorious for having cliques! - target.visible_message("[target] fizzes, it's already linked to something else!") + if(!subtle) + target.visible_message("[target] fizzes, it's already linked to something else!") targets -= target continue - target.visible_message("[target] fizzes, collapsing it's unique wavefunction into the others!") //If we're in a eigenlink all on our own and are open to new friends + if(!subtle) + target.visible_message("[target] fizzes, collapsing it's unique wavefunction into the others!") //If we're in a eigenlink all on our own and are open to new friends remove_eigen_entry(target) //clearup for new stuff //Do we still have targets? if(!length(targets)) return FALSE var/atom/visible_atom = targets[1] //The object that'll handle the messages if(length(targets) == 1) - visible_atom.visible_message("[targets[1]] fizzes, there's nothing it can link to!") + if(!subtle) + visible_atom.visible_message("[targets[1]] fizzes, there's nothing it can link to!") return FALSE - eigen_targets["[id_counter]"] = list() //Add to the master list + var/subtle_keyword = subtle ? "subtle" : "" + eigen_targets["[id_counter][subtle_keyword]"] = list() //Add to the master list for(var/atom/target as anything in targets) - eigen_targets["[id_counter]"] += target - eigen_id[target] = "[id_counter]" + eigen_targets["[id_counter][subtle_keyword]"] += target + eigen_id[target] = "[id_counter][subtle_keyword]" RegisterSignal(target, COMSIG_CLOSET_INSERT, PROC_REF(use_eigenlinked_atom)) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(remove_eigen_entry)) - RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(tool_interact)) + if(!subtle) + RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(tool_interact)) target.RegisterSignal(target, COMSIG_EIGENSTATE_ACTIVATE, TYPE_PROC_REF(/obj/structure/closet,bust_open)) ADD_TRAIT(target, TRAIT_BANNED_FROM_CARGO_SHUTTLE, REF(src)) - var/obj/item = target - if(item) - item.color = COLOR_PERIWINKLEE //Tint the locker slightly. - item.alpha = 200 - do_sparks(3, FALSE, item) + if(!subtle) + target.add_atom_colour(COLOR_PERIWINKLEE, FIXED_COLOUR_PRIORITY) //Tint the locker slightly. + target.alpha = 200 + do_sparks(3, FALSE, target) visible_atom.visible_message("The items shimmer and fizzle, turning a shade of violet blue.") id_counter++ return TRUE ///reverts everything back to start -/datum/controller/subsystem/eigenstates/Destroy() +/datum/eigenstate_manager/eigenstates/Destroy() for(var/index in 1 to id_counter) for(var/entry in eigen_targets["[index]"]) remove_eigen_entry(entry) @@ -63,12 +67,12 @@ SUBSYSTEM_DEF(eigenstates) return ..() ///removes an object reference from the master list -/datum/controller/subsystem/eigenstates/proc/remove_eigen_entry(atom/entry) +/datum/eigenstate_manager/proc/remove_eigen_entry(atom/entry) SIGNAL_HANDLER var/id = eigen_id[entry] eigen_targets[id] -= entry eigen_id -= entry - entry.color = COLOR_WHITE + entry.remove_atom_colour(FIXED_COLOUR_PRIORITY, COLOR_PERIWINKLEE) entry.alpha = 255 UnregisterSignal(entry, list( COMSIG_QDELETING, @@ -83,13 +87,14 @@ SUBSYSTEM_DEF(eigenstates) eigen_targets -= targets ///Finds the object within the master list, then sends the thing to the object's location -/datum/controller/subsystem/eigenstates/proc/use_eigenlinked_atom(atom/object_sent_from, atom/movable/thing_to_send) +/datum/eigenstate_manager/proc/use_eigenlinked_atom(atom/object_sent_from, atom/movable/thing_to_send) SIGNAL_HANDLER var/id = eigen_id[object_sent_from] if(!id) stack_trace("[object_sent_from] attempted to eigenlink to something that didn't have a valid id!") return FALSE + var/subtle = findtext(id, "subtle") var/list/items = eigen_targets[id] var/index = (items.Find(object_sent_from))+1 //index + 1 if(!index) @@ -104,19 +109,21 @@ SUBSYSTEM_DEF(eigenstates) if(check_teleport_valid(thing_to_send, eigen_target, TELEPORT_CHANNEL_EIGENSTATE)) thing_to_send.forceMove(get_turf(eigen_target)) else - object_sent_from.balloon_alert(thing_to_send, "nothing happens!") + if(!subtle) + object_sent_from.balloon_alert(thing_to_send, "nothing happens!") return FALSE //Create ONE set of sparks for ALL times in iteration - if(spark_time != world.time) + if(!subtle && spark_time != world.time) do_sparks(5, FALSE, eigen_target) do_sparks(5, FALSE, object_sent_from) - spark_time = world.time + spark_time = world.time //Calls a special proc for the atom if needed (closets use bust_open()) SEND_SIGNAL(eigen_target, COMSIG_EIGENSTATE_ACTIVATE) - return COMPONENT_CLOSET_INSERT_INTERRUPT + if(!subtle) + return COMPONENT_CLOSET_INSERT_INTERRUPT ///Prevents tool use on the item -/datum/controller/subsystem/eigenstates/proc/tool_interact(atom/source, mob/user, obj/item/item) +/datum/eigenstate_manager/proc/tool_interact(atom/source, mob/user, obj/item/item) SIGNAL_HANDLER to_chat(user, span_notice("The unstable nature of [source] makes it impossible to use [item] on [source.p_them()]!")) return ITEM_INTERACT_BLOCKING diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index b2e021ad2be..fbb4d428dab 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -10,14 +10,20 @@ /** * The index of the first attach argument to consider for duplicate elements * - * All arguments from this index onwards (1 based) are hashed into the key to determine - * if this is a new unique element or one already exists + * All arguments from this index onwards (1 based, until `argument_hash_end_idx` is reached, if set) + * are hashed into the key to determine if this is a new unique element or one already exists * * Is only used when flags contains [ELEMENT_BESPOKE] * * This is infinity so you must explicitly set this */ var/argument_hash_start_idx = INFINITY + /** + * The index of the last attach argument to consider for duplicate elements + * Only used when `element_flags` contains [ELEMENT_BESPOKE]. + * If not set, it'll copy every argument from `argument_hash_start_idx` onwards as normal + */ + var/argument_hash_end_idx = 0 /// Activates the functionality defined by the element on the given target datum /datum/element/proc/Attach(datum/target) diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index 1ac10f02027..b4db40d6778 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -6,21 +6,29 @@ /datum/element/atmos_requirements element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 + argument_hash_end_idx = 3 /// An assoc list of "what atmos does this mob require to survive in". var/list/atmos_requirements /// How much (brute) damage we take from being in unsuitable atmos. var/unsuitable_atmos_damage -/datum/element/atmos_requirements/Attach(datum/target, list/atmos_requirements, unsuitable_atmos_damage = 5) +/datum/element/atmos_requirements/Attach(datum/target, list/atmos_requirements, unsuitable_atmos_damage = 5, mapload = FALSE) . = ..() if(!isliving(target)) return ELEMENT_INCOMPATIBLE if(!atmos_requirements) - stack_trace("[type] added to [target] without any requirements specified.") + CRASH("[type] added to [target] without any requirements specified.") + var/list/short = atmos_requirements + if(!short["min_oxy"] && !short["max_oxy"] && !short["min_plas"] && !short["max_plas"] && !short["min_co2"] && !short["max_co2"] && !short["min_n2"] && !short["max_n2"]) + CRASH("[type] added to [target] with all requirements set to 0.") src.atmos_requirements = atmos_requirements src.unsuitable_atmos_damage = unsuitable_atmos_damage RegisterSignal(target, COMSIG_LIVING_HANDLE_BREATHING, PROC_REF(on_non_stasis_life)) + if(!mapload || !PERFORM_ALL_TESTS(focus_only/atmos_and_temp_requirements)) + return + check_safe_environment(target) + /datum/element/atmos_requirements/Detach(datum/target) . = ..() UnregisterSignal(target, COMSIG_LIVING_HANDLE_BREATHING) @@ -42,34 +50,45 @@ return TRUE var/turf/open/open_turf = target.loc - if(!open_turf.air && (atmos_requirements["min_oxy"] || atmos_requirements["min_tox"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"])) - return FALSE + if(isnull(open_turf.air)) + if(atmos_requirements["min_oxy"] || atmos_requirements["min_plas"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"]) + return FALSE + return TRUE + var/list/gases = get_atmos_req_list(open_turf) + + if(!ISINRANGE(gases["oxy"], atmos_requirements["min_oxy"], (atmos_requirements["max_oxy"] || INFINITY))) + return FALSE + if(!ISINRANGE(gases["plas"], atmos_requirements["min_plas"], (atmos_requirements["max_plas"] || INFINITY))) + return FALSE + if(!ISINRANGE(gases["n2"], atmos_requirements["min_n2"], (atmos_requirements["max_n2"] || INFINITY))) + return FALSE + if(!ISINRANGE(gases["co2"], atmos_requirements["min_co2"], (atmos_requirements["max_co2"] || INFINITY))) + return FALSE + return TRUE + +/datum/element/atmos_requirements/proc/get_atmos_req_list(turf/open/open_turf) var/open_turf_gases = open_turf.air.gases open_turf.air.assert_gases(/datum/gas/oxygen, /datum/gas/pluoxium, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma) - var/plas = open_turf_gases[/datum/gas/plasma][MOLES] - var/oxy = open_turf_gases[/datum/gas/oxygen][MOLES] + (open_turf_gases[/datum/gas/pluoxium][MOLES] * PLUOXIUM_PROPORTION) - var/n2 = open_turf_gases[/datum/gas/nitrogen][MOLES] - var/co2 = open_turf_gases[/datum/gas/carbon_dioxide][MOLES] + var/list/return_gases = list() + return_gases["plas"] = open_turf_gases[/datum/gas/plasma][MOLES] + return_gases["oxy"] = open_turf_gases[/datum/gas/oxygen][MOLES] + (open_turf_gases[/datum/gas/pluoxium][MOLES] * PLUOXIUM_PROPORTION) + return_gases["n2"] = open_turf_gases[/datum/gas/nitrogen][MOLES] + return_gases["co2"] = open_turf_gases[/datum/gas/carbon_dioxide][MOLES] open_turf.air.garbage_collect() - if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) - return FALSE - else if(atmos_requirements["max_oxy"] && oxy > atmos_requirements["max_oxy"]) - return FALSE - else if(atmos_requirements["min_plas"] && plas < atmos_requirements["min_plas"]) - return FALSE - else if(atmos_requirements["max_plas"] && plas > atmos_requirements["max_plas"]) - return FALSE - else if(atmos_requirements["min_n2"] && n2 < atmos_requirements["min_n2"]) - return FALSE - else if(atmos_requirements["max_n2"] && n2 > atmos_requirements["max_n2"]) - return FALSE - else if(atmos_requirements["min_co2"] && co2 < atmos_requirements["min_co2"]) - return FALSE - else if(atmos_requirements["max_co2"] && co2 > atmos_requirements["max_co2"]) - return FALSE + return return_gases - return TRUE +///Ensures that maploaded mobs are in a safe environment. Unit test stuff. +/datum/element/atmos_requirements/proc/check_safe_environment(mob/living/living_mob) + if(living_mob.stat == DEAD || is_breathable_atmos(living_mob)) + return + var/turf/open/open_turf = living_mob.loc + var/list/gases + var/string_text = "No Air" + if(open_turf.air) + gases = get_atmos_req_list(open_turf) + string_text = "O2: [gases["o2"]] - Plasma: [gases["plasma"]] - N2: [gases["n2"]] - CO2: [gases["co2"]]" + stack_trace("[living_mob] loaded on a turf with unsafe atmos at \[[open_turf.x], [open_turf.y], [open_turf.z]\] (area : [open_turf.loc]). Turf gases: [string_text]. Check the mob atmos requirements again.") diff --git a/code/datums/elements/basic_body_temp_sensitive.dm b/code/datums/elements/basic_body_temp_sensitive.dm deleted file mode 100644 index 8e11ed92575..00000000000 --- a/code/datums/elements/basic_body_temp_sensitive.dm +++ /dev/null @@ -1,71 +0,0 @@ -/** - * When attached to a basic mob, it gives it the ability to be hurt by cold/hot body temperatures - */ -/datum/element/basic_body_temp_sensitive - element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 2 - - ///Min body temp - var/min_body_temp = 250 - ///Max body temp - var/max_body_temp = 350 - ////Damage when below min temp - var/cold_damage = 1 - ///Damage when above max temp - var/heat_damage = 1 - -/datum/element/basic_body_temp_sensitive/Attach(datum/target, min_body_temp, max_body_temp, cold_damage, heat_damage) - . = ..() - if(!isbasicmob(target)) - return ELEMENT_INCOMPATIBLE - - if(isnum(min_body_temp)) - src.min_body_temp = min_body_temp - - if(isnum(max_body_temp)) - src.max_body_temp = max_body_temp - - if(isnum(cold_damage)) - src.cold_damage = cold_damage - - if(isnum(heat_damage)) - src.heat_damage = heat_damage - - RegisterSignal(target, COMSIG_LIVING_LIFE, PROC_REF(on_life)) - -/datum/element/basic_body_temp_sensitive/Detach(datum/source) - if(source) - UnregisterSignal(source, COMSIG_LIVING_LIFE) - return ..() - - -/datum/element/basic_body_temp_sensitive/proc/on_life(datum/target, seconds_per_tick, times_fired) - SIGNAL_HANDLER - - var/mob/living/basic/basic_mob = target - var/gave_alert = FALSE - - if(basic_mob.bodytemperature < min_body_temp) - basic_mob.adjust_health(cold_damage * seconds_per_tick) - switch(cold_damage) - if(1 to 5) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) - if(5 to 10) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) - if(10 to INFINITY) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) - gave_alert = TRUE - - else if(basic_mob.bodytemperature > max_body_temp) - basic_mob.adjust_health(heat_damage * seconds_per_tick) - switch(heat_damage) - if(1 to 5) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 1) - if(5 to 10) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 2) - if(10 to INFINITY) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 3) - gave_alert = TRUE - - if(!gave_alert) - basic_mob.clear_alert(ALERT_TEMPERATURE) diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm index 2a7a4b46598..757fd8b3519 100644 --- a/code/datums/elements/basic_eating.dm +++ b/code/datums/elements/basic_eating.dm @@ -23,6 +23,7 @@ if(!isliving(target)) return ELEMENT_INCOMPATIBLE + ADD_TRAIT(target, TRAIT_MOB_EATER, REF(src)) src.heal_amt = heal_amt src.damage_amount = damage_amount src.damage_type = damage_type @@ -35,6 +36,7 @@ RegisterSignal(target, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_pre_attackingtarget)) /datum/element/basic_eating/Detach(datum/target) + REMOVE_TRAIT(target, TRAIT_MOB_EATER, REF(src)) UnregisterSignal(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) return ..() diff --git a/code/datums/elements/basic_health_examine.dm b/code/datums/elements/basic_health_examine.dm new file mode 100644 index 00000000000..c9c22eb5578 --- /dev/null +++ b/code/datums/elements/basic_health_examine.dm @@ -0,0 +1,37 @@ +///A simple element for basic mobs that prints out a custom damaged state message +/datum/element/basic_health_examine + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///Light amount of damage + var/light_damage_message + ///Heavy amount of damage + var/heavy_damage_message + ///Heavy damage threshold percentage + var/heavy_threshold + +/datum/element/basic_health_examine/Attach(datum/target, light_damage_message, heavy_damage_message, heavy_threshold) + . = ..() + if(!isbasicmob(target)) + return ELEMENT_INCOMPATIBLE + + src.light_damage_message = light_damage_message + src.heavy_damage_message = heavy_damage_message + src.heavy_threshold = heavy_threshold + + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/datum/element/basic_health_examine/Detach(atom/movable/source) + UnregisterSignal(source, COMSIG_ATOM_EXAMINE) + return ..() + +/datum/element/basic_health_examine/proc/on_examine(mob/living/basic/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(source.health == source.maxHealth) + return + + if(source.health < source.maxHealth * heavy_threshold) + examine_list += span_danger(heavy_damage_message) + return + + examine_list += span_danger(light_damage_message) diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm index 70b10d4a58c..58f5640c31c 100644 --- a/code/datums/elements/bed_tucking.dm +++ b/code/datums/elements/bed_tucking.dm @@ -1,7 +1,7 @@ /// Tucking element, for things that can be tucked into bed. /datum/element/bed_tuckable element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 2 + argument_hash_start_idx = 3 /// our pixel_x offset - how much the item moves x when in bed (+x is closer to the pillow) var/x_offset = 0 /// our pixel_y offset - how much the item move y when in bed (-y is closer to the middle) @@ -11,7 +11,7 @@ /// our starting angle for the item var/starting_angle = 0 -/datum/element/bed_tuckable/Attach(obj/target, x = 0, y = 0, rotation = 0) +/datum/element/bed_tuckable/Attach(obj/target, mapload = FALSE, x = 0, y = 0, rotation = 0) . = ..() if(!isitem(target)) return ELEMENT_INCOMPATIBLE @@ -20,6 +20,13 @@ y_offset = y starting_angle = rotation RegisterSignal(target, COMSIG_ITEM_ATTACK_ATOM, PROC_REF(tuck_into_bed)) + if(!mapload) + return + var/turf/our_home = get_turf(target) + var/obj/structure/bed/eepy = locate(/obj/structure/bed) in our_home + if(isnull(eepy)) + return + tuck(target, eepy) /datum/element/bed_tuckable/Detach(obj/target) . = ..() @@ -42,6 +49,10 @@ return to_chat(tucker, span_notice("You lay [tucked] out on [target_bed].")) + tuck(tucked, target_bed) + return COMPONENT_NO_AFTERATTACK + +/datum/element/bed_tuckable/proc/tuck(obj/item/tucked, obj/structure/bed/target_bed) tucked.dir = target_bed.dir tucked.pixel_x = target_bed.dir & EAST ? -x_offset : x_offset tucked.pixel_y = y_offset @@ -50,8 +61,6 @@ tucked.transform = turn(tucked.transform, rotation_degree) RegisterSignal(tucked, COMSIG_ITEM_PICKUP, PROC_REF(untuck)) - return COMPONENT_NO_AFTERATTACK - /** * If we rotate our object, then we need to un-rotate it when it's picked up * diff --git a/code/datums/elements/body_temp_sensitive.dm b/code/datums/elements/body_temp_sensitive.dm new file mode 100644 index 00000000000..e3a694baed7 --- /dev/null +++ b/code/datums/elements/body_temp_sensitive.dm @@ -0,0 +1,86 @@ +/** + * When attached to a basic mob, it gives it the ability to be hurt by cold/hot body temperatures + */ +/datum/element/body_temp_sensitive + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + argument_hash_end_idx = 5 + + ///Min body temp + var/min_body_temp = 250 + ///Max body temp + var/max_body_temp = 350 + ////Damage when below min temp + var/cold_damage = 1 + ///Damage when above max temp + var/heat_damage = 1 + +/datum/element/body_temp_sensitive/Attach(datum/target, min_body_temp, max_body_temp, cold_damage, heat_damage, mapload = FALSE) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + if(isnum(min_body_temp)) + src.min_body_temp = min_body_temp + + if(isnum(max_body_temp)) + src.max_body_temp = max_body_temp + + if(isnum(cold_damage)) + src.cold_damage = cold_damage + + if(isnum(heat_damage)) + src.heat_damage = heat_damage + + RegisterSignal(target, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + + if(!mapload || !PERFORM_ALL_TESTS(focus_only/atmos_and_temp_requirements)) + return + check_safe_environment(target) + +/datum/element/body_temp_sensitive/Detach(datum/source) + if(source) + UnregisterSignal(source, COMSIG_LIVING_LIFE) + return ..() + +/datum/element/body_temp_sensitive/proc/on_life(datum/target, seconds_per_tick, times_fired) + SIGNAL_HANDLER + + var/mob/living/living_mob = target + var/gave_alert = FALSE + + if(living_mob.bodytemperature < min_body_temp) + living_mob.adjustFireLoss(cold_damage * seconds_per_tick, forced = TRUE) + if(!living_mob.has_status_effect(/datum/status_effect/inebriated)) + switch(cold_damage) + if(1 to 5) + living_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) + if(5 to 10) + living_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) + if(10 to INFINITY) + living_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) + gave_alert = TRUE + + else if(living_mob.bodytemperature > max_body_temp) + living_mob.adjustFireLoss(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) + if(5 to 10) + living_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 2) + if(10 to INFINITY) + living_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 3) + gave_alert = TRUE + + if(!gave_alert) + living_mob.clear_alert(ALERT_TEMPERATURE) + +///Ensures that maploaded mobs are in a safe environment. Unit test stuff. +/datum/element/body_temp_sensitive/proc/check_safe_environment(mob/living/living_mob) + if(living_mob.stat == DEAD) + return + var/atom/location = living_mob.loc + var/datum/gas_mixture/environment = location.return_air() + var/areatemp = living_mob.get_temperature(environment) + if(!ISINRANGE(areatemp, min_body_temp, max_body_temp)) + stack_trace("[living_mob] loaded on in a loc with unsafe temperature at \[[location.x], [location.y], [location.z]\] (area : [get_area(location)]): [areatemp]K. Acceptable Range: [min_body_temp]K - [max_body_temp]K,") diff --git a/code/datums/elements/shatters_when_thrown.dm b/code/datums/elements/can_shatter.dm similarity index 69% rename from code/datums/elements/shatters_when_thrown.dm rename to code/datums/elements/can_shatter.dm index cbb5994852c..73b025ad83c 100644 --- a/code/datums/elements/shatters_when_thrown.dm +++ b/code/datums/elements/can_shatter.dm @@ -1,7 +1,8 @@ /** * When attached to something, will make that thing shatter into shards on throw impact or z level falling + * Or even when used as a weapon if the 'shatters_as_weapon' arg is TRUE */ -/datum/element/shatters_when_thrown +/datum/element/can_shatter element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 @@ -12,7 +13,12 @@ /// What sound plays when the thing we're attached to shatters var/shattering_sound -/datum/element/shatters_when_thrown/Attach(datum/target, shard_type = /obj/item/plate_shard, number_of_shards = 5, shattering_sound = 'sound/items/ceramic_break.ogg') +/datum/element/can_shatter/Attach(datum/target, + shard_type = /obj/item/plate_shard, + number_of_shards = 5, + shattering_sound = 'sound/items/ceramic_break.ogg', + shatters_as_weapon = FALSE, + ) . = ..() if(!ismovable(target)) @@ -24,26 +30,28 @@ RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) RegisterSignal(target, COMSIG_ATOM_ON_Z_IMPACT, PROC_REF(on_z_impact)) + if(shatters_as_weapon) + RegisterSignal(target, COMSIG_ITEM_POST_ATTACK_ATOM, PROC_REF(on_post_attack_atom)) -/datum/element/shatters_when_thrown/Detach(datum/target) +/datum/element/can_shatter/Detach(datum/target) . = ..() UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT, COMSIG_ATOM_ON_Z_IMPACT)) /// Tells the parent to shatter if we impact a lower zlevel -/datum/element/shatters_when_thrown/proc/on_z_impact(datum/source, turf/impacted_turf, levels) +/datum/element/can_shatter/proc/on_z_impact(datum/source, turf/impacted_turf, levels) SIGNAL_HANDLER shatter(source, impacted_turf) /// Tells the parent to shatter if we are thrown and impact something -/datum/element/shatters_when_thrown/proc/on_throw_impact(datum/source, atom/hit_atom) +/datum/element/can_shatter/proc/on_throw_impact(datum/source, atom/hit_atom) SIGNAL_HANDLER shatter(source, hit_atom) /// Handles the actual shattering part, throwing shards of whatever is defined on the component everywhere -/datum/element/shatters_when_thrown/proc/shatter(atom/movable/source, atom/hit_atom) +/datum/element/can_shatter/proc/shatter(atom/movable/source, atom/hit_atom) var/generator/scatter_gen = generator(GEN_CIRCLE, 0, 48, NORMAL_RAND) var/scatter_turf = get_turf(hit_atom) @@ -64,3 +72,7 @@ return else qdel(source) + +/datum/element/can_shatter/proc/on_post_attack_atom(obj/item/source, atom/attacked_atom, mob/living/user) + SIGNAL_HANDLER + shatter(source, attacked_atom) diff --git a/code/datums/elements/chewable.dm b/code/datums/elements/chewable.dm index 21d546be6aa..d520597f431 100644 --- a/code/datums/elements/chewable.dm +++ b/code/datums/elements/chewable.dm @@ -52,7 +52,7 @@ var/metabolism_amount = metabolization_amount * seconds_per_tick if (!reagents.trans_to(item.loc, metabolism_amount, methods = INGEST)) - reagents.remove_any(metabolism_amount) + reagents.remove_all(metabolism_amount) /datum/element/chewable/proc/on_dropped(datum/source) SIGNAL_HANDLER diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm index ffa6de398b6..92fba97a094 100644 --- a/code/datums/elements/elevation.dm +++ b/code/datums/elements/elevation.dm @@ -113,6 +113,8 @@ for(var/mob/living/living in target) ADD_TRAIT(living, TRAIT_ON_ELEVATED_SURFACE, REF(src)) RegisterSignal(living, COMSIG_LIVING_SET_BUCKLED, PROC_REF(on_set_buckled)) + RegisterSignal(living, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_add)) + RegisterSignal(living, SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_remove)) elevate_mob(living) /datum/element/elevation_core/Detach(datum/source) @@ -133,7 +135,7 @@ continue REMOVE_TRAIT(living, TRAIT_ON_ELEVATED_SURFACE, REF(src)) elevate_mob(living, -pixel_shift) - UnregisterSignal(living, COMSIG_LIVING_SET_BUCKLED) + UnregisterSignal(living, list(COMSIG_LIVING_SET_BUCKLED, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION))) return ..() /datum/element/elevation_core/proc/on_entered(turf/source, atom/movable/entered, atom/old_loc) @@ -143,6 +145,8 @@ var/elevate_time = isturf(old_loc) && source.Adjacent(old_loc) ? ELEVATE_TIME : 0 elevate_mob(entered, elevate_time = elevate_time) RegisterSignal(entered, COMSIG_LIVING_SET_BUCKLED, PROC_REF(on_set_buckled)) + RegisterSignal(entered, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_add)) + RegisterSignal(entered, SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_remove)) /datum/element/elevation_core/proc/on_initialized_on(turf/source, atom/movable/spawned) SIGNAL_HANDLER @@ -152,15 +156,17 @@ /datum/element/elevation_core/proc/on_exited(turf/source, atom/movable/gone) SIGNAL_HANDLER if((isnull(gone.loc) || !HAS_TRAIT_FROM(gone.loc, TRAIT_ELEVATED_TURF, REF(src))) && isliving(gone)) - // Always unregister the signal, we're still leaving even if already shifted down. - UnregisterSignal(gone, COMSIG_LIVING_SET_BUCKLED) + // Always unregister the signals, we're still leaving even if not affected by elevation. + UnregisterSignal(gone, list(COMSIG_LIVING_SET_BUCKLED, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION))) if(!HAS_TRAIT_FROM(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src))) return REMOVE_TRAIT(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src)) var/elevate_time = isturf(gone.loc) && source.Adjacent(gone.loc) ? ELEVATE_TIME : 0 elevate_mob(gone, -pixel_shift, elevate_time) -/datum/element/elevation_core/proc/elevate_mob(mob/living/target, z_shift = pixel_shift, elevate_time = ELEVATE_TIME) +/datum/element/elevation_core/proc/elevate_mob(mob/living/target, z_shift = pixel_shift, elevate_time = ELEVATE_TIME, force = FALSE) + if(HAS_TRAIT(target, TRAIT_IGNORE_ELEVATION) && !force) + return var/buckled_to_vehicle = FALSE if(target.buckled) if(isvehicle(target.buckled)) @@ -181,6 +187,8 @@ */ /datum/element/elevation_core/proc/on_set_buckled(mob/living/source, atom/movable/new_buckled) SIGNAL_HANDLER + if(HAS_TRAIT(source, TRAIT_IGNORE_ELEVATION)) + return if(source.buckled) if(isvehicle(source.buckled)) animate(source.buckled, pixel_z = -pixel_shift, time = ELEVATE_TIME, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) @@ -193,6 +201,14 @@ else if(!isliving(new_buckled)) animate(source, pixel_z = -pixel_shift, time = ELEVATE_TIME, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) +/datum/element/elevation_core/proc/on_ignore_elevation_add(mob/living/source, trait) + SIGNAL_HANDLER + elevate_mob(source, -pixel_shift, force = TRUE) + +/datum/element/elevation_core/proc/on_ignore_elevation_remove(mob/living/source, trait) + SIGNAL_HANDLER + elevate_mob(source, pixel_shift) + /datum/element/elevation_core/proc/on_reset_elevation(turf/source, list/current_values) SIGNAL_HANDLER current_values[ELEVATION_CURRENT_PIXEL_SHIFT] = pixel_shift diff --git a/code/datums/elements/food/grilled_item.dm b/code/datums/elements/food/grilled_item.dm index f657b969f06..de6c2ef41c1 100644 --- a/code/datums/elements/food/grilled_item.dm +++ b/code/datums/elements/food/grilled_item.dm @@ -9,30 +9,27 @@ var/atom/this_food = target switch(grill_time) //no 0-20 to prevent spam - if(20 to 30) + if(20 SECONDS to 30 SECONDS) this_food.name = "lightly-grilled [this_food.name]" this_food.desc += " It's been lightly grilled." - if(30 to 80) + if(30 SECONDS to 80 SECONDS) this_food.name = "grilled [this_food.name]" this_food.desc += " It's been grilled." - if(80 to 100) + if(80 SECONDS to 100 SECONDS) this_food.name = "heavily grilled [this_food.name]" this_food.desc += " It's been heavily grilled." - if(100 to INFINITY) //grill marks reach max alpha + if(100 SECONDS to INFINITY) //grill marks reach max alpha this_food.name = "Powerfully Grilled [this_food.name]" this_food.desc = "A [this_food.name]. Reminds you of your wife, wait, no, it's prettier!" - if(grill_time > 20) - ADD_TRAIT(this_food, TRAIT_FOOD_GRILLED, ELEMENT_TRAIT(type)) - if(grill_time > 30) + if(grill_time > 30 SECONDS && isnull(this_food.GetComponent(/datum/component/edible))) this_food.AddComponent(/datum/component/edible, foodtypes = FRIED) /datum/element/grilled_item/Detach(atom/source, ...) source.name = initial(source.name) source.desc = initial(source.desc) - REMOVE_TRAIT(source, TRAIT_FOOD_GRILLED, ELEMENT_TRAIT(type)) qdel(source.GetComponent(/datum/component/edible)) // Don't care if it was initially edible return ..() diff --git a/code/datums/elements/frozen.dm b/code/datums/elements/frozen.dm index b88cc2afa22..434968dd4d5 100644 --- a/code/datums/elements/frozen.dm +++ b/code/datums/elements/frozen.dm @@ -55,9 +55,13 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 Detach(source) ///signal handler for COMSIG_MOVABLE_POST_THROW that shatters our target after impacting after a throw -/datum/element/frozen/proc/shatter_on_throw(datum/target) +/datum/element/frozen/proc/shatter_on_throw(datum/target, datum/thrownthing/throwingdatum) SIGNAL_HANDLER var/obj/obj_target = target + if(ismob(throwingdatum.thrower)) + log_combat(throwingdatum.thrower, target, "shattered", addition = "from being thrown due to [target] being frozen.") + else + log_combat(throwingdatum.thrower, target, "launched", addition = "shattering it due to being frozen.") obj_target.visible_message(span_danger("[obj_target] shatters into a million pieces!")) obj_target.obj_flags |= NO_DECONSTRUCTION // disable item spawning obj_target.deconstruct(FALSE) // call pre-deletion specialized code -- internals release gas etc diff --git a/code/datums/elements/gags_recolorable.dm b/code/datums/elements/gags_recolorable.dm index bf37a4ba973..93b21c5d31d 100644 --- a/code/datums/elements/gags_recolorable.dm +++ b/code/datums/elements/gags_recolorable.dm @@ -10,7 +10,7 @@ /datum/element/gags_recolorable/proc/on_examine(atom/source, mob/user, list/examine_text) SIGNAL_HANDLER - examine_text += span_notice("You could recolor [source.p_them()] with a spraycan...") + examine_text += span_notice("Now utilising PPP recolouring technology, capable of absorbing paint and pigments for changing it's colours!") /datum/element/gags_recolorable/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user) SIGNAL_HANDLER diff --git a/code/datums/elements/inverted_movement.dm b/code/datums/elements/inverted_movement.dm new file mode 100644 index 00000000000..4de935e81da --- /dev/null +++ b/code/datums/elements/inverted_movement.dm @@ -0,0 +1,17 @@ +/datum/element/inverted_movement + +/datum/element/inverted_movement/Attach(datum/target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOB_CLIENT_PRE_MOVE, PROC_REF(invert_movement)) + +/datum/element/inverted_movement/Detach(datum/source) + UnregisterSignal(source, COMSIG_MOB_CLIENT_PRE_MOVE) + return ..() + +/datum/element/inverted_movement/proc/invert_movement(mob/living/source, move_args) + SIGNAL_HANDLER + var/new_direct = REVERSE_DIR(move_args[MOVE_ARG_DIRECTION]) + move_args[MOVE_ARG_DIRECTION] = new_direct + move_args[MOVE_ARG_NEW_LOC] = get_step(source, new_direct) diff --git a/code/datums/elements/mob_access.dm b/code/datums/elements/mob_access.dm new file mode 100644 index 00000000000..04ef6ac9d59 --- /dev/null +++ b/code/datums/elements/mob_access.dm @@ -0,0 +1,29 @@ +///element given to mobs that have levels of access +/datum/element/mob_access + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// What can this mob access? + var/list/my_access + +/datum/element/mob_access/Attach(datum/target, list/accesses) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + for(var/access_path in accesses) + if(!ispath(access_path)) + continue + var/datum/id_trim/job/trim = SSid_access.trim_singletons_by_path[access_path] + if(isnull(trim)) + continue + my_access += trim.access + + RegisterSignal(target, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access)) + +/datum/element/mob_access/proc/attempt_access(datum/source, obj/door_attempt) + SIGNAL_HANDLER + + return (door_attempt.check_access_list(my_access)) ? ACCESS_ALLOWED : ACCESS_DISALLOWED + +/datum/element/mob_access/Detach(datum/source, ...) + UnregisterSignal(source, COMSIG_MOB_TRIED_ACCESS) + return ..() diff --git a/code/datums/elements/ridable.dm b/code/datums/elements/ridable.dm index 15b81e73f24..cbb6d7931f9 100644 --- a/code/datums/elements/ridable.dm +++ b/code/datums/elements/ridable.dm @@ -133,7 +133,7 @@ ridable_atom.AddElement(/datum/element/ridable, component_type = riding_component_type, potion_boost = TRUE) to_chat(user, span_notice("You slather the red gunk over [ridable_atom], making it faster.")) ridable_atom.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - ridable_atom.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) + ridable_atom.add_atom_colour(COLOR_RED, FIXED_COLOUR_PRIORITY) qdel(speed_potion) return SPEED_POTION_STOP diff --git a/code/datums/elements/screentips/README.md b/code/datums/elements/screentips/README.md index 92a66ca9dd4..30d0e7a90cc 100644 --- a/code/datums/elements/screentips/README.md +++ b/code/datums/elements/screentips/README.md @@ -35,18 +35,17 @@ Example: ```dm /obj/structure/table/Initialize(mapload) - if (!(obj_flags & NO_DECONSTRUCTION)) - var/static/list/tool_behaviors = list( - TOOL_SCREWDRIVER = list( - SCREENTIP_CONTEXT_RMB = "Disassemble", - ), + var/static/list/tool_behaviors = list( + TOOL_SCREWDRIVER = list( + SCREENTIP_CONTEXT_RMB = "Disassemble", + ), - TOOL_WRENCH = list( - SCREENTIP_CONTEXT_RMB = "Deconstruct", - ), - ) + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_RMB = "Deconstruct", + ), + ) - AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) ``` This will display "RMB: Deconstruct" when the user hovers over a table with a wrench. diff --git a/code/datums/elements/skill_reward.dm b/code/datums/elements/skill_reward.dm index 0c0e04754f7..7809eea85f7 100644 --- a/code/datums/elements/skill_reward.dm +++ b/code/datums/elements/skill_reward.dm @@ -24,14 +24,15 @@ if(!LAZYACCESS(modifiers, CTRL_CLICK) && !check_equippable(user)) //Allows other players to drag it around at least. to_chat(user, span_warning("You feel completely and utterly unworthy to even touch \the [source].")) return COMPONENT_CANCEL_ATTACK_CHAIN + return NONE ///We check if the item can be equipped, otherwise we drop it. /datum/element/skill_reward/proc/drop_if_unworthy(datum/source, mob/living/user) SIGNAL_HANDLER - if(check_equippable(user) | !(source in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))) - return + if(check_equippable(user) || !(source in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))) + return NONE to_chat(user, span_warning("You feel completely and utterly unworthy to even touch \the [source].")) - user.dropItemToGround(src, TRUE) + user.dropItemToGround(source, TRUE) return COMPONENT_EQUIPPED_FAILED /datum/element/skill_reward/proc/check_equippable(mob/living/user) diff --git a/code/datums/elements/sticker.dm b/code/datums/elements/sticker.dm deleted file mode 100644 index 3cc8e977daf..00000000000 --- a/code/datums/elements/sticker.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define MAX_ALLOWED_STICKERS 12 - -/datum/element/sticker - ///The typepath for our attached sticker component - var/stick_type = /datum/component/attached_sticker - ///If TRUE, our attached_sticker can be washed off - var/washable = TRUE - -/datum/element/sticker/Attach(datum/target, sticker_type, cleanable=TRUE) - . = ..() - if(!isitem(target)) - return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) - RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) - if(sticker_type) - stick_type = sticker_type - washable = cleanable - -/datum/element/sticker/Detach(datum/source) - . = ..() - UnregisterSignal(source, list(COMSIG_ITEM_AFTERATTACK, COMSIG_MOVABLE_IMPACT)) - -/datum/element/sticker/proc/on_afterattack(obj/item/source, atom/target, mob/living/user, prox, params) - SIGNAL_HANDLER - if(!prox) - return - if(!isatom(target)) - return - var/list/parameters = params2list(params) - if(!LAZYACCESS(parameters, ICON_X) || !LAZYACCESS(parameters, ICON_Y)) - return - var/divided_size = world.icon_size / 2 - var/px = text2num(LAZYACCESS(parameters, ICON_X)) - divided_size - var/py = text2num(LAZYACCESS(parameters, ICON_Y)) - divided_size - - user.do_attack_animation(target) - if(do_stick(source, target, user, px, py)) - target.balloon_alert_to_viewers("sticker sticked") - -///Add our stick_type to the target with px and py as pixel x and pixel y respectively -/datum/element/sticker/proc/do_stick(obj/item/source, atom/target, mob/living/user, px, py) - if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_ALLOWED_STICKERS) - source.balloon_alert_to_viewers("sticker won't stick!") - return FALSE - target.AddComponent(stick_type, px, py, source, user, washable) - return TRUE - -/datum/element/sticker/proc/on_throw_impact(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) - SIGNAL_HANDLER - if(prob(50) && do_stick(source, hit_atom, null, rand(-7,7), rand(-7,7))) - hit_atom.balloon_alert_to_viewers("sticker landed on sticky side!") - -#undef MAX_ALLOWED_STICKERS diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 99fc4cbb343..a8a45f54ecc 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -51,7 +51,7 @@ if (!isnull(should_strip_proc_path) && !call(source, should_strip_proc_path)(user)) return - var/datum/strip_menu/strip_menu + var/datum/strip_menu/strip_menu = LAZYACCESS(strip_menus, source) if (isnull(strip_menu)) strip_menu = new(source, src) @@ -167,18 +167,25 @@ SHOULD_NOT_SLEEP(TRUE) return STRIPPABLE_OBSCURING_NONE -/// Returns the ID of this item's strippable action. -/// Return `null` if there is no alternate action. -/// Any return value of this must be in StripMenu. -/datum/strippable_item/proc/get_alternate_action(atom/source, mob/user) +/** + * Returns a list of alternate actions that can be performed on this strippable_item. + * 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) + RETURN_TYPE(/list) return null -/// Performs an alternative action on this strippable_item. -/// `has_alternate_action` needs to be TRUE. -/// Returns FALSE if blocked by signal, TRUE otherwise. -/datum/strippable_item/proc/alternate_action(atom/source, mob/user) +/** + * Performs an alternate action on this strippable_item. + * - source: The source of the action. + * - user: The user performing the action. + * - 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) SHOULD_CALL_PARENT(TRUE) - if(SEND_SIGNAL(user, COMSIG_TRY_ALT_ACTION, source) & COMPONENT_CANT_ALT_ACTION) + if(SEND_SIGNAL(user, COMSIG_TRY_ALT_ACTION, source, action_key) & COMPONENT_CANT_ALT_ACTION) return FALSE return TRUE @@ -359,7 +366,11 @@ result["icon"] = icon2base64(icon(item.icon, item.icon_state)) result["name"] = item.name - result["alternate"] = item_data.get_alternate_action(owner, user) + result["alternate"] = item_data.get_alternate_actions(owner, user) + var/static/list/already_cried = list() + if(length(result["alternate"]) > 2 && !(type in already_cried)) + stack_trace("Too many alternate actions for [type]! Only two are supported at the moment! This will look bad!") + already_cried += type items[strippable_key] = result @@ -451,6 +462,7 @@ strippable_item.finish_unequip(owner, user) if ("alt") var/key = params["key"] + var/alt_action = params["alternate_action"] var/datum/strippable_item/strippable_item = strippable.items[key] if (isnull(strippable_item)) @@ -466,13 +478,13 @@ if (isnull(item)) return - if (isnull(strippable_item.get_alternate_action(owner, user))) + if (!(alt_action in strippable_item.get_alternate_actions(owner, user))) return LAZYORASSOCLIST(interactions, user, key) // Potentially yielding - strippable_item.alternate_action(owner, user) + strippable_item.perform_alternate_action(owner, user, alt_action) LAZYREMOVEASSOC(interactions, user, key) diff --git a/code/datums/elements/toy_talk.dm b/code/datums/elements/toy_talk.dm new file mode 100644 index 00000000000..8061eafaeb3 --- /dev/null +++ b/code/datums/elements/toy_talk.dm @@ -0,0 +1,28 @@ +/** + * Allows people to talk via the item with .l or .r + * + * Be sure to override [/atom/movable/proc/GetVoice] if you want the item's "voice" to not default to itself + */ +/datum/element/toy_talk + +/datum/element/toy_talk/Attach(datum/target) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ITEM_TALK_INTO, PROC_REF(do_talk)) + +/datum/element/toy_talk/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_ITEM_TALK_INTO) + +/datum/element/toy_talk/proc/do_talk(obj/item/source, mob/speaker, message, channel, list/spans, language, list/message_mods) + SIGNAL_HANDLER + + if(!ismob(speaker) || message_mods[MODE_HEADSET] || message_mods[MODE_RELAY]) + return NONE + + message_mods[MODE_RELAY] = TRUE // Redundant (given NOPASS) but covers our bases + speaker.log_talk(message, LOG_SAY, tag = "toy talk ([source])") + source.say(message, language = language, sanitize = FALSE, message_mods = list(MODE_RELAY = TRUE)) + return NOPASS 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 21330d7089d..99812cfa59a 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -333,6 +333,42 @@ SKYRAT EDIT END */ name = "Sundress (Worn)" icon_file = 'icons/mob/clothing/under/dress.dmi' +/datum/greyscale_config/striped_dress + name = "Striped dress" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/striped_dress.json' + +/datum/greyscale_config/striped_dress/worn + name = "Striped dress (Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + +/datum/greyscale_config/evening_dress + name = "Evening gown" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/eveningdress.json' + +/datum/greyscale_config/evening_dress/worn + name = "Evening gown (Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + +/datum/greyscale_config/cardiganskirt + name = "Cardigan Skirt" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/cardiganskirt.json' + +/datum/greyscale_config/cardiganskirt/worn + name = "Cardigan Skirt(Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + +/datum/greyscale_config/sailor_dress + name = "Sailor Dress" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/sailor_dress.json' + +/datum/greyscale_config/sailor_dress/worn + name = "Sailor Dress(Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + // SHIRTS, PANTS AND SHORTS /datum/greyscale_config/slacks name = "Slacks" @@ -705,6 +741,15 @@ SKYRAT EDIT END */ name = "Well-Worn Shirt (Worn)" icon_file = 'icons/mob/clothing/suits/costume.dmi' +/datum/greyscale_config/wellworn_shirt_skub + name = "Well-Worn Shirt (Skub)" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/wellworn_shirt_skub.json' + +/datum/greyscale_config/wellworn_shirt_skub/worn + name = "Well-Worn Shirt (Skub)(Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' + /datum/greyscale_config/wellworn_shirt_graphic name = "Well-Worn Shirt (Graphic)" icon_file = 'icons/obj/clothing/suits/costume.dmi' @@ -743,3 +788,39 @@ SKYRAT EDIT END */ /datum/greyscale_config/messyworn_shirt_graphic/worn name = "Messy Shirt (Graphic (Worn)" icon_file = 'icons/mob/clothing/suits/costume.dmi' + +/datum/greyscale_config/gi + name = "Gi" + icon_file = 'icons/obj/clothing/under/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/gi.json' + +/datum/greyscale_config/gi/worn + name = "Gi (Worn)" + icon_file = 'icons/mob/clothing/under/costume.dmi' + +/datum/greyscale_config/jester_suit + name = "Jester Suit" + icon_file = 'icons/obj/clothing/under/civilian.dmi' + json_config = 'code/datums/greyscale/json_configs/jester_suit.json' + +/datum/greyscale_config/jester_suit/worn + name = "Jester Suit (Worn)" + icon_file = 'icons/mob/clothing/under/civilian.dmi' + +/datum/greyscale_config/jester_shoes + name = "Jester Shoes" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/jester_shoes.json' + +/datum/greyscale_config/jester_shoes/worn + name = "Jester Shoes (Worn)" + icon_file = 'icons/mob/clothing/feet.dmi' + +/datum/greyscale_config/jester_hat + name = "Jester Hat" + icon_file = 'icons/obj/clothing/head/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/jester_hat.json' + +/datum/greyscale_config/jester_hat/worn + name = "Jester Hat (Worn)" + icon_file = 'icons/mob/clothing/head/costume.dmi' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm index 28433ba9064..6b9465bf46a 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm @@ -335,3 +335,8 @@ name = "Flower Worn" icon_file = 'icons/mob/clothing/head/hydroponics.dmi' json_config = 'code/datums/greyscale/json_configs/simple_flower_worn.json' + +/datum/greyscale_config/piggy_bank + name = "Piggy Bank" + icon_file = 'icons/obj/fluff/general.dmi' + json_config = 'code/datums/greyscale/json_configs/piggy_bank.json' diff --git a/code/datums/greyscale/json_configs/cardiganskirt.json b/code/datums/greyscale/json_configs/cardiganskirt.json new file mode 100644 index 00000000000..97a87b6405c --- /dev/null +++ b/code/datums/greyscale/json_configs/cardiganskirt.json @@ -0,0 +1,21 @@ +{ + "cardiganskirt": [ + { + "type": "icon_state", + "icon_state": "cardiganskirt_skirt", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "cardiganskirt_cardigan", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "cardiganskirt_collar", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/eveningdress.json b/code/datums/greyscale/json_configs/eveningdress.json new file mode 100644 index 00000000000..d08dc95bbbe --- /dev/null +++ b/code/datums/greyscale/json_configs/eveningdress.json @@ -0,0 +1,10 @@ +{ + "evening_gown": [ + { + "type": "icon_state", + "icon_state": "evening_gown", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/gi.json b/code/datums/greyscale/json_configs/gi.json new file mode 100644 index 00000000000..7534552293b --- /dev/null +++ b/code/datums/greyscale/json_configs/gi.json @@ -0,0 +1,36 @@ +{ + "martial_arts_gi": [ + { + "type": "icon_state", + "icon_state": "gi_base", + "blend_mode": "overlay", + "color_ids": [1] + }, + { + "type": "icon_state", + "icon_state": "gi_belt", + "blend_mode": "overlay", + "color_ids": [2] + } + ], + + "martial_arts_gi_goku": [ + { + "type": "icon_state", + "icon_state": "gi_base", + "blend_mode": "overlay", + "color_ids": [1] + }, + { + "type": "icon_state", + "icon_state": "gi_belt", + "blend_mode": "overlay", + "color_ids": [2] + }, + { + "type": "icon_state", + "icon_state": "gi_goku", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jester_hat.json b/code/datums/greyscale/json_configs/jester_hat.json new file mode 100644 index 00000000000..b5147e7a009 --- /dev/null +++ b/code/datums/greyscale/json_configs/jester_hat.json @@ -0,0 +1,21 @@ +{ + "jester_map": [ + { + "type": "icon_state", + "icon_state": "jester_a", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jester_b", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "jester_bells", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jester_shoes.json b/code/datums/greyscale/json_configs/jester_shoes.json new file mode 100644 index 00000000000..b5147e7a009 --- /dev/null +++ b/code/datums/greyscale/json_configs/jester_shoes.json @@ -0,0 +1,21 @@ +{ + "jester_map": [ + { + "type": "icon_state", + "icon_state": "jester_a", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jester_b", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "jester_bells", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jester_suit.json b/code/datums/greyscale/json_configs/jester_suit.json new file mode 100644 index 00000000000..aac60f18be7 --- /dev/null +++ b/code/datums/greyscale/json_configs/jester_suit.json @@ -0,0 +1,16 @@ +{ + "jester_map": [ + { + "type": "icon_state", + "icon_state": "jester_a", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jester_b", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/piggy_bank.json b/code/datums/greyscale/json_configs/piggy_bank.json new file mode 100644 index 00000000000..71876213e19 --- /dev/null +++ b/code/datums/greyscale/json_configs/piggy_bank.json @@ -0,0 +1,10 @@ +{ + "piggy_bank": [ + { + "type": "icon_state", + "icon_state": "piggy_bank", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/sailor_dress.json b/code/datums/greyscale/json_configs/sailor_dress.json new file mode 100644 index 00000000000..86787f4a251 --- /dev/null +++ b/code/datums/greyscale/json_configs/sailor_dress.json @@ -0,0 +1,27 @@ +{ + "sailor_dress": [ + { + "type": "icon_state", + "icon_state": "sailor_dress_skirt", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sailor_dress_jacket", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sailor_dress_stripes", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "sailor_dress_badge", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/striped_dress.json b/code/datums/greyscale/json_configs/striped_dress.json new file mode 100644 index 00000000000..e4b95329e46 --- /dev/null +++ b/code/datums/greyscale/json_configs/striped_dress.json @@ -0,0 +1,22 @@ +{ + "stripeddress": [ + { + "type": "icon_state", + "icon_state": "stripeddress_jacket", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "stripeddress_base", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "stripeddress_stripes", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/wellworn_shirt_skub.json b/code/datums/greyscale/json_configs/wellworn_shirt_skub.json new file mode 100644 index 00000000000..6f6ed3fb1f1 --- /dev/null +++ b/code/datums/greyscale/json_configs/wellworn_shirt_skub.json @@ -0,0 +1,28 @@ +{ + "wellworn_shirt_pro_skub": [ + { + "type": "icon_state", + "icon_state": "worn_out", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "skub_overlay", + "blend_mode": "overlay" + } + ], + "wellworn_shirt_anti_skub": [ + { + "type": "icon_state", + "icon_state": "worn_out", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "anti_skub_overlay", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/id_trim/_id_trim.dm b/code/datums/id_trim/_id_trim.dm index 6428b38d562..067e2e38263 100644 --- a/code/datums/id_trim/_id_trim.dm +++ b/code/datums/id_trim/_id_trim.dm @@ -23,3 +23,9 @@ var/list/access = list() /// Accesses that this trim unlocks on a card that require wildcard slots to apply. If a card cannot accept all a trim's wildcard accesses, the card is incompatible with the trim. var/list/wildcard_access = list() + +/// Returns the SecHUD job icon state for whatever this object's ID card is, if it has one. +/obj/item/proc/get_sechud_job_icon_state() + var/obj/item/card/id/id_card = GetID() + + return id_card?.get_trim_sechud_icon_state() || SECHUD_NO_ID diff --git a/code/datums/id_trim/centcom.dm b/code/datums/id_trim/centcom.dm index 7016ea5d661..5cc24f4bd6e 100644 --- a/code/datums/id_trim/centcom.dm +++ b/code/datums/id_trim/centcom.dm @@ -163,7 +163,7 @@ /datum/id_trim/centcom/ert/chaplain assignment = JOB_ERT_CHAPLAIN trim_state = "trim_chaplain" - subdepartment_color = "#58C800" + subdepartment_color = COLOR_SERVICE_LIME sechud_icon_state = SECHUD_RELIGIOUS_RESPONSE_OFFICER /datum/id_trim/centcom/ert/chaplain/New() diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index ea46cc91319..3d94c8645b5 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -1183,6 +1183,36 @@ ) job = /datum/job/station_engineer +/datum/id_trim/job/veteran_advisor + assignment = "Veteran Security Advisor" + trim_state = "trim_veteranadvisor" + department_color = COLOR_SECURITY_RED + subdepartment_color = COLOR_COMMAND_BLUE + sechud_icon_state = SECHUD_VETERAN_ADVISOR + minimal_access = list( + ACCESS_COMMAND, + ACCESS_BRIG, + ACCESS_BRIG_ENTRANCE, + ACCESS_COURT, + ACCESS_MECH_SECURITY, + ACCESS_MINERAL_STOREROOM, + ACCESS_SECURITY, + ACCESS_WEAPONS, + ) + extra_access = list() + template_access = list() + job = /datum/job/veteran_advisor + +/datum/id_trim/job/veteran_advisor/refresh_trim_access() + . = ..() + + if(!.) + return + + // Config check for if sec has maint access. + if(CONFIG_GET(flag/security_has_maint_access)) + access |= list(ACCESS_MAINT_TUNNELS) + /datum/id_trim/job/virologist assignment = "Virologist" trim_state = "trim_virologist" @@ -1248,3 +1278,20 @@ #undef POPULATION_SCALED_ACCESS #undef ALWAYS_GETS_ACCESS + +/datum/id_trim/job/human_ai + assignment = JOB_HUMAN_AI + trim_state = "trim_recluse" + department_color = COLOR_BLUE_GRAY + subdepartment_color = COLOR_MODERATE_BLUE + sechud_icon_state = SECHUD_HUMAN_AI + minimal_access = list( + ACCESS_ROBOTICS, // to access robotic controls + ACCESS_NETWORK, //to access NTOS + ACCESS_KEYCARD_AUTH, //to access holopads + ACCESS_MINISAT, + ACCESS_AI_UPLOAD, + ) + extra_access = list() + template_access = list() + job = /datum/job/human_ai diff --git a/code/datums/lazy_template.dm b/code/datums/lazy_template.dm index 0a5e8e53314..3b19a17a179 100644 --- a/code/datums/lazy_template.dm +++ b/code/datums/lazy_template.dm @@ -13,6 +13,8 @@ var/map_dir = "_maps/templates/lazy_templates" /// The filename (without extension) of the map to load var/map_name + /// place_on_top: Whether to use /turf/proc/PlaceOnTop rather than /turf/proc/ChangeTurf + var/place_on_top = FALSE /datum/lazy_template/New() reservations = list() @@ -83,6 +85,7 @@ bottom_left.z, z_upper = z_idx, z_lower = z_idx, + place_on_top = place_on_top, ) for(var/turf/turf as anything in block(bottom_left, top_right)) loaded_turfs += turf diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 49905c253a9..c55f95d4bd6 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -327,7 +327,7 @@ name = "carp gloves" desc = "This gloves are capable of making people use The Sleeping Carp." icon_state = "black" - greyscale_colors = "#000000" + greyscale_colors = COLOR_BLACK cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 23591852ec9..6969c3eeb9e 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -358,7 +358,7 @@ If you make a derivative work from this code, you must include this notification attacker.setDir(turn(attacker.dir, 90)) attacker.forceMove(defender.loc) - addtimer(CALLBACK(src, PROC_REF(CheckStrikeTurf), attacker, T), 4) + addtimer(CALLBACK(src, PROC_REF(CheckStrikeTurf), attacker, T), 0.4 SECONDS) 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) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 3c5f6ab62d0..f6e64d57e71 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -4,7 +4,7 @@ desc = "Common iron ore often found in sedimentary and igneous layers of the crust." color = "#878687" greyscale_colors = "#878687" - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/iron ore_type = /obj/item/stack/ore/iron value_per_unit = 5 / SHEET_MATERIAL_AMOUNT @@ -25,10 +25,10 @@ color = "#88cdf1" greyscale_colors = "#88cdf196" alpha = 150 - categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) integrity_modifier = 0.1 sheet_type = /obj/item/stack/sheet/glass - ore_type = /obj/item/stack/ore/glass + ore_type = /obj/item/stack/ore/glass/basalt shard_type = /obj/item/shard debris_type = /obj/effect/decal/cleanable/glass value_per_unit = 5 / SHEET_MATERIAL_AMOUNT @@ -47,12 +47,12 @@ /datum/material/glass/on_applied_obj(atom/source, amount, material_flags) . = ..() if(!isstack(source)) - source.AddElement(/datum/element/shatters_when_thrown, shard_type, round(amount / SHEET_MATERIAL_AMOUNT), SFX_SHATTER) + source.AddElement(/datum/element/can_shatter, shard_type, round(amount / SHEET_MATERIAL_AMOUNT), SFX_SHATTER) /datum/material/glass/on_removed(atom/source, amount, material_flags) . = ..() - source.RemoveElement(/datum/element/shatters_when_thrown, shard_type) + source.RemoveElement(/datum/element/can_shatter, shard_type) /* Color matrices are like regular colors but unlike with normal colors, you can go over 255 on a channel. @@ -65,7 +65,7 @@ Unless you know what you're doing, only use the first three numbers. They're in desc = "Silver" color = list(255/255, 284/255, 302/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) greyscale_colors = "#e3f1f8" - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/silver ore_type = /obj/item/stack/ore/silver value_per_unit = 50 / SHEET_MATERIAL_AMOUNT @@ -86,7 +86,7 @@ Unless you know what you're doing, only use the first three numbers. They're in color = list(340/255, 240/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //gold is shiny, but not as bright as bananium greyscale_colors = "#dbdd4c" strength_modifier = 1.2 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold ore_type = /obj/item/stack/ore/gold value_per_unit = 125 / SHEET_MATERIAL_AMOUNT @@ -107,7 +107,7 @@ Unless you know what you're doing, only use the first three numbers. They're in desc = "Highly pressurized carbon" color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) greyscale_colors = "#71c8f784" - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond ore_type = /obj/item/stack/ore/diamond alpha = 132 @@ -130,7 +130,7 @@ Unless you know what you're doing, only use the first three numbers. They're in desc = "Uranium" color = rgb(48, 237, 26) greyscale_colors = rgb(48, 237, 26) - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/uranium ore_type = /obj/item/stack/ore/uranium value_per_unit = 100 / SHEET_MATERIAL_AMOUNT @@ -170,7 +170,7 @@ Unless you know what you're doing, only use the first three numbers. They're in desc = "Isn't plasma a state of matter? Oh whatever." color = list(298/255, 46/255, 352/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) greyscale_colors = "#c162ec" - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/plasma ore_type = /obj/item/stack/ore/plasma value_per_unit = 200 / SHEET_MATERIAL_AMOUNT @@ -204,7 +204,7 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#4e7dffC8" alpha = 200 starlight_color = COLOR_BLUE - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_ITEM_MATERIAL = TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_ITEM_MATERIAL = TRUE) beauty_modifier = 0.5 sheet_type = /obj/item/stack/sheet/bluespace_crystal ore_type = /obj/item/stack/ore/bluespace_crystal @@ -225,7 +225,7 @@ Unless you know what you're doing, only use the first three numbers. They're in desc = "Material with hilarious properties" color = list(460/255, 464/255, 0, 0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //obnoxiously bright yellow greyscale_colors = "#ffff00" - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/bananium ore_type = /obj/item/stack/ore/bananium value_per_unit = 1000 / SHEET_MATERIAL_AMOUNT @@ -256,7 +256,7 @@ Unless you know what you're doing, only use the first three numbers. They're in color = "#b3c0c7" greyscale_colors = "#b3c0c7" strength_modifier = 1.3 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium ore_type = /obj/item/stack/ore/titanium value_per_unit = 125 / SHEET_MATERIAL_AMOUNT @@ -297,7 +297,7 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 0.85 sheet_type = /obj/item/stack/sheet/plastic ore_type = /obj/item/stack/ore/slag //No plastic or coal ore, so we use slag. - categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) + categories = list(MAT_CATEGORY_SILO = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) value_per_unit = 25 / SHEET_MATERIAL_AMOUNT beauty_modifier = -0.01 armor_modifiers = list(MELEE = 1.5, BULLET = 1.1, LASER = 0.3, ENERGY = 0.5, BOMB = 1, BIO = 1, FIRE = 1.1, ACID = 1) @@ -481,8 +481,8 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/snow name = "snow" desc = "There's no business like snow business." - color = "#FFFFFF" - greyscale_colors = "#FFFFFF" + color = COLOR_WHITE + greyscale_colors = COLOR_WHITE categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/snow value_per_unit = 5 / SHEET_MATERIAL_AMOUNT diff --git a/code/datums/mind/antag.dm b/code/datums/mind/antag.dm index b6179b5fc58..72674705457 100644 --- a/code/datums/mind/antag.dm +++ b/code/datums/mind/antag.dm @@ -106,6 +106,31 @@ var/datum/antagonist/rev/revolutionary = has_antag_datum(/datum/antagonist/rev) revolutionary?.remove_revolutionary() +/** + * Gets an item that can be used as an uplink somewhere on the mob's person. + * + * * desired_location: the location to look for the uplink in. An UPLINK_ define. + * If the desired location is not found, defaults to another location. + * + * Returns the item found, or null if no item was found. + */ +/mob/living/carbon/proc/get_uplink_location(desired_location = UPLINK_PDA) + var/list/all_contents = get_all_contents() + var/obj/item/modular_computer/pda/my_pda = locate() in all_contents + var/obj/item/radio/my_radio = locate() in all_contents + var/obj/item/pen/my_pen = (locate() in my_pda) || (locate() in all_contents) + + switch(desired_location) + if(UPLINK_PDA) + return my_pda || my_radio || my_pen + + if(UPLINK_RADIO) + return my_radio || my_pda || my_pen + + if(UPLINK_PEN) + return my_pen || my_pda || my_radio + + return null /** * ## give_uplink @@ -116,53 +141,26 @@ * * antag_datum: the antag datum of the uplink owner, for storing it in antag memory. optional! */ /datum/mind/proc/give_uplink(silent = FALSE, datum/antagonist/antag_datum) - if(!current) + if(isnull(current)) return var/mob/living/carbon/human/traitor_mob = current if (!istype(traitor_mob)) return - var/list/all_contents = traitor_mob.get_all_contents() - var/obj/item/modular_computer/pda/PDA = locate() in all_contents - var/obj/item/radio/R = locate() in all_contents - var/obj/item/pen/P - - if (PDA) // Prioritize PDA pen, otherwise the pocket protector pens will be chosen, which causes numerous ahelps about missing uplink - P = locate() in PDA - if (!P) // If we couldn't find a pen in the PDA, or we didn't even have a PDA, do it the old way - P = locate() in all_contents - var/obj/item/uplink_loc - var/implant = FALSE - var/uplink_spawn_location = traitor_mob.client?.prefs?.read_preference(/datum/preference/choiced/uplink_location) - var/cant_speak = (HAS_TRAIT(traitor_mob, TRAIT_MUTE) || traitor_mob.mind?.assigned_role.title == JOB_MIME) + var/cant_speak = (HAS_TRAIT(traitor_mob, TRAIT_MUTE) || is_mime_job(assigned_role)) if(uplink_spawn_location == UPLINK_RADIO && cant_speak) if(!silent) to_chat(traitor_mob, span_warning("You have been deemed ineligible for a radio uplink. Supplying standard uplink instead.")) uplink_spawn_location = UPLINK_PDA - switch (uplink_spawn_location) - if(UPLINK_PDA) - uplink_loc = PDA - if(!uplink_loc) - uplink_loc = R - if(!uplink_loc) - uplink_loc = P - if(UPLINK_RADIO) - uplink_loc = R - if(!uplink_loc) - uplink_loc = PDA - if(!uplink_loc) - uplink_loc = P - if(UPLINK_PEN) - uplink_loc = P - if(UPLINK_IMPLANT) - implant = TRUE - if(!uplink_loc) // We've looked everywhere, let's just implant you - implant = TRUE + if(uplink_spawn_location != UPLINK_IMPLANT) + uplink_loc = traitor_mob.get_uplink_location(uplink_spawn_location) + if(istype(uplink_loc, /obj/item/radio) && cant_speak) + uplink_loc = null - if(implant) + if(isnull(uplink_loc)) var/obj/item/implant/uplink/starting/new_implant = new(traitor_mob) new_implant.implant(traitor_mob, null, silent = TRUE) if(!silent) @@ -179,22 +177,27 @@ new_uplink.uplink_handler.owner = traitor_mob.mind new_uplink.uplink_handler.assigned_role = traitor_mob.mind.assigned_role.title new_uplink.uplink_handler.assigned_species = traitor_mob.dna.species.id - if(uplink_loc == R) - unlock_text = "Your Uplink is cunningly disguised as your [R.name]. Simply speak \"[new_uplink.unlock_code]\" into frequency [RADIO_TOKEN_UPLINK] to unlock its hidden features." - add_memory(/datum/memory/key/traitor_uplink, uplink_loc = R.name, uplink_code = new_uplink.unlock_code) - else if(uplink_loc == PDA) - unlock_text = "Your Uplink is cunningly disguised as your [PDA.name]. Simply enter the code \"[new_uplink.unlock_code]\" into the ring tone selection to unlock its hidden features." + + unlock_text = "Your Uplink is cunningly disguised as your [uplink_loc.name]. " + if(istype(uplink_loc, /obj/item/modular_computer/pda)) + unlock_text += "Simply enter the code \"[new_uplink.unlock_code]\" into the ring tone selection to unlock its hidden features." add_memory(/datum/memory/key/traitor_uplink, uplink_loc = "PDA", uplink_code = new_uplink.unlock_code) - else if(uplink_loc == P) + + else if(istype(uplink_loc, /obj/item/radio)) + unlock_text += "Simply speak \"[new_uplink.unlock_code]\" into frequency [RADIO_TOKEN_UPLINK] to unlock its hidden features." + add_memory(/datum/memory/key/traitor_uplink, uplink_loc = uplink_loc.name, uplink_code = new_uplink.unlock_code) + + else if(istype(uplink_loc, /obj/item/pen)) var/instructions = english_list(new_uplink.unlock_code) - unlock_text = "Your Uplink is cunningly disguised as your [P.name]. Simply twist the top of the pen [instructions] from its starting position to unlock its hidden features." - add_memory(/datum/memory/key/traitor_uplink, uplink_loc = "PDA pen", uplink_code = instructions) + unlock_text += "Simply twist the top of the pen [instructions] from its starting position to unlock its hidden features." + add_memory(/datum/memory/key/traitor_uplink, uplink_loc = uplink_loc.name, uplink_code = instructions) new_uplink.unlock_text = unlock_text if(!silent) to_chat(traitor_mob, span_boldnotice(unlock_text)) if(antag_datum) antag_datum.antag_memory += new_uplink.unlock_note + "
" + return . /// Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does. /datum/mind/proc/enslave_mind_to_creator(mob/living/creator) diff --git a/code/datums/mood.dm b/code/datums/mood.dm index c725c8687b7..b59da87acb0 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -92,7 +92,6 @@ set_sanity(sanity + 0.4 * seconds_per_tick, SANITY_NEUTRAL, SANITY_MAXIMUM) if(MOOD_LEVEL_HAPPY4) set_sanity(sanity + 0.6 * seconds_per_tick, SANITY_NEUTRAL, SANITY_MAXIMUM) - handle_nutrition() // 0.416% is 15 successes / 3600 seconds. Calculated with 2 minute // mood runtime, so 50% average uptime across the hour. @@ -112,16 +111,18 @@ last_stat = mob_parent.stat /// Handles mood given by nutrition -/datum/mood/proc/handle_nutrition() - if (HAS_TRAIT(mob_parent, TRAIT_NOHUNGER)) - clear_mood_event(MOOD_CATEGORY_NUTRITION) // if you happen to switch species while hungry youre no longer hungy - return FALSE // no moods for nutrition +/datum/mood/proc/update_nutrition_moodlets() + if(HAS_TRAIT(mob_parent, TRAIT_NOHUNGER)) + clear_mood_event(MOOD_CATEGORY_NUTRITION) + return FALSE + + if(HAS_TRAIT(mob_parent, TRAIT_FAT) && !HAS_TRAIT(mob_parent, TRAIT_VORACIOUS)) + add_mood_event(MOOD_CATEGORY_NUTRITION, /datum/mood_event/fat) + return TRUE + switch(mob_parent.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) - if (!HAS_TRAIT(mob_parent, TRAIT_VORACIOUS)) - add_mood_event(MOOD_CATEGORY_NUTRITION, /datum/mood_event/fat) - else - add_mood_event(MOOD_CATEGORY_NUTRITION, /datum/mood_event/wellfed) // round and full + add_mood_event(MOOD_CATEGORY_NUTRITION, HAS_TRAIT(mob_parent, TRAIT_VORACIOUS) ? /datum/mood_event/wellfed : /datum/mood_event/too_wellfed) if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) add_mood_event(MOOD_CATEGORY_NUTRITION, /datum/mood_event/wellfed) if( NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) @@ -133,6 +134,8 @@ if(0 to NUTRITION_LEVEL_STARVING) add_mood_event(MOOD_CATEGORY_NUTRITION, /datum/mood_event/starving) + return TRUE + /** * Adds a mood event to the mob * @@ -301,7 +304,7 @@ mood_screen_object.color = "#4b96c4" hud.infodisplay += mood_screen_object RegisterSignal(hud, COMSIG_QDELETING, PROC_REF(unmodify_hud)) - RegisterSignal(mood_screen_object, COMSIG_CLICK, PROC_REF(hud_click)) + RegisterSignal(mood_screen_object, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(hud_click)) /// Removes the mood HUD object /datum/mood/proc/unmodify_hud(datum/source) @@ -407,7 +410,7 @@ msg += "[span_boldnicegreen("I love life!")]\n" else msg += "[span_notice("No clue.")]\n" - + msg += "[span_notice("Moodlets:")]\n"//All moodlets msg += get_alcohol_processing(user) msg += get_drunk_mood(user) diff --git a/code/datums/mood_events/eldritch_painting_events.dm b/code/datums/mood_events/eldritch_painting_events.dm index 7df89104263..df801998c1d 100644 --- a/code/datums/mood_events/eldritch_painting_events.dm +++ b/code/datums/mood_events/eldritch_painting_events.dm @@ -17,13 +17,13 @@ mood_change = 5 timeout = 3 MINUTES -/datum/mood_event/eldritch_painting/weeping_withdrawl +/datum/mood_event/eldritch_painting/weeping_withdrawal description = "My mind is clear from his influence." mood_change = 1 timeout = 3 MINUTES /datum/mood_event/eldritch_painting/desire_heretic - description = "A part gained, the manus takes and gives. What did it take from me?" + description = "A part gained, the mansus takes and gives. What did it take from me?" mood_change = -2 timeout = 3 MINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 32b9772dc07..0cfb48f7a98 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -483,3 +483,9 @@ /datum/mood_event/all_nighter description = "I didn't sleep at all last night. I'm exhausted." mood_change = -5 + +//Used by the Veteran Advisor trait job +/datum/mood_event/desentized + description = "Nothing will ever rival with what I seen in the past..." + mood_change = -3 + special_screen_obj = "mood_desentized" diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index dd710554d8d..72d789da1e0 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -3,6 +3,10 @@ description = "I'm so fat..." //muh fatshaming mood_change = -6 +/datum/mood_event/too_wellfed + description = "I think I've eaten too much." + mood_change = 0 + /datum/mood_event/wellfed description = "I'm stuffed!" mood_change = 8 diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index cc99917c746..a5ddcd6d327 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -49,6 +49,7 @@ * make sure to enter it both ways (so that A conflicts with B, and B with A) */ var/list/conflicts + var/remove_on_aheal = TRUE /** * can we take chromosomes? diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 38806aa7529..6d3768704fb 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -20,7 +20,7 @@ owner.Unconscious(200 * GET_MUTATION_POWER(src)) owner.set_jitter(2000 SECONDS * GET_MUTATION_POWER(src)) //yes this number looks crazy but the jitter animations are amplified based on the duration. owner.add_mood_event("epilepsy", /datum/mood_event/epilepsy) - addtimer(CALLBACK(src, PROC_REF(jitter_less)), 90) + addtimer(CALLBACK(src, PROC_REF(jitter_less)), 9 SECONDS) /datum/mutation/human/epilepsy/proc/jitter_less() if(QDELETED(owner)) @@ -120,8 +120,8 @@ if(..()) return // SKYRAT EDIT BEGIN - if(owner.dna.features["body_size"] < 1) - to_chat(owner, "You feel your body shrinking even further, but your organs aren't! Uh oh!") + if(owner.dna.features["body_size"] < 1 || isteshari(owner)) + to_chat(owner, "You feel your body try to shrink, but your organs don't! Uh oh!") owner.adjustBruteLoss(25) return // SKYRAT EDIT END @@ -132,7 +132,7 @@ if(..()) return // SKYRAT EDIT BEGIN - if(owner.dna.features["body_size"] < 1) + if(owner.dna.features["body_size"] < 1 || isteshari(owner)) to_chat(owner, "You feel relief as your organs cease to strain against your insides.") REMOVE_TRAIT(owner, TRAIT_DWARF, GENETIC_MUTATION) return @@ -206,6 +206,7 @@ text_gain_indication = "You feel unusually monkey-like." text_lose_indication = "You feel like your old self." quality = NEGATIVE + remove_on_aheal = FALSE locked = TRUE //Species specific, keep out of actual gene pool var/datum/species/original_species = /datum/species/human var/original_name @@ -232,7 +233,7 @@ instability = 5 power_coeff = 1 conflicts = list(/datum/mutation/human/glow/anti) - var/glow_power = 2.5 + var/glow_power = 2 var/glow_range = 2.5 var/glow_color var/obj/effect/dummy/lighting_obj/moblight/glow diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index a76adac10ac..8c8642a81ea 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -26,7 +26,7 @@ return owner.add_traits(mutation_traits, GENETIC_MUTATION) for(var/obj/item/bodypart/part as anything in owner.bodyparts) - part.variable_color = "#00aa00" + part.variable_color = COLOR_DARK_LIME 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)) diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index 743f2b3fbf8..ca94f109ac6 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -38,7 +38,7 @@ ///This var decides if the spell should chain, dictated by presence of power chromosome var/chain = FALSE ///Affects damage, should do about 1 per limb - var/zap_power = 7500 + var/zap_power = 7.5 KILO JOULES ///Range of tesla shock bounces var/zap_range = 7 ///flags that dictate what the tesla shock can interact with, Can only damage mobs, Cannot damage machines or generate energy @@ -60,7 +60,7 @@ span_userdanger("[caster] electrocutes you!"), ) if(chain) - tesla_zap(source = victim, zap_range = zap_range, power = zap_power, cutoff = 1e3, zap_flags = zap_flags) + tesla_zap(source = victim, zap_range = zap_range, power = zap_power, cutoff = 1 KILO JOULES, zap_flags = zap_flags) carbon_victim.visible_message(span_danger("An arc of electricity explodes out of [victim]!")) return TRUE @@ -72,7 +72,7 @@ span_userdanger("[caster] electrocutes you!"), ) if(chain) - tesla_zap(source = victim, zap_range = zap_range, power = zap_power, cutoff = 1e3, zap_flags = zap_flags) + tesla_zap(source = victim, zap_range = zap_range, power = zap_power, cutoff = 1 KILO JOULES, zap_flags = zap_flags) living_victim.visible_message(span_danger("An arc of electricity explodes out of [victim]!")) return TRUE diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm index 873ffd95fbd..2f7c701e70f 100644 --- a/code/datums/quirks/_quirk.dm +++ b/code/datums/quirks/_quirk.dm @@ -29,10 +29,10 @@ /// The icon to show in the preferences menu. /// This references a tgui icon, so it can be FontAwesome or a tgfont (with a tg- prefix). var/icon = "bug" //SKYRAT EDIT CHANGE - /// A list of items people can receive from mail who have this quirk enabled + /// A lazylist of items people can receive from mail who have this quirk enabled /// The base weight for the each quirk's mail goodies list to be selected is 5 /// then the item selected is determined by pick(selected_quirk.mail_goodies) - var/mail_goodies = list() + var/list/mail_goodies /datum/quirk/Destroy() if(quirk_holder) diff --git a/code/datums/quirks/negative_quirks/junkie.dm b/code/datums/quirks/negative_quirks/addict.dm similarity index 70% rename from code/datums/quirks/negative_quirks/junkie.dm rename to code/datums/quirks/negative_quirks/addict.dm index 2ce29f743c3..f97dae32c26 100644 --- a/code/datums/quirks/negative_quirks/junkie.dm +++ b/code/datums/quirks/negative_quirks/addict.dm @@ -1,14 +1,9 @@ -/datum/quirk/item_quirk/junkie - name = "Junkie" - desc = "You can't get enough of hard drugs." - icon = FA_ICON_PILLS - value = -6 - gain_text = span_danger("You suddenly feel the craving for drugs.") - medical_record_text = "Patient has a history of hard drugs." - hardcore_value = 4 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES - mail_goodies = list(/obj/effect/spawner/random/contraband/narcotics) - var/drug_list = list(/datum/reagent/drug/blastoff, /datum/reagent/drug/krokodil, /datum/reagent/medicine/morphine, /datum/reagent/drug/happiness, /datum/reagent/drug/methamphetamine) //List of possible IDs +/datum/quirk/item_quirk/addict + name = "Addict" + desc = "You are addicted to something that doesn't exist. Suffer." + gain_text = span_danger("You suddenly feel the craving for... something? You're not sure what it is.") + medical_record_text = "Patient has a history with SOMETHING but he refuses to tell us what it is." + abstract_parent_type = /datum/quirk/item_quirk/addict var/datum/reagent/reagent_type //!If this is defined, reagent_id will be unused and the defined reagent type will be instead. var/datum/reagent/reagent_instance //! actual instanced version of the reagent var/where_drug //! Where the drug spawned @@ -17,13 +12,13 @@ var/obj/item/accessory_type //! If this is null, an accessory won't be spawned. var/process_interval = 30 SECONDS //! how frequently the quirk processes var/next_process = 0 //! ticker for processing - var/drug_flavour_text = "Better hope you don't run out..." + var/drug_flavour_text = "Better hope you don't run out... of what, exactly? You don't know." -/datum/quirk/item_quirk/junkie/add_unique(client/client_source) +/datum/quirk/item_quirk/addict/add_unique(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder if(!reagent_type) - reagent_type = pick(drug_list) + reagent_type = GLOB.possible_junkie_addictions[pick(GLOB.possible_junkie_addictions)] reagent_instance = new reagent_type() @@ -65,12 +60,7 @@ ) ) -/datum/quirk/item_quirk/junkie/remove() - if(quirk_holder && reagent_instance) - for(var/addiction_type in subtypesof(/datum/addiction)) - quirk_holder.mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) - -/datum/quirk/item_quirk/junkie/process(seconds_per_tick) +/datum/quirk/item_quirk/addict/process(seconds_per_tick) if(HAS_TRAIT(quirk_holder, TRAIT_LIVERLESS_METABOLISM)) return var/mob/living/carbon/human/human_holder = quirk_holder @@ -88,7 +78,35 @@ for(var/addiction in reagent_instance.addiction_types) human_holder.last_mind?.add_addiction_points(addiction, 1000) ///Max that shit out -/datum/quirk/item_quirk/junkie/smoker +/datum/quirk/item_quirk/addict/junkie + name = "Junkie" + desc = "You can't get enough of hard drugs." + icon = FA_ICON_PILLS + value = -6 + gain_text = span_danger("You suddenly feel the craving for drugs.") + medical_record_text = "Patient has a history of hard drugs." + hardcore_value = 4 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + mail_goodies = list(/obj/effect/spawner/random/contraband/narcotics) + drug_flavour_text = "Better hope you don't run out..." + +/datum/quirk_constant_data/junkie + associated_typepath = /datum/quirk/item_quirk/addict/junkie + customization_options = list(/datum/preference/choiced/junkie) + +/datum/quirk/item_quirk/addict/junkie/add_unique(client/client_source) + + var/addiction = client_source?.prefs.read_preference(/datum/preference/choiced/junkie) + if(addiction && (addiction != "Random")) + reagent_type = GLOB.possible_junkie_addictions[addiction] + return ..() + +/datum/quirk/item_quirk/addict/remove() + if(quirk_holder && reagent_instance) + for(var/addiction_type in subtypesof(/datum/addiction)) + quirk_holder.mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) + +/datum/quirk/item_quirk/addict/smoker name = "Smoker" desc = "Sometimes you just really want a smoke. Probably not great for your lungs." icon = FA_ICON_SMOKING @@ -108,17 +126,21 @@ /obj/item/clothing/mask/cigarette/pipe, ) -/datum/quirk/item_quirk/junkie/smoker/New() - drug_container_type = pick(/obj/item/storage/fancy/cigarettes, - /obj/item/storage/fancy/cigarettes/cigpack_midori, - /obj/item/storage/fancy/cigarettes/cigpack_uplift, - /obj/item/storage/fancy/cigarettes/cigpack_robust, - /obj/item/storage/fancy/cigarettes/cigpack_robustgold, - /obj/item/storage/fancy/cigarettes/cigpack_carp) +/datum/quirk_constant_data/smoker + associated_typepath = /datum/quirk/item_quirk/addict/smoker + customization_options = list(/datum/preference/choiced/smoker) +/datum/quirk/item_quirk/addict/smoker/New() + drug_container_type = GLOB.possible_smoker_addictions[pick(GLOB.possible_smoker_addictions)] return ..() -/datum/quirk/item_quirk/junkie/smoker/post_add() +/datum/quirk/item_quirk/addict/smoker/add_unique(client/client_source) + var/addiction = client_source?.prefs.read_preference(/datum/preference/choiced/smoker) + if(addiction && (addiction != "Random")) + drug_container_type = GLOB.possible_smoker_addictions[addiction] + return ..() + +/datum/quirk/item_quirk/addict/smoker/post_add() . = ..() quirk_holder.add_mob_memory(/datum/memory/key/quirk_smoker, protagonist = quirk_holder, preferred_brand = initial(drug_container_type.name)) // smoker lungs have 25% less health and healing @@ -136,7 +158,7 @@ smoker_lungs = new smoker_lungs smoker_lungs.Insert(carbon_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED) -/datum/quirk/item_quirk/junkie/smoker/process(seconds_per_tick) +/datum/quirk/item_quirk/addict/smoker/process(seconds_per_tick) . = ..() var/mob/living/carbon/human/human_holder = quirk_holder var/obj/item/mask_item = human_holder.get_item_by_slot(ITEM_SLOT_MASK) @@ -147,7 +169,7 @@ else quirk_holder.add_mood_event("wrong_cigs", /datum/mood_event/wrong_brand) -/datum/quirk/item_quirk/junkie/alcoholic +/datum/quirk/item_quirk/addict/alcoholic name = "Alcoholic" desc = "You just can't live without alcohol. Your liver is a machine that turns ethanol into acetaldehyde." icon = FA_ICON_WINE_GLASS @@ -167,31 +189,31 @@ /// Cached typepath of the owner's favorite alcohol reagent var/datum/reagent/consumable/ethanol/favorite_alcohol -/datum/quirk/item_quirk/junkie/alcoholic/New() - drug_container_type = pick( - /obj/item/reagent_containers/cup/glass/bottle/whiskey, - /obj/item/reagent_containers/cup/glass/bottle/vodka, - /obj/item/reagent_containers/cup/glass/bottle/ale, - /obj/item/reagent_containers/cup/glass/bottle/beer, - /obj/item/reagent_containers/cup/glass/bottle/hcider, - /obj/item/reagent_containers/cup/glass/bottle/wine, - /obj/item/reagent_containers/cup/glass/bottle/sake, - ) +/datum/quirk_constant_data/alcoholic + associated_typepath = /datum/quirk/item_quirk/addict/alcoholic + customization_options = list(/datum/preference/choiced/alcoholic) +/datum/quirk/item_quirk/addict/alcoholic/New() + var/random_alcohol = pick(GLOB.possible_alcoholic_addictions) + drug_container_type = GLOB.possible_alcoholic_addictions[random_alcohol]["bottlepath"] + favorite_alcohol = GLOB.possible_alcoholic_addictions[random_alcohol]["reagent"] return ..() -/datum/quirk/item_quirk/junkie/alcoholic/post_add() +/datum/quirk/item_quirk/addict/alcoholic/add_unique(client/client_source) + var/addiction = client_source?.prefs.read_preference(/datum/preference/choiced/alcoholic) + if(addiction && (addiction != "Random")) + drug_container_type = GLOB.possible_alcoholic_addictions[addiction]["bottlepath"] + favorite_alcohol = GLOB.possible_alcoholic_addictions[addiction]["reagent"] + return ..() + +/datum/quirk/item_quirk/addict/alcoholic/post_add() . = ..() RegisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK, PROC_REF(check_brandy)) - - var/obj/item/reagent_containers/brandy_container = GLOB.alcohol_containers[drug_container_type] + var/obj/item/reagent_containers/brandy_container = drug_container_type if(isnull(brandy_container)) stack_trace("Alcoholic quirk added while the GLOB.alcohol_containers is (somehow) not initialized!") brandy_container = new drug_container_type - favorite_alcohol = brandy_container.list_reagents[1] qdel(brandy_container) - else - favorite_alcohol = brandy_container.list_reagents[1] quirk_holder.add_mob_memory(/datum/memory/key/quirk_alcoholic, protagonist = quirk_holder, preferred_brandy = initial(favorite_alcohol.name)) // alcoholic livers have 25% less health and healing @@ -200,10 +222,10 @@ alcohol_liver.maxHealth = alcohol_liver.maxHealth * 0.75 alcohol_liver.healing_factor = alcohol_liver.healing_factor * 0.75 -/datum/quirk/item_quirk/junkie/alcoholic/remove() +/datum/quirk/item_quirk/addict/alcoholic/remove() UnregisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK) -/datum/quirk/item_quirk/junkie/alcoholic/proc/check_brandy(mob/source, datum/reagent/booze) +/datum/quirk/item_quirk/addict/alcoholic/proc/check_brandy(mob/source, datum/reagent/booze) SIGNAL_HANDLER //we don't care if it is not alcohol diff --git a/code/datums/quirks/negative_quirks/all_nighter.dm b/code/datums/quirks/negative_quirks/all_nighter.dm index 253ce12b41f..7f9f051ecf7 100644 --- a/code/datums/quirks/negative_quirks/all_nighter.dm +++ b/code/datums/quirks/negative_quirks/all_nighter.dm @@ -22,19 +22,6 @@ /obj/item/pillow/random, ) - ///a list of all the reagents which alleviate the negative moodlet - var/list/stimulants = list( - /datum/reagent/medicine/stimulants, - /datum/reagent/drug/methamphetamine, - /datum/reagent/drug/bath_salts, - /datum/reagent/drug/aranesp, - /datum/reagent/drug/pumpup, - /datum/reagent/drug/blastoff, - /datum/reagent/consumable/coffee, - /datum/reagent/consumable/tea, - /datum/reagent/consumable/volt_energy, - /datum/reagent/consumable/monkey_energy - ) ///essentially our "sleep bank". sleeping charges it up and its drained while awake var/five_more_minutes = 0 ///the overlay we put over the eyes @@ -43,30 +30,40 @@ ///adds the corresponding moodlet and visual effects /datum/quirk/all_nighter/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_removed_limb)) quirk_holder.add_mood_event("all_nighter", /datum/mood_event/all_nighter) add_bags() ///removes the corresponding moodlet and visual effects /datum/quirk/all_nighter/remove(client/client_source) + UnregisterSignal(quirk_holder, COMSIG_CARBON_REMOVE_LIMB) quirk_holder.clear_mood_event("all_nighter", /datum/mood_event/all_nighter) - remove_bags() + if(bodypart_overlay) + remove_bags() + +///if we have bags and lost a head, remove them +/datum/quirk/all_nighter/proc/on_removed_limb(datum/source, obj/item/bodypart/removed_limb, special, dismembered) + if(bodypart_overlay && istype(removed_limb, /obj/item/bodypart/head)) + remove_bags() ///adds the bag overlay -/datum/quirk/all_nighter/proc/add_bags(client/client_source) +/datum/quirk/all_nighter/proc/add_bags() var/mob/living/carbon/human/sleepy_head = quirk_holder - var/obj/item/bodypart/head/face = sleepy_head.get_bodypart(BODY_ZONE_HEAD) + var/obj/item/bodypart/head/face = sleepy_head?.get_bodypart(BODY_ZONE_HEAD) + if(isnull(face)) + return bodypart_overlay = new() //creates our overlay face.add_bodypart_overlay(bodypart_overlay) sleepy_head.update_body_parts() //make sure to update icon ///removes the bag overlay -/datum/quirk/all_nighter/proc/remove_bags(client/client_source) +/datum/quirk/all_nighter/proc/remove_bags() var/mob/living/carbon/human/sleepy_head = quirk_holder - var/obj/item/bodypart/head/face = sleepy_head.get_bodypart(BODY_ZONE_HEAD) - //our overlay is stored as a datum var, so referencing it is easy - face.remove_bodypart_overlay(bodypart_overlay) + var/obj/item/bodypart/head/face = sleepy_head?.get_bodypart(BODY_ZONE_HEAD) + if(face) + face.remove_bodypart_overlay(bodypart_overlay) + sleepy_head.update_body_parts() QDEL_NULL(bodypart_overlay) - sleepy_head.update_body_parts() /** *Here we actively handle our moodlet & eye bags, adding/removing them as necessary @@ -84,7 +81,6 @@ /datum/quirk/all_nighter/process(seconds_per_tick) var/happy_camper = TRUE var/beauty_sleep = TRUE - var/stims_present = FALSE if(quirk_holder.IsSleeping()) five_more_minutes += SLEEP_BANK_MULTIPLIER * seconds_per_tick @@ -93,11 +89,8 @@ else beauty_sleep = FALSE //no sleep means eye bags - for(var/stimulant in stimulants) - if(quirk_holder.has_reagent(stimulant)) //checking for stims - stims_present = TRUE - break - if(!stims_present) //no stims and no sleep means an unhappy camper + // Defining which reagents count is handled by the reagents + if(!HAS_TRAIT(quirk_holder, TRAIT_STIMULATED)) happy_camper = FALSE //adjusts the mood event accordingly diff --git a/code/datums/quirks/negative_quirks/blood_deficiency.dm b/code/datums/quirks/negative_quirks/blood_deficiency.dm index c75007bacc2..238126f4d79 100644 --- a/code/datums/quirks/negative_quirks/blood_deficiency.dm +++ b/code/datums/quirks/negative_quirks/blood_deficiency.dm @@ -3,37 +3,50 @@ desc = "Your body can't produce enough blood to sustain itself." icon = FA_ICON_TINT value = -8 - mob_trait = TRAIT_BLOOD_DEFICIENCY gain_text = span_danger("You feel your vigor slowly fading away.") lose_text = span_notice("You feel vigorous again.") medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." hardcore_value = 8 mail_goodies = list(/obj/item/reagent_containers/blood/o_minus) // universal blood type that is safe for all + /// Minimum amount of blood the paint is set to var/min_blood = BLOOD_VOLUME_SAFE - 25 // just barely survivable without treatment -/datum/quirk/blooddeficiency/post_add() - if(!ishuman(quirk_holder)) +/datum/quirk/blooddeficiency/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_HUMAN_ON_HANDLE_BLOOD, PROC_REF(lose_blood)) + RegisterSignal(quirk_holder, COMSIG_SPECIES_GAIN, PROC_REF(update_mail)) + + var/mob/living/carbon/human/human_holder = quirk_holder + update_mail(new_species = human_holder.dna.species) + +/datum/quirk/blooddeficiency/remove() + UnregisterSignal(quirk_holder, list(COMSIG_HUMAN_ON_HANDLE_BLOOD, COMSIG_SPECIES_GAIN)) + +/datum/quirk/blooddeficiency/proc/lose_blood(datum/source, seconds_per_tick, times_fired) + SIGNAL_HANDLER + + var/mob/living/carbon/human/human_holder = quirk_holder + if(human_holder.stat == DEAD || human_holder.blood_volume <= min_blood) + return + // This exotic blood check is solely to snowflake slimepeople into working with this quirk + if(HAS_TRAIT(quirk_holder, TRAIT_NOBLOOD) && isnull(human_holder.dna.species.exotic_blood)) return - // for making sure the roundstart species has the right blood pack sent to them - var/mob/living/carbon/human/carbon_target = quirk_holder - carbon_target.dna.species.update_quirk_mail_goodies(carbon_target, src) + human_holder.blood_volume = max(min_blood, human_holder.blood_volume - human_holder.dna.species.blood_deficiency_drain_rate * seconds_per_tick) -/** - * Makes the mob lose blood from having the blood deficiency quirk, if possible - * - * Arguments: - * * seconds_per_tick - */ -/datum/quirk/blooddeficiency/proc/lose_blood(seconds_per_tick) - if(quirk_holder.stat == DEAD) +/datum/quirk/blooddeficiency/proc/update_mail(datum/source, datum/species/new_species, datum/species/old_species) + SIGNAL_HANDLER + + mail_goodies.Cut() + + if(isnull(new_species.exotic_blood) && isnull(new_species.exotic_bloodtype)) + if(TRAIT_NOBLOOD in new_species.inherent_traits) + return + + mail_goodies += /obj/item/reagent_containers/blood/o_minus return - var/mob/living/carbon/human/carbon_target = quirk_holder - if(HAS_TRAIT(carbon_target, TRAIT_NOBLOOD) && isnull(carbon_target.dna.species.exotic_blood)) //can't lose blood if your species doesn't have any - return - - if (carbon_target.blood_volume <= min_blood) - return - // Ensures that we don't reduce total blood volume below min_blood. - carbon_target.blood_volume = max(min_blood, carbon_target.blood_volume - carbon_target.dna.species.blood_deficiency_drain_rate * seconds_per_tick) + for(var/obj/item/reagent_containers/blood/blood_bag as anything in typesof(/obj/item/reagent_containers/blood)) + var/right_blood_type = !isnull(new_species.exotic_bloodtype) && initial(blood_bag.blood_type) == new_species.exotic_bloodtype + var/right_blood_reagent = !isnull(new_species.exotic_blood) && initial(blood_bag.unique_blood) == new_species.exotic_blood + if(right_blood_type || right_blood_reagent) + mail_goodies += blood_bag diff --git a/code/datums/quirks/negative_quirks/hemiplegic.dm b/code/datums/quirks/negative_quirks/hemiplegic.dm index 459b880fad2..b82ad434dfb 100644 --- a/code/datums/quirks/negative_quirks/hemiplegic.dm +++ b/code/datums/quirks/negative_quirks/hemiplegic.dm @@ -12,10 +12,19 @@ /obj/item/reagent_containers/cup/glass/drinkingglass/filled/half_full, ) -/datum/quirk/hemiplegic/add(client/client_source) +/datum/quirk_constant_data/hemiplegic + associated_typepath = /datum/quirk/hemiplegic + customization_options = list(/datum/preference/choiced/hemiplegic) + +/datum/quirk/hemiplegic/add_unique(client/client_source) + var/datum/brain_trauma/severe/paralysis/hemiplegic/side_choice = GLOB.side_choice_hemiplegic[client_source?.prefs?.read_preference(/datum/preference/choiced/hemiplegic)] + if(isnull(side_choice)) // Client gone or they chose a random side + side_choice = GLOB.side_choice_hemiplegic[pick(GLOB.side_choice_hemiplegic)] + var/mob/living/carbon/human/human_holder = quirk_holder - var/trauma_type = pick(/datum/brain_trauma/severe/paralysis/hemiplegic/left, /datum/brain_trauma/severe/paralysis/hemiplegic/right) - human_holder.gain_trauma(trauma_type, TRAUMA_RESILIENCE_ABSOLUTE) + + medical_record_text = "Patient has an untreatable impairment in motor function on the [side_choice::paralysis_type] half of their body." + human_holder.gain_trauma(side_choice, TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/hemiplegic/remove() var/mob/living/carbon/human/human_holder = quirk_holder diff --git a/code/datums/quirks/negative_quirks/prosthetic_organ.dm b/code/datums/quirks/negative_quirks/prosthetic_organ.dm index 0fd5061a787..cd7ca2a8014 100644 --- a/code/datums/quirks/negative_quirks/prosthetic_organ.dm +++ b/code/datums/quirks/negative_quirks/prosthetic_organ.dm @@ -12,6 +12,10 @@ /// The original organ from before the prosthetic was applied var/obj/item/organ/old_organ +/datum/quirk_constant_data/prosthetic_organ + associated_typepath = /datum/quirk/prosthetic_organ + customization_options = list(/datum/preference/choiced/prosthetic_organ) + /datum/quirk/prosthetic_organ/add_unique(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder var/static/list/organ_slots = list( @@ -20,6 +24,10 @@ ORGAN_SLOT_LIVER, ORGAN_SLOT_STOMACH, ) + var/preferred_organ = GLOB.organ_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic_organ)] + if(isnull(preferred_organ)) //Client is gone or they chose a random prosthetic + preferred_organ = GLOB.organ_choice[pick(GLOB.organ_choice)] + var/list/possible_organ_slots = organ_slots.Copy() if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD)) possible_organ_slots -= ORGAN_SLOT_HEART @@ -31,7 +39,10 @@ possible_organ_slots -= ORGAN_SLOT_STOMACH if(!length(organ_slots)) //what the hell return + var/organ_slot = pick(possible_organ_slots) + if(preferred_organ in possible_organ_slots) + organ_slot = preferred_organ var/obj/item/organ/prosthetic switch(organ_slot) if(ORGAN_SLOT_HEART) @@ -47,14 +58,14 @@ prosthetic = new /obj/item/organ/internal/stomach/cybernetic/surplus slot_string = "stomach" medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic [slot_string]. \ - Removal of these organs is known to be dangerous to the patient as well as the practitioner." + Removal of these organs is known to be dangerous to the patient as well as the practitioner." old_organ = human_holder.get_organ_slot(organ_slot) if(prosthetic.Insert(human_holder, special = TRUE)) old_organ.moveToNullspace() STOP_PROCESSING(SSobj, old_organ) /datum/quirk/prosthetic_organ/post_add() - to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a surplus organ. It is fragile and will easily come apart under duress. \ + to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a surplus organ. It is weak and highly unstable. \ Additionally, any EMP will make it stop working entirely.")) /datum/quirk/prosthetic_organ/remove() diff --git a/code/datums/quirks/negative_quirks/social_anxiety.dm b/code/datums/quirks/negative_quirks/social_anxiety.dm index b6916b2dd03..2f28a646b32 100644 --- a/code/datums/quirks/negative_quirks/social_anxiety.dm +++ b/code/datums/quirks/negative_quirks/social_anxiety.dm @@ -15,9 +15,26 @@ RegisterSignal(quirk_holder, COMSIG_MOB_EYECONTACT, PROC_REF(eye_contact)) RegisterSignal(quirk_holder, COMSIG_MOB_EXAMINATE, PROC_REF(looks_at_floor)) RegisterSignal(quirk_holder, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + quirk_holder.apply_status_effect(/datum/status_effect/speech/stutter/anxiety, INFINITY) /datum/quirk/social_anxiety/remove() UnregisterSignal(quirk_holder, list(COMSIG_MOB_EYECONTACT, COMSIG_MOB_EXAMINATE, COMSIG_MOB_SAY)) + quirk_holder.remove_status_effect(/datum/status_effect/speech/stutter/anxiety) + +/// Calculates how much to modifiy our effects based on our mood level +/datum/quirk/social_anxiety/proc/calculate_mood_mod() + var/nearby_people = 0 + for(var/mob/living/carbon/human/listener in oview(3, quirk_holder)) + if(listener.client || listener.mind) + nearby_people++ + + var/mod = 1 + if(quirk_holder.mob_mood) + mod = 1 + 0.02 * (50 - (max(50, quirk_holder.mob_mood.mood_level * (SANITY_LEVEL_MAX + 1 - quirk_holder.mob_mood.sanity_level)))) //low sanity levels are better, they max at 6 + else + mod = 1 + 0.02 * (50 - (max(50, 0.1 * quirk_holder.nutrition))) + + return mod * nearby_people * 12.5 /datum/quirk/social_anxiety/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER @@ -27,48 +44,33 @@ if(HAS_TRAIT(source, TRAIT_SIGN_LANG)) // No modifiers for signers, so you're less anxious when you go non-verbal return - var/moodmod - if(quirk_holder.mob_mood) - moodmod = (1+0.02*(50-(max(50, quirk_holder.mob_mood.mood_level*(7-quirk_holder.mob_mood.sanity_level))))) //low sanity levels are better, they max at 6 - else - moodmod = (1+0.02*(50-(max(50, 0.1*quirk_holder.nutrition)))) - var/nearby_people = 0 - for(var/mob/living/carbon/human/H in oview(3, quirk_holder)) - if(H.client) - nearby_people++ + var/moodmod = calculate_mood_mod() var/message = speech_args[SPEECH_MESSAGE] if(message) var/list/message_split = splittext(message, " ") var/list/new_message = list() - var/mob/living/carbon/human/quirker = quirk_holder for(var/word in message_split) - if(prob(max(5,(nearby_people*12.5*moodmod))) && word != message_split[1]) //Minimum 1/20 chance of filler + if(prob(max(5, moodmod)) && word != message_split[1]) //Minimum 1/20 chance of filler new_message += pick("uh,","erm,","um,") - if(prob(min(5,(0.05*(nearby_people*12.5)*moodmod)))) //Max 1 in 20 chance of cutoff after a successful filler roll, for 50% odds in a 15 word sentence - quirker.set_silence_if_lower(6 SECONDS) - to_chat(quirker, span_danger("You feel self-conscious and stop talking. You need a moment to recover!")) + if(prob(min(5, moodmod))) //Max 1 in 20 chance of cutoff after a successful filler roll, for 50% odds in a 15 word sentence + quirk_holder.set_silence_if_lower(6 SECONDS) + to_chat(quirk_holder, span_danger("You feel self-conscious and stop talking. You need a moment to recover!")) break - if(prob(max(5,(nearby_people*12.5*moodmod)))) //Minimum 1/20 chance of stutter - // Add a short stutter, THEN treat our word - quirker.adjust_stutter(0.5 SECONDS) - var/list/message_data = quirker.treat_message(word, capitalize_message = FALSE) - new_message += message_data["message"] - else - new_message += word + new_message += word message = jointext(new_message, " ") - var/mob/living/carbon/human/quirker = quirk_holder - if(prob(min(50,(0.50*(nearby_people*12.5)*moodmod)))) //Max 50% chance of not talking + + if(prob(min(50, (0.50 * moodmod)))) //Max 50% chance of not talking if(dumb_thing) - to_chat(quirker, span_userdanger("You think of a dumb thing you said a long time ago and scream internally.")) + to_chat(quirk_holder, span_userdanger("You think of a dumb thing you said a long time ago and scream internally.")) dumb_thing = FALSE //only once per life if(prob(1)) - new/obj/item/food/spaghetti/pastatomato(get_turf(quirker)) //now that's what I call spaghetti code + new/obj/item/food/spaghetti/pastatomato(get_turf(quirk_holder)) //now that's what I call spaghetti code else to_chat(quirk_holder, span_warning("You think that wouldn't add much to the conversation and decide not to say it.")) - if(prob(min(25,(0.25*(nearby_people*12.75)*moodmod)))) //Max 25% chance of silence stacks after successful not talking roll - to_chat(quirker, span_danger("You retreat into yourself. You really don't feel up to talking.")) - quirker.set_silence_if_lower(10 SECONDS) + if(prob(min(25, (0.25 * moodmod)))) //Max 25% chance of silence stacks after successful not talking roll + to_chat(quirk_holder, span_danger("You retreat into yourself. You really don't feel up to talking.")) + quirk_holder.set_silence_if_lower(10 SECONDS) speech_args[SPEECH_MESSAGE] = pick("Uh.","Erm.","Um.") else @@ -82,7 +84,7 @@ if(prob(85) || (istype(mind_check) && mind_check.mind)) return - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), quirk_holder, span_smallnotice("You make eye contact with [A].")), 3) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), quirk_holder, span_smallnotice("You make eye contact with [A].")), 0.3 SECONDS) /datum/quirk/social_anxiety/proc/eye_contact(datum/source, mob/living/other_mob, triggering_examiner) SIGNAL_HANDLER diff --git a/code/datums/quirks/neutral_quirks/borg_ready.dm b/code/datums/quirks/neutral_quirks/borg_ready.dm new file mode 100644 index 00000000000..371e02a03c5 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/borg_ready.dm @@ -0,0 +1,14 @@ +/datum/quirk/item_quirk/borg_ready + name = "Cyborg Pre-screened dogtag" + desc = "Get pre-approved for NT's experimental Cyborg program, with a dog tag that lets medical staff know." + icon = FA_ICON_TAG + value = 0 + gain_text = span_notice("You hear a distant echo of beeps and buzzes.") + lose_text = span_danger("The distant beeping halts.") + medical_record_text = "Patient is a registered brain donor for Robotics research." + +/datum/quirk/item_quirk/borg_ready/add_unique(client/client_source) + if(is_banned_from(quirk_holder.ckey, JOB_CYBORG)) + return FALSE + var/obj/item/clothing/accessory/dogtag/borg_ready/borgtag = new(get_turf(quirk_holder)) + give_item_to_holder(borgtag, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) diff --git a/code/datums/quirks/neutral_quirks/transhumanist.dm b/code/datums/quirks/neutral_quirks/transhumanist.dm index 88923d463f6..046c2bb30f0 100644 --- a/code/datums/quirks/neutral_quirks/transhumanist.dm +++ b/code/datums/quirks/neutral_quirks/transhumanist.dm @@ -15,7 +15,7 @@ /datum/quirk/transhumanist name = "Transhumanist" - desc = "You see silicon life as the perfect lifeform and despise organic flesh. You are happier around silicons, but get frustrated when around organics. You seek to replace your fleshy limbs with their silicon counterparts. You start with a robotic limb." + desc = "You see silicon life as the perfect lifeform and despise organic flesh. You are happier around silicons, but get frustrated when around organics. You seek to replace your failing flesh with perfect silicon. You start with a robotic augmentation." icon = FA_ICON_ROBOT quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_MOODLET_BASED value = 0 @@ -29,7 +29,8 @@ /obj/item/toy/figure/borg, ) var/slot_string - var/obj/item/bodypart/old_limb + var/obj/item/old_part + /datum/quirk/transhumanist/add(client/client_source) RegisterSignal(quirk_holder, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(calculate_bodypart_score)) @@ -100,27 +101,59 @@ if(-INFINITY to 0) quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART, /datum/mood_event/very_organic) +/datum/quirk_constant_data/transhumanist + associated_typepath = /datum/quirk/transhumanist + customization_options = list(/datum/preference/choiced/trans_prosthetic) /datum/quirk/transhumanist/add_unique(client/client_source) - var/limb_type = GLOB.limb_choice_transhuman[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)] - if(isnull(limb_type)) //Client gone or they chose a random prosthetic - limb_type = GLOB.limb_choice_transhuman[pick(GLOB.limb_choice_transhuman)] + var/part_type = GLOB.part_choice_transhuman[client_source?.prefs?.read_preference(/datum/preference/choiced/trans_prosthetic)] + if(isnull(part_type)) //Client gone or they chose a random part + part_type = GLOB.part_choice_transhuman[pick(GLOB.part_choice_transhuman)] var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/bodypart/new_part = new limb_type() - - slot_string = "[new_part.plaintext_zone]" - old_limb = human_holder.return_and_replace_bodypart(new_part, special = TRUE) + var/obj/item/new_part = new part_type() + if(isbodypart(new_part)) + var/obj/item/bodypart/new_bodypart = new_part + slot_string = new_bodypart.plaintext_zone + old_part = human_holder.return_and_replace_bodypart(new_bodypart, special = TRUE) + else if(isorgan(new_part)) + var/obj/item/organ/new_organ = new_part + old_part = human_holder.get_organ_slot(new_organ.slot) + if(new_organ.Insert(human_holder, special = TRUE)) + old_part.moveToNullspace() + STOP_PROCESSING(SSobj, old_part) + slot_string = new_organ.name /datum/quirk/transhumanist/post_add() - if(slot_string) - to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a robot arm. You need to use a welding tool and cables to repair it, instead of sutures and regenerative meshes.")) + if(!slot_string) + return + if(isbodypart(old_part)) + to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a robotic limb. You need to use a welding tool and cables to repair it, instead of sutures and regenerative meshes.")) + else if (old_part.name == "eyes") + to_chat(quirk_holder, span_boldannounce("You replaced your eyes with flashlights, not cameras. You can't see a thing!")) + else if (isorgan(old_part)) + to_chat(quirk_holder, span_boldannounce("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(old_limb) - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.del_and_replace_bodypart(old_limb, special = TRUE) - old_limb = null + 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) diff --git a/code/datums/quirks/positive_quirks/settler.dm b/code/datums/quirks/positive_quirks/settler.dm index 81402c050cd..6d6dcd1f43f 100644 --- a/code/datums/quirks/positive_quirks/settler.dm +++ b/code/datums/quirks/positive_quirks/settler.dm @@ -19,7 +19,10 @@ give_item_to_holder(/obj/item/storage/box/papersack/wheat, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) give_item_to_holder(/obj/item/storage/toolbox/fishing/small, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) var/mob/living/carbon/human/human_quirkholder = quirk_holder - human_quirkholder.set_mob_height(HUMAN_HEIGHT_SHORTEST) + //SKYRAT EDIT BEGIN - This is so Teshari don't get the height decrease. + if(!isteshari(human_quirkholder)) + human_quirkholder.set_mob_height(HUMAN_HEIGHT_SHORTEST) + //SKYRAT EDIT END human_quirkholder.add_movespeed_modifier(/datum/movespeed_modifier/settler) human_quirkholder.physiology.hunger_mod *= 0.5 //good for you, shortass, you don't get hungry nearly as often diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index c13acad9f05..f1f81b521f8 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -11,10 +11,9 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) /// Builds the list of crew records for all crew members. /datum/manifest/proc/build() - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/readied_player = i + for(var/mob/dead/new_player/readied_player as anything in GLOB.new_player_list) if(readied_player.new_character) - log_manifest(readied_player.ckey,readied_player.new_character.mind,readied_player.new_character) + log_manifest(readied_player.ckey, readied_player.new_character.mind, readied_player.new_character) if(ishuman(readied_player.new_character)) inject(readied_player.new_character, readied_player.client) // SKYRAT EDIT - RP Records - ORIGINAL: inject(readied_player.new_character) CHECK_TICK @@ -104,14 +103,17 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) if(!(person.mind?.assigned_role.job_flags & JOB_CREW_MANIFEST)) return - var/assignment = person.mind.assigned_role.title + // Attempt to get assignment from ID, otherwise default to mind. + var/obj/item/card/id/id_card = person.get_idcard(hand_first = FALSE) + var/assignment = id_card?.get_trim_assignment() || person.mind.assigned_role.title + var/mutable_appearance/character_appearance = new(person.appearance) var/person_gender = "Other" if(person.gender == "male") person_gender = "Male" if(person.gender == "female") person_gender = "Female" - var/datum/dna/record_dna = new() + var/datum/dna/stored/record_dna = new() person.dna.copy_dna(record_dna) // SKYRAT EDIT ADDITION BEGIN - ALTERNATIVE_JOB_TITLES @@ -164,8 +166,6 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) // SKYRAT EDIT END ) - return - /// Edits the rank and trim of the found record. /datum/manifest/proc/modify(name, assignment, trim) var/datum/record/crew/target = find_record(name) @@ -175,6 +175,22 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) target.rank = assignment target.trim = trim +/** + * Using the name to find the record, and person in reference to the body, we recreate photos for the manifest (and records). + * Args: + * - name - The name of the record we're looking for, which should be the name of the person. + * - person - The mob we're taking pictures of to update the records. + * - add_height_chart - If we should add a height chart to the background of the photo. + */ +/datum/manifest/proc/change_pictures(name, mob/living/person, add_height_chart = FALSE) + var/datum/record/crew/target = find_record(name) + if(!target) + return FALSE + + target.character_appearance = new(person.appearance) + target.recreate_manifest_photos(add_height_chart) + return TRUE + /datum/manifest/ui_state(mob/user) return GLOB.always_state diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm index 276865115e4..cf10e62bdcd 100644 --- a/code/datums/records/record.dm +++ b/code/datums/records/record.dm @@ -84,6 +84,9 @@ /// Current arrest status var/wanted_status = WANTED_NONE + ///Photo used for records, which we store here so we don't have to constantly make more of. + var/list/obj/item/photo/record_photos + /datum/record/crew/New( age = 18, blood_type = "?", @@ -134,6 +137,7 @@ /datum/record/crew/Destroy() GLOB.manifest.general -= src + QDEL_LAZYLIST(record_photos) return ..() /** @@ -184,6 +188,20 @@ /datum/record/crew/proc/get_side_photo() return get_photo("photo_side", WEST) +/// A helper proc to recreate all photos of a character from the record. +/datum/record/crew/proc/recreate_manifest_photos(add_height_chart) + delete_photos("photo_front") + make_photo("photo_front", SOUTH, add_height_chart) + delete_photos("photo_side") + make_photo("photo_side", WEST, add_height_chart) + +///Deletes the existing photo for field_name +/datum/record/crew/proc/delete_photos(field_name) + var/obj/item/photo/existing_photo = LAZYACCESS(record_photos, field_name) + if(existing_photo) + qdel(existing_photo) + LAZYREMOVE(record_photos, field_name) + /** * You shouldn't be calling this directly, use `get_front_photo()` or `get_side_photo()` * instead. @@ -202,18 +220,29 @@ * Returns an empty `/icon` if there was no `character_appearance` entry in the `fields` list, * returns the generated/cached photo otherwise. */ -/datum/record/crew/proc/get_photo(field_name, orientation) +/datum/record/crew/proc/get_photo(field_name, orientation = SOUTH) if(!field_name) return - if(!character_appearance) return new /icon() + var/obj/item/photo/existing_photo = LAZYACCESS(record_photos, field_name) + if(!existing_photo) + existing_photo = make_photo(field_name, orientation) + return existing_photo +/** + * make_photo + * + * Called if the person doesn't already have a photo, this will make a photo of the person, + * then make a picture out of it, then finally create a new photo. + */ +/datum/record/crew/proc/make_photo(field_name, orientation, add_height_chart) var/icon/picture_image if(!isicon(character_appearance)) var/mutable_appearance/appearance = character_appearance appearance.setDir(orientation) - + if(add_height_chart) + appearance.underlays += mutable_appearance('icons/obj/machines/photobooth.dmi', "height_chart", alpha = 125, appearance_flags = RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM) picture_image = getFlatIcon(appearance) else picture_image = character_appearance @@ -223,9 +252,10 @@ picture.picture_desc = "This is [name]." picture.picture_image = picture_image - var/obj/item/photo/photo = new(null, picture) - field_name = photo - return photo + var/obj/item/photo/new_photo = new(null, picture) + + LAZYSET(record_photos, field_name, new_photo) + return new_photo /// Returns a paper printout of the current record's crime data. /datum/record/crew/proc/get_rapsheet(alias, header = "Rapsheet", description = "No further details.") diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index 452d8bf3578..6093ff10205 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -13,62 +13,62 @@ // above ground only /datum/map_template/ruin/icemoon/gas - name = "Lizard Gas Station" + name = "Ice-Ruin Lizard Gas Station" id = "lizgasruin" description = "A gas station. It appears to have been recently open and is in mint condition." suffix = "icemoon_surface_gas.dmm" /datum/map_template/ruin/icemoon/lust - name = "Ruin of Lust" + name = "Ice-Ruin Ruin of Lust" id = "lust" description = "Not exactly what you expected." suffix = "icemoon_surface_lust.dmm" /datum/map_template/ruin/icemoon/asteroid - name = "Asteroid Site" + name = "Ice-Ruin Asteroid Site" id = "asteroidsite" description = "Surprised to see us here?" suffix = "icemoon_surface_asteroid.dmm" /datum/map_template/ruin/icemoon/engioutpost - name = "Engineer Outpost" + name = "Ice-Ruin Engineer Outpost" id = "engioutpost" description = "Blown up by an unfortunate accident." suffix = "icemoon_surface_engioutpost.dmm" /datum/map_template/ruin/icemoon/fountain - name = "Fountain Hall" + name = "Ice-Ruin Fountain Hall" id = "ice_fountain" description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented." prefix = "_maps/RandomRuins/AnywhereRuins/" suffix = "fountain_hall.dmm" /datum/map_template/ruin/icemoon/abandoned_homestead - name = "Abandoned Homestead" + name = "Ice-Ruin Abandoned Homestead" id = "abandoned_homestead" description = "This homestead was once host to a happy homesteading family. It's now host to hungry bears." suffix = "icemoon_underground_abandoned_homestead.dmm" /datum/map_template/ruin/icemoon/entemology - name = "Insect Research Station" + name = "Ice-Ruin Insect Research Station" id = "bug_habitat" description = "An independently funded research outpost, long abandoned. Their mission, to boldly go where no insect life would ever live, ever, and look for bugs." suffix = "icemoon_surface_bughabitat.dmm" /datum/map_template/ruin/icemoon/pizza - name = "Moffuchi's Pizzeria" + name = "Ice-Ruin Moffuchi's Pizzeria" id = "pizzeria" description = "Moffuchi's Family Pizzeria chain has a reputation for providing affordable artisanal meals of questionable edibility. This particular pizzeria seems to have been abandoned for some time." suffix = "icemoon_surface_pizza.dmm" /datum/map_template/ruin/icemoon/frozen_phonebooth - name = "Frozen Phonebooth" + name = "Ice-Ruin Frozen Phonebooth" id = "frozen_phonebooth" description = "A venture by nanotrasen to help popularize the use of holopads. This one was sent to a icemoon." suffix = "icemoon_surface_phonebooth.dmm" /datum/map_template/ruin/icemoon/smoking_room - name = "Smoking Room" + name = "Ice-Ruin Smoking Room" id = "smoking_room" description = "Here lies Charles Morlbaro. He died the way he lived." suffix = "icemoon_surface_smoking_room.dmm" @@ -76,7 +76,7 @@ // above and below ground together /* SKYRAT EDIT REMOVAL - Mapping /datum/map_template/ruin/icemoon/mining_site - name = "Mining Site" + name = "Ice-Ruin Mining Site" id = "miningsite" description = "Ruins of a site where people once mined with primitive tools for ore." suffix = "icemoon_surface_mining_site.dmm" @@ -84,7 +84,7 @@ always_spawn_with = list(/datum/map_template/ruin/icemoon/underground/mining_site_below = PLACE_BELOW) /datum/map_template/ruin/icemoon/underground/mining_site_below - name = "Mining Site Underground" + name = "Ice-Ruin Mining Site Underground" id = "miningsite-underground" description = "Who knew ladders could be so useful?" suffix = "icemoon_underground_mining_site.dmm" @@ -94,60 +94,60 @@ // below ground only /datum/map_template/ruin/icemoon/underground - name = "underground ruin" + name = "Ice-Ruin underground ruin" ruin_type = ZTRAIT_ICE_RUINS_UNDERGROUND default_area = /area/icemoon/underground/unexplored /datum/map_template/ruin/icemoon/underground/abandonedvillage - name = "Abandoned Village" + name = "Ice-Ruin Abandoned Village" id = "abandonedvillage" description = "Who knows what lies within?" suffix = "icemoon_underground_abandoned_village.dmm" /datum/map_template/ruin/icemoon/underground/library - name = "Buried Library" + name = "Ice-Ruin Buried Library" id = "buriedlibrary" description = "A once grand library, now lost to the confines of the Ice Moon." suffix = "icemoon_underground_library.dmm" /datum/map_template/ruin/icemoon/underground/wrath - name = "Ruin of Wrath" + name = "Ice-Ruin Ruin of Wrath" id = "wrath" description = "You'll fight and fight and just keep fighting." suffix = "icemoon_underground_wrath.dmm" /datum/map_template/ruin/icemoon/underground/hermit - name = "Frozen Shack" + name = "Ice-Ruin Frozen Shack" id = "hermitshack" description = "A place of shelter for a lone hermit, scraping by to live another day." suffix = "icemoon_underground_hermit.dmm" /datum/map_template/ruin/icemoon/underground/lavaland - name = "Lavaland Site" + name = "Ice-Ruin Lavaland Site" id = "lavalandsite" description = "I guess we never really left you huh?" suffix = "icemoon_underground_lavaland.dmm" /datum/map_template/ruin/icemoon/underground/puzzle - name = "Ancient Puzzle" + name = "Ice-Ruin Ancient Puzzle" id = "puzzle" description = "Mystery to be solved." suffix = "icemoon_underground_puzzle.dmm" /datum/map_template/ruin/icemoon/underground/bathhouse - name = "Bath House" + name = "Ice-Ruin Bath House" id = "bathhouse" description = "A warm, safe place." suffix = "icemoon_underground_bathhouse.dmm" /datum/map_template/ruin/icemoon/underground/wendigo_cave - name = "Wendigo Cave" + name = "Ice-Ruin Wendigo Cave" id = "wendigocave" description = "Into the jaws of the beast." suffix = "icemoon_underground_wendigo_cave.dmm" /datum/map_template/ruin/icemoon/underground/free_golem - name = "Free Golem Ship" + name = "Ice-Ruin Free Golem Ship" id = "golem-ship" description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ Seem very intent on research and individual liberty, and also geology-based naming?" @@ -155,33 +155,33 @@ suffix = "golem_ship.dmm" /datum/map_template/ruin/icemoon/underground/mailroom - name = "Frozen-over Post Office" + name = "Ice-Ruin Frozen-over Post Office" id = "mailroom" description = "This is where all of your paychecks went. Signed, the management." suffix = "icemoon_underground_mailroom.dmm" /datum/map_template/ruin/icemoon/underground/frozen_comms - name = "Frozen Communicatons Outpost" + name = "Ice-Ruin Frozen Communicatons Outpost" id = "frozen_comms" description = "3 Peaks Radio, where the 2000's live forever." suffix = "icemoon_underground_frozen_comms.dmm" //TODO: Bottom-Level ONLY Spawns after Refactoring Related Code /datum/map_template/ruin/icemoon/underground/plasma_facility - name = "Abandoned Plasma Facility" + name = "Ice-Ruin Abandoned Plasma Facility" id = "plasma_facility" description = "Rumors have developed over the many years of Freyja plasma mining. These rumors suggest that the ghosts of dead mistreated excavation staff have returned to \ exact revenge on their (now former) employers. Coorperate reminds all staff that rumors are just that: Old Housewife tales meant to scare misbehaving kids to bed." suffix = "icemoon_underground_abandoned_plasma_facility.dmm" /datum/map_template/ruin/icemoon/underground/hotsprings - name = "Hot Springs" + name = "Ice-Ruin Hot Springs" id = "hotsprings" description = "Just relax and take a dip, nothing will go wrong, I swear!" suffix = "icemoon_underground_hotsprings.dmm" /datum/map_template/ruin/icemoon/underground/vent - name = "Icemoon Ore Vent" + name = "Ice-Ruin Icemoon Ore Vent" id = "ore_vent_i" description = "A vent that spews out ore. Seems to be a natural phenomenon." //Make this a subtype that only spawns medium and large vents. Some smalls will go to the top level. suffix = "icemoon_underground_ore_vent.dmm" @@ -191,7 +191,7 @@ always_place = TRUE /datum/map_template/ruin/icemoon/ruin/vent - name = "Surface Icemoon Ore Vent" + name = "Ice-Ruin Surface Icemoon Ore Vent" id = "ore_vent_i" description = "A vent that spews out ore. Seems to be a natural phenomenon. Smaller than the underground ones." suffix = "icemoon_surface_ore_vent.dmm" diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index f66d06a4bba..776fd3b1e8c 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -10,27 +10,34 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/biodome/beach - name = "Biodome Beach" + name = "Lava-Ruin Biodome Beach" id = "biodome-beach" description = "Seemingly plucked from a tropical destination, this beach is calm and cool, with the salty waves roaring softly in the background. \ Comes with a rustic wooden bar and suicidal bartender." suffix = "lavaland_biodome_beach.dmm" /datum/map_template/ruin/lavaland/biodome/winter - name = "Biodome Winter" + name = "Lava-Ruin Biodome Winter" id = "biodome-winter" description = "For those getaways where you want to get back to nature, but you don't want to leave the fortified military compound where you spend your days. \ Includes a unique(*) laser pistol display case, and the recently introduced I.C.E(tm)." suffix = "lavaland_surface_biodome_winter.dmm" /datum/map_template/ruin/lavaland/biodome/clown - name = "Biodome Clown Planet" + name = "Lava-Ruin Biodome Clown Planet" id = "biodome-clown" description = "WELCOME TO CLOWN PLANET! HONK HONK HONK etc.!" suffix = "lavaland_biodome_clown_planet.dmm" +/datum/map_template/ruin/lavaland/lizgas + name = "The Lizard's Gas(Lava)" + id = "lizgas2" + description = "A recently opened gas station from the Lizard's Gas franchise." + suffix = "lavaland_surface_gas.dmm" + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/cube - name = "The Wishgranter Cube" + name = "Lava-Ruin The Wishgranter Cube" id = "wishgranter-cube" description = "Nothing good can come from this. Learn from their mistakes and turn around." suffix = "lavaland_surface_cube.dmm" @@ -38,7 +45,7 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/seed_vault - name = "Seed Vault" + name = "Lava-Ruin Seed Vault" id = "seed-vault" description = "The creators of these vaults were a highly advanced and benevolent race, and launched many into the stars, hoping to aid fledgling civilizations. \ However, all the inhabitants seem to do is grow drugs and guns." @@ -47,7 +54,7 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/ash_walker - name = "Ash Walker Nest" + name = "Lava-Ruin Ash Walker Nest" id = "ash-walker" description = "A race of unbreathing lizards live here, that run faster than a human can, worship a broken dead city, and are capable of reproducing by something involving tentacles? \ Probably best to stay clear." @@ -58,7 +65,7 @@ //SKYRAT EDIT REMOVAL BEGIN - MAPPING /* /datum/map_template/ruin/lavaland/syndicate_base - name = "Syndicate Lava Base" + name = "Lava-Ruin Syndicate Lava Base" id = "lava-base" description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents." suffix = "lavaland_surface_syndicate_base1.dmm" @@ -67,7 +74,7 @@ */ //SKYRAT EDIT REMOVAL END /datum/map_template/ruin/lavaland/free_golem - name = "Free Golem Ship" + name = "Lava-Ruin Free Golem Ship" id = "golem-ship" description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ Seem very intent on research and individual liberty, and also geology-based naming?" @@ -77,7 +84,7 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/gaia - name = "Patch of Eden" + name = "Lava-Ruin Patch of Eden" id = "gaia" description = "Who would have thought that such a peaceful place could be on such a horrific planet?" cost = 5 @@ -89,32 +96,32 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/sin/envy - name = "Ruin of Envy" + name = "Lava-Ruin Ruin of Envy" id = "envy" description = "When you get what they have, then you'll finally be happy." suffix = "lavaland_surface_envy.dmm" /datum/map_template/ruin/lavaland/sin/gluttony - name = "Ruin of Gluttony" + name = "Lava-Ruin Ruin of Gluttony" id = "gluttony" description = "If you eat enough, then eating will be all that you do." suffix = "lavaland_surface_gluttony.dmm" /datum/map_template/ruin/lavaland/sin/greed - name = "Ruin of Greed" + name = "Lava-Ruin Ruin of Greed" id = "greed" description = "Sure you don't need magical powers, but you WANT them, and \ that's what's important." suffix = "lavaland_surface_greed.dmm" /datum/map_template/ruin/lavaland/sin/pride - name = "Ruin of Pride" + name = "Lava-Ruin Ruin of Pride" id = "pride" description = "Wormhole lifebelts are for LOSERS, whom you are better than." suffix = "lavaland_surface_pride.dmm" /datum/map_template/ruin/lavaland/sin/sloth - name = "Ruin of Sloth" + name = "Lava-Ruin Ruin of Sloth" id = "sloth" description = "..." suffix = "lavaland_surface_sloth.dmm" @@ -122,7 +129,7 @@ cost = 0 /datum/map_template/ruin/lavaland/ratvar - name = "Dead God" + name = "Lava-Ruin Dead God" id = "ratvar" description = "Ratvar's final resting place." suffix = "lavaland_surface_dead_ratvar.dmm" @@ -130,7 +137,7 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/hierophant - name = "Hierophant's Arena" + name = "Lava-Ruin Hierophant's Arena" id = "hierophant" description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares." suffix = "lavaland_surface_hierophant.dmm" @@ -138,7 +145,7 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/blood_drunk_miner - name = "Blood-Drunk Miner" + name = "Lava-Ruin Blood-Drunk Miner" id = "blooddrunk" description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them." suffix = "lavaland_surface_blooddrunk1.dmm" @@ -146,15 +153,15 @@ allow_duplicates = FALSE //will only spawn one variant of the ruin /datum/map_template/ruin/lavaland/blood_drunk_miner/guidance - name = "Blood-Drunk Miner (Guidance)" + name = "Lava-Ruin Blood-Drunk Miner (Guidance)" suffix = "lavaland_surface_blooddrunk2.dmm" /datum/map_template/ruin/lavaland/blood_drunk_miner/hunter - name = "Blood-Drunk Miner (Hunter)" + name = "Lava-Ruin Blood-Drunk Miner (Hunter)" suffix = "lavaland_surface_blooddrunk3.dmm" /datum/map_template/ruin/lavaland/blood_drunk_miner/random - name = "Blood-Drunk Miner (Random)" + name = "Lava-Ruin Blood-Drunk Miner (Random)" suffix = null always_place = TRUE @@ -163,14 +170,14 @@ return ..() /datum/map_template/ruin/lavaland/ufo_crash - name = "UFO Crash" + name = "Lava-Ruin UFO Crash" id = "ufo-crash" description = "Turns out that keeping your abductees unconscious is really important. Who knew?" suffix = "lavaland_surface_ufo_crash.dmm" cost = 5 /datum/map_template/ruin/lavaland/xeno_nest - name = "Xenomorph Nest" + name = "Lava-Ruin Xenomorph Nest" id = "xeno-nest" description = "These xenomorphs got bored of horrifically slaughtering people on space stations, and have settled down on a nice lava-filled hellscape to focus on what's really important in life. \ Quality memes." @@ -178,7 +185,7 @@ cost = 20 /datum/map_template/ruin/lavaland/fountain - name = "Fountain Hall" + name = "Lava-Ruin Fountain Hall" id = "lava_fountain" description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented." prefix = "_maps/RandomRuins/AnywhereRuins/" @@ -186,14 +193,14 @@ cost = 5 /datum/map_template/ruin/lavaland/survivalcapsule - name = "Survival Capsule Ruins" + name = "Lava-Ruin Survival Capsule Ruins" id = "survivalcapsule" description = "What was once sanctuary to the common miner, is now their tomb." suffix = "lavaland_surface_survivalpod.dmm" cost = 5 /datum/map_template/ruin/lavaland/pizza - name = "Ruined Pizza Party" + name = "Lava-Ruin Ruined Pizza Party" id = "pizza" description = "Little Timmy's birthday pizza bash took a turn for the worse when a bluespace anomaly passed by." suffix = "lavaland_surface_pizzaparty.dmm" @@ -201,7 +208,7 @@ cost = 5 /datum/map_template/ruin/lavaland/cultaltar - name = "Summoning Ritual" + name = "Lava-Ruin Summoning Ritual" id = "cultaltar" description = "A place of vile worship, the scrawling of blood in the middle glowing eerily. A demonic laugh echoes throughout the caverns." suffix = "lavaland_surface_cultaltar.dmm" @@ -209,7 +216,7 @@ cost = 10 /datum/map_template/ruin/lavaland/hermit - name = "Makeshift Shelter" + name = "Lava-Ruin Makeshift Shelter" id = "hermitcave" description = "A place of shelter for a lone hermit, scraping by to live another day." suffix = "lavaland_surface_hermit.dmm" @@ -217,7 +224,7 @@ cost = 10 /datum/map_template/ruin/lavaland/miningripley - name = "Ripley" + name = "Lava-Ruin Ripley" id = "ripley" description = "A heavily-damaged mining ripley, property of a very unfortunate miner. You might have to do a bit of work to fix this thing up." suffix = "lavaland_surface_random_ripley.dmm" @@ -225,14 +232,14 @@ cost = 5 /datum/map_template/ruin/lavaland/dark_wizards - name = "Dark Wizard Altar" + name = "Lava-Ruin Dark Wizard Altar" id = "dark_wizards" description = "A ruin with dark wizards. What secret do they guard?" suffix = "lavaland_surface_wizard.dmm" cost = 5 /datum/map_template/ruin/lavaland/strong_stone - name = "Strong Stone" + name = "Lava-Ruin Strong Stone" id = "strong_stone" description = "A stone that seems particularly powerful." suffix = "lavaland_strong_rock.dmm" @@ -240,14 +247,14 @@ cost = 2 /datum/map_template/ruin/lavaland/puzzle - name = "Ancient Puzzle" + name = "Lava-Ruin Ancient Puzzle" id = "puzzle" description = "Mystery to be solved." suffix = "lavaland_surface_puzzle.dmm" cost = 5 /datum/map_template/ruin/lavaland/elite_tumor - name = "Pulsating Tumor" + name = "Lava-Ruin Pulsating Tumor" id = "tumor" description = "A strange tumor which houses a powerful beast..." suffix = "lavaland_surface_elite_tumor.dmm" @@ -256,7 +263,7 @@ allow_duplicates = TRUE /datum/map_template/ruin/lavaland/elephant_graveyard - name = "Elephant Graveyard" + name = "Lava-Ruin Elephant Graveyard" id = "Graveyard" description = "An abandoned graveyard, calling to those unable to continue." suffix = "lavaland_surface_elephant_graveyard.dmm" @@ -264,7 +271,7 @@ cost = 10 /datum/map_template/ruin/lavaland/bileworm_nest - name = "Bileworm Nest" + name = "Lava-Ruin Bileworm Nest" id = "bileworm_nest" description = "A small sanctuary from the harsh wilderness... if you're a bileworm, that is." cost = 5 @@ -272,7 +279,7 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/lava_phonebooth - name = "Phonebooth" + name = "Lava-Ruin Phonebooth" id = "lava_phonebooth" description = "A venture by nanotrasen to help popularize the use of holopads. This one somehow made its way here." suffix = "lavaland_surface_phonebooth.dmm" @@ -280,7 +287,7 @@ cost = 5 /datum/map_template/ruin/lavaland/battle_site - name = "Battle Site" + name = "Lava-Ruin Battle Site" id = "battle_site" description = "The long past site of a battle between beast and humanoids. The victor is unknown, but the losers are clear." suffix = "lavaland_battle_site.dmm" @@ -288,7 +295,7 @@ cost = 3 /datum/map_template/ruin/lavaland/vent - name = "Ore Vent" + name = "Lava-Ruin Ore Vent" id = "ore_vent" description = "A vent that spews out ore. Seems to be a natural phenomenon." suffix = "lavaland_surface_ore_vent.dmm" @@ -298,7 +305,7 @@ always_place = TRUE /datum/map_template/ruin/lavaland/watcher_grave - name = "Watchers' Grave" + name = "Lava-Ruin Watchers' Grave" id = "watcher-grave" description = "A lonely cave where an orphaned child awaits a new parent." suffix = "lavaland_surface_watcher_grave.dmm" @@ -306,7 +313,7 @@ allow_duplicates = FALSE /datum/map_template/ruin/lavaland/mook_village - name = "Mook Village" + name = "Lava-Ruin Mook Village" id = "mook_village" description = "A village hosting a community of friendly mooks!" suffix = "lavaland_surface_mookvillage.dmm" diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 545414ab8e4..982fdaf8477 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -10,65 +10,65 @@ /datum/map_template/ruin/space/zoo id = "zoo" suffix = "abandonedzoo.dmm" - name = "Biological Storage Facility" + name = "Space-Ruin Biological Storage Facility" description = "In case society crumbles, we will be able to restore our zoos to working order with the breeding stock kept in these 100% secure and unbreachable storage facilities. \ At no point has anything escaped. That's our story, and we're sticking to it." /datum/map_template/ruin/space/asteroid1 id = "asteroid1" suffix = "asteroid1.dmm" - name = "Asteroid 1" + name = "Space-Ruin Asteroid 1" description = "I-spy with my little eye, something beginning with R." /datum/map_template/ruin/space/asteroid2 id = "asteroid2" suffix = "asteroid2.dmm" - name = "Asteroid 2" + name = "Space-Ruin Asteroid 2" description = "Oh my god, a giant rock!" /datum/map_template/ruin/space/asteroid3 id = "asteroid3" suffix = "asteroid3.dmm" - name = "Asteroid 3" + name = "Space-Ruin Asteroid 3" description = "This asteroid floating in space has no official designation, because the scientist that discovered it deemed it 'super dull'." /datum/map_template/ruin/space/asteroid4 id = "asteroid4" suffix = "asteroid4.dmm" - name = "Asteroid 4" + name = "Space-Ruin Asteroid 4" description = "Nanotrasen Escape Pods have a 100%* success rate, and a 99%* customer satisfaction rate. \ *Please note that these statistics are taken from pods that have successfully docked with a recovery vessel." /datum/map_template/ruin/space/asteroid5 id = "asteroid5" suffix = "asteroid5.dmm" - name = "Asteroid 5" + name = "Space-Ruin Asteroid 5" description = "Oh my god, another giant rock!" /datum/map_template/ruin/space/asteroid6 id = "asteroid6" suffix = "asteroid6.dmm" - name = "Asteroid 6" + name = "Space-Ruin Asteroid 6" description = "This asteroid has brittle bone disease, so it is fortunate asteroids dont have bones." /datum/map_template/ruin/space/deep_storage id = "deep-storage" suffix = "deepstorage.dmm" - name = "Survivalist Bunker" + name = "Space-Ruin Survivalist Bunker" description = "Assume the best, prepare for the worst. Generally, you should do so by digging a three-man heavily fortified bunker into a giant unused asteroid. \ Then make it self sufficient, mask any evidence of construction, hook it covertly into the telecommunications network and hope for the best." /datum/map_template/ruin/space/bigderelict1 id = "bigderelict1" suffix = "bigderelict1.dmm" - name = "Derelict Tradepost" + name = "Space-Ruin Derelict Tradepost" description = "A once-bustling tradestation that handled imports and exports from nearby stations now lays eerily dormant. \ The last received message was a distress call from one of the on-board officers, but we had no success in making contact again." /datum/map_template/ruin/space/derelict_construction id = "derelict_construction" suffix = "derelict_construction.dmm" - name = "Derelict Construction" + name = "Space-Ruin Derelict Construction" description = "Construction supplies are in high demand due to non-trivial damage routinely sustained by most space stations in this sector. \ Space pirates who dont attempt to rob corporate research stations with only 3 collaborators live long enough to sell captured construction \ equipment back to the highest bidder." @@ -76,14 +76,14 @@ /datum/map_template/ruin/space/derelict_sulaco id = "derelict_sulaco" suffix = "derelict_sulaco.dmm" - name = "Derelict Sulaco" + name = "Space-Ruin Derelict Sulaco" description = "Nothing to see here citizen, move along, certainly no xeno outbreaks here. That purple stuff? It's uh... space nectar... but don't eat it! \ It's the bridge of a top secret military ship." /datum/map_template/ruin/space/derelict2 id = "derelict2" suffix = "derelict2.dmm" - name = "Dinner for Two" + name = "Space-Ruin Dinner for Two" description = "Oh this is the night\n\ It's a beautiful night\n\ And we call it bella notte" @@ -91,161 +91,161 @@ /datum/map_template/ruin/space/derelict3 id = "derelict3" suffix = "derelict3.dmm" - name = "Derelict 3" + name = "Space-Ruin Derelict 3" description = "These hulks were once part of a larger structure, where the three great \[REDACTED\] were forged." /datum/map_template/ruin/space/derelict4 id = "derelict4" suffix = "derelict4.dmm" - name = "Derelict 4" + name = "Space-Ruin Derelict 4" description = "CentCom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \ information in the name of this baseless witchhunt." /datum/map_template/ruin/space/derelict5 id = "derelict5" suffix = "derelict5.dmm" - name = "Derelict 5" + name = "Space-Ruin Derelict 5" description = "The plan is, we put a whole bunch of crates full of treasure in this disused warehouse, launch it into space, and then ignore it. Forever." /datum/map_template/ruin/space/derelict6 id = "derelict6" suffix = "derelict6.dmm" - name = "Derelict 6" + name = "Space-Ruin Derelict 6" description = "The hush-hush of Nanotrasen when it comes to stations seemingly vanishing off the radar is an interesting topic, theories of nuclear destruction float about while Nanotrasen \ flat-out denies said stations ever existing." /datum/map_template/ruin/space/derelict7 id = "derelict7" suffix = "derelict7.dmm" - name = "Derelict 7" + name = "Space-Ruin Derelict 7" description = "The official report says there was a 'huge explosion' which was 'radical' and 'tubular'. Nothing is said about the explosion's cause." /datum/map_template/ruin/space/derelict8 id = "derelict8" suffix = "derelict8.dmm" - name = "Derelict 8" + name = "Space-Ruin Derelict 8" description = "An auxiliary storage bay might be the least respected room on any functional station, but studies show they are the least likely to be hit in an artillery strike." /datum/map_template/ruin/space/derelict9 id = "derelict9" suffix = "derelict9.dmm" - name = "Derelict 9" + name = "Space-Ruin Derelict 9" description = "Someone already found this high-security supply cache already, but were unable to get inside. Perhaps the next visitor will have more luck." /datum/map_template/ruin/space/empty_shell id = "empty-shell" suffix = "emptyshell.dmm" - name = "Empty Shell" + name = "Space-Ruin Empty Shell" description = "Cosy, rural property available for young professional couple. Only twelve parsecs from the nearest hyperspace lane!" /datum/map_template/ruin/space/the_lizards_gas id = "the-lizards-gas" suffix = "thelizardsgas.dmm" - name = "The Lizard's Gas" + name = "Space-Ruin The Lizard's Gas" description = "A refueling station stocked with enough plasma for any space-worthy vessel. Well, maybe if it weren't 50 years ago." /datum/map_template/ruin/space/intact_empty_ship id = "intact-empty-ship" suffix = "intactemptyship.dmm" - name = "Authorship" + name = "Space-Ruin Authorship" description = "Just somewhere quiet, where I can focus on my work with no interruptions." /datum/map_template/ruin/space/caravanambush id = "caravanambush" suffix = "caravanambush.dmm" - name = "Syndicate Ambush" + name = "Space-Ruin Syndicate Ambush" description = "A caravan route used by passing cargo freights has been ambushed by a salvage team manned by the syndicate. \ The caravan managed to send off a distress message before being surrounded, their video feed cutting off as the sound of gunfire and a parrot was heard." /datum/map_template/ruin/space/originalcontent id = "paperwizard" suffix = "originalcontent.dmm" - name = "A Giant Ball of Paper in Space" + name = "Space-Ruin A Giant Ball of Paper in Space" description = "Sightings of a giant wad of paper hurling through the depths of space have been recently reported by multiple outposts near this sector. \ A giant wad of paper, really? Damn prank callers." /datum/map_template/ruin/space/mech_transport id = "mech-transport" suffix = "mechtransport.dmm" - name = "CF Corsair" + name = "Space-Ruin CF Corsair" description = "Well, when is it getting here? I have bills to pay; very well-armed clients who want their shipments as soon as possible! I don't care, just find it!" /datum/map_template/ruin/space/onehalf id = "onehalf" suffix = "onehalf.dmm" - name = "DK Excavator 453" + name = "Space-Ruin DK Excavator 453" description = "Based on the trace elements we've detected on the gutted asteroids, we suspect that a mining ship using a restricted engine is somewhere in the area. \ We'd like to request a patrol vessel to investigate." /datum/map_template/ruin/space/spacehotel id = "spacehotel" suffix = "spacehotel_skyrat.dmm" // SKYRAT EDIT CHANGE - ORIGINAL: suffix = "spacehotel.dmm" - name = "The Twin-Nexus Hotel" + name = "Space-Ruin The Twin-Nexus Hotel" description = "An interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residental staff will not murder them in their sleep. Probably." /datum/map_template/ruin/space/turreted_outpost id = "turreted-outpost" suffix = "turretedoutpost.dmm" - name = "Unnamed Turreted Outpost" + name = "Space-Ruin Unnamed Turreted Outpost" description = "We'd ask them to stop blaring that ruskiepop music, but none of us are brave enough to go near those death turrets they have." /datum/map_template/ruin/space/oldshuttle id = "spaceman-origins" suffix = "shuttlerelic.dmm" - name = "Strange Ship" + name = "Space-Ruin Strange Ship" description = "A ship seemingly lost, drifting along the stars. This thing looks like it belongs in ancient times." /datum/map_template/ruin/space/way_home id = "way-home" suffix = "way_home.dmm" - name = "Salvation" + name = "Space-Ruin Salvation" description = "In the darkest times, we will find our way home." /datum/map_template/ruin/space/djstation id = "djstation" suffix = "dj_station.dmm" - name = "DJ Station" + name = "Space-Ruin DJ Station" description = "Until very recently this pirate radio station was used to harangue local space stations over a variety of perceived \"ethics violations\". \ It seems like someone finally got sick of it, but the equipment still works." /datum/map_template/ruin/space/thederelict id = "thederelict" suffix = "russian_derelict.dmm" - name = "Kosmicheskaya Stantsiya 13" + name = "Space-Ruin Kosmicheskaya Stantsiya 13" description = "The true fate of Kosmicheskaya Stantsiya 13 is an open question to this day. Most corporations deny its existence, for fear of questioning on what became of its crew." /datum/map_template/ruin/space/abandonedteleporter id = "abandonedteleporter" suffix = "abandonedteleporter.dmm" - name = "Abandoned Teleporter" + name = "Space-Ruin Abandoned Teleporter" description = "In space construction the teleporter is often the first system brought online. \ This lonely, half-built teleporter is a sign of a proposed structure that for one reason or another just never got built." /datum/map_template/ruin/space/crashedclownship id = "crashedclownship" suffix = "crashedclownship.dmm" - name = "Crashed Clown Ship" + name = "Space-Ruin Crashed Clown Ship" description = "For centuries the promise of a new clown homeworld has been the siren call for countless clown vessels. \ Alas, the clown's lust for shenanigans means that successful voyages are almost unheard of, with most vessels falling to hilarious consequences almost immediately." /datum/map_template/ruin/space/crashedship id = "crashedship" suffix = "crashedship.dmm" - name = "Crashed Ship" + name = "Space-Ruin Crashed Ship" description = "The SSCV Atrus was chartered to survey over 600 planets in its maiden voyage. \ Hopefully the SSC is content with an indepth analysis of just this asteroid." /datum/map_template/ruin/space/listeningstation id = "listeningstation" suffix = "listeningstation.dmm" - name = "Syndicate Listening Station" + name = "Space-Ruin Syndicate Listening Station" description = "Listening stations form the backbone of the syndicate's information-gathering operations. \ Assignment to these stations is dreaded by most agents, as it entails long and lonely shifts listening to nearby stations chatter incessantly about the most meaningless things." /datum/map_template/ruin/space/old_ai_sat id = "oldAIsat" suffix = "oldAIsat.dmm" - name = "Abandoned Telecommunications Satellite" + name = "Space-Ruin Abandoned Telecommunications Satellite" description = "When the inspector told the employees that they were all fired, and that their jobs \"could be done by trained lizards anyway\", they reacted badly. \ This event and others is the reason why Central always sends an ERT squad with their competent inspectors. Incompetent inspectors are told they can \"do it alone\" because they're \"that pro\". \ Incompetent inspectors believe this." @@ -253,34 +253,34 @@ /datum/map_template/ruin/space/oldteleporter id = "oldteleporter" suffix = "oldteleporter.dmm" - name = "Detached Teleporter" + name = "Space-Ruin Detached Teleporter" description = "The structure of this surprisingly intact teleporter suggests that it was once part of a larger structure, but what remains of said structure, if anything, can only be guessed at." /datum/map_template/ruin/space/vaporwave id = "vaporwave" suffix = "vaporwave.dmm" - name = "Aesthetic Outpost" + name = "Space-Ruin Aesthetic Outpost" description = "Pause and remember-- You are unique.You are special. Every mistake, trial, and hardship has helped to sculpt your real beauty. \ Stop hating yourself and start appreciating and loving yourself!" /datum/map_template/ruin/space/bus id = "bus" suffix = "bus.dmm" - name = "Waylaid Buses" + name = "Space-Ruin Waylaid Buses" description = "There seems to be a pair of buses that pulled over for repairs. What were they doing...? Their shipment sure seems to be filled with a strange mix. \ Anyway, it looks like some people tried to fix it up for a long time but didn't really get anywhere..." /datum/map_template/ruin/space/oldstation id = "oldstation" suffix = "oldstation.dmm" - name = "Ancient Space Station" + name = "Space-Ruin Ancient Space Station" description = "The crew of a space station awaken one hundred years after a crisis. Awaking to a derelict space station on the verge of collapse, and a hostile force of invading \ hivebots. Can the surviving crew overcome the odds and survive and rebuild, or will the cold embrace of the stars become their new home?" /datum/map_template/ruin/space/gondoland id = "gondolaasteroid" suffix = "gondolaasteroid.dmm" - name = "Gondoland" + name = "Space-Ruin Gondoland" description = "Just an ordinary rock- wait, what's that thing?" // SKYRAT EDIT CHANGE START -- Reworked whiteship ruin @@ -293,46 +293,46 @@ suffix = "whiteshipruin_box.dmm"*/ id = "whiteshipruin_box_skyrat" suffix = "whiteshipruin_box_skyrat.dmm" // SKYRAT EDIT CHANGE END - name = "NT Medical Ship" + name = "Space-Ruin NT Medical Ship" description = "An ancient ship, said to be among the first discovered derelicts near Space Station 13 that was still in working order. \ Aged and deprecated by time, this relic of a vessel is now broken beyond repair." /datum/map_template/ruin/space/whiteshipdock id = "whiteshipdock" suffix = "whiteshipdock.dmm" - name = "Whiteship Dock" + name = "Space-Ruin Whiteship Dock" description = "An abandoned but functional vessel parked in deep space, ripe for the taking." /datum/map_template/ruin/space/cat_experiments id = "meow" suffix = "mrow_thats_right.dmm" - name = "Feline-Human Combination Den" + name = "Space-Ruin Feline-Human Combination Den" description = "With heated debates over the legality of the catperson and their status in the workforce, there's always a place for the blackmarket to slip in for some cash. Whether the results \ are morally sound or not is another issue entirely." /datum/map_template/ruin/space/hilbertresearchfacility id = "hilbert_facility" suffix = "hilbertresearchfacility.dmm" - name = "Hilbert Research Facility" + name = "Space-Ruin Hilbert Research Facility" description = "A research facility of great bluespace discoveries. Long since abandoned, willingly or not..." /datum/map_template/ruin/space/clownplanet id = "clownplanet" suffix = "clownplanet.dmm" - name = "Clown Planet" + name = "Space-Ruin Clown Planet" description = "Thought lost in 2552, this minor planet has recently been rediscovered." /datum/map_template/ruin/space/clericden id = "clericden" suffix = "clericden.dmm" - name = "Cleric's Den" + name = "Space-Ruin Cleric's Den" description = "Once part of a larger monastery, this holy order of long dead clerics practiced far less non-violence than they preached. Appears to have been untouched by looters, however. Odd." /* BUBBERSTATION REMOVAL ADD /datum/map_template/ruin/space/forgottenship id = "forgottenship" suffix = "forgottenship.dmm" - name = "Syndicate Forgotten Ship" + name = "Space-Ruin Syndicate Forgotten Ship" description = "Seemingly abandoned ship went of course right into NT controlled space. It seems that malfunction caused most systems to turn off, except for sleepers." BUBBERSTATION REMOVAL END */ @@ -340,181 +340,181 @@ BUBBERSTATION REMOVAL END */ /datum/map_template/ruin/space/old_syndie_infiltrator id = "old_infiltrator" suffix = "old_infiltrator.dmm" - name = "Abandoned Infiltrator" + name = "Space-Ruin Abandoned Infiltrator" description = "Only one in five Gorlex Marauder strike forces return from their regular raids into Nanotrasen space. \ For the other four... well, their ship doesn't just disappear when their target evacuates." /datum/map_template/ruin/space/hellfactory id = "hellfactory" suffix = "hellfactory.dmm" - name = "Heck Brewery" + name = "Space-Ruin Heck Brewery" description = "An abandoned warehouse and brewing facility, which has been recently rediscovered. Reports claim that the security system entered an ultra-hard lockdown, but these reports are inconclusive." /datum/map_template/ruin/space/space_billboard id = "space_billboard" suffix = "space_billboard.dmm" - name = "Space Billboard" + name = "Space-Ruin Space Billboard" description = "Frequently found alongside well-traversed sublight routes, space billboards have fallen out of favour in recent years as advertisers finally realised that people are incapable of reading billboards going by at over 2/3rds the speed of light." /datum/map_template/ruin/space/spinwardsmoothies id = "spinwardsmoothies" suffix = "spinwardsmoothies.dmm" - name = "Spinward Smoothies" + name = "Space-Ruin Spinward Smoothies" description = "A branch of the beloved Spinward Smoothies chain of smoothie bars." /datum/map_template/ruin/space/cyborg_mothership id = "cyborg_mothership" suffix = "cyborg_mothership.dmm" - name = "Cyborg Mothership" + name = "Space-Ruin Cyborg Mothership" description = "An abandoned cyborg mothership that was overtaken by space vines and hivebots. It appears that it hosted an experimental AI focused on mining before it was depowered." /datum/map_template/ruin/space/dangerous_research id = "dangerous_research" suffix = "dangerous_research.dmm" - name = "Alternate Sciences Research Center" + name = "Space-Ruin Alternate Sciences Research Center" description = "When you're messing with the occult, who knows what you're going to get?" /datum/map_template/ruin/space/anomaly_research id = "anomaly_research" suffix = "anomaly_research.dmm" - name = "Anomaly Research" + name = "Space-Ruin Anomaly Research" description = "A secret research lab embedded in arctic rock, belonging to a Dr Anna Molly. What could she have been researching?" /datum/map_template/ruin/space/meateor id = "meateor" suffix = "meateor.dmm" - name = "Meateor" + name = "Space-Ruin Meateor" description = "A big chunk of meat floating in space. How did it get there?" /datum/map_template/ruin/space/the_faceoff id = "the_faceoff" suffix = "the_faceoff.dmm" - name = "The Faceoff" + name = "Space-Ruin The Faceoff" description = "What do you get when a meeting of the enemy corporations get crashed?" /datum/map_template/ruin/space/meatstation id = "meatderelict" suffix = "meatderelict.dmm" - name = "Bioresearch Outpost" + name = "Space-Ruin Bioresearch Outpost" description = "A bioresearch experiment gone wrong." /datum/map_template/ruin/space/ghost_restaurant id = "space_ghost_restaurant.dmm" suffix = "space_ghost_restaurant.dmm" - name = "Space Ghost Restaurant" + name = "Space-Ruin Space Ghost Restaurant" description = "Ever wondered where the restaurant robots come from? On this ruined station, NTgrub interns dressed up robots in clothes, and sent them to stations to cook their meal orders for them." /datum/map_template/ruin/space/atmosasteroidruin id = "atmosasteroidruin" suffix = "atmosasteroidruin.dmm" - name = "Atmos Asteroid" + name = "Space-Ruin Atmos Asteroid" description = "A dead atmos tech in a continuously pressurizing ruin." /datum/map_template/ruin/space/massdriverrouter id = "fasttravel" suffix = "fasttravel.dmm" - name = "Mass driver Router" + name = "Space-Ruin Mass driver Router" description = "An old, still functional router for some long destroyed system." /datum/map_template/ruin/space/prey_pod id = "prey" suffix = "prey_pod.dmm" - name = "Crashed Mimic Escape Pod" + name = "Space-Ruin Crashed Mimic Escape Pod" description = "A pod with a person who has died to a mimic." /datum/map_template/ruin/space/travelers_rest id = "travelers_rest" suffix = "travelers_rest.dmm" - name = "Traveler's Rest" + name = "Space-Ruin Traveler's Rest" description = "An abandoned capsule floating through space. It seems as if somebody was in here not too long ago." /datum/map_template/ruin/space/prison_shuttle id = "prison_shuttle" suffix = "prison_shuttle.dmm" - name = "Crashed Prisoner Shuttle" + name = "Space-Ruin Crashed Prisoner Shuttle" description = "A prisoner transport shuttle that had crashed into a stray asteroid long ago." /datum/map_template/ruin/space/botanical_haven id = "botanical_haven" suffix = "botanical_haven.dmm" - name = "Botanical Haven" + name = "Space-Ruin Botanical Haven" description = "A small sanctuary for plants and botanists, hidden away in a rusted structure." /datum/map_template/ruin/space/pod_crash id = "pod_crash" suffix = "pod_crash.dmm" - name = "Pod Crash" + name = "Space-Ruin Pod Crash" description = "A tragic display of what happens to drivers who pda and pod." /datum/map_template/ruin/space/interdyne id = "interdyne" suffix = "interdyne.dmm" - name = "Interdyne Spinward Research Base" + name = "Space-Ruin Interdyne Spinward Research Base" description = "An Interdyne facility abandoned due to the accidental discovery of Romerol" /datum/map_template/ruin/space/waystation id = "waystation" suffix = "waystation.dmm" - name = "Waystation" + name = "Space-Ruin Waystation" description = "A waytation for a backwater subsector of Spinward gets attacked by the syndicate due to bad luck." /datum/map_template/ruin/space/allamericandiner id = "allamericandiner" suffix = "allamericandiner.dmm" - name = "The All-American Diner" + name = "Space-Ruin The All-American Diner" description = "A mothballed \"Restaurant\" station of the popular \"The All-American Diner\" franchise." /datum/map_template/ruin/space/mimesvclowns id = "mimesvclowns" suffix = "mimesvsclowns.dmm" - name = "Abandoned Mime Outpost" + name = "Space-Ruin Abandoned Mime Outpost" description = "When you fight mimes, you better bring more than slips." /datum/map_template/ruin/space/transit_booth id = "transit_booth" suffix = "transit_booth.dmm" - name = "Transit Booth" + name = "Space-Ruin Transit Booth" description = "Make sure to check out the duty-free store!" /datum/map_template/ruin/space/space_phonebooth id = "Space_phonebooth" suffix = "phonebooth.dmm" - name = "Space Phonebooth" + name = "Space-Ruin Phonebooth" description = "A venture by nanotrasen to help popularize the use of holopads." /datum/map_template/ruin/space/the_outlet id = "the_outlet" suffix = "the_outlet.dmm" - name = "calebs krazy clothing outlet" + name = "Space-Ruin calebs krazy clothing outlet" description = "A decrepit clothing store built into an asteroid. It appears long since abandoned and has fallen into disrepair." /datum/map_template/ruin/space/infested_frigate id = "infested_frigate" suffix = "infested_frigate.dmm" - name = "SYN-C Brutus" + name = "Space-Ruin SYN-C Brutus" description = "This wasn't an outbreak, this was a repelled attack." /datum/map_template/ruin/space/garbagetruck1 id = "garbagetruck1" suffix = "garbagetruck1.dmm" - name = "Decommissioned Garbage Truck NX1" + name = "Space-Ruin Decommissioned Garbage Truck NX1" description = "An NX-760 interstellar transport barge. At the end of their life cycle, they are often filled with trash and launched into unexplored space to become someone else's problem. This one is full of kitchen waste, and rodents." /datum/map_template/ruin/space/garbagetruck2 id = "garbagetruck2" suffix = "garbagetruck2.dmm" - name = "Decommissioned Garbage Truck NX2" + name = "Space-Ruin Decommissioned Garbage Truck NX2" description = "An NX-760 interstellar transport barge. At the end of their life cycle, they are often filled with trash and launched into unexplored space to become someone else's problem. This one is full of medical waste, and a syndicate agent." /datum/map_template/ruin/space/garbagetruck3 id = "garbagetruck3" suffix = "garbagetruck3.dmm" - name = "Decommissioned Garbage Truck NX3" + name = "Space-Ruin Decommissioned Garbage Truck NX3" description = "An NX-760 interstellar transport barge. At the end of their life cycle, they are often filled with trash and launched into unexplored space to become someone else's problem. This one is full of industrial garbage, and a russian drug den." /datum/map_template/ruin/space/garbagetruck4 id = "garbagetruck4" suffix = "garbagetruck4.dmm" - name = "Decommissioned Garbage Truck NX4" + name = "Space-Ruin Decommissioned Garbage Truck NX4" description = "An NX-760 interstellar transport barge. At the end of their life cycle, they are often filled with trash and launched into unexplored space to become someone else's problem. This one is full of commercial trash, and spiders." diff --git a/code/datums/signals.dm b/code/datums/signals.dm index 97334253b4e..ddb7dd9cc9e 100644 --- a/code/datums/signals.dm +++ b/code/datums/signals.dm @@ -38,7 +38,7 @@ if(exists) if(!override) - var/override_message = "[signal_type] overridden. Use override = TRUE to suppress this warning.\nTarget: [target] ([target.type]) Proc: [proctype]" + var/override_message = "[signal_type] overridden. Use override = TRUE to suppress this warning.\nTarget: [target] ([target.type]) Existing Proc: [exists] New Proc: [proctype]" log_signal(override_message) stack_trace(override_message) return diff --git a/code/datums/skills/fishing.dm b/code/datums/skills/fishing.dm index ddf90e1a0a3..cfd14a4ce3b 100644 --- a/code/datums/skills/fishing.dm +++ b/code/datums/skills/fishing.dm @@ -4,17 +4,20 @@ */ /datum/skill/fishing name = "Fishing" - title = "Fisher" + title = "Angler" desc = "How empty and alone you are on this barren Earth." modifiers = list(SKILL_VALUE_MODIFIER = list(1, 1, 0, -1, -2, -4, -6)) skill_item_path = /obj/item/clothing/head/soft/fishing_hat /datum/skill/fishing/New() . = ..() - levelUpMessages[SKILL_LEVEL_MASTER] = span_nicegreen("After lots of practice, I've begun to truly understand the surprising depth behind [name]. As a master [title], I can take an easier guess of what I'm trying to catch now.") + levelUpMessages[SKILL_LEVEL_JOURNEYMAN] = span_nicegreen("I feel like I've become quite proficient at [name]! I can tell what fishes I can catch at any given fishing spot.") + levelUpMessages[SKILL_LEVEL_MASTER] = span_nicegreen("I've begun to truly understand the surprising depth behind [name]. As a master [title], I can guess what I'm going to catch now!") /datum/skill/fishing/level_gained(datum/mind/mind, new_level, old_level, silent) . = ..() + if(new_level >= SKILL_LEVEL_JOURNEYMAN && old_level < SKILL_LEVEL_JOURNEYMAN) + ADD_TRAIT(mind, TRAIT_EXAMINE_FISHING_SPOT, SKILL_TRAIT) if(new_level >= SKILL_LEVEL_MASTER && old_level < SKILL_LEVEL_MASTER) ADD_TRAIT(mind, TRAIT_REVEAL_FISH, SKILL_TRAIT) @@ -22,3 +25,5 @@ . = ..() if(old_level >= SKILL_LEVEL_MASTER && new_level < SKILL_LEVEL_MASTER) REMOVE_TRAIT(mind, TRAIT_REVEAL_FISH, SKILL_TRAIT) + if(old_level >= SKILL_LEVEL_JOURNEYMAN && new_level < SKILL_LEVEL_JOURNEYMAN) + REMOVE_TRAIT(mind, TRAIT_EXAMINE_FISHING_SPOT, SKILL_TRAIT) diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index f0690abbe86..2c31b61ea1a 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -1916,6 +1916,26 @@ hasinner = TRUE color_src = HAIR_COLOR +/datum/sprite_accessory/ears/cat/big + name = "Big" + icon_state = "big" + +/datum/sprite_accessory/ears/cat/miqo + name = "Coeurl" + icon_state = "miqo" + +/datum/sprite_accessory/ears/cat/fold + name = "Fold" + icon_state = "fold" + +/datum/sprite_accessory/ears/cat/lynx + name = "Lynx" + icon_state = "lynx" + +/datum/sprite_accessory/ears/cat/round + name = "Round" + icon_state = "round" + /datum/sprite_accessory/ears/fox icon = 'icons/mob/human/fox_features.dmi' name = "Fox" @@ -2271,6 +2291,10 @@ name = "Moffra" icon_state = "moffra" +/datum/sprite_accessory/moth_wings/lightbearer + name = "Lightbearer" + icon_state = "lightbearer" + /datum/sprite_accessory/moth_antennae //Finally splitting the sprite icon = 'icons/mob/human/species/moth/moth_antennae.dmi' color_src = null @@ -2358,6 +2382,10 @@ name = "Moffra" icon_state = "moffra" +/datum/sprite_accessory/moth_antennae/lightbearer + name = "Lightbearer" + icon_state = "lightbearer" + /datum/sprite_accessory/moth_markings // the markings that moths can have. finally something other than the boring tan icon = 'icons/mob/human/species/moth/moth_markings.dmi' color_src = null @@ -2421,3 +2449,7 @@ /datum/sprite_accessory/moth_markings/witchwing name = "Witch Wing" icon_state = "witchwing" + +/datum/sprite_accessory/moth_markings/lightbearer + name = "Lightbearer" + icon_state = "lightbearer" diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index d340a8503d5..4c8b19a1358 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -94,7 +94,7 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) SHOULD_CALL_PARENT(TRUE) lobby_buttons |= lobby_button RegisterSignal(lobby_button, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_lobby_button_update_icon)) - RegisterSignal(lobby_button, COMSIG_CLICK, PROC_REF(on_lobby_button_click)) + RegisterSignal(lobby_button, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(on_lobby_button_click)) RegisterSignal(lobby_button, COMSIG_QDELETING, PROC_REF(on_lobby_button_destroyed)) lobby_button.update_appearance(UPDATE_ICON) diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 8ad478e6c83..94fb0e220d4 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -60,21 +60,20 @@ for (var/mob/dead/new_player/signee as anything in lobby_candidates) if (isnull(signee) || !signee.client || !signee.mind || signee.ready != PLAYER_READY_TO_PLAY) LAZYREMOVE(lobby_candidates, signee) - if (!LAZYLEN(lobby_candidates)) - on_failed_assignment() - return // Nobody signed up :( - for(var/_ in 1 to position_amount) + + var/datum/job/our_job = SSjob.GetJobType(job_to_add) + our_job.total_positions = position_amount + our_job.spawn_positions = position_amount + while(length(lobby_candidates) && position_amount > 0) var/mob/dead/new_player/picked_player = pick_n_take(lobby_candidates) - picked_player.mind.assigned_role = new job_to_add() + picked_player.mind.set_assigned_role(our_job) + our_job.current_positions++ + position_amount-- + lobby_candidates = null -/// Called if we didn't assign a role before the round began, we add it to the latejoin menu instead -/datum/station_trait/job/proc/on_failed_assignment() - var/datum/job/our_job = SSjob.GetJob(job_to_add::title) - our_job.total_positions = position_amount - /datum/station_trait/job/can_display_lobby_button(client/player) - var/datum/job/our_job = SSjob.GetJob(job_to_add::title) + var/datum/job/our_job = SSjob.GetJobType(job_to_add) return our_job.player_old_enough(player) && ..() /// Adds a gorilla to the cargo department, replacing the sloth and the mech @@ -165,6 +164,91 @@ new /obj/item/reagent_containers/cup/coffeepot(picked_turf) new /obj/item/storage/box/coffeepack(picked_turf) +/datum/station_trait/job/veteran_advisor + name = "Veteran Advisor" + button_desc = "Sign up to become a DISABLED but hard boiled Veteran Advisor of Nanotrasen Security Force. Advise HoS and Captain, train Officers, all while fighting your PTSD." + weight = 2 + report_message = "Veteran Security Advisor has been assigned to your station to help with Security matters." + show_in_report = TRUE + can_roll_antag = CAN_ROLL_PROTECTED + job_to_add = /datum/job/veteran_advisor + +/* SKYRAT EDIT -- REMOVAL -- We handle the lobby a bit differently for time being +/datum/station_trait/job/veteran_advisor/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + . = ..() + overlays += "veteran_advisor" +*/ + +/datum/station_trait/job/human_ai + name = "Human AI" + button_desc = "Sign up to become the \"AI\"." + weight = 1 + trait_flags = parent_type::trait_flags | STATION_TRAIT_REQUIRES_AI + report_message = "Our recent technological advancements in machine Artificial Intelligence has proven futile. In the meantime, we're sending an Intern to help out." + show_in_report = TRUE + can_roll_antag = CAN_ROLL_PROTECTED + job_to_add = /datum/job/human_ai + trait_to_give = STATION_TRAIT_HUMAN_AI + +/datum/station_trait/job/human_ai/New() + . = ..() + RegisterSignal(SSjob, COMSIG_OCCUPATIONS_SETUP, PROC_REF(remove_ai_job)) + RegisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(give_fax_machine)) + +/datum/station_trait/job/human_ai/revert() + UnregisterSignal(SSjob, COMSIG_OCCUPATIONS_SETUP) + UnregisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE) + return ..() + +/* SKYRAT EDIT - REMOVAL +/datum/station_trait/job/human_ai/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + . = ..() + overlays += LAZYFIND(lobby_candidates, lobby_button.get_mob()) ? "human_ai_on" : "human_ai_off" +*/ + +/datum/station_trait/job/human_ai/proc/remove_ai_job(datum/source) + SIGNAL_HANDLER + var/datum/job_department/department = SSjob.joinable_departments_by_type[/datum/job_department/silicon] + department.remove_job(/datum/job/ai) + var/datum/station_trait/triple_ai/triple_ais = locate() in SSstation.station_traits + if(triple_ais) + position_amount = 3 + +/// 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] + if(isnull(sat_area)) + return + var/list/fax_machines = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/fax) + for(var/obj/machinery/fax_machine as anything in fax_machines) //don't spawn a fax machine if one exists already. + if(is_type_in_list(get_area(fax_machine), sat_area)) + return + var/list/tables = list() + for(var/turf/area_turf as anything in sat_area.get_turfs_from_all_zlevels()) + var/obj/structure/table/table = locate() in area_turf + if(isnull(table)) + continue + if(area_turf.is_blocked_turf(ignore_atoms = list(table))) + continue + tables += table + if(!length(tables)) + return + var/picked_table = pick_n_take(tables) + var/picked_turf = get_turf(picked_table) + for(var/obj/thing_on_table in picked_turf) //if there's paper bins or other shit on the table, get that off + if(thing_on_table == picked_table) + continue + if(HAS_TRAIT(thing_on_table, TRAIT_WALLMOUNTED) || (thing_on_table.flags_1 & ON_BORDER_1) || thing_on_table.layer < TABLE_LAYER) + continue + if(thing_on_table.invisibility || !thing_on_table.alpha || !thing_on_table.mouse_opacity) + continue + if(length(tables)) + thing_on_table.forceMove(get_turf(pick(tables))) + else + qdel(thing_on_table) + new /obj/machinery/fax/auto_name(picked_turf) + #undef CAN_ROLL_ALWAYS #undef CAN_ROLL_PROTECTED #undef CAN_ROLL_NEVER diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index f12f9bed855..9df85756c21 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -29,6 +29,7 @@ /datum/station_trait/unique_ai name = "Unique AI" trait_type = STATION_TRAIT_NEUTRAL + trait_flags = parent_type::trait_flags | STATION_TRAIT_REQUIRES_AI weight = 5 show_in_report = TRUE report_message = "For experimental purposes, this station AI might show divergence from default lawset. Do not meddle with this experiment, we've removed \ @@ -103,7 +104,7 @@ /datum/station_trait/glitched_pdas name = "PDA glitch" trait_type = STATION_TRAIT_NEUTRAL - weight = 10 + weight = 5 show_in_report = TRUE cost = STATION_TRAIT_COST_MINIMAL report_message = "Something seems to be wrong with the PDAs issued to you all this shift. Nothing too bad though." @@ -282,7 +283,7 @@ /datum/station_trait/scarves name = "Scarves" trait_type = STATION_TRAIT_NEUTRAL - weight = 10 + weight = 5 cost = STATION_TRAIT_COST_MINIMAL show_in_report = TRUE var/list/scarves @@ -316,7 +317,7 @@ name = "Wallets!" trait_type = STATION_TRAIT_NEUTRAL show_in_report = TRUE - weight = 10 + weight = 5 cost = STATION_TRAIT_COST_MINIMAL report_message = "It has become temporarily fashionable to use a wallet, so everyone on the station has been issued one." @@ -362,26 +363,202 @@ show_in_report = TRUE report_message = "There sure are a lot of trees out there." +/datum/station_trait/linked_closets + name = "Closet Anomaly" + trait_type = STATION_TRAIT_NEUTRAL + show_in_report = TRUE + weight = 1 + report_message = "We've reports of high amount of trace eigenstasium on your station. Ensure that your closets are working correctly." + +/datum/station_trait/linked_closets/on_round_start() + . = ..() + var/list/roundstart_non_secure_closets = GLOB.roundstart_station_closets.Copy() + for(var/obj/structure/closet/closet in roundstart_non_secure_closets) + if(closet.secure) + roundstart_non_secure_closets -= closet + + /** + * The number of links to perform. + * Combined with 50/50 the probability of the link being triangular, the boundaries of any given + * on-station, non-secure closet being linked are as high as 1 in 7/8 and as low as 1 in 16-17, + * nearing an a mean of 1 in 9 to 11/12 the more repetitions are done. + * + * There are more than 220 roundstart closets on meta, around 150 of which aren't secure, + * so, about 13 to 17 closets will be affected by this most of the times. + */ + var/number_of_links = round(length(roundstart_non_secure_closets) * (rand(350, 450)*0.0001), 1) + for(var/repetition in 1 to number_of_links) + var/closets_left = length(roundstart_non_secure_closets) + if(closets_left < 2) + return + var/list/targets = list() + for(var/how_many in 1 to min(closets_left, rand(2,3))) + targets += pick_n_take(roundstart_non_secure_closets) + if(closets_left == 1) //there's only one closet left. Let's not leave it alone. + targets += roundstart_non_secure_closets[1] + GLOB.eigenstate_manager.create_new_link(targets) + /datum/station_trait/triple_ai name = "AI Triumvirate" trait_type = STATION_TRAIT_NEUTRAL + trait_flags = parent_type::trait_flags | STATION_TRAIT_REQUIRES_AI show_in_report = TRUE weight = 0 // SKYRAT EDIT Original = 1 report_message = "Your station has been instated with three Nanotrasen Artificial Intelligence models." /datum/station_trait/triple_ai/New() . = ..() - RegisterSignal(SSjob, COMSIG_OCCUPATIONS_DIVIDED, PROC_REF(on_occupations_divided)) + RegisterSignal(SSjob, COMSIG_OCCUPATIONS_SETUP, PROC_REF(on_occupations_setup)) /datum/station_trait/triple_ai/revert() - UnregisterSignal(SSjob, COMSIG_OCCUPATIONS_DIVIDED) + UnregisterSignal(SSjob, COMSIG_OCCUPATIONS_SETUP) return ..() -/datum/station_trait/triple_ai/proc/on_occupations_divided(datum/source, pure, allow_all) +/datum/station_trait/triple_ai/proc/on_occupations_setup(datum/controller/subsystem/job/source) SIGNAL_HANDLER + //allows for latejoining AIs + for(var/obj/effect/landmark/start/ai/secondary/secondary_ai_spawn in GLOB.start_landmarks_list) + secondary_ai_spawn.latejoin_active = TRUE + + var/datum/station_trait/job/human_ai/ai_trait = locate() in SSstation.station_traits + //human AI quirk will handle adding its own job positions, but for now don't allow more AI slots. + if(ai_trait) + return for(var/datum/job/ai/ai_datum in SSjob.joinable_occupations) ai_datum.spawn_positions = 3 - if(!pure) - for(var/obj/effect/landmark/start/ai/secondary/secondary_ai_spawn in GLOB.start_landmarks_list) - secondary_ai_spawn.latejoin_active = TRUE + ai_datum.total_positions = 3 + + +#define PRO_SKUB "pro-skub" +#define ANTI_SKUB "anti-skub" +#define SKUB_IDFC "i don't frikkin' care" +#define RANDOM_SKUB null //This means that if you forgot to opt in/against/out, there's a 50/50 chance to be pro or anti + +/// A trait that lets players choose whether they want pro-skub or anti-skub (or neither), and receive the appropriate equipment. +/datum/station_trait/skub + name = "The Great Skub Contention" + trait_type = STATION_TRAIT_NEUTRAL + show_in_report = FALSE + weight = 2 + sign_up_button = TRUE + /// List of people signed up to be either pro_skub or anti_skub + var/list/skubbers = list() + +/datum/station_trait/skub/New() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) + +/* SKYRAT EDIT -- REMOVAL -- I swear, we need to update our UI in near future to account for the new buttons and shit +/datum/station_trait/skub/setup_lobby_button(atom/movable/screen/lobby/button/sign_up/lobby_button) + RegisterSignal(lobby_button, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_lobby_button_update_overlays)) + lobby_button.desc = "Are you pro-skub or anti-skub? Click to cycle through pro-skub, anti-skub, random and neutral." + return ..() + +/// Let late-joiners jump on this gimmick too. +/datum/station_trait/skub/can_display_lobby_button(client/player) + return sign_up_button + +/// We don't destroy buttons on round start for those who are still in the lobby. +/datum/station_trait/skub/on_round_start() + return + +/datum/station_trait/skub/on_lobby_button_update_icon(atom/movable/screen/lobby/button/sign_up/lobby_button, location, control, params, mob/dead/new_player/user) + var/mob/player = lobby_button.get_mob() + var/skub_stance = skubbers[player.ckey] + switch(skub_stance) + if(PRO_SKUB) + lobby_button.base_icon_state = "signup_on" + if(ANTI_SKUB) + lobby_button.base_icon_state = "signup" + else + lobby_button.base_icon_state = "signup_neutral" + +/datum/station_trait/skub/on_lobby_button_click(atom/movable/screen/lobby/button/sign_up/lobby_button, updates) + var/mob/player = lobby_button.get_mob() + var/skub_stance = skubbers[player.ckey] + switch(skub_stance) + if(PRO_SKUB) + skubbers[player.ckey] = ANTI_SKUB + lobby_button.balloon_alert(player, "anti-skub") + if(ANTI_SKUB) + skubbers[player.ckey] = SKUB_IDFC + lobby_button.balloon_alert(player, "don't care") + if(SKUB_IDFC) + skubbers[player.ckey] = RANDOM_SKUB + lobby_button.balloon_alert(player, "on the best side") + if(RANDOM_SKUB) + skubbers[player.ckey] = PRO_SKUB + lobby_button.balloon_alert(player, "pro-skub") + +/datum/station_trait/skub/proc/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + SIGNAL_HANDLER + var/mob/player = lobby_button.get_mob() + var/skub_stance = skubbers[player.ckey] + switch(skub_stance) + if(PRO_SKUB) + overlays += "pro_skub" + if(ANTI_SKUB) + overlays += "anti_skub" + if(SKUB_IDFC) + overlays += "neutral_skub" + if(RANDOM_SKUB) + overlays += "random_skub" +*/ +/datum/station_trait/skub/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned, client/player_client) + SIGNAL_HANDLER + + var/skub_stance = skubbers[player_client.ckey] + if(skub_stance == SKUB_IDFC) + return + + if((skub_stance == RANDOM_SKUB && prob(50)) || skub_stance == PRO_SKUB) + var/obj/item/storage/box/skub/boxie = new(spawned.loc) + spawned.equip_to_slot_if_possible(boxie, ITEM_SLOT_BACKPACK, indirect_action = TRUE) + if(ishuman(spawned)) + var/obj/item/clothing/suit/costume/wellworn_shirt/skub/shirt = new(spawned.loc) + if(!spawned.equip_to_slot_if_possible(shirt, ITEM_SLOT_OCLOTHING, indirect_action = TRUE)) + shirt.forceMove(boxie) + return + + var/obj/item/storage/box/stickers/anti_skub/boxie = new(spawned.loc) + spawned.equip_to_slot_if_possible(boxie, ITEM_SLOT_BACKPACK, indirect_action = TRUE) + if(!ishuman(spawned)) + return + var/obj/item/clothing/suit/costume/wellworn_shirt/skub/anti/shirt = new(spawned.loc) + if(!spawned.equip_to_slot_if_possible(shirt, ITEM_SLOT_OCLOTHING, indirect_action = TRUE)) + shirt.forceMove(boxie) + +/// A box containing a skub, for easier carry because skub is a bulky item. +/obj/item/storage/box/skub + name = "skub box" + desc = "A box to store your skub and pro-skub shirt in. A label on the back reads: \"Skubtide, Stationwide\"." + icon_state = "hugbox" + illustration = "skub" + +/obj/item/storage/box/skub/Initialize(mapload) + . = ..() + atom_storage.exception_hold = typecacheof(list(/obj/item/skub, /obj/item/clothing/suit/costume/wellworn_shirt/skub)) + +/obj/item/storage/box/skub/PopulateContents() + new /obj/item/skub(src) + new /obj/item/sticker/skub(src) + new /obj/item/sticker/skub(src) + +/obj/item/storage/box/stickers/anti_skub + name = "anti-skub stickers box" + desc = "The enemy may have been given a skub and a shirt, but I've more stickers! Plus the box can hold my anti-skub shirt." + +/obj/item/storage/box/stickers/anti_skub/Initialize(mapload) + . = ..() + atom_storage.exception_hold = typecacheof(list(/obj/item/clothing/suit/costume/wellworn_shirt/skub)) + +/obj/item/storage/box/stickers/anti_skub/PopulateContents() + for(var/i in 1 to 4) + new /obj/item/sticker/anti_skub(src) + +#undef PRO_SKUB +#undef ANTI_SKUB +#undef SKUB_IDFC +#undef RANDOM_SKUB + diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 4a21d25f884..cc2c49f1b86 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -219,6 +219,7 @@ /datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer. /datum/job/head_of_personnel = /obj/item/organ/internal/eyes/robotic, /datum/job/head_of_security = /obj/item/organ/internal/eyes/robotic/thermals, + /datum/job/human_ai = /obj/item/organ/internal/brain/cybernetic, /datum/job/janitor = /obj/item/organ/internal/eyes/robotic/xray, /datum/job/lawyer = /obj/item/organ/internal/heart/cybernetic/tier2, /datum/job/mime = /obj/item/organ/internal/tongue/robot, //... diff --git a/code/datums/status_effects/_status_effect_helpers.dm b/code/datums/status_effects/_status_effect_helpers.dm index 0ee95220061..f887afd9142 100644 --- a/code/datums/status_effects/_status_effect_helpers.dm +++ b/code/datums/status_effects/_status_effect_helpers.dm @@ -56,7 +56,7 @@ . = FALSE for(var/datum/status_effect/existing_effect as anything in status_effects) - if(existing_effect.id == initial(removed_effect.id) && existing_effect.before_remove(arguments)) + if(existing_effect.id == initial(removed_effect.id) && existing_effect.before_remove(arglist(arguments))) qdel(existing_effect) . = TRUE @@ -84,6 +84,17 @@ return null +///Gets every status effect of an ID and returns all of them in a list, rather than the individual 'has_status_effect' +/mob/living/proc/get_all_status_effect_of_id(datum/status_effect/checked_effect) + RETURN_TYPE(/list/datum/status_effect) + + var/list/all_effects_of_type = list() + for(var/datum/status_effect/present_effect as anything in status_effects) + if(present_effect.id == initial(checked_effect.id)) + all_effects_of_type += present_effect + + return all_effects_of_type + /** * Checks if this mob has a status effect that shares the passed effect's ID * and has the passed sources are in its list of sources (ONLY works for grouped efects!) diff --git a/code/datums/status_effects/buffs/bioware/_bioware.dm b/code/datums/status_effects/buffs/bioware/_bioware.dm new file mode 100644 index 00000000000..c2f7259f270 --- /dev/null +++ b/code/datums/status_effects/buffs/bioware/_bioware.dm @@ -0,0 +1,28 @@ +/** + * ## Bioware status effect + * + * Simple holder status effects that grants the owner mob basic buffs + */ +/datum/status_effect/bioware + id = "bioware" + alert_type = null + duration = -1 + tick_interval = -1 + +/datum/status_effect/bioware/on_apply() + if(!ishuman(owner)) + return FALSE + + bioware_gained() + return TRUE + +/datum/status_effect/bioware/on_remove() + bioware_lost() + +/// Called when applying to the mob. +/datum/status_effect/bioware/proc/bioware_gained() + return + +/// Called when removing from the mob. +/datum/status_effect/bioware/proc/bioware_lost() + return diff --git a/code/datums/status_effects/buffs/bioware/circulation.dm b/code/datums/status_effects/buffs/bioware/circulation.dm new file mode 100644 index 00000000000..c20efd3aa93 --- /dev/null +++ b/code/datums/status_effects/buffs/bioware/circulation.dm @@ -0,0 +1,23 @@ +// Bioware that affects the heart / circulatory system +/datum/status_effect/bioware/heart + id = "circulation" + +/// Muscled veins - Removes the need to have a heart +/datum/status_effect/bioware/heart/muscled_veins + +/datum/status_effect/bioware/heart/muscled_veins/bioware_gained() + ADD_TRAIT(owner, TRAIT_STABLEHEART, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/bioware/heart/muscled_veins/bioware_lost() + REMOVE_TRAIT(owner, TRAIT_STABLEHEART, TRAIT_STATUS_EFFECT(id)) + +/// Threaded veins - Bleed way less +/datum/status_effect/bioware/heart/threaded_veins + +/datum/status_effect/bioware/heart/threaded_veins/bioware_gained() + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.bleed_mod *= 0.25 + +/datum/status_effect/bioware/heart/threaded_veins/bioware_lost() + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.bleed_mod *= 4 diff --git a/code/datums/status_effects/buffs/bioware/cortex.dm b/code/datums/status_effects/buffs/bioware/cortex.dm new file mode 100644 index 00000000000..de11dab1eac --- /dev/null +++ b/code/datums/status_effects/buffs/bioware/cortex.dm @@ -0,0 +1,20 @@ +// Bioware that affects the brain +/datum/status_effect/bioware/cortex + id = "cortex" + +// Folded brain - Grants a bonus chance to getting special traumas via lobotomy +/datum/status_effect/bioware/cortex/folded + +/datum/status_effect/bioware/cortex/folded/bioware_gained() + ADD_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/bioware/cortex/folded/bioware_lost() + REMOVE_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST, TRAIT_STATUS_EFFECT(id)) + +// Imprinted brain - Cures basic traumas continuously +/datum/status_effect/bioware/cortex/imprinted + tick_interval = 2 SECONDS + +/datum/status_effect/bioware/cortex/imprinted/tick(seconds_between_ticks) + var/mob/living/carbon/human/human_owner = owner + human_owner.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) diff --git a/code/datums/status_effects/buffs/bioware/ligaments.dm b/code/datums/status_effects/buffs/bioware/ligaments.dm new file mode 100644 index 00000000000..2b41ad01e7a --- /dev/null +++ b/code/datums/status_effects/buffs/bioware/ligaments.dm @@ -0,0 +1,21 @@ +// Bioware that affects the player's limbs +/datum/status_effect/bioware/ligaments + id = "ligaments" + +// Hooked ligaments - Easier to dismember, but easier to reattach +/datum/status_effect/bioware/ligaments/hooked + +/datum/status_effect/bioware/ligaments/hooked/bioware_gained() + owner.add_traits(list(TRAIT_LIMBATTACHMENT, TRAIT_EASYDISMEMBER), TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/bioware/ligaments/hooked/bioware_lost() + owner.remove_traits(list(TRAIT_LIMBATTACHMENT, TRAIT_EASYDISMEMBER), TRAIT_STATUS_EFFECT(id)) + +// Reinforced ligaments - Easier to break, but cannot be dismembered +/datum/status_effect/bioware/ligaments/reinforced + +/datum/status_effect/bioware/ligaments/reinforced/bioware_gained() + owner.add_traits(list(TRAIT_NODISMEMBER, TRAIT_EASILY_WOUNDED), TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/bioware/ligaments/reinforced/bioware_lost() + owner.remove_traits(list(TRAIT_NODISMEMBER, TRAIT_EASILY_WOUNDED), TRAIT_STATUS_EFFECT(id)) diff --git a/code/datums/status_effects/buffs/bioware/nerves.dm b/code/datums/status_effects/buffs/bioware/nerves.dm new file mode 100644 index 00000000000..36392ca6364 --- /dev/null +++ b/code/datums/status_effects/buffs/bioware/nerves.dm @@ -0,0 +1,25 @@ +// Bioware that affects the CNS +/datum/status_effect/bioware/nerves + id = "nerves" + +// Grounded Nerves - Immunity to being zapped +/datum/status_effect/bioware/nerves/grounded + +/datum/status_effect/bioware/nerves/grounded/bioware_gained() + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/bioware/nerves/grounded/bioware_lost() + REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, TRAIT_STATUS_EFFECT(id)) + +// Spliced Nerves - Reduced stun time and stamina damage taken +/datum/status_effect/bioware/nerves/spliced + +/datum/status_effect/bioware/nerves/spliced/bioware_gained() + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.stun_mod *= 0.5 + human_owner.physiology.stamina_mod *= 0.8 + +/datum/status_effect/bioware/nerves/spliced/bioware_lost() + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.stun_mod *= 2 + human_owner.physiology.stamina_mod *= 1.25 diff --git a/code/datums/status_effects/buffs/food/chilling.dm b/code/datums/status_effects/buffs/food/chilling.dm new file mode 100644 index 00000000000..8b1d60fbcc1 --- /dev/null +++ b/code/datums/status_effects/buffs/food/chilling.dm @@ -0,0 +1,13 @@ +///food effect applied by ice cream and frozen treats +/datum/status_effect/food/chilling + alert_type = /atom/movable/screen/alert/status_effect/icecream_chilling //different path, so we sprite one state and not five. + +/datum/status_effect/food/chilling/tick(seconds_between_ticks) + var/minimum_temp = (BODYTEMP_HEAT_DAMAGE_LIMIT - 12 * strength) + if(owner.bodytemperature >= minimum_temp) + owner.adjust_bodytemperature(-2.75 * strength * seconds_between_ticks, min_temp = minimum_temp) + +/atom/movable/screen/alert/status_effect/icecream_chilling + desc = "Nothing beats a cup of ice cream during hot, plasma-floody day..." + icon_state = "food_icecream" + diff --git a/code/datums/status_effects/buffs/food_traits.dm b/code/datums/status_effects/buffs/food/food_traits.dm similarity index 51% rename from code/datums/status_effects/buffs/food_traits.dm rename to code/datums/status_effects/buffs/food/food_traits.dm index ebe22116dd0..dfd0b888aa0 100644 --- a/code/datums/status_effects/buffs/food_traits.dm +++ b/code/datums/status_effects/buffs/food/food_traits.dm @@ -1,8 +1,7 @@ /datum/status_effect/food/trait/shockimmune - alert_type = /atom/movable/screen/alert/status_effect/food_trait_shockimmune + alert_type = /atom/movable/screen/alert/status_effect/food/trait_shockimmune trait = TRAIT_SHOCKIMMUNE -/atom/movable/screen/alert/status_effect/food_trait_shockimmune +/atom/movable/screen/alert/status_effect/food/trait_shockimmune name = "Grounded" desc = "That meal made me feel like a superconductor..." - icon_state = "food_buff_4" diff --git a/code/datums/status_effects/buffs/food/haste.dm b/code/datums/status_effects/buffs/food/haste.dm new file mode 100644 index 00000000000..8dbe7a7762e --- /dev/null +++ b/code/datums/status_effects/buffs/food/haste.dm @@ -0,0 +1,27 @@ +///Haste makes the eater move and act faster +/datum/status_effect/food/haste + +/datum/status_effect/food/haste/on_apply() + var/datum/movespeed_modifier/food_haste/speed_mod = new() + speed_mod.multiplicative_slowdown = -0.04 * strength + owner.add_movespeed_modifier(speed_mod, update = TRUE) + var/datum/actionspeed_modifier/status_effect/food_haste/action_mod = new() + action_mod.multiplicative_slowdown = -0.06 * strength + owner.add_actionspeed_modifier(action_mod, update = TRUE) + return ..() + +/datum/status_effect/food/haste/be_replaced() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/food_haste) + owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/food_haste) + return ..() + +/datum/status_effect/food/haste/on_remove() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/food_haste, update = TRUE) + owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/food_haste, update = TRUE) + return ..() + +/datum/movespeed_modifier/food_haste + multiplicative_slowdown = -0.04 + +/datum/actionspeed_modifier/status_effect/food_haste + multiplicative_slowdown = -0.06 diff --git a/code/datums/status_effects/buffs/food_haste.dm b/code/datums/status_effects/buffs/food_haste.dm deleted file mode 100644 index 9daf859fb19..00000000000 --- a/code/datums/status_effects/buffs/food_haste.dm +++ /dev/null @@ -1,20 +0,0 @@ -/// Haste makes the eater move faster -/datum/status_effect/food/haste - var/datum/movespeed_modifier/food_haste/modifier - -/datum/status_effect/food/haste/on_apply() - modifier = new() - modifier.multiplicative_slowdown = -0.04 * strength - owner.add_movespeed_modifier(modifier, update = TRUE) - return ..() - -/datum/status_effect/food/haste/be_replaced() - owner.remove_movespeed_modifier(modifier, update = TRUE) - return ..() - -/datum/status_effect/food/haste/on_remove() - owner.remove_movespeed_modifier(modifier, update = TRUE) - return ..() - -/datum/movespeed_modifier/food_haste - multiplicative_slowdown = -0.1 diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 9613ec9fb94..362a9eee23b 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -346,7 +346,7 @@ /datum/status_effect/crusher_mark id = "crusher_mark" duration = 300 //if you leave for 30 seconds you lose the mark, deal with it - status_type = STATUS_EFFECT_REPLACE + status_type = STATUS_EFFECT_MULTIPLE alert_type = null var/mutable_appearance/marked_underlay var/obj/item/kinetic_crusher/hammer_synced @@ -373,9 +373,9 @@ QDEL_NULL(marked_underlay) return ..() -/datum/status_effect/crusher_mark/be_replaced() - owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point. - ..() +//we will only clear ourselves if the crusher is the one that owns us. +/datum/status_effect/crusher_mark/before_remove(obj/item/kinetic_crusher/attacking_hammer) + return (attacking_hammer == hammer_synced) /datum/status_effect/stacking/saw_bleed id = "saw_bleed" @@ -604,7 +604,7 @@ // The brain trauma itself does its own set of logging, but this is the only place the source of the hypnosis phrase can be found. hearing_speaker.log_message("hypnotised [key_name(C)] with the phrase '[hearing_args[HEARING_RAW_MESSAGE]]'", LOG_ATTACK, color="red") C.log_message("has been hypnotised by the phrase '[hearing_args[HEARING_RAW_MESSAGE]]' spoken by [key_name(hearing_speaker)]", LOG_VICTIM, color="orange", log_globally = FALSE) - addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, gain_trauma), /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hearing_args[HEARING_RAW_MESSAGE]), 10) + addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, gain_trauma), /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hearing_args[HEARING_RAW_MESSAGE]), 1 SECONDS) addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living, Stun), 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) @@ -881,6 +881,9 @@ icon_state = "antalert" /atom/movable/screen/alert/status_effect/ants/Click() + . = ..() + if(!.) + return var/mob/living/living = owner if(!istype(living) || !living.can_resist() || living != owner) return @@ -900,25 +903,25 @@ name = "Fire Ants!" desc = span_warning("JESUS FUCKING CHRIST IT BURNS! CLICK TO GET THOSE THINGS OFF!") -/datum/status_effect/stagger - id = "stagger" +/datum/status_effect/rebuked + id = "rebuked" status_type = STATUS_EFFECT_REFRESH duration = 30 SECONDS tick_interval = 1 SECONDS alert_type = null -/datum/status_effect/stagger/on_apply() - owner.next_move_modifier *= 1.5 +/datum/status_effect/rebuked/on_apply() + owner.next_move_modifier *= 2 if(ishostile(owner)) var/mob/living/simple_animal/hostile/simple_owner = owner simple_owner.ranged_cooldown_time *= 2.5 return TRUE -/datum/status_effect/stagger/on_remove() +/datum/status_effect/rebuked/on_remove() . = ..() if(QDELETED(owner)) return - owner.next_move_modifier /= 1.5 + owner.next_move_modifier *= 0.5 if(ishostile(owner)) var/mob/living/simple_animal/hostile/simple_owner = owner simple_owner.ranged_cooldown_time /= 2.5 diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 2f32ff5b3be..5bf8269bbbf 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -30,8 +30,7 @@ qdel(src) return if(isbasicmob(owner)) - var/mob/living/basic/basic_owner = owner - if(!(basic_owner.basic_mob_flags & FLAMMABLE_MOB)) + if(!check_basic_mob_immunity(owner)) qdel(src) return @@ -94,6 +93,10 @@ stacks = max(0, min(stack_limit, stacks + new_stacks)) cache_stacks() +/// Checks if the applicable basic mob is immune to the status effect we're trying to apply. Returns TRUE if it is, FALSE if it isn't. +/datum/status_effect/fire_handler/proc/check_basic_mob_immunity(mob/living/basic/basic_owner) + return (basic_owner.basic_mob_flags & FLAMMABLE_MOB) + /** * Refresher for mob's fire_stacks */ @@ -272,11 +275,6 @@ overlays |= created_overlay -/obj/effect/dummy/lighting_obj/moblight/fire - name = "fire" - light_color = LIGHT_COLOR_FIRE - light_range = LIGHT_RANGE_FIRE - /datum/status_effect/fire_handler/wet_stacks id = "wet_stacks" @@ -292,3 +290,6 @@ if(particle_effect) return particle_effect = new(owner, /particles/droplets) + +/datum/status_effect/fire_handler/wet_stacks/check_basic_mob_immunity(mob/living/basic/basic_owner) + return !(basic_owner.basic_mob_flags & IMMUNE_TO_GETTING_WET) diff --git a/code/datums/status_effects/debuffs/hooked.dm b/code/datums/status_effects/debuffs/hooked.dm index 9280303209a..3eb7caf1c37 100644 --- a/code/datums/status_effects/debuffs/hooked.dm +++ b/code/datums/status_effects/debuffs/hooked.dm @@ -31,6 +31,9 @@ icon_state = "hooked" /atom/movable/screen/alert/status_effect/hooked/Click() + . = ..() + if(!.) + return if(!owner.can_resist()) return owner.balloon_alert(owner, "removing hook...") diff --git a/code/datums/status_effects/debuffs/slime/slime_food.dm b/code/datums/status_effects/debuffs/slime/slime_food.dm new file mode 100644 index 00000000000..aa711bb878f --- /dev/null +++ b/code/datums/status_effects/debuffs/slime/slime_food.dm @@ -0,0 +1,65 @@ +///Adds pheromones to a mob. If the target slime drains the mob to death, they might befriend the user +/datum/status_effect/slime_food + id = "slime_food" + alert_type = null + var/befriend_chance = 30 + var/mob/living/carbon/human/feeder + +/datum/status_effect/slime_food/on_creation(mob/living/new_owner, mob/living/carbon/human/feeder, befriend_chance = 100) + src.befriend_chance = befriend_chance + src.feeder = feeder + return ..() + +/datum/status_effect/slime_food/on_apply() + if(isnull(feeder)) + return FALSE + + if(!ishuman(feeder)) //don't give the AI pheromones + return FALSE + + RegisterSignal(feeder, COMSIG_QDELETING, PROC_REF(on_feeder_deleted)) + RegisterSignal(owner, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_feeder_deleted)) + RegisterSignal(owner, COMSIG_SLIME_DRAINED, PROC_REF(on_drained)) + RegisterSignal(owner, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + + return ..() + +///Handles the source of the pheromones getting deleted, or the owner getting washed +/datum/status_effect/slime_food/proc/on_feeder_deleted(datum/source) + SIGNAL_HANDLER + qdel(src) + +///Gaze upon the target +/datum/status_effect/slime_food/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(user == feeder) + examine_list += span_boldnotice("Their smell reminds you of serenity and yourself.") + else + examine_list += span_boldnotice("Their smell reminds you of serenity and [feeder].") + +///Handles a slime completely draining someone +/datum/status_effect/slime_food/proc/on_drained(datum/source, mob/living/basic/slime/draining_slime) + SIGNAL_HANDLER + if(isnull(draining_slime) || !isslime(draining_slime)) + qdel(src) + return + + if(!prob(befriend_chance) || draining_slime.ai_controller.blackboard[BB_SLIME_RABID]) + qdel(src) + return + + draining_slime.befriend(feeder) + new /obj/effect/temp_visual/heart(draining_slime.loc) + qdel(src) + +/datum/status_effect/slime_food/on_remove() + feeder = null + +/datum/status_effect/slime_food/update_particles() + if(particle_effect) + return + + particle_effect = new(owner, /particles/pollen) + + //particle coloured like the "pheromones" of the feeder + particle_effect.particles.color = "[feeder.chat_color]a0" diff --git a/code/datums/status_effects/debuffs/slime/slime_leech.dm b/code/datums/status_effects/debuffs/slime/slime_leech.dm new file mode 100644 index 00000000000..49bd0f7b82c --- /dev/null +++ b/code/datums/status_effects/debuffs/slime/slime_leech.dm @@ -0,0 +1,93 @@ +/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" + +/datum/status_effect/slime_leech + id = "slime_leech" + alert_type = /atom/movable/screen/alert/status_effect/slime_leech + var/mob/living/basic/slime/our_slime + +/datum/status_effect/slime_leech/on_creation(mob/living/new_owner, mob/living/basic/slime/our_slime) + src.our_slime = our_slime + return ..() + +/datum/status_effect/slime_leech/on_apply() + if(isnull(our_slime)) + return FALSE + + if(!isslime(our_slime)) + return FALSE + + RegisterSignals(our_slime, list(COMSIG_LIVING_DEATH, COMSIG_MOB_UNBUCKLED, COMSIG_QDELETING,), PROC_REF(on_buckle_end)) + return ..() + +///If the buckling ends +/datum/status_effect/slime_leech/proc/on_buckle_end() + SIGNAL_HANDLER + + var/bio_protection = 100 - owner.getarmor(null, BIO) + if(prob(bio_protection)) + owner.apply_status_effect(/datum/status_effect/slimed, our_slime.slime_type.rgb_code, our_slime.slime_type.colour == SLIME_TYPE_RAINBOW) + + qdel(src) + +/datum/status_effect/slime_leech/on_remove() + our_slime = null + +/datum/status_effect/slime_leech/tick(seconds_between_ticks) + if(our_slime.stat) + our_slime.stop_feeding(silent = TRUE) + return + + if(owner.stat == DEAD) // our victim died + if(our_slime.client) + to_chat(our_slime, span_info("This subject does not have a strong enough life energy anymore...")) + + SEND_SIGNAL(owner, COMSIG_SLIME_DRAINED, our_slime) + + if(prob(60) && owner.client && ishuman(owner) && !our_slime.ai_controller.blackboard[BB_SLIME_RABID]) + our_slime.ai_controller?.set_blackboard_key(BB_SLIME_RABID, TRUE) //we might go rabid after finishing to feed on a human with a client. + + our_slime.stop_feeding() + return + + 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) + + 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) + if(need_mob_update) + owner.updatehealth() + + if(totaldamage >= 0) // AdjustBruteLoss returns a negative value on succesful damage adjustment + our_slime.balloon_alert(our_slime, "not food!") + our_slime.stop_feeding() + return + + if(totaldamage < 0 && SPT_PROB(5, seconds_between_ticks) && owner.client) + + var/static/list/pain_lines + if(isnull(pain_lines)) + pain_lines = list( + "You can feel your body becoming weak!", + "You feel like you're about to die!", + "You feel every part of your body screaming in agony!", + "A low, rolling pain passes through your body!", + "Your body feels as if it's falling apart!", + "You feel extremely weak!", + "A sharp, deep pain bathes every inch of your body!", + ) + + to_chat(owner, span_userdanger(pick(pain_lines))) + + 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) diff --git a/code/datums/status_effects/debuffs/slimed.dm b/code/datums/status_effects/debuffs/slime/slimed.dm similarity index 100% rename from code/datums/status_effects/debuffs/slimed.dm rename to code/datums/status_effects/debuffs/slime/slimed.dm diff --git a/code/datums/status_effects/debuffs/speech_debuffs.dm b/code/datums/status_effects/debuffs/speech_debuffs.dm index 4968bb42e39..07bcd3c2543 100644 --- a/code/datums/status_effects/debuffs/speech_debuffs.dm +++ b/code/datums/status_effects/debuffs/speech_debuffs.dm @@ -2,8 +2,10 @@ id = null alert_type = null remove_on_fullheal = TRUE - + tick_interval = -1 + /// If TRUE, TTS will say the original message rather than what we changed it to var/make_tts_message_original = FALSE + /// If set, this will be appended to the TTS filter of the message var/tts_filter = "" /datum/status_effect/speech/on_creation(mob/living/new_owner, duration = 10 SECONDS) @@ -30,18 +32,20 @@ if(!length(phrase)) return - if(length(tts_filter) > 0) - message_args[TREAT_TTS_FILTER_ARG] += tts_filter - if(make_tts_message_original) - message_args[TREAT_TTS_MESSAGE_ARG] = message_args[TREAT_MESSAGE_ARG] - var/final_phrase = "" var/original_char = "" for(var/i = 1, i <= length(phrase), i += length(original_char)) original_char = phrase[i] + final_phrase += apply_speech(original_char) - final_phrase += apply_speech(original_char, original_char) + if(final_phrase == phrase) + return // No change was done, whatever + + if(length(tts_filter) > 0) + message_args[TREAT_TTS_FILTER_ARG] += tts_filter + if(make_tts_message_original) + message_args[TREAT_TTS_MESSAGE_ARG] = message_args[TREAT_MESSAGE_ARG] message_args[TREAT_MESSAGE_ARG] = sanitize(final_phrase) @@ -51,20 +55,26 @@ * * Return the modified_char to be reapplied to the message. */ -/datum/status_effect/speech/proc/apply_speech(original_char, modified_char) +/datum/status_effect/speech/proc/apply_speech(original_char) stack_trace("[type] didn't implement apply_speech.") return original_char /datum/status_effect/speech/stutter id = "stutter" - /// The probability of adding a stutter to any character - var/stutter_prob = 80 - /// Regex of characters we won't apply a stutter to - var/static/regex/no_stutter - make_tts_message_original = TRUE tts_filter = "tremolo=f=10:d=0.8,rubberband=tempo=0.5" + /// The probability of adding a stutter to any character + var/stutter_prob = 80 + /// The chance of a four character stutter + var/four_char_chance = 10 + /// The chance of a three character stutter + var/three_char_chance = 20 + /// The chance of a two character stutter + var/two_char_chance = 95 + /// Regex of characters we won't apply a stutter to + var/static/regex/no_stutter + /datum/status_effect/speech/stutter/on_creation(mob/living/new_owner, ...) . = ..() if(!.) @@ -72,18 +82,32 @@ if(!no_stutter) no_stutter = regex(@@[aeiouAEIOU ""''()[\]{}.!?,:;_`~-]@) -/datum/status_effect/speech/stutter/apply_speech(original_char, modified_char) +/datum/status_effect/speech/stutter/apply_speech(original_char) if(prob(stutter_prob) && !no_stutter.Find(original_char)) - if(prob(10)) - modified_char = "[modified_char]-[modified_char]-[modified_char]-[modified_char]" - else if(prob(20)) - modified_char = "[modified_char]-[modified_char]-[modified_char]" - else if(prob(95)) - modified_char = "[modified_char]-[modified_char]" - else - modified_char = "" + if(prob(four_char_chance)) + return "[original_char]-[original_char]-[original_char]-[original_char]" + if(prob(three_char_chance)) + return "[original_char]-[original_char]-[original_char]" + if(prob(two_char_chance)) + return "[original_char]-[original_char]" - return modified_char + return original_char + +/datum/status_effect/speech/stutter/anxiety + id = "anxiety_stutter" + stutter_prob = 5 + four_char_chance = 4 + three_char_chance = 10 + two_char_chance = 100 + remove_on_fullheal = FALSE + +/datum/status_effect/speech/stutter/anxiety/handle_message(datum/source, list/message_args) + if(HAS_TRAIT(owner, TRAIT_FEARLESS) || HAS_TRAIT(owner, TRAIT_SIGN_LANG)) + stutter_prob = 0 + else + var/datum/quirk/social_anxiety/host_quirk = owner.get_quirk(/datum/quirk/social_anxiety) + stutter_prob = clamp(host_quirk?.calculate_mood_mod() * 0.5, 5, 50) + return ..() /datum/status_effect/speech/stutter/derpspeech id = "derp_stutter" @@ -160,8 +184,9 @@ string_replacements = speech_changes["string_replacements"] string_additions = speech_changes["string_additions"] -/datum/status_effect/speech/slurring/apply_speech(original_char, modified_char) +/datum/status_effect/speech/slurring/apply_speech(original_char) + var/modified_char = original_char var/lower_char = lowertext(modified_char) if(prob(common_prob) && (lower_char in common_replacements)) var/to_replace = common_replacements[lower_char] diff --git a/code/datums/status_effects/food_effects.dm b/code/datums/status_effects/food_effects.dm index e41ef67ad10..deba7bf750b 100644 --- a/code/datums/status_effects/food_effects.dm +++ b/code/datums/status_effects/food_effects.dm @@ -3,37 +3,24 @@ id = "food_buff" duration = 5 MINUTES // Same as food mood buffs status_type = STATUS_EFFECT_REPLACE // Only one food buff allowed + alert_type = /atom/movable/screen/alert/status_effect/food /// Buff power var/strength /datum/status_effect/food/on_creation(mob/living/new_owner, timeout_mod = 1, strength = 1) src.strength = strength //Generate alert when not specified - if(alert_type == /atom/movable/screen/alert/status_effect) - alert_type = "/atom/movable/screen/alert/status_effect/food/buff_[strength]" if(isnum(timeout_mod)) duration *= timeout_mod . = ..() + if(istype(linked_alert, /atom/movable/screen/alert/status_effect/food)) + linked_alert.icon_state = "[linked_alert.base_icon_state]_[strength]" /atom/movable/screen/alert/status_effect/food name = "Hand-crafted meal" desc = "Eating it made me feel better." icon_state = "food_buff_1" - -/atom/movable/screen/alert/status_effect/food/buff_1 - icon_state = "food_buff_1" - -/atom/movable/screen/alert/status_effect/food/buff_2 - icon_state = "food_buff_2" - -/atom/movable/screen/alert/status_effect/food/buff_3 - icon_state = "food_buff_3" - -/atom/movable/screen/alert/status_effect/food/buff_4 - icon_state = "food_buff_4" - -/atom/movable/screen/alert/status_effect/food/buff_5 - icon_state = "food_buff_5" + base_icon_state = "food_buff" /// Makes you gain a trait /datum/status_effect/food/trait diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 3f267cb3bad..9efc867a043 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -562,7 +562,7 @@ return ..() /datum/status_effect/tinlux_light/on_apply() - mob_light_obj = owner.mob_light(2) + mob_light_obj = owner.mob_light(2, 1.5, "#ccff33") return TRUE /datum/status_effect/tinlux_light/on_remove() diff --git a/code/datums/status_effects/song_effects.dm b/code/datums/status_effects/song_effects.dm index 066ac457a9f..f61253c987d 100644 --- a/code/datums/status_effects/song_effects.dm +++ b/code/datums/status_effects/song_effects.dm @@ -44,7 +44,7 @@ var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj /datum/status_effect/song/light/on_apply() - mob_light_obj = owner.mob_light(3, color = LIGHT_COLOR_DIM_YELLOW) + mob_light_obj = owner.mob_light(3, 1.5, color = LIGHT_COLOR_DIM_YELLOW) playsound(owner, 'sound/weapons/fwoosh.ogg', 75, FALSE) return TRUE diff --git a/code/datums/stock_market_events.dm b/code/datums/stock_market_events.dm index 81142d23002..4907bf784f6 100644 --- a/code/datums/stock_market_events.dm +++ b/code/datums/stock_market_events.dm @@ -83,7 +83,7 @@ /datum/stock_market_event/large_boost name = "Large Boost!" trend_value = MARKET_TREND_UPWARD - trend_duration = 3 + trend_duration = 4 circumstance = list( "has just released a new product that raised the price of ", "discovered a new valuable use for ", @@ -93,14 +93,14 @@ /datum/stock_market_event/large_boost/start_event() . = ..() var/price_units = SSstock_market.materials_prices[mat] - SSstock_market.materials_prices[mat] += round(gaussian(price_units * 0.5, price_units * 0.1)) + SSstock_market.materials_prices[mat] += round(gaussian(price_units, price_units * 0.15)) SSstock_market.materials_prices[mat] = clamp(SSstock_market.materials_prices[mat], price_minimum * mat.value_per_unit, price_maximum * mat.value_per_unit) create_news() /datum/stock_market_event/large_drop name = "Large Drop!" trend_value = MARKET_TREND_DOWNWARD - trend_duration = 5 + trend_duration = 4 circumstance = list( "'s latest product has seen major controversy, and resulted in a price drop for ", "has been hit with a major lawsuit, resulting in a price drop for ", @@ -110,6 +110,42 @@ /datum/stock_market_event/large_drop/start_event() . = ..() var/price_units = SSstock_market.materials_prices[mat] - SSstock_market.materials_prices[mat] -= round(gaussian(price_units * 1.5, price_units * 0.1)) + SSstock_market.materials_prices[mat] -= round(gaussian(price_units * 1.5, price_units * 0.15)) SSstock_market.materials_prices[mat] = clamp(SSstock_market.materials_prices[mat], price_minimum * mat.value_per_unit, price_maximum * mat.value_per_unit) create_news() + +/datum/stock_market_event/hotcakes + name = "Selling like Hotcakes!" + trend_value = MARKET_TREND_UPWARD + trend_duration = 1 + circumstance = list( + "has just released a new product that is dominating the market for ", + "is hitting it big! Dramatically stocking and raising the price of ", + ", in a surprise move, monopolized supply and has raised the price of ", + ) + +/datum/stock_market_event/hotcakes/start_event() + . = ..() + SSstock_market.materials_prices[mat] = round(price_maximum * mat.value_per_unit) + create_news() + +/datum/stock_market_event/lockdown + name = "Lockdown!" + trend_value = MARKET_TREND_DOWNWARD + trend_duration = 2 + circumstance = list( + "is being investigated by the Galactic Trade Commission, resulting in a halt of trade for ", + ", in a stunning move, has been embargoed by TerraGov, resulting in a halt of trade of ", + ) + +/datum/stock_market_event/lockdown/handle() + . = ..() + SSstock_market.materials_quantity[mat] = 0 //Force the material to be unavailable. + +/datum/stock_market_event/lockdown/end_event() + . = ..() + 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 8213bf347ab..42fad48509d 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -347,6 +347,15 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(QDELETED(to_insert) || !istype(to_insert)) return FALSE + //stops you from putting stuff like off-hand thingy inside. Hologram storages can accept only hologram items + if(to_insert.item_flags & ABSTRACT) + return FALSE + if(parent.flags_1 & HOLOGRAM_1) + if(!(to_insert.flags_1 & HOLOGRAM_1)) + return FALSE + else if(to_insert.flags_1 & HOLOGRAM_1) + return FALSE + if(locked > force) if(messages && user) user.balloon_alert(user, "closed!") diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index a9322074f25..ca9cff19c73 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -259,9 +259,10 @@ // This method of applying one overlay per z layer has some minor downsides, in that it could lead to improperly doubled effects if some have alpha // I prefer it to creating 2 extra plane masters however, so it's a cost I'm willing to pay // LU - var/mutable_appearance/glow_overlay = mutable_appearance('icons/effects/glow_weather.dmi', weather_state, overlay_layer, null, ABOVE_LIGHTING_PLANE, 100, offset_const = offset) - glow_overlay.color = weather_color - gen_overlay_cache += glow_overlay + if(use_glow) + var/mutable_appearance/glow_overlay = mutable_appearance('icons/effects/glow_weather.dmi', weather_state, overlay_layer, null, ABOVE_LIGHTING_PLANE, 100, offset_const = offset) + glow_overlay.color = weather_color + gen_overlay_cache += glow_overlay var/mutable_appearance/weather_overlay = mutable_appearance('icons/effects/weather_effects.dmi', weather_state, overlay_layer, plane = overlay_plane, offset_const = offset) weather_overlay.color = weather_color diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index 66aa8b2ba15..c98ee9636a7 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -11,6 +11,7 @@ weather_overlay = "snow_storm" weather_duration_lower = 600 weather_duration_upper = 1500 + use_glow = FALSE end_duration = 100 end_message = "The snowfall dies down, it should be safe to go outside again." diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index 2dc3244e9ca..00291609871 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -34,13 +34,13 @@ if(!A.shorted) A.shorted = TRUE A.update_appearance() - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/airalarm, reset), wire), 1200) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/airalarm, reset), wire), 2 MINUTES) if(WIRE_IDSCAN) // Toggle lock. A.locked = !A.locked if(WIRE_AI) // Disable AI control for a while. if(!A.aidisabled) A.aidisabled = TRUE - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/airalarm, reset), wire), 100) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/airalarm, reset), wire), 10 SECONDS) if(WIRE_PANIC) // Toggle panic siphon. if(!A.shorted) if(istype(A.selected_mode, /datum/air_alarm_mode/filtering)) diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 4672bd15b87..c26ddd524ce 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -65,7 +65,7 @@ /datum/wires/airlock/interact(mob/user) var/obj/machinery/door/airlock/airlock_holder = holder - if (!issilicon(user) && airlock_holder.isElectrified() && airlock_holder.shock(user, 100)) + if (!HAS_SILICON_ACCESS(user) && airlock_holder.isElectrified() && airlock_holder.shock(user, 100)) return return ..() @@ -74,9 +74,9 @@ if(!..()) return FALSE var/obj/machinery/door/airlock/airlock = holder - if(!issilicon(user) && !isdrone(user) && airlock.isElectrified()) + if(!HAS_SILICON_ACCESS(user) && !isdrone(user) && airlock.isElectrified()) var/mob/living/carbon/carbon_user = user - if (!istype(carbon_user) || carbon_user.should_electrocute(src)) + if (!istype(carbon_user) || carbon_user.should_electrocute(get_area(airlock))) return FALSE if(airlock.is_secure()) return FALSE diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index ca55dad954f..75c3a368760 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -29,13 +29,13 @@ switch(wire) if(WIRE_HACK) A.adjust_hacked(!A.hacked) - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/autolathe, reset), wire), 60) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/autolathe, reset), wire), 6 SECONDS) if(WIRE_SHOCK) A.shocked = !A.shocked - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/autolathe, reset), wire), 60) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/autolathe, reset), wire), 6 SECONDS) if(WIRE_DISABLE) A.disabled = !A.disabled - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/autolathe, reset), wire), 60) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/autolathe, reset), wire), 6 SECONDS) /datum/wires/autolathe/on_cut(wire, mend, source) var/obj/machinery/autolathe/A = holder diff --git a/code/datums/wires/collar_bomb.dm b/code/datums/wires/collar_bomb.dm new file mode 100644 index 00000000000..574a3d52dbc --- /dev/null +++ b/code/datums/wires/collar_bomb.dm @@ -0,0 +1,33 @@ +/datum/wires/collar_bomb + proper_name = "Collar Bomb" + randomize = TRUE // Only one wire, no need for blueprints + holder_type = /obj/item/clothing/neck/collar_bomb + wires = list(WIRE_ACTIVATE) + +/datum/wires/collar_bomb/interactable(mob/user) + . = ..() + if(user.get_item_by_slot(ITEM_SLOT_NECK) == holder) + return FALSE + +/datum/wires/collar_bomb/on_pulse(wire, mob/user) + var/obj/item/clothing/neck/collar_bomb/collar = holder + if(collar.active) + return ..() + collar.explosive_countdown(ticks_left = 5) + if(!ishuman(collar.loc)) + return ..() + var/mob/living/carbon/human/brian = collar.loc + if(brian.get_item_by_slot(ITEM_SLOT_NECK) != collar) + return ..() + var/mob/living/triggerer = user + var/obj/item/assembly/assembly + if(isnull(triggerer)) + assembly = assemblies[colors[1]] + if(assembly) + triggerer = get_mob_by_key(assembly.fingerprintslast) + brian.investigate_log("has had their [collar] triggered [triggerer ? "by [user || assembly][assembly ? " last touched by triggerer" : ""]" : ""].", INVESTIGATE_DEATHS) + return ..() + +///I'd rather not get people killed by EMP here. +/datum/wires/collar_bomb/emp_pulse() + return diff --git a/code/datums/wires/fax.dm b/code/datums/wires/fax.dm index 8c189d68df8..32904c5f891 100644 --- a/code/datums/wires/fax.dm +++ b/code/datums/wires/fax.dm @@ -12,7 +12,7 @@ if(!.) return FALSE var/obj/machinery/fax/machine = holder - if(!issilicon(user) && machine.seconds_electrified && machine.shock(user, 100)) + if(!HAS_SILICON_ACCESS(user) && machine.seconds_electrified && machine.shock(user, 100)) return FALSE if(machine.panel_open) return TRUE diff --git a/code/datums/wires/mecha.dm b/code/datums/wires/mecha.dm index 07bc1190148..b6e20c8161f 100644 --- a/code/datums/wires/mecha.dm +++ b/code/datums/wires/mecha.dm @@ -69,7 +69,7 @@ if(.) return var/obj/vehicle/sealed/mecha/mecha = holder - if(!issilicon(usr) && mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT && mecha.shock(usr)) + if(!HAS_SILICON_ACCESS(usr) && mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT && mecha.shock(usr)) return FALSE /datum/wires/mecha/can_reveal_wires(mob/user) diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm index 09274880367..00d836a52eb 100644 --- a/code/datums/wires/mod.dm +++ b/code/datums/wires/mod.dm @@ -52,7 +52,7 @@ /datum/wires/mod/ui_act(action, params) var/obj/item/mod/control/mod = holder - if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr)) + if(!HAS_SILICON_ACCESS(usr) && mod.seconds_electrified && mod.shock(usr)) return FALSE return ..() diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 9ec8cbe4db1..beb58fb1ce3 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -20,7 +20,7 @@ if(!..()) return FALSE var/mob/living/simple_animal/bot/mulebot/mule = holder - if(mule.bot_cover_flags & BOT_COVER_OPEN) + if(mule.bot_cover_flags & BOT_COVER_MAINTS_OPEN) return TRUE /datum/wires/mulebot/on_cut(wire, mend, source) diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 8e3870acb47..cf8d9b23886 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -24,7 +24,7 @@ var/list/status = list() status += "The law sync module is [R.lawupdate ? "on" : "off"]." status += "The intelligence link display shows [R.connected_ai ? R.connected_ai.name : "NULL"]." - status += "The camera light is [!isnull(R.builtInCamera) && R.builtInCamera.status ? "on" : "off"]." + status += "The camera light is [!isnull(R.builtInCamera) && R.builtInCamera.camera_enabled ? "on" : "off"]." status += "The lockdown indicator is [R.lockcharge ? "on" : "off"]." status += "There is a star symbol above the [get_color_of_wire(WIRE_RESET_MODEL)] wire." return status @@ -52,7 +52,7 @@ if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) R.builtInCamera.toggle_cam(usr, FALSE) R.visible_message(span_notice("[R]'s camera lens focuses loudly."), span_notice("Your camera lens focuses loudly.")) - log_silicon("[key_name(usr)] toggled [key_name(R)]'s camera to [R.builtInCamera.status ? "on" : "off"] via pulse") + log_silicon("[key_name(usr)] toggled [key_name(R)]'s camera to [R.builtInCamera.camera_enabled ? "on" : "off"] via pulse") if(WIRE_LAWSYNC) // Forces a law update if possible. if(R.lawupdate) R.visible_message(span_notice("[R] gently chimes."), span_notice("LawSync protocol engaged.")) @@ -90,7 +90,7 @@ R.logevent("Lawsync Module fault [mend ? "cleared" : "detected"]") if (WIRE_CAMERA) // Disable the camera. if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) - R.builtInCamera.status = mend + R.builtInCamera.camera_enabled = mend R.builtInCamera.toggle_cam(usr, 0) R.visible_message(span_notice("[R]'s camera lens focuses loudly."), span_notice("Your camera lens focuses loudly.")) R.logevent("Camera Module fault [mend?"cleared":"detected"]") diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 4e037f3e24b..873d092e4f6 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -24,12 +24,21 @@ break ..() +/datum/wires/vending/interact(mob/user) + var/obj/machinery/vending/vending_machine = holder + if (!HAS_SILICON_ACCESS(user) && vending_machine.seconds_electrified && vending_machine.shock(user, 100)) + return + + return ..() + /datum/wires/vending/interactable(mob/user) if(!..()) return FALSE var/obj/machinery/vending/vending_machine = holder - if(!issilicon(user) && vending_machine.seconds_electrified && vending_machine.shock(user, 100)) - return FALSE + if(!HAS_SILICON_ACCESS(user) && vending_machine.seconds_electrified) + var/mob/living/carbon/carbon_user = user + if (!istype(carbon_user) || carbon_user.should_electrocute(get_area(vending_machine))) + return FALSE if(vending_machine.panel_open) return TRUE @@ -57,6 +66,7 @@ vending_machine.extended_inventory = !vending_machine.extended_inventory if(WIRE_SHOCK) vending_machine.seconds_electrified = MACHINE_DEFAULT_ELECTRIFY_TIME + vending_machine.shock(usr, 100) if(WIRE_IDSCAN) vending_machine.scan_id = !vending_machine.scan_id if(WIRE_SPEAKER) @@ -74,7 +84,11 @@ if(WIRE_CONTRABAND) vending_machine.extended_inventory = FALSE if(WIRE_SHOCK) - vending_machine.seconds_electrified = mend ? MACHINE_NOT_ELECTRIFIED : MACHINE_ELECTRIFIED_PERMANENT + if (mend) + vending_machine.seconds_electrified = MACHINE_NOT_ELECTRIFIED + else + vending_machine.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT + vending_machine.shock(usr, 100) if(WIRE_IDSCAN) vending_machine.scan_id = mend if(WIRE_SPEAKER) diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm index 84574d6badd..f6559d344c4 100644 --- a/code/game/area/ai_monitored.dm +++ b/code/game/area/ai_monitored.dm @@ -1,35 +1,31 @@ /area/station/ai_monitored name = "\improper AI Monitored Area" - var/list/obj/machinery/camera/motioncameras = list() - var/list/datum/weakref/motionTargets = list() 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) - for (var/obj/machinery/camera/M in src) - if(M.isMotion()) - motioncameras.Add(M) - M.set_area_motion(src) - -//Only need to use one camera + 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) && motioncameras.len) - for(var/X in motioncameras) - var/obj/machinery/camera/cam = X - cam.newTarget(arrived) - return + 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) && motioncameras.len) - for(var/X in motioncameras) - var/obj/machinery/camera/cam = X - cam.lostTargetRef(WEAKREF(gone)) - return - -/area/station/ai_monitored/turret_protected/ai/Initialize(mapload) . = ..() - src.area_flags |= ABDUCTOR_PROOF + 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 64b4ee9bca4..8d8977a6451 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -79,6 +79,7 @@ var/power_equip = TRUE var/power_light = TRUE var/power_environ = TRUE + var/power_apc_charge = TRUE var/has_gravity = FALSE @@ -105,7 +106,8 @@ ///Typepath to limit the areas (subtypes included) that atoms in this area can smooth with. Used for shuttles. var/area/area_limited_icon_smoothing - var/list/power_usage + /// The energy usage of the area in the last machines SS tick. + var/list/energy_usage /// Wire assignment for airlocks in this area var/airlock_wires = /datum/wires/airlock @@ -161,7 +163,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (area_flags & UNIQUE_AREA) GLOB.areas_by_type[type] = src GLOB.areas += src - power_usage = new /list(AREA_USAGE_LEN) // Some atoms would like to use power in Initialize() + energy_usage = new /list(AREA_USAGE_LEN) // Some atoms would like to use power in Initialize() alarm_manager = new(src) // just in case return ..() @@ -473,7 +475,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /** - * Add a static amount of power load to an area + * Add a static amount of power load to an area. The value is assumed as the watt. * * Possible channels * *AREA_USAGE_STATIC_EQUIP @@ -481,12 +483,13 @@ GLOBAL_LIST_EMPTY(teleportlocs) * *AREA_USAGE_STATIC_ENVIRON */ /area/proc/addStaticPower(value, powerchannel) + value = power_to_energy(value) switch(powerchannel) if(AREA_USAGE_STATIC_START to AREA_USAGE_STATIC_END) - power_usage[powerchannel] += value + energy_usage[powerchannel] += value /** - * Remove a static amount of power load to an area + * Remove a static amount of power load to an area. The value is assumed as the watt. * * Possible channels * *AREA_USAGE_STATIC_EQUIP @@ -494,9 +497,10 @@ GLOBAL_LIST_EMPTY(teleportlocs) * *AREA_USAGE_STATIC_ENVIRON */ /area/proc/removeStaticPower(value, powerchannel) + value = power_to_energy(value) switch(powerchannel) if(AREA_USAGE_STATIC_START to AREA_USAGE_STATIC_END) - power_usage[powerchannel] -= value + energy_usage[powerchannel] -= value /** * Clear all non-static power usage in area @@ -504,18 +508,21 @@ GLOBAL_LIST_EMPTY(teleportlocs) * Clears all power used for the dynamic equipment, light and environment channels */ /area/proc/clear_usage() - power_usage[AREA_USAGE_EQUIP] = 0 - power_usage[AREA_USAGE_LIGHT] = 0 - power_usage[AREA_USAGE_ENVIRON] = 0 + energy_usage[AREA_USAGE_EQUIP] = 0 + energy_usage[AREA_USAGE_LIGHT] = 0 + energy_usage[AREA_USAGE_ENVIRON] = 0 + energy_usage[AREA_USAGE_APC_CHARGE] = 0 /** * Add a power value amount to the stored used_x variables */ -/area/proc/use_power(amount, chan) +/area/proc/use_energy(amount, chan) switch(chan) - if(AREA_USAGE_DYNAMIC_START to AREA_USAGE_DYNAMIC_END) - power_usage[chan] += amount + if(AREA_USAGE_STATIC_START to AREA_USAGE_STATIC_END) + return + else + energy_usage[chan] += amount /** * Call back when an atom enters an area diff --git a/code/game/area/areas/ai_monitored.dm b/code/game/area/areas/ai_monitored.dm index 0fc34c96abb..77ac5d6a2fd 100644 --- a/code/game/area/areas/ai_monitored.dm +++ b/code/game/area/areas/ai_monitored.dm @@ -47,6 +47,7 @@ name = "\improper AI Chamber" icon_state = "ai_chamber" ai_will_not_hear_this = null + area_flags = parent_type::area_flags | ABDUCTOR_PROOF /area/station/ai_monitored/turret_protected/aisat name = "\improper AI Satellite" diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index db4900a1edd..86d1ade828c 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -35,6 +35,10 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" sound_environment = SOUND_ENVIRONMENT_PLAIN ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') +/area/awaymission/museum/cafeteria + name = "Nanotrasen Museum Cafeteria" + sound_environment = SOUND_ENVIRONMENT_ROOM + /area/awaymission/errorroom name = "Super Secret Room" static_lighting = FALSE diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index b0691803bb7..9a0ef3711e4 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -33,7 +33,7 @@ ASSERT(!istype(A, /area/station/holodeck)) return ..() -/area/station/holodeck/use_power(amount, chan) +/area/station/holodeck/use_energy(amount, chan) if(!linked) return FALSE var/area/A = get_area(linked) diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index c16d65059ff..3d4c0fa4172 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -10,6 +10,9 @@ name = "\improper Clown Biodome" ambientsounds = list('sound/ambience/clown.ogg') +/area/ruin/lizard_gaslava + name = "\improper Lizard's Gas(Lava)" + /area/ruin/unpowered/gaia name = "\improper Patch of Eden" diff --git a/code/game/area/areas/station/engineering.dm b/code/game/area/areas/station/engineering.dm index a7ce535cc5d..fa051833ef5 100644 --- a/code/game/area/areas/station/engineering.dm +++ b/code/game/area/areas/station/engineering.dm @@ -23,6 +23,17 @@ /area/station/engineering/atmos/upper name = "Upper Atmospherics" +/*outside atmos*/ +/area/station/engineering/atmos/space_catwalk + name = "\improper Atmospherics Space Catwalk" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + + sound_environment = SOUND_AREA_SPACE + ambience_index = AMBIENCE_SPACE + ambient_buzz = null //Space is deafeningly quiet + min_ambience_cooldown = 195 SECONDS //length of ambispace.ogg + max_ambience_cooldown = 200 SECONDS + /area/station/engineering/atmos/project name = "\improper Atmospherics Project Room" icon_state = "atmos_projectroom" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 71b86bafe72..ad841856c64 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -794,6 +794,10 @@ /atom/proc/setClosed() return +///Called after the atom is 'tamed' for type-specific operations, Usually called by the tameable component but also other things. +/atom/proc/tamed(mob/living/tamer, obj/item/food) + return + /** * Used to attempt to charge an object with a payment component. * diff --git a/code/game/atom/atom_act.dm b/code/game/atom/atom_act.dm index 4c4ec04d667..d7fe5645b13 100644 --- a/code/game/atom/atom_act.dm +++ b/code/game/atom/atom_act.dm @@ -67,6 +67,8 @@ * We then return the protection value */ /atom/proc/emp_act(severity) + // SKYRAT EDIT - REMOVAL + //SHOULD_CALL_PARENT(TRUE) var/protection = SEND_SIGNAL(src, COMSIG_ATOM_PRE_EMP_ACT, severity) if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) wires.emp_pulse() @@ -118,7 +120,7 @@ /atom/proc/hitby(atom/movable/hitting_atom, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) SEND_SIGNAL(src, COMSIG_ATOM_HITBY, hitting_atom, skipcatch, hitpush, blocked, throwingdatum) if(density && !has_gravity(hitting_atom)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). - addtimer(CALLBACK(src, PROC_REF(hitby_react), hitting_atom), 2) + addtimer(CALLBACK(src, PROC_REF(hitby_react), hitting_atom), 0.2 SECONDS) /** * We have have actually hit the passed in atom diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index 078615dba75..4b91f396095 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -25,8 +25,8 @@ return early_sig_return var/interact_return = is_left_clicking \ - ? tool.interact_with_atom(src, user) \ - : tool.interact_with_atom_secondary(src, user) + ? tool.interact_with_atom(src, user, modifiers) \ + : tool.interact_with_atom_secondary(src, user, modifiers) if(interact_return) return interact_return @@ -92,7 +92,7 @@ * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. * Return NONE to allow default interaction / tool handling. */ -/obj/item/proc/interact_with_atom(atom/interacting_with, mob/living/user) +/obj/item/proc/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) return NONE /** @@ -104,8 +104,8 @@ * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. * Return NONE to allow default interaction / tool handling. */ -/obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user) - return interact_with_atom(interacting_with, user) +/obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) /* * Tool-specific behavior procs. diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 41d9407dd6e..786ab5d2108 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -4,6 +4,8 @@ appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE var/last_move = null + /// A list containing arguments for Moved(). + VAR_PRIVATE/tmp/list/active_movement var/anchored = FALSE var/move_resist = MOVE_RESIST_DEFAULT var/move_force = MOVE_FORCE_DEFAULT @@ -119,6 +121,14 @@ /// Will not automatically apply to the turf below you, you need to apply /datum/element/block_explosives in conjunction with this var/explosion_block = 0 + // Access levels, used in modules\jobs\access.dm + /// List of accesses needed to use this object: The user must possess all accesses in this list in order to use the object. + /// Example: If req_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have both ACCESS_ENGINE and ACCESS_CE in order to use the object. + var/list/req_access + /// List of accesses needed to use this object: The user must possess at least one access in this list in order to use the object. + /// Example: If req_one_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have either ACCESS_ENGINE or ACCESS_CE in order to use the object. + var/list/req_one_access + /mutable_appearance/emissive_blocker /mutable_appearance/emissive_blocker/New() @@ -425,7 +435,7 @@ if(z_move_flags & ZMOVE_CAN_FLY_CHECKS && !(movement_type & (FLYING|FLOATING)) && has_gravity(start)) if(z_move_flags & ZMOVE_FEEDBACK) if(rider) - to_chat(rider, span_warning("[src] is is not capable of flight.")) + to_chat(rider, span_warning("[src] [p_are()] incapable of flight.")) else to_chat(src, span_warning("You are not Superman.")) return FALSE @@ -604,6 +614,7 @@ * most of the time you want forceMove() */ /atom/movable/proc/abstract_move(atom/new_loc) + RESOLVE_ACTIVE_MOVEMENT // This should NEVER happen, but, just in case... var/atom/old_loc = loc var/direction = get_dir(old_loc, new_loc) loc = new_loc @@ -618,6 +629,9 @@ if(!newloc || newloc == loc) return + // A mid-movement... movement... occured, resolve that first. + RESOLVE_ACTIVE_MOVEMENT + if(!direction) direction = get_dir(src, newloc) @@ -662,6 +676,7 @@ var/area/oldarea = get_area(oldloc) var/area/newarea = get_area(newloc) + SET_ACTIVE_MOVEMENT(oldloc, direction, FALSE, old_locs) loc = newloc . = TRUE @@ -682,7 +697,7 @@ if(oldarea != newarea) newarea.Entered(src, oldarea) - Moved(oldloc, direction, FALSE, old_locs) + RESOLVE_ACTIVE_MOVEMENT //////////////////////////////////////// @@ -1091,8 +1106,13 @@ /atom/movable/proc/doMove(atom/destination) . = FALSE + RESOLVE_ACTIVE_MOVEMENT + var/atom/oldloc = loc var/is_multi_tile = bound_width > world.icon_size || bound_height > world.icon_size + + SET_ACTIVE_MOVEMENT(oldloc, NONE, TRUE, null) + if(destination) ///zMove already handles whether a pull from another movable should be broken. if(pulledby && !currently_z_moving) @@ -1154,7 +1174,7 @@ if(old_area) old_area.Exited(src, NONE) - Moved(oldloc, NONE, TRUE) + RESOLVE_ACTIVE_MOVEMENT /** * Called when a movable changes z-levels. diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index f04ff43553c..d81f9306af4 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1017,6 +1017,11 @@ GLOBAL_LIST_EMPTY(possible_items) var/payout_bonus = 0 var/area/dropoff = null +/datum/objective/contract/is_valid_target(datum/mind/possible_target) + if(HAS_TRAIT(possible_target, TRAIT_HAS_BEEN_KIDNAPPED)) + return FALSE + return ..() + // Generate a random valid area on the station that the dropoff will happen. /datum/objective/contract/proc/generate_dropoff() var/found = FALSE diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 2240f220e48..64b3e4420cb 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -22,9 +22,23 @@ var/objective_type = OBJECTIVE_ITEM_TYPE_NORMAL /// Whether this item exists on the station map at the start of a round. var/exists_on_map = FALSE + /** + * How hard it is to steal this item given normal circumstances, ranked on a scale of 1 to 5. + * + * 1 - Probably found in a public area + * 2 - Likely on someone's person, or in a less-than-public but otherwise unguarded area + * 3 - Usually on someone's person, or in a locked locker or otherwise secure area + * 4 - Always on someone's person, or in a secure area + * 5 - You know it when you see it. Things like the Nuke Disc which have a pointer to it at all times. + * + * Also accepts 0 as "extremely easy to steal" and >5 as "almost impossible to steal" + */ + var/difficulty = 0 + /// A hint explaining how one may find the target item. + var/steal_hint = "The clown might have one." /// For objectives with special checks (does that intellicard have an ai in it? etcetc) -/datum/objective_item/proc/check_special_completion() +/datum/objective_item/proc/check_special_completion(obj/item/thing) return TRUE /// Takes a list of minds and returns true if this is a valid objective to give to a team of these minds @@ -72,6 +86,8 @@ excludefromjob = list(JOB_BARTENDER) item_owner = list(JOB_BARTENDER) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A double-barrel shotgun usually found on the bartender's person, or if none are around, in the bar's backroom." /obj/item/gun/ballistic/shotgun/doublebarrel/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/doublebarrel) @@ -91,6 +107,9 @@ JOB_STATION_ENGINEER, ) exists_on_map = TRUE + difficulty = 3 + steal_hint = "Only two of these exist on the station - one in the bridge, and one in atmospherics. \ + You can use a multitool to hack open the case, or break it open the hard way." /obj/item/fireaxe/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/fireaxe) @@ -105,6 +124,8 @@ ) item_owner = list(JOB_ROBOTICIST) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A specialized tool found in the roboticist's lab. You can use a multitool to hack open the case, or break it open the hard way." /obj/item/crowbar/mechremoval/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/crowbar/mechremoval) @@ -115,6 +136,9 @@ excludefromjob = list(JOB_CHAPLAIN) item_owner = list(JOB_CHAPLAIN) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A holy artifact usually found on the chaplain's person, or if none are around, in the chapel's relic closet. \ + If there is a chaplain aboard, it is likely be to be transformed into some holy weapon - some of which are... difficult to remove from their person." /obj/item/nullrod/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/nullrod) @@ -125,6 +149,8 @@ excludefromjob = list(JOB_CLOWN, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_CLOWN) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The clown's huge, bright shoes. They should always be on the clown's feet." /obj/item/clothing/shoes/clown_shoes/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/shoes/clown_shoes) @@ -135,6 +161,8 @@ excludefromjob = list(JOB_MIME, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_MIME) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The mime's mask. It should always be on the mime's face." /obj/item/clothing/mask/gas/mime/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/mask/gas/mime) @@ -145,6 +173,9 @@ excludefromjob = list(JOB_SHAFT_MINER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_SHAFT_MINER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A tool primarily used by shaft miners to mine. Most carry one (or multiple) on their person, \ + but they can also be found in the Mining Station, Mining office, or Auxiliary Mining Base on the station." /obj/item/gun/energy/recharge/kinetic_accelerator/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/recharge/kinetic_accelerator) @@ -155,6 +186,8 @@ excludefromjob = list(JOB_COOK, JOB_HEAD_OF_PERSONNEL, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_COOK) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The chef's fake Italian moustache, either found on their face or in the garbage, depending on who's on duty." /obj/item/clothing/mask/fakemoustache/italian/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/mask/fakemoustache/italian) @@ -164,6 +197,9 @@ targetitem = /obj/item/gun/ballistic/revolver/c38/detective excludefromjob = list(JOB_DETECTIVE) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A .38 special revolver found in the Detective's holder. \ + Usually found on the Detective's person, or if none are around, in the detective's locker, in their office." /obj/item/gun/ballistic/revolver/c38/detective/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/revolver/c38/detective) @@ -174,6 +210,8 @@ excludefromjob = list(JOB_LAWYER) item_owner = list(JOB_LAWYER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The lawyer's badge. Usually pinned to their chest, but a spare can be obtained from their clothes vendor." /obj/item/clothing/accessory/lawyers_badge/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/accessory/lawyers_badge) @@ -183,6 +221,8 @@ targetitem = /obj/item/storage/belt/utility/chief excludefromjob = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE + difficulty = 2 + steal_hint = "The chief engineer's toolbelt, strapped to their waist at all times." /obj/item/storage/belt/utility/chief/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/storage/belt/utility/chief) @@ -199,6 +239,8 @@ JOB_CHIEF_MEDICAL_OFFICER ) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A self-defense weapon standard-issue for all heads of staffs barring the Head of Security. Rarely found off of their person." /obj/item/melee/baton/telescopic/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/melee/baton/telescopic) @@ -209,6 +251,9 @@ excludefromjob = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN) item_owner = list(JOB_QUARTERMASTER) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A card that grants access to Cargo's funds. \ + Normally found in the locker of the Quartermaster, but a particularly keen one may have it on their person or in their wallet." /obj/item/card/id/departmental_budget/car/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/card/id/departmental_budget/car) @@ -218,6 +263,9 @@ targetitem = /obj/item/mod/control/pre_equipped/magnate excludefromjob = list(JOB_CAPTAIN) exists_on_map = TRUE + difficulty = 3 + steal_hint = "An expensive, hand-crafted MOD unit made for the station's Captain. \ + If not being worn by the Captain, you would find it in the Suit Storage Unit in their quarters." /obj/item/mod/control/pre_equipped/magnate/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/magnate) @@ -234,6 +282,10 @@ JOB_CHIEF_MEDICAL_OFFICER ) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The spare ID of the High Lord himself. \ + If there's no official Captain around, you may find it pinned to the chest of the Acting Captain - one of the Heads of Staff. \ + Otherwise, you'll have to bust open the golden safe on the bridge with acid or explosives to get to it." /obj/item/card/id/advanced/gold/captains_spare/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/card/id/advanced/gold/captains_spare) @@ -246,6 +298,9 @@ targetitem = /obj/item/gun/energy/laser/captain excludefromjob = list(JOB_CAPTAIN) exists_on_map = TRUE + difficulty = 4 + steal_hint = "A self-charging laser gun found in a display case in the Captain's Quarters. \ + Breaking it open may trigger a security alert, so be careful." /obj/item/gun/energy/laser/captain/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/laser/captain) @@ -256,6 +311,9 @@ excludefromjob = list(JOB_HEAD_OF_SECURITY) item_owner = list(JOB_HEAD_OF_SECURITY) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The Head of Security's unique three mode laser gun. \ + Always found on their person, if they are alive, but may otherwise be found in their locker." /obj/item/gun/energy/e_gun/hos/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/e_gun/hos) @@ -266,6 +324,8 @@ excludefromjob = list(JOB_HEAD_OF_SECURITY) item_owner = list(JOB_HEAD_OF_SECURITY) exists_on_map = TRUE + difficulty = 4 + steal_hint = "A miniaturized combat shotgun. May be found in Head of Security's locker or strapped to their back." /obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/automatic/combat/compact) @@ -276,6 +336,9 @@ excludefromjob = list(JOB_CAPTAIN, JOB_RESEARCH_DIRECTOR, JOB_HEAD_OF_PERSONNEL) item_owner = list(JOB_CAPTAIN, JOB_RESEARCH_DIRECTOR) exists_on_map = TRUE + difficulty = 3 + steal_hint = "Only two of these devices exist on the station, with one sitting in the Teleporter Room \ + for emergencies, and the other in the Captain's Quarters for personal use." /obj/item/hand_tele/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/hand_tele) @@ -286,6 +349,8 @@ 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) @@ -296,6 +361,9 @@ excludefromjob = list(JOB_CHIEF_ENGINEER) item_owner = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A pair of magnetic boots found in the Chief Engineer's Suit Storage Unit. \ + May also be found on their person, concealed beneath their MODsuit." /obj/item/clothing/shoes/magboots/advance/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/shoes/magboots/advance) @@ -306,6 +374,9 @@ excludefromjob = list(JOB_CAPTAIN) item_owner = list(JOB_CAPTAIN) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A gold medal found in the medal box in the Captain's Quarters. \ + The Captain usually also has one pinned to their jumpsuit." /obj/item/clothing/accessory/medal/gold/captain/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/accessory/medal/gold/captain) @@ -314,18 +385,24 @@ //name = "the hypospray" // ORIGINAL name = "the Chief Medical Officer's hypospray" // SKYRAT EDIT CHANGE //targetitem = /obj/item/reagent_containers/hypospray/cmo // ORIGINAL - targetitem = /obj/item/hypospray/mkii/cmo // SKYRAT EDIT CHANGE + targetitem = /obj/item/hypospray/mkii/deluxe/cmo // SKYRAT EDIT CHANGE excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER) item_owner = list(JOB_CHIEF_MEDICAL_OFFICER) exists_on_map = TRUE + difficulty = 3 + steal_hint = "The Chief Medical Officer's personal medical injector. \ + Usually found amongst their medical supplies on their person, in their belt, or otherwise in their locker." -/obj/item/hypospray/mkii/cmo/add_stealing_item_objective() // SKYRAT EDIT CHANGE - return add_item_to_steal(src, /obj/item/hypospray/mkii/cmo) // SKYRAT EDIT CHANGE +/obj/item/hypospray/mkii/deluxe/cmo/add_stealing_item_objective() // SKYRAT EDIT CHANGE + return add_item_to_steal(src, /obj/item/hypospray/mkii/deluxe/cmo) // SKYRAT EDIT CHANGE /datum/objective_item/steal/nukedisc name = "the nuclear authentication disk" targetitem = /obj/item/disk/nuclear excludefromjob = list(JOB_CAPTAIN) + difficulty = 5 + steal_hint = "THAT disk - you know the one. Carried by the Captain at all times (hopefully). \ + Difficult to miss, but if you can't find it, the Head of Security and Captain both have devices to track its precise location." /obj/item/disk/nuclear/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/disk/nuclear) @@ -339,6 +416,8 @@ excludefromjob = list(JOB_HEAD_OF_SECURITY, JOB_WARDEN) item_owner = list(JOB_HEAD_OF_SECURITY) exists_on_map = TRUE + difficulty = 4 + steal_hint = "An ablative trechcoat found on the shelves of the Armory." /obj/item/clothing/suit/hooded/ablative/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/suit/hooded/ablative) @@ -349,6 +428,9 @@ excludefromjob = list(JOB_RESEARCH_DIRECTOR) item_owner = list(JOB_RESEARCH_DIRECTOR) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A special suit of armor found in the possession of the Research Director. \ + You may otherwise find it in their locker." /obj/item/clothing/suit/armor/reactive/teleport/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/suit/armor/reactive/teleport) @@ -358,6 +440,11 @@ valid_containers = list(/obj/item/folder) targetitem = /obj/item/documents exists_on_map = TRUE + difficulty = 3 + steal_hint = "A set of papers belonging to a megaconglomerate. \ + Nanotrasen documents can easily be found in the station's vault. \ + For other corporations, you may find them in strange and distant places. \ + A photocopy may also suffice." /obj/item/documents/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/documents) //Any set of secret documents. Doesn't have to be NT's @@ -367,6 +454,8 @@ valid_containers = list(/obj/item/nuke_core_container) targetitem = /obj/item/nuke_core exists_on_map = TRUE + difficulty = 4 + steal_hint = "The core of the station's self-destruct device, found in the vault." /obj/item/nuke_core/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/nuke_core) @@ -381,6 +470,8 @@ excludefromjob = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST) item_owner = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The hard drive of the master research server, found in R&D's server room." /obj/item/computer_disk/hdd_theft/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/computer_disk/hdd_theft) @@ -394,6 +485,8 @@ name = "a sliver of a supermatter crystal" targetitem = /obj/item/nuke_core/supermatter_sliver valid_containers = list(/obj/item/nuke_core_container/supermatter) + difficulty = 5 + steal_hint = "A small shard of the station's supermatter crystal engine." /datum/objective_item/steal/supermatter/New() special_equipment += /obj/item/storage/box/syndie_kit/supermatter @@ -406,6 +499,8 @@ /datum/objective_item/steal/functionalai name = "a functional AI" targetitem = /obj/item/aicard + difficulty = 5 + steal_hint = "An intellicard (or MODsuit) containing an active, functional AI." /datum/objective_item/steal/functionalai/New() . = ..() @@ -439,6 +534,8 @@ item_owner = list(JOB_CHIEF_ENGINEER) altitems = list(/obj/item/photo) exists_on_map = TRUE + difficulty = 3 + steal_hint = "The blueprints of the station, found in the Chief Engineer's locker, or on their person. A picture may suffice." /obj/item/areaeditor/blueprints/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/areaeditor/blueprints) @@ -457,6 +554,8 @@ targetitem = /obj/item/blackbox excludefromjob = list(JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The station's data Blackbox, found solely within Telecommunications." /obj/item/blackbox/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/blackbox) @@ -470,6 +569,8 @@ excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) item_owner = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A basic pair of insulated gloves, usually worn by Assistants, Engineers, or Cargo Technicians." /obj/item/clothing/gloves/color/yellow/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/gloves/color/yellow) @@ -479,6 +580,8 @@ targetitem = /obj/item/toy/plush/moth excludefromjob = list(JOB_PSYCHOLOGIST, JOB_PARAMEDIC, JOB_CHEMIST, JOB_MEDICAL_DOCTOR, JOB_VIROLOGIST, JOB_CHIEF_MEDICAL_OFFICER, JOB_CORONER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A moth plush toy. The Psychologist has one to help console patients." /obj/item/toy/plush/moth/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/toy/plush/moth) @@ -487,6 +590,8 @@ name = "cute lizard plush toy" targetitem = /obj/item/toy/plush/lizard_plushie exists_on_map = TRUE + difficulty = 1 + steal_hint = "A lizard plush toy. Often found hidden in maintenance." /obj/item/toy/plush/lizard_plushie/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/toy/plush/lizard_plushie) @@ -496,6 +601,8 @@ targetitem = /obj/item/stamp/denied excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Cargo often has multiple of these red stamps lying around to process paperwork." /obj/item/stamp/denied/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/stamp/denied) @@ -505,6 +612,8 @@ targetitem = /obj/item/stamp/granted excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Cargo often has multiple of these green stamps lying around to process paperwork." /obj/item/stamp/granted/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/stamp/granted) @@ -514,6 +623,9 @@ targetitem = /obj/item/book/manual/wiki/security_space_law excludefromjob = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY, JOB_LAWYER, JOB_DETECTIVE) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Sometimes found in the possession of members of Security and Lawyers. \ + The courtroom and the library are also good places to look." /obj/item/book/manual/wiki/security_space_law/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/book/manual/wiki/security_space_law) @@ -524,6 +636,8 @@ excludefromjob = list(JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_SCIENTIST, JOB_RESEARCH_DIRECTOR, JOB_GENETICIST, JOB_ROBOTICIST) item_owner = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A tool often used by Engineers, Atmospherics Technicians, and Ordnance Technicians." /obj/item/pipe_dispenser/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/pipe_dispenser) @@ -533,6 +647,254 @@ targetitem = /obj/item/storage/fancy/donut_box excludefromjob = list(JOB_CAPTAIN, JOB_CHIEF_ENGINEER, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_LAWYER, JOB_DETECTIVE) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Everyone has a box of donuts - you may most commonly find them on the Bridge, within Security, or in any department's break room." /obj/item/storage/fancy/donut_box/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/storage/fancy/donut_box) + +/datum/objective_item/steal/spy + objective_type = OBJECTIVE_ITEM_TYPE_SPY + +/datum/objective_item/steal/spy/lamarr + name = "The Research Director's pet headcrab" + targetitem = /obj/item/clothing/mask/facehugger/lamarr + excludefromjob = list(JOB_RESEARCH_DIRECTOR) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "The Research Director's pet headcrab, Lamarr, found in a secure cage in their office." + +/obj/item/clothing/mask/facehugger/lamarr/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/facehugger/lamarr) + +/datum/objective_item/steal/spy/disabler + name = "a disabler" + targetitem = /obj/item/gun/energy/disabler + excludefromjob = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + difficulty = 2 + steal_hint = "A hand-held disabler, often found in the possession of Security Officers." + +/datum/objective_item/steal/spy/energy_gun + name = "an energy gun" + targetitem = /obj/item/gun/energy/e_gun + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "A two-mode energy gun, found in the station's Armory, as well as in the hands of some heads of staff for personal defense." + +/datum/objective_item/steal/spy/energy_gun/check_special_completion(obj/item/thing) + return thing.type == /obj/item/gun/energy/e_gun + +/obj/item/gun/energy/e_gun/add_stealing_item_objective() + if(type == /obj/item/gun/energy/e_gun) + return add_item_to_steal(src, /obj/item/gun/energy/e_gun) + +/datum/objective_item/steal/spy/laser_gun + name = "a laser gun" + targetitem = /obj/item/gun/energy/laser + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "A simple laser gun, found in the station's Armory." + +/datum/objective_item/steal/spy/laser_gun/check_special_completion(obj/item/thing) + return thing.type == /obj/item/gun/energy/laser + +/obj/item/gun/energy/laser/add_stealing_item_objective() + if(type == /obj/item/gun/energy/laser) + return add_item_to_steal(src, /obj/item/gun/energy/laser) + +/datum/objective_item/steal/spy/shotgun + name = "a riot shotgun" + targetitem = /obj/item/gun/ballistic/shotgun/riot + excludefromjob = list( + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "A shotgun found in the station's Armory for riot suppression. Doesn't miss." + +/obj/item/gun/ballistic/shotgun/riot/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/riot) + +/datum/objective_item/steal/spy/temp_gun + name = "security's temperature gun" + targetitem = /obj/item/gun/energy/temperature/security + excludefromjob = list( + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 2 // lowered for the meme + steal_hint = "Security's TRUSTY temperature gun, found in the station's Armory." + +/obj/item/gun/energy/temperature/security/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/energy/temperature/security) + +/datum/objective_item/steal/spy/stamp + name = "a head of staff's stamp" + targetitem = /obj/item/stamp/head + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + ) + exists_on_map = TRUE + difficulty = 1 + steal_hint = "A stamp owned by a head of staff, from their offices." + +/obj/item/stamp/head/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/head) + +/datum/objective_item/steal/spy/sunglasses + name = "sunglasses" + targetitem = /obj/item/clothing/glasses/sunglasses + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_LAWYER, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + difficulty = 1 + steal_hint = "A pair of sunglasses. Lawyers often have a few pairs, as do some heads of staff. \ + You can also obtain a pair from dissassembling hudglasses." + +/datum/objective_item/steal/spy/ce_modsuit + name = "the cheif engineer's advanced MOD control unit" + targetitem = /obj/item/mod/control/pre_equipped/advanced + excludefromjob = list(JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "An advanced version of the standard Engineering MODsuit commonly worn by the Chief Engineer." + +/obj/item/mod/control/pre_equipped/advanced/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/advanced) + +/datum/objective_item/steal/spy/rd_modsuit + name = "the research director's research MOD control unit" + targetitem = /obj/item/mod/control/pre_equipped/research + excludefromjob = list(JOB_RESEARCH_DIRECTOR) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "A bulky MODsuit commonly worn by the Research Director to protect themselves from the hazards of their work." + +/obj/item/mod/control/pre_equipped/research/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/research) + +/datum/objective_item/steal/spy/cmo_modsuit + name = "the chief medical officer's rescure MOD control unit" + targetitem = /obj/item/mod/control/pre_equipped/rescue + excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "A MODsuit sometimes equipped by the Chief Medical Officer to perform rescue opperations in hazardous environments." + +/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/hos_modsuit + name = "the head of security's safeguard MOD control unit" + targetitem = /obj/item/mod/control/pre_equipped/safeguard + excludefromjob = list(JOB_HEAD_OF_SECURITY) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "An advanced MODsuit sometimes worn by the Head of Security when needing to detain hostiles invading the station." + +/obj/item/mod/control/pre_equipped/safeguard/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/safeguard) + +/datum/objective_item/steal/spy/stun_baton + name = "a stun baton" + targetitem = /obj/item/melee/baton/security + excludefromjob = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + difficulty = 2 + steal_hint = "Steal any stun baton from Security." + +/datum/objective_item/steal/spy/stun_baton/check_special_completion(obj/item/thing) + return !istype(thing, /obj/item/melee/baton/security/cattleprod) + +/datum/objective_item/steal/spy/det_baton + name = "the detective's baton" + targetitem = /obj/item/melee/baton + excludefromjob = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "The detective's old wooden truncheon, commonly found on their person for self defense." + +/datum/objective_item/steal/spy/det_baton/check_special_completion(obj/item/thing) + return thing.type == /obj/item/melee/baton + +/obj/item/melee/baton/add_stealing_item_objective() + if(type == /obj/item/melee/baton) + return add_item_to_steal(src, /obj/item/melee/baton) + +/datum/objective_item/steal/spy/captain_sabre_sheathe + name = "the captain's sabre sheathe" + targetitem = /obj/item/storage/belt/sabre + excludefromjob = list(JOB_CAPTAIN) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "The sheathe for the captain's sabre, found in their closet or strapped to their waist at all times." + +/obj/item/storage/belt/sabre/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/storage/belt/sabre) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 7485e1253a6..d9ceac4f7f2 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -57,13 +57,13 @@ * * * Default definition uses 'use_power', 'power_channel', 'active_power_usage', - * 'idle_power_usage', 'powered()', and 'use_power()' implement behavior. + * 'idle_power_usage', 'powered()', and 'use_energy()' implement behavior. * * powered(chan = -1) 'modules/power/power.dm' * Checks to see if area that contains the object has power available for power * channel given in 'chan'. -1 defaults to power_channel * - * use_power(amount, chan=-1) 'modules/power/power.dm' + * use_energy(amount, chan=-1) 'modules/power/power.dm' * Deducts 'amount' from the power channel 'chan' of the area that contains the object. * * power_change() 'modules/power/power.dm' @@ -191,7 +191,7 @@ update_current_power_usage() setup_area_power_relationship() -/obj/machinery/Destroy() +/obj/machinery/Destroy(force) SSmachines.unregister_machine(src) end_processing() @@ -304,7 +304,7 @@ . = ..() if(!use_power || machine_stat || (. & EMP_PROTECT_SELF)) return - use_power(7500/severity) + use_energy(7.5 KILO JOULES / severity) new /obj/effect/temp_visual/emp(loc) if(!prob(70/severity)) @@ -593,10 +593,10 @@ if(!isliving(user)) return FALSE //no ghosts allowed, sorry - if(!issilicon(user) && !user.can_hold_items()) + if(!HAS_SILICON_ACCESS(user) && !user.can_hold_items()) return FALSE //spiders gtfo - if(issilicon(user)) // If we are a silicon, make sure the machine allows silicons to interact with it + if(HAS_SILICON_ACCESS(user)) // If we are a silicon, make sure the machine allows silicons to interact with it if(!(interaction_flags_machine & INTERACT_MACHINE_ALLOW_SILICON)) return FALSE @@ -657,7 +657,7 @@ //////////////////////////////////////////////////////////////////////////////////////////// //Return a non FALSE value to interrupt attack_hand propagation to subtypes. -/obj/machinery/interact(mob/user, special_state) +/obj/machinery/interact(mob/user) if(interaction_flags_machine & INTERACT_MACHINE_SET_MACHINE) user.set_machine(src) update_last_used(user) @@ -666,7 +666,7 @@ /obj/machinery/ui_act(action, list/params) add_fingerprint(usr) update_last_used(usr) - if(isAI(usr) && !GLOB.cameranet.checkTurfVis(get_turf(src))) //We check if they're an AI specifically here, so borgs can still access off-camera stuff. + if(HAS_AI_ACCESS(usr) && !GLOB.cameranet.checkTurfVis(get_turf(src))) //We check if they're an AI specifically here, so borgs can still access off-camera stuff. to_chat(usr, span_warning("You can no longer connect to this device!")) return FALSE return ..() @@ -699,8 +699,8 @@ hit_with_what_noun += plural_s(hit_with_what_noun) // hit with "their hands" user.visible_message( - span_danger("[user] smashes [src] with [user.p_their()] [hit_with_what_noun][damage ? "." : ", without leaving a mark!"]"), - span_danger("You smash [src] with your [hit_with_what_noun][damage ? "." : ", without leaving a mark!"]"), + span_danger("[user] smashes [src] with [user.p_their()] [hit_with_what_noun][damage ? "." : ", [no_damage_feedback]!"]"), + span_danger("You smash [src] with your [hit_with_what_noun][damage ? "." : ", [no_damage_feedback]!"]"), span_hear("You hear a [damage ? "smash" : "thud"]."), COMBAT_MESSAGE_RANGE, ) @@ -799,7 +799,7 @@ SEND_SIGNAL(src, COMSIG_MACHINERY_REFRESH_PARTS) /obj/machinery/proc/default_pry_open(obj/item/crowbar, close_after_pry = FALSE, open_density = FALSE, closed_density = TRUE) - . = !(state_open || panel_open || is_operational || (obj_flags & NO_DECONSTRUCTION)) && crowbar.tool_behaviour == TOOL_CROWBAR + . = !(state_open || panel_open || is_operational) && crowbar.tool_behaviour == TOOL_CROWBAR if(!.) return crowbar.play_tool_sound(src, 50) @@ -809,23 +809,23 @@ close_machine(density_to_set = closed_density) /obj/machinery/proc/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel = 0, custom_deconstruct = FALSE) - . = (panel_open || ignore_panel) && !(obj_flags & NO_DECONSTRUCTION) && crowbar.tool_behaviour == TOOL_CROWBAR + . = (panel_open || ignore_panel) && crowbar.tool_behaviour == TOOL_CROWBAR if(!. || custom_deconstruct) return crowbar.play_tool_sound(src, 50) deconstruct(TRUE) -/obj/machinery/deconstruct(disassembled = TRUE) +/obj/machinery/handle_deconstruct(disassembled = TRUE) SHOULD_NOT_OVERRIDE(TRUE) if(obj_flags & NO_DECONSTRUCTION) - dump_contents() //drop everything inside us - return ..() //Just delete us, no need to call anything else. + dump_inventory_contents() //drop stuff we consider important + return //Just delete us, no need to call anything else. on_deconstruction(disassembled) if(!LAZYLEN(component_parts)) dump_contents() //drop everything inside us - return ..() //we don't have any parts. + return //we don't have any parts. spawn_frame(disassembled) for(var/part in component_parts) @@ -849,8 +849,6 @@ //to handle their contents before we dump them dump_contents() - return ..() - /** * Spawns a frame where this machine is. If the machine was not disassmbled, the * frame is spawned damaged. If the frame couldn't exist on this turf, it's smashed @@ -882,7 +880,7 @@ /obj/machinery/atom_break(damage_flag) . = ..() - if(!(machine_stat & BROKEN) && !(obj_flags & NO_DECONSTRUCTION)) + if(!(machine_stat & BROKEN)) set_machine_stat(machine_stat | BROKEN) SEND_SIGNAL(src, COMSIG_MACHINERY_BROKEN, damage_flag) update_appearance() @@ -929,7 +927,7 @@ qdel(atom_part) /obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) - if((obj_flags & NO_DECONSTRUCTION) || screwdriver.tool_behaviour != TOOL_SCREWDRIVER) + if(screwdriver.tool_behaviour != TOOL_SCREWDRIVER) return FALSE screwdriver.play_tool_sound(src, 50) @@ -956,7 +954,7 @@ if(!istype(replacer_tool)) return FALSE - if((obj_flags & NO_DECONSTRUCTION) && !replacer_tool.works_from_distance) + if(!replacer_tool.works_from_distance) return FALSE var/shouldplaysound = FALSE diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index df3e402525d..edb945f483e 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) /// Sends a message to the appropriate channels. /obj/machinery/announcement_system/proc/broadcast(message, list/channels) - use_power(active_power_usage) + use_energy(active_power_usage) if(channels.len == 0) radio.talk_into(src, message, null) else diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index ba9667b3e58..4fbfe2d37bf 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -4,7 +4,8 @@ icon = 'icons/obj/machines/lathes.dmi' icon_state = "autolathe" density = TRUE - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 + //Energy cost per full stack of sheets worth of materials used. Material insertion is 40% of this. + active_power_usage = 25 * BASE_MACHINE_ACTIVE_CONSUMPTION circuit = /obj/item/circuitboard/machine/autolathe layer = BELOW_OBJ_LAYER processing_flags = NONE @@ -95,10 +96,19 @@ /obj/machinery/autolathe/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER - flick("autolathe_[item_inserted.has_material_type(/datum/material/glass) ? "r" : "o"]", src) - //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it - directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage))) + if(directly_use_energy(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.4 * initial(active_power_usage)))) + flick_overlay_view(mutable_appearance('icons/obj/machines/lathes.dmi', "autolathe_mat"), 1 SECONDS) + + var/datum/material/highest_mat_ref + var/highest_mat = 0 + for(var/datum/material/mat as anything in mats_consumed) + var/present_mat = mats_consumed[mat] + if(present_mat > highest_mat) + highest_mat = present_mat + highest_mat_ref = mat + + flick_overlay_view(material_insertion_animation(highest_mat_ref.greyscale_colors), 1 SECONDS) /obj/machinery/autolathe/ui_interact(mob/user, datum/tgui/ui) if(!is_operational) @@ -274,7 +284,7 @@ var/charge_per_item = 0 for(var/material in design.materials) charge_per_item += design.materials[material] - charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * material_cost_coefficient * 0.05 * active_power_usage) + charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * material_cost_coefficient * active_power_usage) var/build_time_per_item = (design.construction_time * design.lathe_time_factor) ** 0.8 //do the printing sequentially @@ -311,11 +321,22 @@ finalize_build() return - if(!is_operational || !directly_use_power(charge_per_item)) + if(!is_operational) say("Unable to continue production, power failure.") finalize_build() return + if(!directly_use_energy(charge_per_item)) // provide the wait time until lathe is ready + var/area/my_area = get_area(src) + var/obj/machinery/power/apc/my_apc = my_area.apc + var/charging_wait = my_apc.time_to_charge(charge_per_item) + if(!isnull(charging_wait)) + say("Unable to continue production, APC overload. Wait [DisplayTimeText(charging_wait, round_seconds_to = 1)] and try again.") + else + say("Unable to continue production, power grid overload.") + finalize_build() + return + var/is_stack = ispath(design.build_path, /obj/item/stack) if(!materials.has_materials(materials_needed, material_cost_coefficient, is_stack ? items_remaining : 1)) say("Unable to continue production, missing materials.") @@ -356,7 +377,7 @@ /obj/machinery/autolathe/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) . = ..() - if((!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) + if(!can_interact(usr) || (!HAS_SILICON_ACCESS(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) return if(busy) balloon_alert(usr, "printing started!") diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index faa29c2673e..006620ec5f4 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -88,7 +88,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /obj/machinery/barsign/atom_break(damage_flag) . = ..() - if((machine_stat & BROKEN) && !(obj_flags & NO_DECONSTRUCTION)) + if(machine_stat & BROKEN) set_sign(new /datum/barsign/hiddensigns/signoff) /obj/machinery/barsign/on_deconstruction(disassembled) diff --git a/code/game/machinery/botlaunchpad.dm b/code/game/machinery/botlaunchpad.dm index 0744954257a..c8004af84ba 100644 --- a/code/game/machinery/botlaunchpad.dm +++ b/code/game/machinery/botlaunchpad.dm @@ -44,6 +44,10 @@ user.balloon_alert(user, "too many bots on the pad!") return possible_bot = robot // We don't change the launched_bot var here because we are not sure if there is another bot on the pad. + + if(!use_energy(active_power_usage, force = FALSE)) + balloon_alert(user, "not enough energy!") + return launched_bot = WEAKREF(possible_bot) podspawn(list( "target" = get_turf(src), @@ -51,7 +55,6 @@ "style" = STYLE_SEETHROUGH, "reverse_dropoff_coords" = list(reverse_turf.x, reverse_turf.y, reverse_turf.z) )) - use_power(active_power_usage) /obj/machinery/botpad/proc/recall(mob/living/user) var/atom/our_bot = launched_bot?.resolve() diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 5824f93dcc7..32e56e2fca9 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -4,23 +4,25 @@ icon = 'icons/obj/machines/wallmounts.dmi' base_icon_state = "button" icon_state = "button" - ///Icon suffix for the skin of the front pannel that is added to base_icon_state - var/skin = "" - ///Whether it is possible to change the panel skin - var/can_alter_skin = TRUE power_channel = AREA_USAGE_ENVIRON - var/obj/item/assembly/device - var/obj/item/electronics/airlock/board - var/device_type = null - var/id = null - var/initialized_button = 0 - var/silicon_access_disabled = FALSE light_power = 0.5 // Minimums, we want the button to glow if it has a mask, not light an area light_range = 1.5 light_color = LIGHT_COLOR_VIVID_GREEN armor_type = /datum/armor/machinery_button idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.02 resistance_flags = LAVA_PROOF | FIRE_PROOF + interaction_flags_machine = parent_type::interaction_flags_machine | INTERACT_MACHINE_OPEN + ///Icon suffix for the skin of the front pannel that is added to base_icon_state + var/skin = "" + ///Whether it is possible to change the panel skin + var/can_alter_skin = TRUE + + var/obj/item/assembly/device + var/obj/item/electronics/airlock/board + var/device_type = null + var/id = null + var/initialized_button = 0 + var/silicon_access_disabled = FALSE /obj/machinery/button/indestructible resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -44,7 +46,7 @@ if(!built && !device && device_type) device = new device_type(src) - src.check_access(null) + check_access(null) if(length(req_access) || length(req_one_access)) board = new(src) @@ -184,7 +186,7 @@ id = "[port.shuttle_id]_[id]" setup_device() -/obj/machinery/button/attack_hand(mob/user, list/modifiers) +/obj/machinery/button/interact(mob/user) . = ..() if(.) return @@ -227,7 +229,7 @@ flick_overlay_view("[base_icon_state]-overlay-error", 1 SECONDS) return - use_power(5) + use_energy(5 JOULES) flick_overlay_view("[base_icon_state]-overlay-success", 1 SECONDS) if(device) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 69c01a22f62..ed896cc7576 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -1,8 +1,25 @@ +/** + * Camera assembly frame + * Putting this on a wall will put a deconstructed camera machine on the wall. + */ +/obj/item/wallframe/camera + name = "camera assembly" + desc = "The basic construction for Nanotrasen-Always-Watching-You cameras." + 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, + ) + result_path = /obj/machinery/camera/autoname/deconstructed + wall_external = TRUE + /obj/machinery/camera name = "security camera" desc = "It's used to monitor rooms." - icon = 'icons/obj/machines/camera.dmi' //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE - icon_state = "camera" //mapping icon to represent upgrade states. if you want a different base icon, update default_camera_icon as well as this. + icon = 'icons/obj/machines/camera.dmi' + icon_state = "camera" + base_icon_state = "camera" use_power = ACTIVE_POWER_USE active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.02 layer = WALL_OBJ_LAYER @@ -11,29 +28,54 @@ armor_type = /datum/armor/machinery_camera max_integrity = 100 integrity_failure = 0.5 - var/default_camera_icon = "camera" //the camera's base icon used by update_appearance - icon_state is primarily used for mapping display purposes. - var/list/network = list("ss13") + + ///An analyzer in the camera being used for x-ray upgrade. + var/obj/item/analyzer/xray_module + ///used to keep from revealing malf AI upgrades for user facing isXRay() checks when they use Upgrade Camera Network ability + ///will be false if the camera is upgraded with the proper parts. + var/malf_xray_firmware_active + ///so the malf upgrade is restored when the normal upgrade part is removed. + var/malf_xray_firmware_present + ///A sheet of plasma stored inside of the camera, giving it EMP protection. + var/obj/item/stack/sheet/mineral/plasma/emp_module + ///used to keep from revealing malf AI upgrades for user facing isEmp() checks after they use Upgrade Camera Network ability + ///will be false if the camera is upgraded with the proper parts. + var/malf_emp_firmware_active + ///so the malf upgrade is restored when the normal upgrade part is removed. + var/malf_emp_firmware_present + + ///The current state of the camera's construction, all mapped in ones start off already built. + var/camera_construction_state = CAMERA_STATE_FINISHED + + ///Bitflag of upgrades this camera has: (CAMERA_UPGRADE_XRAY | CAMERA_UPGRADE_EMP_PROOF | CAMERA_UPGRADE_MOTION) + var/camera_upgrade_bitflags = NONE + + ///List of all networks that can see this camera through the security console. + var/list/network = list(CAMERANET_NETWORK_SS13) + ///The tag the camera has, which is essentially its name to security camera consoles. var/c_tag = null - var/status = TRUE - var/start_active = FALSE //If it ignores the random chance to start broken on round start - var/invuln = null - var/datum/weakref/assembly_ref = null + ///Boolean on whether the camera is activated, so can be seen on camera consoles or will just be static. + var/camera_enabled = TRUE + ///Boolean for special cameras to bypass the random chance of being broken on roundstart. + var/start_active = FALSE + ///The area this camera is built in, which we will add/remove ourselves to the list of cameras in that area from. var/area/myarea = null - //OTHER - + ///The max range (and default range) the camera can see. var/view_range = 7 + ///The short range the camera can see, if tampered with to be short-sighted. var/short_range = 2 + ///Boolean on whether the camera's alarm is triggered. var/alarm_on = FALSE - var/busy = FALSE - var/emped = FALSE //Number of consecutive EMP's on this camera + ///How many times this camera has been EMP'ed consecutively, will reset back to 0 when fixed. + var/emped + ///Boolean on whether the AI can even turn on this camera's light- borg caneras dont have one, for example. + var/internal_light = TRUE + ///Number of AIs watching this camera with lights on, used for icons. var/in_use_lights = 0 - // Upgrades bitflag - var/upgrades = 0 - var/internal_light = TRUE //Whether it can light up when an AI views it - ///Represents a signel source of camera alarms about movement or camera tampering + ///Represents a signal source of camera alarms about movement or camera tampering var/datum/alarm_handler/alarm_manager ///Proximity monitor associated with this atom, for motion sensitive cameras. var/datum/proximity_monitor/proximity_monitor @@ -41,6 +83,11 @@ /// A copy of the last paper object that was shown to this camera. var/obj/item/paper/last_shown_paper + var/list/datum/weakref/localMotionTargets = list() + var/detectTime = 0 + var/area/station/ai_monitored/area_motion = null + var/alarm_delay = 30 // Don't forget, there's another 3 seconds in queueAlarm() + MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera, 0) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/autoname, 0) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/emp_proof, 0) @@ -55,51 +102,27 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) fire = 90 acid = 50 -/obj/machinery/camera/preset/ordnance //Bomb test site in space - name = "Hardened Bomb-Test Camera" - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top." - c_tag = "Bomb Testing Site" - network = list("rd","ordnance") - use_power = NO_POWER_USE //Test site is an unpowered area - invuln = TRUE - light_range = 10 - start_active = TRUE - -/obj/machinery/camera/Initialize(mapload, obj/structure/camera_assembly/old_assembly) +/obj/machinery/camera/Initialize(mapload, ndir, building) . = ..() - for(var/i in network) - network -= i - network += lowertext(i) - var/obj/structure/camera_assembly/assembly - if(old_assembly) //check to see if the camera assembly was upgraded at all. - assembly = old_assembly - assembly_ref = WEAKREF(assembly) //important to do this now since upgrades call back to the assembly_ref - if(assembly.xray_module) - upgradeXRay() - else if(assembly.malf_xray_firmware_present) //if it was secretly upgraded via the MALF AI Upgrade Camera Network ability - upgradeXRay(TRUE) - if(assembly.emp_module) - upgradeEmpProof() - else if(assembly.malf_xray_firmware_present) //if it was secretly upgraded via the MALF AI Upgrade Camera Network ability - upgradeEmpProof(TRUE) + if(building) + setDir(ndir) + + for(var/network_name in network) + network -= network_name + network += lowertext(network_name) - if(assembly.proxy_module) - upgradeMotion() - else - assembly = new(src) - assembly.state = 4 //STATE_FINISHED - assembly_ref = WEAKREF(assembly) GLOB.cameranet.cameras += src - GLOB.cameranet.addCamera(src) + myarea = get_room_area() - LAZYADD(myarea.cameras, src) - - if(mapload && is_station_level(z) && prob(3) && !start_active) - toggle_cam() - else //this is handled by toggle_camera, so no need to update it twice. - update_appearance() + if(camera_enabled) + GLOB.cameranet.addCamera(src) + LAZYADD(myarea.cameras, src) + if(mapload && !start_active && is_station_level(z) && prob(3)) + toggle_cam() + else //this is handled by toggle_camera, so no need to update it twice. + update_appearance() alarm_manager = new(src) find_and_hang_on_wall(directional = TRUE, \ @@ -107,11 +130,45 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) +/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 + cancelCameraAlarm() + if(isarea(myarea)) + LAZYREMOVE(myarea.cameras, src) + QDEL_NULL(alarm_manager) + QDEL_NULL(last_shown_paper) + QDEL_NULL(xray_module) + QDEL_NULL(emp_module) + QDEL_NULL(proximity_monitor) + return ..() + /obj/machinery/camera/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) for(var/i in network) network -= i network += "[port.shuttle_id]_[i]" +/obj/machinery/camera/Exited(atom/movable/gone, direction) + . = ..() + if(gone == xray_module) + xray_module = null + update_appearance() + if(malf_xray_firmware_present) + malf_xray_firmware_active = malf_xray_firmware_present //re-enable firmware based upgrades after the part is removed. + removeXRay(malf_xray_firmware_present) //make sure we don't remove MALF upgrades. + + else if(gone == emp_module) + emp_module = null + if(malf_emp_firmware_present) + malf_emp_firmware_active = malf_emp_firmware_present //re-enable firmware based upgrades after the part is removed. + removeEmpProof(malf_emp_firmware_present) //make sure we don't remove MALF upgrades + + else if(gone == proximity_monitor) + emp_module = null + removeMotion() + /obj/machinery/camera/proc/create_prox_monitor() if(!proximity_monitor) proximity_monitor = new(src, 1) @@ -125,67 +182,58 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) area_motion = A create_prox_monitor() -/obj/machinery/camera/Destroy() - if(can_use()) - toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks - GLOB.cameranet.removeCamera(src) - GLOB.cameranet.cameras -= src - cancelCameraAlarm() - if(isarea(myarea)) - LAZYREMOVE(myarea.cameras, src) - QDEL_NULL(alarm_manager) - QDEL_NULL(assembly_ref) - QDEL_NULL(last_shown_paper) - return ..() - /obj/machinery/camera/examine(mob/user) . = ..() + if(isEmpProof(TRUE)) //don't reveal it's upgraded if was done via MALF AI Upgrade Camera Network ability . += span_info("It has electromagnetic interference shielding installed.") else . += span_info("It can be shielded against electromagnetic interference with some plasma.") + if(isXRay(TRUE)) //don't reveal it's upgraded if was done via MALF AI Upgrade Camera Network ability . += span_info("It has an X-ray photodiode installed.") else . += span_info("It can be upgraded with an X-ray photodiode with an analyzer.") + if(isMotion()) . += span_info("It has a proximity sensor installed.") else . += span_info("It can be upgraded with a proximity sensor.") - if(!status) + if(!camera_enabled) . += span_info("It's currently deactivated.") if(!panel_open && powered()) . += span_notice("You'll need to open its maintenance panel with a screwdriver to turn it back on.") + if(panel_open) . += span_info("Its maintenance panel is currently open.") - if(!status && powered()) + if(!camera_enabled && powered()) . += span_info("It can reactivated with wirecutters.") /obj/machinery/camera/emp_act(severity, reset_time = 90 SECONDS) . = ..() - if(!status) + if(!camera_enabled) return - if(!(. & EMP_PROTECT_SELF)) - if(prob(150/severity)) - update_appearance() - network = list() - GLOB.cameranet.removeCamera(src) - set_machine_stat(machine_stat | EMPED) - set_light(0) - emped = emped+1 //Increase the number of consecutive EMP's - update_appearance() - addtimer(CALLBACK(src, PROC_REF(post_emp_reset), emped, network), reset_time) - for(var/i in GLOB.player_list) - var/mob/M = i - if (M.client?.eye == src) - M.unset_machine() - M.reset_perspective(null) - to_chat(M, span_warning("The screen bursts into static!")) + if(. & EMP_PROTECT_SELF) + return + if(prob(150 / severity)) + network = list() + GLOB.cameranet.removeCamera(src) + set_machine_stat(machine_stat | EMPED) + set_light(0) + emped++ //Increase the number of consecutive EMP's + update_appearance() + 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) + M.unset_machine() + M.reset_perspective(null) + to_chat(M, span_warning("The screen bursts into static!")) /obj/machinery/camera/proc/on_saboteur(datum/source, disrupt_duration) SIGNAL_HANDLER - emp_act(EMP_LIGHT, reset_time = disrupt_duration) + //lasts twice as much so we don't have to constantly shoot cameras just to be S T E A L T H Y + emp_act(EMP_LIGHT, reset_time = disrupt_duration * 2) return COMSIG_SABOTEUR_SUCCESS /obj/machinery/camera/proc/post_emp_reset(thisemp, previous_network) @@ -202,11 +250,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) emped = 0 //Resets the consecutive EMP count addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 10 SECONDS) -/obj/machinery/camera/ex_act(severity, target) - if(invuln) - return FALSE - return ..() - /obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -224,211 +267,26 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) user.electrocute_act(10, src) /obj/machinery/camera/singularity_pull(S, current_size) - if (status && current_size >= STAGE_FIVE) // If the singulo is strong enough to pull anchored objects and the camera is still active, turn off the camera as it gets ripped off the wall. + if (camera_enabled && current_size >= STAGE_FIVE) // If the singulo is strong enough to pull anchored objects and the camera is still active, turn off the camera as it gets ripped off the wall. toggle_cam(null, 0) - ..() - -// Construction/Deconstruction -/obj/machinery/camera/screwdriver_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - toggle_panel_open() - to_chat(user, span_notice("You screw the camera's panel [panel_open ? "open" : "closed"].")) - I.play_tool_sound(src) - update_appearance() - return TRUE - -/obj/machinery/camera/crowbar_act(mob/living/user, obj/item/I) - . = ..() - if(!panel_open) - return - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() - if(!assembly) - assembly_ref = null - return - var/list/droppable_parts = list() - if(assembly.xray_module) - droppable_parts += assembly.xray_module - if(assembly.emp_module) - droppable_parts += assembly.emp_module - if(assembly.proxy_module) - droppable_parts += assembly.proxy_module - if(!length(droppable_parts)) - return - var/obj/item/choice = tgui_input_list(user, "Select a part to remove", "Part Removal", sort_names(droppable_parts)) - if(isnull(choice)) - return - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - to_chat(user, span_notice("You remove [choice] from [src].")) - if(choice == assembly.xray_module) - assembly.drop_upgrade(assembly.xray_module) - removeXRay() - if(choice == assembly.emp_module) - assembly.drop_upgrade(assembly.emp_module) - removeEmpProof() - if(choice == assembly.proxy_module) - assembly.drop_upgrade(assembly.proxy_module) - removeMotion() - I.play_tool_sound(src) - return TRUE - -/obj/machinery/camera/wirecutter_act(mob/living/user, obj/item/I) - . = ..() - if(!panel_open) - return - toggle_cam(user, 1) - atom_integrity = max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex. - set_machine_stat(machine_stat & ~BROKEN) - I.play_tool_sound(src) - return TRUE - -/obj/machinery/camera/multitool_act(mob/living/user, obj/item/I) - . = ..() - if(!panel_open) - return - - setViewRange((view_range == initial(view_range)) ? short_range : initial(view_range)) - to_chat(user, span_notice("You [(view_range == initial(view_range)) ? "restore" : "mess up"] the camera's focus.")) - return TRUE - -/obj/machinery/camera/welder_act(mob/living/user, obj/item/I) - . = ..() - if(!panel_open) - return - - if(!I.tool_start_check(user, amount=2)) - return TRUE - - to_chat(user, span_notice("You start to weld [src]...")) - if(I.use_tool(src, user, 100, volume=50)) - user.visible_message(span_warning("[user] unwelds [src], leaving it as just a frame bolted to the wall."), - span_warning("You unweld [src], leaving it as just a frame bolted to the wall")) - deconstruct(TRUE) - - return TRUE - -/obj/machinery/camera/attackby(obj/item/attacking_item, mob/living/user, params) - // UPGRADES - if(panel_open) - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() - if(!assembly) - assembly_ref = null - if(attacking_item.tool_behaviour == TOOL_ANALYZER) - if(!isXRay(TRUE)) //don't reveal it was already upgraded if was done via MALF AI Upgrade Camera Network ability - if(!user.temporarilyRemoveItemFromInventory(attacking_item)) - return - upgradeXRay(FALSE, TRUE) - to_chat(user, span_notice("You attach [attacking_item] into [assembly]'s inner circuits.")) - qdel(attacking_item) - else - to_chat(user, span_warning("[src] already has that upgrade!")) - return - - else if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma)) - if(!isEmpProof(TRUE)) //don't reveal it was already upgraded if was done via MALF AI Upgrade Camera Network ability - if(attacking_item.use_tool(src, user, 0, amount=1)) - upgradeEmpProof(FALSE, TRUE) - to_chat(user, span_notice("You attach [attacking_item] into [assembly]'s inner circuits.")) - else - to_chat(user, span_warning("[src] already has that upgrade!")) - return - - else if(isprox(attacking_item)) - if(!isMotion()) - if(!user.temporarilyRemoveItemFromInventory(attacking_item)) - return - upgradeMotion() - to_chat(user, span_notice("You attach [attacking_item] into [assembly]'s inner circuits.")) - qdel(attacking_item) - else - to_chat(user, span_warning("[src] already has that upgrade!")) - return - - // OTHER - if(istype(attacking_item, /obj/item/modular_computer)) - var/itemname = "" - var/info = "" - - var/obj/item/modular_computer/computer = attacking_item - for(var/datum/computer_file/program/notepad/notepad_app in computer.stored_files) - info = notepad_app.written_note - break - - itemname = computer.name - itemname = sanitize(itemname) - info = sanitize(info) - to_chat(user, span_notice("You hold \the [itemname] up to the camera...")) - user.log_talk(itemname, LOG_GAME, log_globally=TRUE, tag="Pressed to camera") - user.changeNext_move(CLICK_CD_MELEE) - - for(var/mob/potential_viewer as anything in GLOB.player_list) - if(isAI(potential_viewer)) - var/mob/living/silicon/ai/ai = potential_viewer - if(ai.control_disabled || (ai.stat == DEAD)) - continue - - ai.log_talk(itemname, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) - ai.last_tablet_note_seen = "[itemname][info]" - - if(user.name == "Unknown") - to_chat(ai, "[span_name(user)] holds \a [itemname] up to one of your cameras ...") - else - to_chat(ai, "[user] holds \a [itemname] up to one of your cameras ...") - continue - - if (potential_viewer.client?.eye == src) - to_chat(potential_viewer, "[span_name("[user]")] holds \a [itemname] up to one of the cameras ...") - potential_viewer.log_talk(itemname, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) - potential_viewer << browse("[itemname][info]", "window=[itemname]") - return - - if(istype(attacking_item, /obj/item/paper)) - // Grab the paper, sanitise the name as we're about to just throw it into chat wrapped in HTML tags. - var/obj/item/paper/paper = attacking_item - - // Make a complete copy of the paper, store a ref to it locally on the camera. - last_shown_paper = paper.copy(paper.type, null); - - // Then sanitise the name because we're putting it directly in chat later. - var/item_name = sanitize(last_shown_paper.name) - - // Start the process of holding it up to the camera. - to_chat(user, span_notice("You hold \the [item_name] up to the camera...")) - user.log_talk(item_name, LOG_GAME, log_globally=TRUE, tag="Pressed to camera") - user.changeNext_move(CLICK_CD_MELEE) - - // And make a weakref we can throw around to all potential viewers. - last_shown_paper.camera_holder = WEAKREF(src) - - // Iterate over all living mobs and check if anyone is elibile to view the paper. - // This is backwards, but cameras don't store a list of people that are looking through them, - // and we'll have to iterate this list anyway so we can use it to pull out AIs too. - for(var/mob/potential_viewer in GLOB.player_list) - // All AIs view through cameras, so we need to check them regardless. - if(isAI(potential_viewer)) - var/mob/living/silicon/ai/ai = potential_viewer - if(ai.control_disabled || (ai.stat == DEAD)) - continue - - ai.log_talk(item_name, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) - log_paper("[key_name(user)] held [last_shown_paper] up to [src], requesting [key_name(ai)] read it.") - - if(user.name == "Unknown") - to_chat(ai, "[span_name(user.name)] holds \a [item_name] up to one of your cameras ...") - else - to_chat(ai, "[user] holds \a [item_name] up to one of your cameras ...") - continue - - // If it's not an AI, eye if the client's eye is set to the camera. I wonder if this even works anymore with tgui camera apps and stuff? - if (potential_viewer.client?.eye == src) - log_paper("[key_name(user)] held [last_shown_paper] up to [src], and [key_name(potential_viewer)] may read it.") - potential_viewer.log_talk(item_name, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) - to_chat(potential_viewer, "[span_name(user)] holds \a [item_name] up to your camera...") - return - return ..() +///Drops a specific upgrade and nulls it where necessary. +/obj/machinery/camera/proc/drop_upgrade(obj/item/upgrade_dropped) + upgrade_dropped.forceMove(drop_location()) + if(upgrade_dropped == xray_module) + xray_module = null + if(malf_xray_firmware_present) + malf_xray_firmware_active = malf_xray_firmware_present //re-enable firmware based upgrades after the part is removed. + update_appearance() + + else if(upgrade_dropped == emp_module) + emp_module = null + if(malf_emp_firmware_present) + malf_emp_firmware_active = malf_emp_firmware_present //re-enable firmware based upgrades after the part is removed. + + else if(upgrade_dropped == proximity_monitor) + proximity_monitor = null /obj/machinery/camera/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(machine_stat & BROKEN) @@ -436,7 +294,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) . = ..() /obj/machinery/camera/atom_break(damage_flag) - if(!status) + if(!camera_enabled) return . = ..() if(.) @@ -444,36 +302,39 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) toggle_cam(null, 0) /obj/machinery/camera/on_deconstruction(disassembled) - if(disassembled) - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() - if(!assembly) - assembly = new() - assembly.forceMove(drop_location()) - assembly.state = 1 - assembly.setDir(dir) - assembly_ref = null + if(!disassembled) + if(camera_construction_state >= CAMERA_STATE_WIRED) + new /obj/item/stack/cable_coil(drop_location(), 2) + new /obj/item/stack/sheet/iron(loc) return - var/obj/item/I = new /obj/item/wallframe/camera (loc) - I.update_integrity(I.max_integrity * 0.5) - new /obj/item/stack/cable_coil(loc, 2) + var/obj/item/wallframe/camera/dropped_cam = new(drop_location()) + dropped_cam.update_integrity(dropped_cam.max_integrity * 0.5) + if(camera_construction_state >= CAMERA_STATE_WIRED) + new /obj/item/stack/cable_coil(drop_location(), 2) + if(xray_module) + drop_upgrade(xray_module) + if(emp_module) + drop_upgrade(emp_module) + if(proximity_monitor) + drop_upgrade(proximity_monitor) /obj/machinery/camera/update_icon_state() //TO-DO: Make panel open states, xray camera, and indicator lights overlays instead. var/xray_module if(isXRay(TRUE)) xray_module = "xray" - if(!status) - icon_state = "[xray_module][default_camera_icon]_off" + if(!camera_enabled) + icon_state = "[xray_module][base_icon_state]_off" return ..() if(machine_stat & EMPED) - icon_state = "[xray_module][default_camera_icon]_emp" + icon_state = "[xray_module][base_icon_state]_emp" return ..() - icon_state = "[xray_module][default_camera_icon][in_use_lights ? "_in_use" : ""]" + icon_state = "[xray_module][base_icon_state][in_use_lights ? "_in_use" : ""]" return ..() /obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE) - status = !status + camera_enabled = !camera_enabled if(can_use()) GLOB.cameranet.addCamera(src) if (isturf(loc)) @@ -490,11 +351,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) var/turf/our_turf = get_turf(src) GLOB.cameranet.updateChunk(our_turf.x, our_turf.y, our_turf.z) var/change_msg = "deactivates" - if(status) + if(camera_enabled) change_msg = "reactivates" triggerCameraAlarm() if(!QDELETED(src)) //We'll be doing it anyway in destroy - addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 100) + addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 10 SECONDS) if(displaymessage) if(user) visible_message(span_danger("[user] [change_msg] [src]!")) @@ -508,7 +369,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) // now disconnect anyone using the camera //Apparently, this will disconnect anyone even if the camera was re-activated. //I guess that doesn't matter since they can't use it anyway? - for(var/mob/O in GLOB.player_list) + for(var/mob/O as anything in GLOB.player_list) if (O.client?.eye == src) O.unset_machine() O.reset_perspective(null) @@ -523,7 +384,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) alarm_manager.clear_alarm(ALARM_CAMERA) /obj/machinery/camera/proc/can_use() - if(!status) + if(!camera_enabled) return FALSE if(machine_stat & EMPED) return FALSE @@ -580,4 +441,4 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) user.add_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) else user.clear_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) - return 1 + return TRUE diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm deleted file mode 100644 index e684b383e36..00000000000 --- a/code/game/machinery/camera/camera_assembly.dm +++ /dev/null @@ -1,280 +0,0 @@ -#define STATE_WRENCHED 1 -#define STATE_WELDED 2 -#define STATE_WIRED 3 -#define STATE_FINISHED 4 - -/obj/item/wallframe/camera - name = "camera assembly" - desc = "The basic construction for Nanotrasen-Always-Watching-You cameras." - 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) - result_path = /obj/structure/camera_assembly - wall_external = TRUE - -/obj/structure/camera_assembly - name = "camera assembly" - desc = "The basic construction for Nanotrasen-Always-Watching-You cameras." - icon = 'icons/obj/machines/camera.dmi' - icon_state = "camera_assembly" - max_integrity = 150 - // Motion, EMP-Proof, X-ray - var/obj/item/analyzer/xray_module - var/malf_xray_firmware_active //used to keep from revealing malf AI upgrades for user facing isXRay() checks when they use Upgrade Camera Network ability - //will be false if the camera is upgraded with the proper parts. - var/malf_xray_firmware_present //so the malf upgrade is restored when the normal upgrade part is removed. - var/obj/item/stack/sheet/mineral/plasma/emp_module - var/malf_emp_firmware_active //used to keep from revealing malf AI upgrades for user facing isEmp() checks after they use Upgrade Camera Network ability - //will be false if the camera is upgraded with the proper parts. - var/malf_emp_firmware_present //so the malf upgrade is restored when the normal upgrade part is removed. - var/obj/item/assembly/prox_sensor/proxy_module - var/state = STATE_WRENCHED - -/obj/structure/camera_assembly/examine(mob/user) - . = ..() - //upgrade messages - var/has_upgrades - if(emp_module) - . += span_info("It has electromagnetic interference shielding installed.") - has_upgrades = TRUE - else if(state == STATE_WIRED) - . += span_info("It can be shielded against electromagnetic interference with some plasma.") - if(xray_module) - . += span_info("It has an X-ray photodiode installed.") - has_upgrades = TRUE - else if(state == STATE_WIRED) - . += span_info("It can be upgraded with an X-ray photodiode with an analyzer.") - if(proxy_module) - . += span_info("It has a proximity sensor installed.") - has_upgrades = TRUE - else if(state == STATE_WIRED) - . += span_info("It can be upgraded with a proximity sensor.") - - //construction states - switch(state) - if(STATE_WRENCHED) - . += span_info("You can secure it in place with a welder, or removed with a wrench.") - if(STATE_WELDED) - . += span_info("You can add wires to it, or unweld it from the wall.") - if(STATE_WIRED) - if(has_upgrades) - . += span_info("You can remove the contained upgrades with a crowbar.") - . += span_info("You can complete it with a screwdriver, or unwire it to start removal.") - if(STATE_FINISHED) - . += span_boldwarning("You shouldn't be seeing this, tell a coder!") - -/obj/structure/camera_assembly/Initialize(mapload, ndir, building) - . = ..() - if(building) - setDir(ndir) - find_and_hang_on_wall() - -/obj/structure/camera_assembly/update_icon_state() - icon_state = "[xray_module ? "xray" : null][initial(icon_state)]" - return ..() - -/obj/structure/camera_assembly/Exited(atom/movable/gone, direction) - . = ..() - if(gone == xray_module) - xray_module = null - update_appearance() - if(malf_xray_firmware_present) - malf_xray_firmware_active = malf_xray_firmware_present //re-enable firmware based upgrades after the part is removed. - if(istype(loc, /obj/machinery/camera)) - var/obj/machinery/camera/contained_camera = loc - contained_camera.removeXRay(malf_xray_firmware_present) //make sure we don't remove MALF upgrades. - - else if(gone == emp_module) - emp_module = null - if(malf_emp_firmware_present) - malf_emp_firmware_active = malf_emp_firmware_present //re-enable firmware based upgrades after the part is removed. - if(istype(loc, /obj/machinery/camera)) - var/obj/machinery/camera/contained_camera = loc - contained_camera.removeEmpProof(malf_emp_firmware_present) //make sure we don't remove MALF upgrades - - else if(gone == proxy_module) - emp_module = null - if(istype(loc, /obj/machinery/camera)) - var/obj/machinery/camera/contained_camera = loc - contained_camera.removeMotion() - - -/obj/structure/camera_assembly/Destroy() - QDEL_NULL(xray_module) - QDEL_NULL(emp_module) - QDEL_NULL(proxy_module) - return ..() - -/obj/structure/camera_assembly/proc/drop_upgrade(obj/item/I) - I.forceMove(drop_location()) - if(I == xray_module) - xray_module = null - if(malf_xray_firmware_present) - malf_xray_firmware_active = malf_xray_firmware_present //re-enable firmware based upgrades after the part is removed. - update_appearance() - - else if(I == emp_module) - emp_module = null - if(malf_emp_firmware_present) - malf_emp_firmware_active = malf_emp_firmware_present //re-enable firmware based upgrades after the part is removed. - - else if(I == proxy_module) - proxy_module = null - -/obj/structure/camera_assembly/welder_act(mob/living/user, obj/item/tool) - if(state != STATE_WRENCHED && state != STATE_WELDED) - return - . = TRUE - if(!tool.tool_start_check(user, amount=1)) - return - user.balloon_alert_to_viewers("[state == STATE_WELDED ? "un" : null]welding...") - audible_message(span_hear("You hear welding.")) - if(!tool.use_tool(src, user, 2 SECONDS, volume = 50)) - user.balloon_alert_to_viewers("stopped [state == STATE_WELDED ? "un" : null]welding!") - return - state = ((state == STATE_WELDED) ? STATE_WRENCHED : STATE_WELDED) - set_anchored(state == STATE_WELDED) - user.balloon_alert_to_viewers(state == STATE_WELDED ? "welded" : "unwelded") - - -/obj/structure/camera_assembly/attackby(obj/item/W, mob/living/user, params) - switch(state) - if(STATE_WELDED) - if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if(C.use(2)) - to_chat(user, span_notice("You add wires to [src].")) - state = STATE_WIRED - else - to_chat(user, span_warning("You need two lengths of cable to wire a camera!")) - return - if(STATE_WIRED) // Upgrades! - if(istype(W, /obj/item/stack/sheet/mineral/plasma)) //emp upgrade - if(emp_module) - to_chat(user, span_warning("[src] already contains a [emp_module]!")) - return - if(!W.use_tool(src, user, 0, amount=1)) //only use one sheet, otherwise the whole stack will be consumed. - return - emp_module = new(src) - if(malf_xray_firmware_active) - malf_xray_firmware_active = FALSE //flavor reason: MALF AI Upgrade Camera Network ability's firmware is incompatible with the new part - //real reason: make it a normal upgrade so the finished camera's icons and examine texts are restored. - to_chat(user, span_notice("You attach [W] into [src]'s inner circuits.")) - return - - else if(istype(W, /obj/item/analyzer)) //xray upgrade - if(xray_module) - to_chat(user, span_warning("[src] already contains a [xray_module]!")) - return - if(!user.transferItemToLoc(W, src)) - return - to_chat(user, span_notice("You attach [W] into [src]'s inner circuits.")) - xray_module = W - if(malf_xray_firmware_active) - malf_xray_firmware_active = FALSE //flavor reason: MALF AI Upgrade Camera Network ability's firmware is incompatible with the new part - //real reason: make it a normal upgrade so the finished camera's icons and examine texts are restored. - update_appearance() - return - - else if(isprox(W)) //motion sensing upgrade - if(proxy_module) - to_chat(user, span_warning("[src] already contains a [proxy_module]!")) - return - if(!user.transferItemToLoc(W, src)) - return - to_chat(user, span_notice("You attach [W] into [src]'s inner circuits.")) - proxy_module = W - return - - return ..() - -/obj/structure/camera_assembly/crowbar_act(mob/user, obj/item/tool) - if(state != STATE_WIRED) - return FALSE - var/list/droppable_parts = list() - if(xray_module) - droppable_parts += xray_module - if(emp_module) - droppable_parts += emp_module - if(proxy_module) - droppable_parts += proxy_module - if(!length(droppable_parts)) - return - var/obj/item/choice = tgui_input_list(user, "Select a part to remove", "Part Removal", sort_names(droppable_parts)) - if(isnull(choice)) - return - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - to_chat(user, span_notice("You remove [choice] from [src].")) - drop_upgrade(choice) - tool.play_tool_sound(src) - return TRUE - -/obj/structure/camera_assembly/screwdriver_act(mob/user, obj/item/tool) - . = ..() - if(.) - return TRUE - if(state != STATE_WIRED) - return FALSE - - tool.play_tool_sound(src) - var/input = tgui_input_text(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret", "Set Network", "SS13") - if(isnull(input)) - return - var/list/tempnetwork = splittext(input, ",") - if(!length(tempnetwork)) - to_chat(user, span_warning("No network found, please hang up and try your call again!")) - return - for(var/i in tempnetwork) - tempnetwork -= i - tempnetwork += lowertext(i) - state = STATE_FINISHED - var/obj/machinery/camera/C = new(loc, src) - forceMove(C) - C.setDir(src.dir) - - C.network = tempnetwork - var/area/A = get_area(src) - C.c_tag = "[format_text(A.name)] ([rand(1, 999)])" - return TRUE - -/obj/structure/camera_assembly/wirecutter_act(mob/user, obj/item/I) - . = ..() - if(state != STATE_WIRED) - return - - new /obj/item/stack/cable_coil(drop_location(), 2) - I.play_tool_sound(src) - to_chat(user, span_notice("You cut the wires from the circuits.")) - state = STATE_WELDED - return TRUE - -/obj/structure/camera_assembly/wrench_act(mob/user, obj/item/I) - . = ..() - if(state != STATE_WRENCHED) - return - I.play_tool_sound(src) - to_chat(user, span_notice("You detach [src] from its place.")) - new /obj/item/wallframe/camera(drop_location()) - //drop upgrades - if(xray_module) - drop_upgrade(xray_module) - if(emp_module) - drop_upgrade(emp_module) - if(proxy_module) - drop_upgrade(proxy_module) - - qdel(src) - return TRUE - - -/obj/structure/camera_assembly/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc) - qdel(src) - - -#undef STATE_WRENCHED -#undef STATE_WELDED -#undef STATE_WIRED -#undef STATE_FINISHED diff --git a/code/game/machinery/camera/camera_construction.dm b/code/game/machinery/camera/camera_construction.dm new file mode 100644 index 00000000000..48bf4ccabaa --- /dev/null +++ b/code/game/machinery/camera/camera_construction.dm @@ -0,0 +1,247 @@ +/obj/machinery/camera/welder_act(mob/living/user, obj/item/tool) + switch(camera_construction_state) + if(CAMERA_STATE_WRENCHED, CAMERA_STATE_WELDED) + if(!tool.tool_start_check(user, amount = 1)) + return ITEM_INTERACT_BLOCKING + user.balloon_alert_to_viewers("[camera_construction_state == CAMERA_STATE_WELDED ? "un" : null]welding...") + audible_message(span_hear("You hear welding.")) + if(!tool.use_tool(src, user, 2 SECONDS, volume = 50)) + user.balloon_alert_to_viewers("stopped [camera_construction_state == CAMERA_STATE_WELDED ? "un" : null]welding!") + return + camera_construction_state = ((camera_construction_state == CAMERA_STATE_WELDED) ? CAMERA_STATE_WRENCHED : CAMERA_STATE_WELDED) + set_anchored(camera_construction_state == CAMERA_STATE_WELDED) + user.balloon_alert_to_viewers(camera_construction_state == CAMERA_STATE_WELDED ? "welded" : "unwelded") + return ITEM_INTERACT_SUCCESS + if(CAMERA_STATE_FINISHED) + if(!panel_open) + return ITEM_INTERACT_BLOCKING + if(!tool.tool_start_check(user, amount=2)) + return ITEM_INTERACT_BLOCKING + audible_message(span_hear("You hear welding.")) + if(!tool.use_tool(src, user, 100, volume=50)) + return ITEM_INTERACT_BLOCKING + user.visible_message(span_warning("[user] unwelds [src], leaving it as just a frame bolted to the wall."), + span_warning("You unweld [src], leaving it as just a frame bolted to the wall")) + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/camera/screwdriver_act(mob/user, obj/item/tool) + switch(camera_construction_state) + if(CAMERA_STATE_WIRED) + tool.play_tool_sound(src) + var/input = tgui_input_text(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret", "Set Network", "SS13") + if(isnull(input)) + return ITEM_INTERACT_BLOCKING + var/list/tempnetwork = splittext(input, ",") + if(!length(tempnetwork)) + to_chat(user, span_warning("No network found, please hang up and try your call again!")) + return ITEM_INTERACT_BLOCKING + for(var/i in tempnetwork) + tempnetwork -= i + tempnetwork += lowertext(i) + camera_construction_state = CAMERA_STATE_FINISHED + toggle_cam(user, displaymessage = FALSE) + network = tempnetwork + return ITEM_INTERACT_SUCCESS + if(CAMERA_STATE_FINISHED) + toggle_panel_open() + to_chat(user, span_notice("You screw the camera's panel [panel_open ? "open" : "closed"].")) + tool.play_tool_sound(src) + update_appearance() + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/camera/wirecutter_act(mob/user, obj/item/tool) + switch(camera_construction_state) + if(CAMERA_STATE_WIRED) + new /obj/item/stack/cable_coil(drop_location(), 2) + tool.play_tool_sound(src) + to_chat(user, span_notice("You cut the wires from the circuits.")) + camera_construction_state = CAMERA_STATE_WELDED + return ITEM_INTERACT_SUCCESS + if(CAMERA_STATE_FINISHED) + if(!panel_open) + return ITEM_INTERACT_BLOCKING + toggle_cam(user, 1) + atom_integrity = max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex. + set_machine_stat(machine_stat & ~BROKEN) + tool.play_tool_sound(src) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/camera/wrench_act(mob/user, obj/item/tool) + if(camera_construction_state == CAMERA_STATE_WRENCHED) + tool.play_tool_sound(src) + to_chat(user, span_notice("You detach [src] from its place.")) + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/camera/crowbar_act(mob/living/user, obj/item/tool) + if(camera_construction_state == CAMERA_STATE_FINISHED) + if(!panel_open) + return ITEM_INTERACT_BLOCKING + var/list/droppable_parts = list() + if(xray_module) + droppable_parts += xray_module + if(emp_module) + droppable_parts += emp_module + if(proximity_monitor) + droppable_parts += proximity_monitor + if(!length(droppable_parts)) + return ITEM_INTERACT_BLOCKING + var/obj/item/choice = tgui_input_list(user, "Select a part to remove", "Part Removal", sort_names(droppable_parts)) + if(isnull(choice)) + return ITEM_INTERACT_BLOCKING + if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You remove [choice] from [src].")) + if(choice == xray_module) + drop_upgrade(xray_module) + removeXRay() + if(choice == emp_module) + drop_upgrade(emp_module) + removeEmpProof() + if(choice == proximity_monitor) + drop_upgrade(proximity_monitor) + removeMotion() + tool.play_tool_sound(src) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/camera/multitool_act(mob/living/user, obj/item/tool) + if(camera_construction_state == CAMERA_STATE_FINISHED) + if(!panel_open) + return ITEM_INTERACT_BLOCKING + setViewRange((view_range == initial(view_range)) ? short_range : initial(view_range)) + to_chat(user, span_notice("You [(view_range == initial(view_range)) ? "restore" : "mess up"] the camera's focus.")) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/camera/attackby(obj/item/attacking_item, mob/living/user, params) + if(camera_construction_state != CAMERA_STATE_FINISHED || panel_open) + if(attacking_item.tool_behaviour == TOOL_ANALYZER) + if(!isXRay(TRUE)) //don't reveal it was already upgraded if was done via MALF AI Upgrade Camera Network ability + if(!user.temporarilyRemoveItemFromInventory(attacking_item)) + return + upgradeXRay(FALSE, TRUE) + to_chat(user, span_notice("You attach [attacking_item] into [name]'s inner circuits.")) + qdel(attacking_item) + else + to_chat(user, span_warning("[src] already has that upgrade!")) + return + else if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma)) + if(!isEmpProof(TRUE)) //don't reveal it was already upgraded if was done via MALF AI Upgrade Camera Network ability + if(attacking_item.use_tool(src, user, 0, amount=1)) + upgradeEmpProof(FALSE, TRUE) + to_chat(user, span_notice("You attach [attacking_item] into [name]'s inner circuits.")) + else + to_chat(user, span_warning("[src] already has that upgrade!")) + return + else if(isprox(attacking_item)) + if(!isMotion()) + if(!user.temporarilyRemoveItemFromInventory(attacking_item)) + return + upgradeMotion() + to_chat(user, span_notice("You attach [attacking_item] into [name]'s inner circuits.")) + qdel(attacking_item) + else + to_chat(user, span_warning("[src] already has that upgrade!")) + return + switch(camera_construction_state) + if(CAMERA_STATE_WELDED) + if(istype(attacking_item, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/attacking_cable = attacking_item + if(attacking_cable.use(2)) + to_chat(user, span_notice("You add wires to [src].")) + camera_construction_state = CAMERA_STATE_WIRED + else + to_chat(user, span_warning("You need two lengths of cable to wire a camera!")) + return + if(CAMERA_STATE_FINISHED) + if(istype(attacking_item, /obj/item/modular_computer)) + var/itemname = "" + var/info = "" + + var/obj/item/modular_computer/computer = attacking_item + for(var/datum/computer_file/program/notepad/notepad_app in computer.stored_files) + info = notepad_app.written_note + break + + if(!info) + return + + itemname = computer.name + itemname = sanitize(itemname) + info = sanitize(info) + to_chat(user, span_notice("You hold \the [itemname] up to the camera...")) + user.log_talk(itemname, LOG_GAME, log_globally=TRUE, tag="Pressed to camera") + user.changeNext_move(CLICK_CD_MELEE) + + for(var/mob/potential_viewer as anything in GLOB.player_list) + if(isAI(potential_viewer)) + var/mob/living/silicon/ai/ai = potential_viewer + if(ai.control_disabled || (ai.stat == DEAD)) + continue + + ai.log_talk(itemname, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) + ai.last_tablet_note_seen = "[itemname][info]" + + if(user.name == "Unknown") + to_chat(ai, "[span_name(user)] holds \a [itemname] up to one of your cameras ...") + else + to_chat(ai, "[user] holds \a [itemname] up to one of your cameras ...") + continue + + if (potential_viewer.client?.eye == src) + to_chat(potential_viewer, "[span_name("[user]")] holds \a [itemname] up to one of the cameras ...") + potential_viewer.log_talk(itemname, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) + potential_viewer << browse("[itemname][info]", "window=[itemname]") + return + + if(istype(attacking_item, /obj/item/paper)) + // Grab the paper, sanitise the name as we're about to just throw it into chat wrapped in HTML tags. + var/obj/item/paper/paper = attacking_item + + // Make a complete copy of the paper, store a ref to it locally on the camera. + last_shown_paper = paper.copy(paper.type, null) + + // Then sanitise the name because we're putting it directly in chat later. + var/item_name = sanitize(last_shown_paper.name) + + // Start the process of holding it up to the camera. + to_chat(user, span_notice("You hold \the [item_name] up to the camera...")) + user.log_talk(item_name, LOG_GAME, log_globally=TRUE, tag="Pressed to camera") + user.changeNext_move(CLICK_CD_MELEE) + + // And make a weakref we can throw around to all potential viewers. + last_shown_paper.camera_holder = WEAKREF(src) + + // Iterate over all living mobs and check if anyone is elibile to view the paper. + // This is backwards, but cameras don't store a list of people that are looking through them, + // and we'll have to iterate this list anyway so we can use it to pull out AIs too. + for(var/mob/potential_viewer in GLOB.player_list) + // All AIs view through cameras, so we need to check them regardless. + if(isAI(potential_viewer)) + var/mob/living/silicon/ai/ai = potential_viewer + if(ai.control_disabled || (ai.stat == DEAD)) + continue + + ai.log_talk(item_name, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) + log_paper("[key_name(user)] held [last_shown_paper] up to [src], requesting [key_name(ai)] read it.") + + if(user.name == "Unknown") + to_chat(ai, "[span_name(user.name)] holds \a [item_name] up to one of your cameras ...") + else + to_chat(ai, "[user] holds \a [item_name] up to one of your cameras ...") + continue + + // If it's not an AI, eye if the client's eye is set to the camera. I wonder if this even works anymore with tgui camera apps and stuff? + if (potential_viewer.client?.eye == src) + log_paper("[key_name(user)] held [last_shown_paper] up to [src], and [key_name(potential_viewer)] may read it.") + potential_viewer.log_talk(item_name, LOG_VICTIM, tag="Pressed to camera from [key_name(user)]", log_globally=FALSE) + to_chat(potential_viewer, "[span_name(user)] holds \a [item_name] up to your camera...") + return + + return ..() diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index ec01c2365f8..ba5e793d68c 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -1,10 +1,3 @@ -/obj/machinery/camera - - var/list/datum/weakref/localMotionTargets = list() - var/detectTime = 0 - var/area/station/ai_monitored/area_motion = null - var/alarm_delay = 30 // Don't forget, there's another 3 seconds in queueAlarm() - /obj/machinery/camera/process() // motion camera event loop if(!isMotion()) @@ -39,7 +32,7 @@ /obj/machinery/camera/Destroy() localMotionTargets = null if(area_motion) - area_motion.motioncameras -= src + LAZYREMOVE(area_motion.motioncameras, src) cancelAlarm() return ..() @@ -50,7 +43,7 @@ cancelAlarm() /obj/machinery/camera/proc/cancelAlarm() - if (detectTime == -1 && status) + if (detectTime == -1 && camera_enabled) alarm_manager.clear_alarm(ALARM_MOTION) detectTime = 0 return TRUE @@ -58,7 +51,7 @@ /obj/machinery/camera/proc/triggerAlarm() if (!detectTime) return FALSE - if(status) + if(camera_enabled) if(alarm_manager.send_alarm(ALARM_MOTION, src, src)) visible_message(span_warning("A red light flashes on [src]!")) detectTime = -1 @@ -72,7 +65,7 @@ /obj/machinery/camera/motion/thunderdome name = "entertainment camera" - network = list("thunder") + network = list(CAMERANET_NETWORK_THUNDERDOME) c_tag = "Arena" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 2d9a2a221b4..bb9ef7d3fc5 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -1,6 +1,16 @@ -// PRESETS +/** + * Deconstructed Camera + * Used by wallmounted cameras, starts off deconstructed and requires building by a player. + */ +/obj/machinery/camera/autoname/deconstructed + icon_state = "camera_off" + camera_construction_state = CAMERA_STATE_WRENCHED + camera_enabled = FALSE -// EMP +/** + * EMP Proof + * Starts off with the EMP protection upgrade, and can't start unactivated. + */ /obj/machinery/camera/emp_proof start_active = TRUE @@ -8,23 +18,30 @@ . = ..() upgradeEmpProof() -// EMP + Motion - +/** + * Motion EMP proof + * Same as EMP but also starts with motion upgrade. + */ /obj/machinery/camera/emp_proof/motion/Initialize(mapload) . = ..() upgradeMotion() -// X-ray - +/** + * X-Ray Cameras + * Starts off with x-ray, and can't start deactivated. + */ /obj/machinery/camera/xray start_active = TRUE - icon_state = "xraycamera" //mapping icon - Thanks to Krutchen for the icons. + icon_state = "xraycamera" //mapping icon only /obj/machinery/camera/xray/Initialize(mapload) . = ..() upgradeXRay() -// MOTION +/** + * Motion camera + * Starts off with the motion detector and can't be disablede on roundstart. + */ /obj/machinery/camera/motion start_active = TRUE name = "motion-sensitive security camera" @@ -33,7 +50,10 @@ . = ..() upgradeMotion() -// ALL UPGRADES +/** + * All camera + * Has all upgrades by default, can't be disabled roundstart. + */ /obj/machinery/camera/all start_active = TRUE icon_state = "xraycamera" //mapping icon. @@ -44,33 +64,47 @@ upgradeXRay() upgradeMotion() -// AUTONAME - +/** + * Autonaming camera + * Automatically names itself after the area it's in during LateInitialize, + * good for mappers who don't want to manually name them all. + */ /obj/machinery/camera/autoname var/number = 0 //camera number in area -//This camera type automatically sets it's name to whatever the area that it's in is called. /obj/machinery/camera/autoname/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD /obj/machinery/camera/autoname/LateInitialize() . = ..() - var/static/list/autonames_in_areas = list() - var/area/camera_area = get_area(src) - number = autonames_in_areas[camera_area] + 1 autonames_in_areas[camera_area] = number - c_tag = "[format_text(camera_area.name)] #[number]" + +/** + * Bomb preset + * Can't be disabled, sees further, doesn't cost power, can be seen by ordnance + * cameras, and is indestructible (so bomb-proof). + */ +/obj/machinery/camera/preset/ordnance + name = "Hardened Bomb-Test Camera" + desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top." + c_tag = "Bomb Testing Site" + network = list(CAMERANET_NETWORK_RD, CAMERANET_NETWORK_ORDNANCE) + use_power = NO_POWER_USE //Test site is an unpowered area + resistance_flags = parent_type::resistance_flags | INDESTRUCTIBLE + light_range = 10 + start_active = TRUE + ///The internal camera object for exosuits, applied by the camera upgrade /obj/machinery/camera/exosuit c_tag = "Exosuit: unspecified" desc = "This camera belongs in a mecha. If you see this, tell a coder!" - network = list("ss13", "rd") + network = list(CAMERANET_NETWORK_SS13, CAMERANET_NETWORK_RD) short_range = 1 //used when the camera gets EMPd ///Number of the camera and thus the name of the mech var/number = 0 @@ -103,78 +137,69 @@ // UPGRADE PROCS /obj/machinery/camera/proc/isEmpProof(ignore_malf_upgrades) - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() - return (upgrades & CAMERA_UPGRADE_EMP_PROOF) && (!(ignore_malf_upgrades && assembly?.malf_emp_firmware_active)) + return (camera_upgrade_bitflags & CAMERA_UPGRADE_EMP_PROOF) && (!(ignore_malf_upgrades && malf_emp_firmware_active)) /obj/machinery/camera/proc/upgradeEmpProof(malf_upgrade, ignore_malf_upgrades) if(isEmpProof(ignore_malf_upgrades)) //pass a malf upgrade to ignore_malf_upgrades so we can replace the malf module with the normal one return //that way if someone tries to upgrade an already malf-upgraded camera, it'll just upgrade it to a normal version. - AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) if(malf_upgrade) - assembly.malf_emp_firmware_active = TRUE //don't add parts to drop, update icon, ect. reconstructing it will also retain the upgrade. - assembly.malf_emp_firmware_present = TRUE //so the upgrade is retained after incompatible parts are removed. + 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. - else if(!assembly.emp_module) //only happens via upgrading in camera/attackby() - assembly.emp_module = new(assembly) - if(assembly.malf_emp_firmware_active) - assembly.malf_emp_firmware_active = FALSE //make it appear like it's just normally upgraded so the icons and examine texts are restored. + 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. - upgrades |= CAMERA_UPGRADE_EMP_PROOF + camera_upgrade_bitflags |= CAMERA_UPGRADE_EMP_PROOF /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_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) - upgrades &= ~CAMERA_UPGRADE_EMP_PROOF - - + RemoveElement(/datum/element/empprotection, EMP_PROTECT_ALL) + camera_upgrade_bitflags &= ~CAMERA_UPGRADE_EMP_PROOF /obj/machinery/camera/proc/isXRay(ignore_malf_upgrades) - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() - return (upgrades & CAMERA_UPGRADE_XRAY) && (!(ignore_malf_upgrades && assembly.malf_xray_firmware_active)) + return (camera_upgrade_bitflags & CAMERA_UPGRADE_XRAY) && (!(ignore_malf_upgrades && malf_xray_firmware_active)) /obj/machinery/camera/proc/upgradeXRay(malf_upgrade, ignore_malf_upgrades) if(isXRay(ignore_malf_upgrades)) //pass a malf upgrade to ignore_malf_upgrades so we can replace the malf upgrade with the normal one return //that way if someone tries to upgrade an already malf-upgraded camera, it'll just upgrade it to a normal version. - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() if(malf_upgrade) - assembly.malf_xray_firmware_active = TRUE //don't add parts to drop, update icon, ect. reconstructing it will also retain the upgrade. - assembly.malf_xray_firmware_present = TRUE //so the upgrade is retained after incompatible parts are removed. + malf_xray_firmware_active = TRUE //don't add parts to drop, update icon, ect. reconstructing it will also retain the upgrade. + malf_xray_firmware_present = TRUE //so the upgrade is retained after incompatible parts are removed. - else if(!assembly.xray_module) //only happens via upgrading in camera/attackby() - assembly.xray_module = new(assembly) - if(assembly.malf_xray_firmware_active) - assembly.malf_xray_firmware_active = FALSE //make it appear like it's just normally upgraded so the icons and examine texts are restored. + else if(!xray_module) //only happens via upgrading in camera/attackby() + xray_module = new(src) + if(malf_xray_firmware_active) + malf_xray_firmware_active = FALSE //make it appear like it's just normally upgraded so the icons and examine texts are restored. - upgrades |= CAMERA_UPGRADE_XRAY + camera_upgrade_bitflags |= CAMERA_UPGRADE_XRAY update_appearance() /obj/machinery/camera/proc/removeXRay(ignore_malf_upgrades) if(!ignore_malf_upgrades) //don't downgrade it if malf software is forced onto it. - upgrades &= ~CAMERA_UPGRADE_XRAY + camera_upgrade_bitflags &= ~CAMERA_UPGRADE_XRAY update_appearance() - - /obj/machinery/camera/proc/isMotion() - return upgrades & CAMERA_UPGRADE_MOTION + return camera_upgrade_bitflags & CAMERA_UPGRADE_MOTION /obj/machinery/camera/proc/upgradeMotion() if(isMotion()) return - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() if(name == initial(name)) name = "motion-sensitive security camera" - if(!assembly.proxy_module) - assembly.proxy_module = new(assembly) - upgrades |= CAMERA_UPGRADE_MOTION + if(!proximity_monitor) + proximity_monitor = new(src) + camera_upgrade_bitflags |= CAMERA_UPGRADE_MOTION create_prox_monitor() /obj/machinery/camera/proc/removeMotion() if(name == "motion-sensitive security camera") name = "security camera" - upgrades &= ~CAMERA_UPGRADE_MOTION + camera_upgrade_bitflags &= ~CAMERA_UPGRADE_MOTION if(!area_motion) QDEL_NULL(proximity_monitor) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 89b092bf367..ae3ae36e51b 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -7,7 +7,7 @@ circuit = /obj/item/circuitboard/machine/cell_charger pass_flags = PASSTABLE var/obj/item/stock_parts/cell/charging = null - var/charge_rate = 250 + var/charge_rate = 250 KILO WATTS /* OVERWRITTEN IN modular_skyrat\modules\aesthetics\cells\cell.dm /obj/machinery/cell_charger/update_overlays() @@ -33,7 +33,7 @@ if(charging) . += "Current charge: [round(charging.percent(), 1)]%." if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Charging power: [charge_rate]W.") + . += span_notice("The status display reads: Charging power: [display_power(charge_rate, convert = FALSE)].") /obj/machinery/cell_charger/wrench_act(mob/living/user, obj/item/tool) . = ..() @@ -133,7 +133,7 @@ /obj/machinery/cell_charger/RefreshParts() . = ..() - charge_rate = 250 + charge_rate = 250 KILO WATTS for(var/datum/stock_part/capacitor/capacitor in component_parts) charge_rate *= capacitor.tier @@ -143,10 +143,11 @@ if(charging.percent() >= 100) return - var/main_draw = use_power_from_net(charge_rate * seconds_per_tick, take_any = TRUE) //Pulls directly from the Powernet to dump into the cell + var/main_draw = charge_rate * seconds_per_tick if(!main_draw) return - charging.give(main_draw) - use_power(charge_rate / 100) //use a small bit for the charger itself, but power usage scales up with the part tier + + use_energy(main_draw * 0.01) //use a small bit for the charger itself, but power usage scales up with the part tier + charge_cell(main_draw, charging, grid_only = TRUE) update_appearance() diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index f9158d21996..0749c79bb88 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -63,7 +63,7 @@ /obj/machinery/computer/screwdriver_act(mob/living/user, obj/item/I) if(..()) return TRUE - if(circuit && !(obj_flags & NO_DECONSTRUCTION)) + if(circuit) balloon_alert(user, "disconnecting monitor...") if(I.use_tool(src, user, time_to_unscrew, volume=50)) deconstruct(TRUE) diff --git a/code/game/machinery/computer/accounting.dm b/code/game/machinery/computer/accounting.dm index 475bf404c1c..d804b8efe5d 100644 --- a/code/game/machinery/computer/accounting.dm +++ b/code/game/machinery/computer/accounting.dm @@ -21,10 +21,9 @@ for(var/current_account as anything in SSeconomy.bank_accounts_by_id) var/datum/bank_account/current_bank_account = SSeconomy.bank_accounts_by_id[current_account] - var/job_title = current_bank_account.account_job?.title player_accounts += list(list( "name" = current_bank_account.account_holder, - "job" = job_title ? job_title : "No Job", // because this can be null + "job" = current_bank_account.account_job?.title || "No job", // because this can be null "balance" = round(current_bank_account.account_balance), "modifier" = round((current_bank_account.payday_modifier * 0.9), 0.1), )) @@ -32,4 +31,3 @@ data["AuditLog"] = audit_list data["Crashing"] = HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING) return data - diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 74632b926b1..ba3041cc484 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -64,7 +64,9 @@ . = TRUE /obj/machinery/computer/aifixer/proc/Fix() - use_power(1000) + if(!use_energy(active_power_usage, force = TRUE)) + 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) diff --git a/code/game/machinery/computer/arcade/orion_event.dm b/code/game/machinery/computer/arcade/orion_event.dm index f1050e9a8e2..7ab2f3b98b3 100644 --- a/code/game/machinery/computer/arcade/orion_event.dm +++ b/code/game/machinery/computer/arcade/orion_event.dm @@ -438,7 +438,7 @@ game.say("A miniature black hole suddenly appears in front of [game], devouring [gamer] alive!") gamer.Stun(200, ignore_canstun = TRUE) //you can't run :^) var/black_hole = new /obj/singularity/orion(gamer.loc) - addtimer(CALLBACK(game, TYPE_PROC_REF(/atom/movable, say), "[black_hole] winks out, just as suddenly as it appeared."), 50) + addtimer(CALLBACK(game, TYPE_PROC_REF(/atom/movable, say), "[black_hole] winks out, just as suddenly as it appeared."), 5 SECONDS) QDEL_IN(black_hole, 5 SECONDS) #define BUTTON_DOCK "Dock" diff --git a/code/game/machinery/computer/atmos_computers/_air_sensor.dm b/code/game/machinery/computer/atmos_computers/_air_sensor.dm index 3a8cd36de89..1c365dd0876 100644 --- a/code/game/machinery/computer/atmos_computers/_air_sensor.dm +++ b/code/game/machinery/computer/atmos_computers/_air_sensor.dm @@ -43,7 +43,7 @@ if(!on) return . = ..() - use_power(active_power_usage) //use power for analyzing gases + use_energy(active_power_usage) //use power for analyzing gases /obj/machinery/air_sensor/process() //update appearance according to power state @@ -221,8 +221,6 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/item/air_sensor/deconstruct(disassembled) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/analyzer(loc) - new /obj/item/stack/sheet/iron(loc, 1) - return ..() +/obj/item/air_sensor/atom_deconstruct(disassembled) + new /obj/item/analyzer(loc) + new /obj/item/stack/sheet/iron(loc, 1) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 157a3a77fbe..18ca1665765 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -10,20 +10,17 @@ . = ..() AddComponent(/datum/component/simple_rotation) register_context() - update_appearance(UPDATE_ICON_STATE) - -/obj/structure/frame/computer/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/atom/drop_loc = drop_location() - if(state == FRAME_COMPUTER_STATE_GLASSED) - if(disassembled) - new /obj/item/stack/sheet/glass(drop_loc, 2) - else - new /obj/item/shard(drop_loc) - new /obj/item/shard(drop_loc) - if(state >= FRAME_COMPUTER_STATE_WIRED) - new /obj/item/stack/cable_coil(drop_loc, 5) +/obj/structure/frame/computer/atom_deconstruct(disassembled = TRUE) + var/atom/drop_loc = drop_location() + if(state == FRAME_COMPUTER_STATE_GLASSED) + if(disassembled) + new /obj/item/stack/sheet/glass(drop_loc, 2) + else + new /obj/item/shard(drop_loc) + new /obj/item/shard(drop_loc) + if(state >= FRAME_COMPUTER_STATE_WIRED) + new /obj/item/stack/cable_coil(drop_loc, 5) return ..() /obj/structure/frame/computer/add_context(atom/source, list/context, obj/item/held_item, mob/user) @@ -79,10 +76,11 @@ switch(state) if(FRAME_STATE_EMPTY) - . += span_notice("It can be [EXAMINE_HINT("wrenched")] [anchored ? "loose" : "in place"].") + . += span_notice("It can be [EXAMINE_HINT("anchored")] [anchored ? "loose" : "in place"].") if(anchored) . += span_warning("It's missing a circuit board.") - . += span_notice("It can be [EXAMINE_HINT("welded")] or [EXAMINE_HINT("screwed")] apart.") + else + . += span_notice("It can be [EXAMINE_HINT("welded")] or [EXAMINE_HINT("screwed")] apart.") if(FRAME_COMPUTER_STATE_BOARD_INSTALLED) . += span_warning("An [circuit.name] is installed and should be [EXAMINE_HINT("screwed")] in place.") . += span_notice("The circuit board can be [EXAMINE_HINT("pried")] out.") diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 37514c142fe..b244cba4aa6 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -8,7 +8,7 @@ circuit = /obj/item/circuitboard/computer/security light_color = COLOR_SOFT_RED - var/list/network = list("ss13") + var/list/network = list(CAMERANET_NETWORK_SS13) var/obj/machinery/camera/active_camera /// The turf where the camera was last updated. var/turf/last_camera_turf @@ -50,7 +50,7 @@ /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui) . = ..() - if(!user.can_perform_action(src, NEED_DEXTERITY)) //prevents monkeys from using camera consoles + if(!user.can_perform_action(src, NEED_DEXTERITY|ALLOW_SILICON_REACH)) //prevents monkeys from using camera consoles return // Update UI ui = SStgui.try_update_ui(user, src, ui) @@ -68,7 +68,7 @@ // Turn on the console if(length(concurrent_users) == 1 && is_living) playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) - use_power(active_power_usage) + use_energy(active_power_usage) // Register map objects cam_screen.display_to(user) user.client.register_map_obj(cam_background) @@ -89,7 +89,7 @@ data["activeCamera"] = list( name = active_camera.c_tag, ref = REF(active_camera), - status = active_camera.status, + status = active_camera.camera_enabled, ) return data @@ -173,7 +173,6 @@ active_camera = null last_camera_turf = null playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) - use_power(0) /obj/machinery/computer/security/proc/show_camera_static() cam_screen.vis_contents.Cut() @@ -195,31 +194,31 @@ desc = "Used to access the various cameras on the outpost." icon_screen = "mining" icon_keyboard = "mining_key" - network = list("mine", "auxbase") + network = list(CAMERANET_NETWORK_MINE, CAMERANET_NETWORK_AUXBASE) circuit = /obj/item/circuitboard/computer/mining /obj/machinery/computer/security/research name = "research camera console" desc = "Used to access the various cameras in science." - network = list("rd") + network = list(CAMERANET_NETWORK_RD) circuit = /obj/item/circuitboard/computer/research /obj/machinery/computer/security/hos name = "\improper Head of Security's camera console" desc = "A custom security console with added access to the labor camp network." - network = list("ss13", "labor") + network = list(CAMERANET_NETWORK_SS13, CAMERANET_NETWORK_LABOR) circuit = null /obj/machinery/computer/security/labor name = "labor camp monitoring" desc = "Used to access the various cameras on the labor camp." - network = list("labor") + network = list(CAMERANET_NETWORK_LABOR) circuit = null /obj/machinery/computer/security/qm name = "\improper Quartermaster's camera console" desc = "A console with access to the mining, auxiliary base and vault camera networks." - network = list("mine", "auxbase", "vault") + network = list(CAMERANET_NETWORK_MINE, CAMERANET_NETWORK_AUXBASE, CAMERANET_NETWORK_VAULT) circuit = null #undef DEFAULT_MAP_SIZE diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index a2b1b30183b..a271517b0c4 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -8,7 +8,7 @@ var/lock_override = NONE var/mob/camera/ai_eye/remote/eyeobj var/mob/living/current_user = null - var/list/networks = list("ss13") + var/list/networks = list(CAMERANET_NETWORK_SS13) /// Typepath of the action button we use as "off" /// It's a typepath so subtypes can give it fun new names var/datum/action/innate/camera_off/off_action = /datum/action/innate/camera_off diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f3b63a7a6e1..caa3452626e 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -101,19 +101,19 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) /// Are we NOT a silicon, AND we're logged in as the captain? /obj/machinery/computer/communications/proc/authenticated_as_non_silicon_captain(mob/user) - if (issilicon(user)) + if (HAS_SILICON_ACCESS(user)) return FALSE return ACCESS_CAPTAIN in authorize_access /// Are we a silicon, OR we're logged in as the captain? /obj/machinery/computer/communications/proc/authenticated_as_silicon_or_captain(mob/user) - if (issilicon(user)) + if (HAS_SILICON_ACCESS(user)) return TRUE return ACCESS_CAPTAIN in authorize_access /// Are we a silicon, OR logged in? /obj/machinery/computer/communications/proc/authenticated(mob/user) - if (issilicon(user)) + if (HAS_SILICON_ACCESS(user)) return TRUE return authenticated @@ -201,7 +201,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return // Check if they have - if (!issilicon(usr)) + if (!HAS_SILICON_ACCESS(usr)) var/obj/item/held_item = usr.get_active_held_item() var/obj/item/card/id/id_card = held_item?.GetID() if (!istype(id_card)) @@ -300,7 +300,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) state = STATE_MAIN if ("recallShuttle") // AIs cannot recall the shuttle - if (!authenticated(usr) || issilicon(usr) || syndicate) + if (!authenticated(usr) || HAS_SILICON_ACCESS(usr) || syndicate) return SSshuttle.cancelEvac(usr) if ("requestNukeCodes") @@ -571,7 +571,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) "syndicate" = syndicate, ) - var/ui_state = issilicon(user) ? cyborg_state : state + var/ui_state = HAS_SILICON_ACCESS(user) ? cyborg_state : state var/has_connection = has_communication() data["hasConnection"] = has_connection @@ -588,9 +588,9 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) data["safeCodeDeliveryWait"] = 0 data["safeCodeDeliveryArea"] = null - if (authenticated || issilicon(user)) + if (authenticated || HAS_SILICON_ACCESS(user)) data["authenticated"] = TRUE - data["canLogOut"] = !issilicon(user) + data["canLogOut"] = !HAS_SILICON_ACCESS(user) data["page"] = ui_state if ((obj_flags & EMAGGED) || syndicate) @@ -601,7 +601,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) data["canBuyShuttles"] = can_buy_shuttles(user) data["canMakeAnnouncement"] = FALSE data["canMessageAssociates"] = FALSE - data["canRecallShuttles"] = !issilicon(user) + data["canRecallShuttles"] = !HAS_SILICON_ACCESS(user) data["canRequestNuke"] = FALSE data["canSendToSectors"] = FALSE data["canSetAlertLevel"] = FALSE @@ -613,7 +613,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) data["aprilFools"] = check_holidays(APRIL_FOOLS) data["alertLevel"] = SSsecurity_level.get_current_level_as_text() data["authorizeName"] = authorize_name - data["canLogOut"] = !issilicon(user) + data["canLogOut"] = !HAS_SILICON_ACCESS(user) data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac() if(syndicate) data["shuttleCanEvacOrFailReason"] = "You cannot summon the shuttle from this console!" @@ -642,7 +642,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) data["engineeringOverride"] = GLOB.force_eng_override //SKYRAT EDIT - Engineering Override Toggle data["alertLevelTick"] = alert_level_tick data["canMakeAnnouncement"] = TRUE - data["canSetAlertLevel"] = issilicon(user) ? "NO_SWIPE_NEEDED" : "SWIPE_NEEDED" + data["canSetAlertLevel"] = HAS_SILICON_ACCESS(user) ? "NO_SWIPE_NEEDED" : "SWIPE_NEEDED" else if(syndicate) data["canMakeAnnouncement"] = TRUE @@ -746,7 +746,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return is_station_level(z_level) || is_centcom_level(z_level) /obj/machinery/computer/communications/proc/set_state(mob/user, new_state) - if (issilicon(user)) + if (HAS_SILICON_ACCESS(user)) cyborg_state = new_state else state = new_state @@ -756,7 +756,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) /obj/machinery/computer/communications/proc/can_buy_shuttles(mob/user) if (!SSmapping.config.allow_custom_shuttles) return FALSE - if (issilicon(user)) + if (HAS_SILICON_ACCESS(user)) return FALSE var/has_access = FALSE @@ -799,7 +799,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return length(CONFIG_GET(keyed_list/cross_server)) > 0 /obj/machinery/computer/communications/proc/make_announcement(mob/living/user) - var/is_ai = issilicon(user) + var/is_ai = HAS_SILICON_ACCESS(user) if(!SScommunications.can_announce(user, is_ai)) to_chat(user, span_alert("Intercomms recharging. Please stand by.")) return diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 815c1183b56..4cfe39f2314 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -98,7 +98,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/list/jobs = list( // Note that jobs divisible by 10 are considered heads of staff, and bolded // 00: Captain - JOB_CAPTAIN = 00, + JOB_CAPTAIN = 0, + JOB_HUMAN_AI = 1, // 10-19: Security JOB_HEAD_OF_SECURITY = 10, JOB_WARDEN = 11, @@ -198,7 +199,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) z = T.z . = list( "sensors" = update_data(z), - "link_allowed" = isAI(user) + "link_allowed" = HAS_AI_ACCESS(user) ) /datum/crewmonitor/proc/update_data(z) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index c9cae83504e..f9e06ab58b3 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -440,9 +440,9 @@ to_chat(usr,span_notice("DNA scrambled.")) scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, GENETIC_DAMAGE_STRENGTH_MULTIPLIER*50/(connected_scanner.damage_coeff ** 2)) if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Check whether a specific mutation is eligible for discovery within the @@ -578,9 +578,9 @@ // Check if we cracked a mutation check_discovery(alias) if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Apply a chromosome to a specific mutation. @@ -615,9 +615,9 @@ stored_chromosomes -= CM CM.apply(HM) if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Attempt overwriting Base DNA : The pairs are instead the top row vs the top row of the new code. @@ -759,9 +759,9 @@ scanner_occupant.domutcheck() if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return @@ -843,9 +843,9 @@ else injector_ready = world.time + INJECTOR_TIMEOUT * 5 if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Save a mutation to the console's storage buffer. @@ -1057,9 +1057,9 @@ stored_research.discovered_mutations += result_path say("Successfully mutated [HM.name].") if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Combines two mutations from the disk to try and create a new mutation @@ -1123,9 +1123,9 @@ stored_research.discovered_mutations += result_path say("Successfully mutated [HM.name].") if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Sets the Genetic Makeup pulse strength. @@ -1362,9 +1362,9 @@ if(I) injector_ready = world.time + INJECTOR_TIMEOUT if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Applies a genetic makeup buffer to the scanner occupant @@ -1402,9 +1402,9 @@ apply_genetic_makeup(type, buffer_slot) if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Applies a genetic makeup buffer to the next scanner occupant. This sets @@ -1471,9 +1471,9 @@ genetic_damage_pulse_index = WRAP(text2num(params["index"]), 1, len+1) begin_processing() if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Cancels the delayed action - In this context it is not the genetic damage @@ -1633,9 +1633,9 @@ injector_selection[adv_inj] += A to_chat(usr,span_notice("Mutation successfully added to advanced injector.")) if(connected_scanner) - connected_scanner.use_power(connected_scanner.active_power_usage) + connected_scanner.use_energy(connected_scanner.active_power_usage) else - use_power(active_power_usage) + use_energy(active_power_usage) return // Deletes a mutation from an advanced injector diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 82ffe89b30e..816177f9f0e 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -42,6 +42,11 @@ desc = "Used to upload laws to the AI." circuit = /obj/item/circuitboard/computer/aiupload +/obj/machinery/computer/upload/ai/Initialize(mapload) + . = ..() + if(mapload && HAS_TRAIT(SSstation, STATION_TRAIT_HUMAN_AI)) + return INITIALIZE_HINT_QDEL + /obj/machinery/computer/upload/ai/interact(mob/user) current = select_active_ai(user, z) diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm index 3b639a9ce57..bb809af0eea 100644 --- a/code/game/machinery/computer/operating_computer.dm +++ b/code/game/machinery/computer/operating_computer.dm @@ -55,7 +55,7 @@ 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, 10, target = src)) + if(do_after(user, 1 SECONDS, target = src)) advanced_surgeries |= D.surgeries return TRUE return ..() @@ -103,6 +103,7 @@ data["table"] = table data["patient"] = list() + data["procedures"] = list() if(!table.patient) return data var/mob/living/carbon/patient = table.patient @@ -136,7 +137,6 @@ data["patient"]["fireLoss"] = patient.getFireLoss() data["patient"]["toxLoss"] = patient.getToxLoss() data["patient"]["oxyLoss"] = patient.getOxyLoss() - data["procedures"] = list() if(patient.surgeries.len) for(var/datum/surgery/procedure in patient.surgeries) var/datum/surgery_step/surgery_step = procedure.get_surgery_step() @@ -159,8 +159,6 @@ )) return data - - /obj/machinery/computer/operating/ui_act(action, params) . = ..() if(.) diff --git a/code/game/machinery/computer/orders/order_items/mining/order_pka.dm b/code/game/machinery/computer/orders/order_items/mining/order_pka.dm index 251343e6f8e..f239e9f2a7e 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_pka.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_pka.dm @@ -40,3 +40,7 @@ /datum/orderable_item/accelerator/minebot_passthrough item_path = /obj/item/borg/upgrade/modkit/minebot_passthrough cost_per_order = 800 + +/datum/orderable_item/accelerator/friendly_fire + item_path = /obj/item/borg/upgrade/modkit/human_passthrough + cost_per_order = 750 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 5ce92f7b84f..7ee4c6cfba8 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 @@ -21,6 +21,14 @@ item_path = /obj/item/mine_bot_upgrade/health cost_per_order = 350 +/datum/orderable_item/toys_drones/drone_shield + item_path = /obj/item/mine_bot_upgrade/regnerative_shield + cost_per_order = 500 + +/datum/orderable_item/toys_drones/drone_shield + item_path = /obj/item/minebot_remote_control + cost_per_order = 500 + /datum/orderable_item/toys_drones/drone_pka item_path = /obj/item/borg/upgrade/modkit/cooldown/minebot cost_per_order = 525 diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index 45124eefeee..f3dacdb8e20 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -114,7 +114,7 @@ if("teleport") if(!teleporter || !beacon) return - addtimer(CALLBACK(src, PROC_REF(teleport), usr), 5) + addtimer(CALLBACK(src, PROC_REF(teleport), usr), 0.5 SECONDS) return TRUE /obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/scan_machinery() diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm index 7bc9381c351..6fcef6726e4 100644 --- a/code/game/machinery/computer/records/medical.dm +++ b/code/game/machinery/computer/records/medical.dm @@ -31,7 +31,7 @@ return ui = SStgui.try_update_ui(user, src, ui) if (!ui) - create_character_preview_view(user) + character_preview_view = create_character_preview_view(user) ui = new(user, src, "MedicalRecords") ui.set_autoupdate(FALSE) ui.open() diff --git a/code/game/machinery/computer/records/records.dm b/code/game/machinery/computer/records/records.dm index 531e1725e33..f0b360ff1c8 100644 --- a/code/game/machinery/computer/records/records.dm +++ b/code/game/machinery/computer/records/records.dm @@ -13,15 +13,22 @@ if(!has_access) return data - data["assigned_view"] = "preview_[user.ckey]_[REF(src)]_records" + data["assigned_view"] = USER_PREVIEW_ASSIGNED_VIEW(user.ckey) data["station_z"] = !!(z && is_station_level(z)) return data +/obj/machinery/computer/records/ui_close(mob/user) + . = ..() + user.client?.screen_maps -= USER_PREVIEW_ASSIGNED_VIEW(user.ckey) + if((LAZYLEN(open_uis) <= 1) && character_preview_view) //only delete the preview if we're the last one to close the console. + QDEL_NULL(character_preview_view) + /obj/machinery/computer/records/ui_act(action, list/params, datum/tgui/ui) . = ..() if(.) return + var/mob/user = ui.user var/datum/record/crew/target if(params["crew_ref"]) @@ -35,6 +42,7 @@ return FALSE var/value = trim(params["value"], MAX_BROADCAST_LEN) + investigate_log("[key_name(user)] changed the field: \"[field]\" with value: \"[target.vars[field]]\" to new value: \"[value || "Unknown"]\"", INVESTIGATE_RECORDS) target.vars[field] = value || "Unknown" return TRUE @@ -44,22 +52,23 @@ return FALSE // Don't let people off station futz with the station network. if(!is_station_level(z)) - balloon_alert(usr, "out of range!") + balloon_alert(user, "out of range!") return TRUE expunge_record_info(target) - balloon_alert(usr, "record expunged") + balloon_alert(user, "record expunged") playsound(src, 'sound/machines/terminal_eject.ogg', 70, TRUE) - investigate_log("[key_name(usr)] expunged the record of [target.name].", INVESTIGATE_RECORDS) + investigate_log("[key_name(user)] expunged the record of [target.name].", INVESTIGATE_RECORDS) return TRUE if("login") - authenticated = secure_login(usr) + authenticated = secure_login(user) + investigate_log("[key_name(user)] [authenticated ? "successfully logged" : "failed to log"] into the [src].", INVESTIGATE_RECORDS) return TRUE if("logout") - balloon_alert(usr, "logged out") + balloon_alert(user, "logged out") playsound(src, 'sound/machines/terminal_off.ogg', 70, TRUE) authenticated = FALSE @@ -68,22 +77,22 @@ if("purge_records") // Don't let people off station futz with the station network. if(!is_station_level(z)) - balloon_alert(usr, "out of range!") + balloon_alert(user, "out of range!") return TRUE ui.close() - balloon_alert(usr, "purging records...") + balloon_alert(user, "purging records...") playsound(src, 'sound/machines/terminal_alert.ogg', 70, TRUE) - if(do_after(usr, 5 SECONDS)) + if(do_after(user, 5 SECONDS)) for(var/datum/record/crew/entry in GLOB.manifest.general) expunge_record_info(entry) - balloon_alert(usr, "records purged") + balloon_alert(user, "records purged") playsound(src, 'sound/machines/terminal_off.ogg', 70, TRUE) - investigate_log("[key_name(usr)] purged all records.", INVESTIGATE_RECORDS) + investigate_log("[key_name(user)] purged all records.", INVESTIGATE_RECORDS) else - balloon_alert(usr, "interrupted!") + balloon_alert(user, "interrupted!") return TRUE @@ -92,20 +101,21 @@ return FALSE playsound(src, "sound/machines/terminal_button0[rand(1, 8)].ogg", 50, TRUE) - update_preview(usr, params["assigned_view"], target) + update_preview(user, params["assigned_view"], target) return TRUE return FALSE /// Creates a character preview view for the UI. /obj/machinery/computer/records/proc/create_character_preview_view(mob/user) - var/assigned_view = "preview_[user.ckey]_[REF(src)]_records" + var/assigned_view = USER_PREVIEW_ASSIGNED_VIEW(user.ckey) if(user.client?.screen_maps[assigned_view]) return var/atom/movable/screen/map_view/char_preview/new_view = new(null, src) new_view.generate_view(assigned_view) new_view.display_to(user) + return new_view /// Takes a record and updates the character preview view to match it. /obj/machinery/computer/records/proc/update_preview(mob/user, assigned_view, datum/record/crew/target) @@ -123,30 +133,12 @@ /obj/machinery/computer/records/proc/expunge_record_info(datum/record/crew/target) return -/// Detects whether a user can use buttons on the machine -/obj/machinery/computer/records/proc/has_auth(mob/user) - if(issilicon(user) || isAdminGhostAI(user)) // Silicons don't need to authenticate - return TRUE - - if(!isliving(user)) - return FALSE - var/mob/living/player = user - - var/obj/item/card/auth = player.get_idcard(TRUE) - if(!auth) - return FALSE - var/list/access = auth.GetAccess() - if(!check_access_list(access)) - return FALSE - - return TRUE - /// Inserts a new record into GLOB.manifest.general. Requires a photo to be taken. /obj/machinery/computer/records/proc/insert_new_record(mob/user, obj/item/photo/mugshot) if(!mugshot || !is_operational || !user.can_perform_action(src, ALLOW_SILICON_REACH)) return FALSE - if(!authenticated && !has_auth(user)) + if(!authenticated && !allowed(user)) balloon_alert(user, "access denied") playsound(src, 'sound/machines/terminal_error.ogg', 70, TRUE) return FALSE @@ -175,7 +167,7 @@ if(!user.can_perform_action(src, ALLOW_SILICON_REACH) || !is_operational) return FALSE - if(!has_auth(user)) + if(!allowed(user)) balloon_alert(user, "access denied") playsound(src, 'sound/machines/terminal_error.ogg', 70, TRUE) return FALSE diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm index 0064cf570a6..4788e29e714 100644 --- a/code/game/machinery/computer/records/security.dm +++ b/code/game/machinery/computer/records/security.dm @@ -151,6 +151,8 @@ if(.) return + var/mob/user = ui.user + var/datum/record/crew/target if(params["crew_ref"]) target = locate(params["crew_ref"]) in GLOB.manifest.general @@ -159,28 +161,30 @@ switch(action) if("add_crime") - add_crime(usr, target, params) + add_crime(user, target, params) return TRUE if("delete_record") + investigate_log("[user] deleted record: \"[target]\".", INVESTIGATE_RECORDS) qdel(target) return TRUE if("edit_crime") - edit_crime(usr, target, params) + edit_crime(user, target, params) return TRUE if("invalidate_crime") - invalidate_crime(usr, target, params) + invalidate_crime(user, target, params) return TRUE if("print_record") - print_record(usr, target, params) + print_record(user, target, params) return TRUE if("set_note") - var/note = params["note"] - target.security_note = trim(note, MAX_MESSAGE_LEN) + var/note = trim(params["note"], MAX_MESSAGE_LEN) + investigate_log("[user] has changed the security note of record: \"[target]\" from \"[target.security_note]\" to \"[note]\".") + target.security_note = note return TRUE if("set_wanted") @@ -243,14 +247,19 @@ return FALSE if(user != editing_crime.author && !has_armory_access(user)) // only warden/hos/command can edit crimes they didn't author + investigate_log("[user] attempted to edit crime: \"[editing_crime.name]\" for target: \"[target.name]\" but failed due to lacking armoury access and not being the author of the crime.", INVESTIGATE_RECORDS) return FALSE if(params["name"] && length(params["name"]) > 2 && params["name"] != editing_crime.name) - editing_crime.name = trim(params["name"], MAX_CRIME_NAME_LEN) + var/new_name = trim(params["name"], MAX_CRIME_NAME_LEN) + investigate_log("[user] edited crime: \"[editing_crime.name]\" for target: \"[target.name]\", changing the name to: \"[new_name]\".", INVESTIGATE_RECORDS) + editing_crime.name = new_name return TRUE if(params["details"] && length(params["description"]) > 2 && params["name"] != editing_crime.name) - editing_crime.details = trim(params["details"], MAX_MESSAGE_LEN) + var/new_details = trim(params["details"], MAX_MESSAGE_LEN) + investigate_log("[user] edited crime \"[editing_crime.name]\" for target: \"[target.name]\", changing the details to: \"[new_details]\" from: \"[editing_crime.details]\".", INVESTIGATE_RECORDS) + editing_crime.details = new_details return TRUE return FALSE @@ -315,7 +324,7 @@ /// Handles printing records via UI. Takes the params from UI_act. /obj/machinery/computer/records/security/proc/print_record(mob/user, datum/record/crew/target, list/params) if(printing) - balloon_alert(usr, "printer busy") + balloon_alert(user, "printer busy") playsound(src, 'sound/machines/terminal_error.ogg', 100, TRUE) return FALSE diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 7b1e62e2cb7..2c17e1e088a 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -6,7 +6,7 @@ icon_keyboard = null icon_screen = null layer = SIGN_LAYER - network = list("thunder") + network = list(CAMERANET_NETWORK_THUNDERDOME) density = FALSE circuit = null light_power = 0 @@ -87,10 +87,65 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai notify(network.len, announcement) +/** + * Adds a camera network to all entertainment monitors. + * + * * camera_net - The camera network ID to add to the monitors. + * * announcement - Optional, what announcement to make when the show starts. + */ +/proc/start_broadcasting_network(camera_net, announcement) + for(var/obj/machinery/computer/security/telescreen/entertainment/tv as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/security/telescreen/entertainment)) + tv.update_shows( + is_show_active = TRUE, + tv_show_id = camera_net, + announcement = announcement, + ) + +/** + * Removes a camera network from all entertainment monitors. + * + * * camera_net - The camera network ID to remove from the monitors. + * * announcement - Optional, what announcement to make when the show ends. + */ +/proc/stop_broadcasting_network(camera_net, announcement) + for(var/obj/machinery/computer/security/telescreen/entertainment/tv as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/security/telescreen/entertainment)) + tv.update_shows( + is_show_active = FALSE, + tv_show_id = camera_net, + announcement = announcement, + ) + +/** + * Sets the camera network status on all entertainment monitors. + * A way to force a network to a status if you are unsure of the current state. + * + * * camera_net - The camera network ID to set on the monitors. + * * is_show_active - Whether the show is active or not. + * * announcement - Optional, what announcement to make. + * Note this announcement will be made regardless of the current state of the show: + * This means if it's currently on and you set it to on, the announcement will still be made. + * Likewise, there's no way to differentiate off -> on and on -> off, unless you handle that yourself. + */ +/proc/set_network_broadcast_status(camera_net, is_show_active, announcement) + for(var/obj/machinery/computer/security/telescreen/entertainment/tv as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/security/telescreen/entertainment)) + tv.update_shows( + is_show_active = is_show_active, + tv_show_id = camera_net, + announcement = announcement, + ) + /obj/machinery/computer/security/telescreen/rd name = "\improper Research Director's telescreen" desc = "Used for watching the AI and the RD's goons from the safety of his office." - network = list("rd", "aicore", "aiupload", "minisat", "xeno", "test", "toxins") + network = list( + CAMERANET_NETWORK_RD, + CAMERANET_NETWORK_AI_CORE, + CAMERANET_NETWORK_AI_UPLOAD, + CAMERANET_NETWORK_MINISAT, + CAMERANET_NETWORK_XENOBIOLOGY, + CAMERANET_NETWORK_TEST_CHAMBER, + CAMERANET_NETWORK_ORDNANCE, + ) frame_type = /obj/item/wallframe/telescreen/rd /obj/item/wallframe/telescreen/rd @@ -100,7 +155,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/research name = "research telescreen" desc = "A telescreen with access to the research division's camera network." - network = list("rd") + network = list(CAMERANET_NETWORK_RD) frame_type = /obj/item/wallframe/telescreen/research /obj/item/wallframe/telescreen/research @@ -110,7 +165,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/ce name = "\improper Chief Engineer's telescreen" desc = "Used for watching the engine, telecommunications and the minisat." - network = list("engine", "singularity", "tcomms", "minisat") + network = list(CAMERANET_NETWORK_ENGINE, CAMERANET_NETWORK_TELECOMMS, CAMERANET_NETWORK_MINISAT) frame_type = /obj/item/wallframe/telescreen/ce /obj/item/wallframe/telescreen/ce @@ -120,7 +175,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/cmo name = "\improper Chief Medical Officer's telescreen" desc = "A telescreen with access to the medbay's camera network." - network = list("medbay") + network = list(CAMERANET_NETWORK_MEDBAY) frame_type = /obj/item/wallframe/telescreen/cmo /obj/item/wallframe/telescreen/cmo @@ -130,7 +185,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/vault name = "vault monitor" desc = "A telescreen that connects to the vault's camera network." - network = list("vault") + network = list(CAMERANET_NETWORK_VAULT) frame_type = /obj/item/wallframe/telescreen/vault /obj/item/wallframe/telescreen/vault @@ -140,7 +195,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/ordnance name = "bomb test site monitor" desc = "A telescreen that connects to the bomb test site's camera." - network = list("ordnance") + network = list(CAMERANET_NETWORK_ORDNANCE) frame_type = /obj/item/wallframe/telescreen/ordnance /obj/item/wallframe/telescreen/ordnance @@ -150,7 +205,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/engine name = "engine monitor" desc = "A telescreen that connects to the engine's camera network." - network = list("engine") + network = list(CAMERANET_NETWORK_ENGINE) frame_type = /obj/item/wallframe/telescreen/engine /obj/item/wallframe/telescreen/engine @@ -160,7 +215,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/turbine name = "turbine monitor" desc = "A telescreen that connects to the turbine's camera." - network = list("turbine") + network = list(CAMERANET_NETWORK_TURBINE) frame_type = /obj/item/wallframe/telescreen/turbine /obj/item/wallframe/telescreen/turbine @@ -170,7 +225,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/interrogation name = "interrogation room monitor" desc = "A telescreen that connects to the interrogation room's camera." - network = list("interrogation") + network = list(CAMERANET_NETWORK_INTERROGATION) frame_type = /obj/item/wallframe/telescreen/interrogation /obj/item/wallframe/telescreen/interrogation @@ -180,7 +235,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/prison name = "prison monitor" desc = "A telescreen that connects to the permabrig's camera network." - network = list("prison") + network = list(CAMERANET_NETWORK_PRISON) frame_type = /obj/item/wallframe/telescreen/prison /obj/item/wallframe/telescreen/prison @@ -190,7 +245,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/auxbase name = "auxiliary base monitor" desc = "A telescreen that connects to the auxiliary base's camera." - network = list("auxbase") + network = list(CAMERANET_NETWORK_AUXBASE) frame_type = /obj/item/wallframe/telescreen/auxbase /obj/item/wallframe/telescreen/auxbase @@ -200,7 +255,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/minisat name = "minisat monitor" desc = "A telescreen that connects to the minisat's camera network." - network = list("minisat") + network = list(CAMERANET_NETWORK_MINISAT) frame_type = /obj/item/wallframe/telescreen/minisat /obj/item/wallframe/telescreen/minisat @@ -210,7 +265,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/aiupload name = "\improper AI upload monitor" desc = "A telescreen that connects to the AI upload's camera network." - network = list("aiupload") + network = list(CAMERANET_NETWORK_AI_UPLOAD) frame_type = /obj/item/wallframe/telescreen/aiupload /obj/item/wallframe/telescreen/aiupload @@ -220,7 +275,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/bar name = "bar monitor" desc = "A telescreen that connects to the bar's camera network. Perfect for checking on customers." - network = list("bar") + network = list(CAMERANET_NETWORK_BAR) frame_type = /obj/item/wallframe/telescreen/bar /obj/item/wallframe/telescreen/bar @@ -270,5 +325,4 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai is_show_active = !is_show_active say("The [tv_show_name] show has [is_show_active ? "begun" : "ended"]") var/announcement = is_show_active ? pick(tv_starters) : pick(tv_enders) - for(var/obj/machinery/computer/security/telescreen/entertainment/tv as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/security/telescreen/entertainment)) - tv.update_shows(is_show_active, tv_network_id, announcement) + set_network_broadcast_status(tv_network_id, is_show_active, announcement) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index e624e3f33d7..f47948753ab 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -13,18 +13,19 @@ /// The current (de/con)struction state of the frame var/state = FRAME_STATE_EMPTY +/obj/structure/frame/Initialize(mapload) + . = ..() + update_appearance(UPDATE_ICON_STATE) + /obj/structure/frame/examine(user) . = ..() if(circuit) . += "It has \a [circuit] installed." -/obj/structure/frame/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/atom/movable/drop_loc = drop_location() - new /obj/item/stack/sheet/iron(drop_loc, 5) - circuit?.forceMove(drop_loc) - - return ..() +/obj/structure/frame/atom_deconstruct(disassembled = TRUE) + var/atom/movable/drop_loc = drop_location() + new /obj/item/stack/sheet/iron(drop_loc, 5) + circuit?.forceMove(drop_loc) /// Called when circuit has been set to a new board /obj/structure/frame/proc/circuit_added(obj/item/circuitboard/added) @@ -57,8 +58,9 @@ /obj/structure/frame/proc/try_dissassemble(mob/living/user, obj/item/tool, disassemble_time = 8 SECONDS) if(state != FRAME_STATE_EMPTY) return NONE - if(obj_flags & NO_DECONSTRUCTION) - return NONE + if(anchored && state == FRAME_STATE_EMPTY) //when using a screwdriver on an incomplete frame(missing components) no point checking for this + balloon_alert(user, "must be unanchored first!") + return ITEM_INTERACT_BLOCKING if(!tool.tool_start_check(user, amount = (tool.tool_behaviour == TOOL_WELDER ? 1 : 0))) return ITEM_INTERACT_BLOCKING diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index f791c0dcc27..0a626459667 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -33,8 +33,6 @@ /obj/machinery/jukebox/wrench_act(mob/living/user, obj/item/tool) if(!isnull(music_player.active_song_sound)) return NONE - if(obj_flags & NO_DECONSTRUCTION) - return NONE if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) return ITEM_INTERACT_SUCCESS diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index cb12a399260..c067fcfef0b 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -8,6 +8,7 @@ icon_state = "defibrillator_mount" density = FALSE use_power = NO_POWER_USE + active_power_usage = 40 * BASE_MACHINE_ACTIVE_CONSUMPTION power_channel = AREA_USAGE_EQUIP req_one_access = list(ACCESS_MEDICAL, ACCESS_COMMAND, ACCESS_SECURITY) //used to control clamps processing_flags = NONE @@ -132,7 +133,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) user.visible_message(span_notice("[user] presses [multitool] into [src]'s ID slot..."), \ span_notice("You begin overriding the clamps on [src]...")) playsound(src, 'sound/machines/click.ogg', 50, TRUE) - if(!do_after(user, 100, target = src) || !clamps_locked) + if(!do_after(user, 10 SECONDS, target = src) || !clamps_locked) return user.visible_message(span_notice("[user] pulses [multitool], and [src]'s clamps slide up."), \ span_notice("You override the locking clamps on [src]!")) @@ -196,12 +197,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) /obj/machinery/defibrillator_mount/charging/process(seconds_per_tick) - var/obj/item/stock_parts/cell/C = get_cell() - if(!C || !is_operational) + var/obj/item/stock_parts/cell/cell = get_cell() + if(!cell || !is_operational) return PROCESS_KILL - if(C.charge < C.maxcharge) - use_power(active_power_usage * seconds_per_tick) - C.give(40 * seconds_per_tick) + if(cell.charge < cell.maxcharge) + charge_cell(active_power_usage * seconds_per_tick, cell) defib.update_power() //wallframe, for attaching the mounts easily diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 0d3c04ccd6f..61f12100de2 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -17,12 +17,13 @@ var/proj_pass_rate = 50 //How many projectiles will pass the cover. Lower means stronger cover var/bar_material = METAL -/obj/structure/barricade/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - make_debris() - qdel(src) +/obj/structure/barricade/atom_deconstruct(disassembled = TRUE) + make_debris() +/// Spawn debris & stuff upon deconstruction /obj/structure/barricade/proc/make_debris() + PROTECTED_PROC(TRUE) + return /obj/structure/barricade/attackby(obj/item/I, mob/living/user, params) @@ -77,7 +78,7 @@ else to_chat(user, span_notice("You start adding [I] to [src]...")) playsound(src, 'sound/items/hammering_wood.ogg', 50, vary = TRUE) - if(do_after(user, 50, target=src)) + if(do_after(user, 5 SECONDS, target=src)) W.use(5) var/turf/T = get_turf(src) T.place_on_top(/turf/closed/wall/mineral/wood/nonmetal) diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 1cd8b3c7bf0..81961ce7187 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -161,9 +161,11 @@ var/disposed = 0 for(var/obj/item/dish in dish_drive_contents) if(is_type_in_list(dish, disposable_items)) + if(!use_energy(active_power_usage, force = FALSE)) + say("Not enough energy to continue!") + break LAZYREMOVE(dish_drive_contents, dish) dish.forceMove(bin) - use_power(active_power_usage) disposed++ if (disposed) visible_message(span_notice("[src] [pick("whooshes", "bwooms", "fwooms", "pshooms")] and beams [disposed] stored item\s into the nearby [bin.name].")) 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 477b461bdf3..f9ccf16812b 100644 --- a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm @@ -1,6 +1,6 @@ #define GOLIATH_ORGAN_COLOR "#875652" #define GOLIATH_SCLERA_COLOR "#ac0f32" -#define GOLIATH_PUPIL_COLOR "#FF0000" +#define GOLIATH_PUPIL_COLOR COLOR_RED #define GOLIATH_COLORS GOLIATH_ORGAN_COLOR + GOLIATH_SCLERA_COLOR + GOLIATH_PUPIL_COLOR ///bonus of the goliath: you can swim through space! @@ -21,8 +21,8 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = GOLIATH_COLORS - eye_color_left = "#FF0000" - eye_color_right = "#FF0000" + eye_color_left = COLOR_RED + eye_color_right = COLOR_RED low_light_cutoff = list(15, 0, 8) medium_light_cutoff = list(35, 15, 25) diff --git a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm index 70dd58f9f27..96e41a57789 100644 --- a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm @@ -1,6 +1,6 @@ #define GONDOLA_ORGAN_COLOR "#7a503d" -#define GONDOLA_SCLERA_COLOR "#000000" -#define GONDOLA_PUPIL_COLOR "#000000" +#define GONDOLA_SCLERA_COLOR COLOR_BLACK +#define GONDOLA_PUPIL_COLOR COLOR_BLACK #define GONDOLA_COLORS GONDOLA_ORGAN_COLOR + GONDOLA_SCLERA_COLOR + GONDOLA_PUPIL_COLOR /* 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 4e84870ec9c..f6e1e92c2a5 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -1,6 +1,6 @@ #define RAT_ORGAN_COLOR "#646464" #define RAT_SCLERA_COLOR "#f0e055" -#define RAT_PUPIL_COLOR "#000000" +#define RAT_PUPIL_COLOR COLOR_BLACK #define RAT_COLORS RAT_ORGAN_COLOR + RAT_SCLERA_COLOR + RAT_PUPIL_COLOR ///bonus of the rat: you can ventcrawl! @@ -16,8 +16,8 @@ name = "mutated rat-eyes" desc = "Rat DNA infused into what was once a normal pair of eyes." flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE - eye_color_left = "#000000" - eye_color_right = "#000000" + eye_color_left = COLOR_BLACK + eye_color_right = COLOR_BLACK icon = 'icons/obj/medical/organs/infuser_organs.dmi' icon_state = "eyes" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 2d727749c0d..917255e50b4 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -803,7 +803,7 @@ . = ..() if(.) return - if(!(issilicon(user) || isAdminGhostAI(user))) + if(!HAS_SILICON_ACCESS(user)) if(isElectrified() && shock(user, 100)) return @@ -1001,7 +1001,7 @@ return TRUE /obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) - if(!issilicon(user) && !isAdminGhostAI(user)) + if(!HAS_SILICON_ACCESS(user)) if(isElectrified() && (C.obj_flags & CONDUCTS_ELECTRICITY) && shock(user, 75)) return add_fingerprint(user) @@ -1268,14 +1268,14 @@ if(DEFAULT_DOOR_CHECKS) // Regular behavior. if(!hasPower() || wires.is_cut(WIRE_OPEN) || (obj_flags & EMAGGED)) return FALSE - use_power(50) + use_energy(50 JOULES) playsound(src, doorOpen, 30, TRUE) return TRUE if(FORCING_DOOR_CHECKS) // Only one check. if(obj_flags & EMAGGED) return FALSE - use_power(50) + use_energy(50 JOULES) playsound(src, doorOpen, 30, TRUE) return TRUE @@ -1351,7 +1351,7 @@ if(DEFAULT_DOOR_CHECKS to FORCING_DOOR_CHECKS) if(obj_flags & EMAGGED) return FALSE - use_power(50) + use_energy(50 JOULES) playsound(src, doorClose, 30, TRUE) return TRUE @@ -1458,7 +1458,7 @@ /obj/machinery/door/airlock/hostile_lockdown(mob/origin) // Must be powered and have working AI wire. - if(canAIControl(src) && !machine_stat) + if(canAIControl(origin) && !machine_stat) locked = FALSE //For airlocks that were bolted open. safe = FALSE //DOOR CRUSH close() @@ -1470,7 +1470,7 @@ /obj/machinery/door/airlock/disable_lockdown() // Must be powered and have working AI wire. - if(canAIControl(src) && !machine_stat) + if(canAIControl() && !machine_stat) unbolt() set_electrified(MACHINE_NOT_ELECTRIFIED) open() @@ -1689,7 +1689,7 @@ . = TRUE /obj/machinery/door/airlock/proc/user_allowed(mob/user) - return (issilicon(user) && canAIControl(user)) || isAdminGhostAI(user) + return (HAS_SILICON_ACCESS(user) && canAIControl(user)) || isAdminGhostAI(user) /obj/machinery/door/airlock/proc/shock_restore(mob/user) if(!user_allowed(user)) @@ -2311,6 +2311,7 @@ /obj/machinery/door/airlock/cult/Initialize(mapload) . = ..() new openingoverlaytype(loc) + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/machinery/door/airlock/cult/canAIControl(mob/user) return (IS_CULTIST(user) && !isAllPowerCut()) @@ -2337,7 +2338,7 @@ var/atom/throwtarget throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) - flash_color(L, flash_color="#960000", flash_time=20) + flash_color(L, flash_color=COLOR_CULT_RED, flash_time=20) L.Paralyze(40) L.throw_at(throwtarget, 5, 1) return FALSE @@ -2361,9 +2362,6 @@ /obj/machinery/door/airlock/cult/narsie_act() return -/obj/machinery/door/airlock/cult/emp_act(severity) - return - /obj/machinery/door/airlock/cult/friendly friendly = TRUE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index db09a0db560..adbf99aa40e 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -32,22 +32,32 @@ /// A filler object used to fill the space of multi-tile airlocks var/obj/structure/fluff/airlock_filler/filler var/welded = FALSE - var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors - var/emergency = FALSE // Emergency access override - var/sub_door = FALSE // true if it's meant to go under another door. + /// For rglass-windowed airlocks and firedoors + var/heat_proof = FALSE + /// Emergency access override + var/emergency = FALSE + /// true if it's meant to go under another door. + var/sub_door = FALSE var/closingLayer = CLOSED_DOOR_LAYER - var/autoclose = FALSE //does it automatically close after some time - var/safe = TRUE //whether the door detects things and mobs in its way and reopen or crushes them. - var/locked = FALSE //whether the door is bolted or not. + ///does it automatically close after some time + var/autoclose = FALSE + ///whether the door detects things and mobs in its way and reopen or crushes them. + var/safe = TRUE + ///whether the door is bolted or not. + var/locked = FALSE var/datum/effect_system/spark_spread/spark_system - var/real_explosion_block //ignore this, just use explosion_block - var/red_alert_access = FALSE //if TRUE, this door will always open on red alert + ///ignore this, just use explosion_block + 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 - var/can_crush = TRUE /// Whether or not the door can crush mobs. - var/can_open_with_hands = TRUE /// Whether or not the door can be opened by hand (used for blast doors and shutters) + /// 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) + var/can_open_with_hands = TRUE /// Whether or not this door can be opened through a door remote, ever var/opens_with_door_remote = FALSE /// Special operating mode for elevator doors @@ -116,7 +126,7 @@ if(!can_open_with_hands) return . - if(isaicamera(user) || issilicon(user)) + if(isaicamera(user) || HAS_SILICON_ACCESS(user)) return . if(isnull(held_item) && Adjacent(user)) @@ -239,7 +249,7 @@ var/obj/item/I = AM if(!density || (I.w_class < WEIGHT_CLASS_NORMAL && !LAZYLEN(I.GetAccess()))) return - if(check_access(I)) + if(requiresID() && check_access(I)) open() else do_animate("deny") @@ -427,7 +437,7 @@ if(operating) return FALSE operating = TRUE - use_power(active_power_usage) + use_energy(active_power_usage) do_animate("opening") set_opacity(0) SLEEP_NOT_DEL(0.5 SECONDS) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index c188eaa58b9..b63e94e6079 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -889,7 +889,7 @@ return if(istype(attacking_object, /obj/item/electroadaptive_pseudocircuit)) var/obj/item/electroadaptive_pseudocircuit/raspberrypi = attacking_object - if(!raspberrypi.adapt_circuit(user, DEFAULT_STEP_TIME * 0.5)) + if(!raspberrypi.adapt_circuit(user, circuit_cost = DEFAULT_STEP_TIME * 0.5 KILO JOULES)) return user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ span_notice("You adapt a firelock circuit and slot it into the assembly.")) diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 21b0bb2e193..df8f7fa936a 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -25,7 +25,6 @@ /obj/machinery/door/password/voice voice_activated = TRUE - /datum/armor/door_password melee = 100 bullet = 100 @@ -40,6 +39,10 @@ . = ..() if(voice_activated) become_hearing_sensitive() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) + +/obj/machinery/door/password/get_save_vars() + return ..() + NAMEOF(src, password) /obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) . = ..() @@ -83,8 +86,5 @@ return TRUE return FALSE -/obj/machinery/door/password/emp_act(severity) - return - /obj/machinery/door/password/ex_act(severity, target) return FALSE diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index f1d29735a24..d2a432688c1 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -32,6 +32,9 @@ fire = 100 acid = 70 +/obj/machinery/door/poddoor/get_save_vars() + return ..() + NAMEOF(src, id) + /obj/machinery/door/poddoor/screwdriver_act(mob/living/user, obj/item/tool) . = ..() if (density) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index bbe443bf380..0849a5ad8c5 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -317,7 +317,7 @@ transfer_fingerprints_to(debris) /obj/machinery/door/window/narsie_act() - add_atom_colour("#7D1919", FIXED_COLOUR_PRIORITY) + add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY) /obj/machinery/door/window/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return (exposed_temperature > T0C + (reinf ? 1600 : 800)) @@ -347,8 +347,6 @@ /obj/machinery/door/window/screwdriver_act(mob/living/user, obj/item/tool) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return if(density || operating) to_chat(user, span_warning("You need to open the door to access the maintenance panel!")) return @@ -360,8 +358,6 @@ /obj/machinery/door/window/crowbar_act(mob/living/user, obj/item/tool) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return if(!panel_open || density || operating) return add_fingerprint(user) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 91e7d1a3d48..5495033651a 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -23,7 +23,7 @@ var/starting_amount = 0 var/iron_cost = HALF_SHEET_MATERIAL_AMOUNT var/glass_cost = HALF_SHEET_MATERIAL_AMOUNT - var/power_used = 1000 + var/energy_used = 1 KILO JOULES var/mode = DRONE_READY var/timer @@ -95,7 +95,7 @@ // Those holoprojectors aren't cheap iron_cost = SHEET_MATERIAL_AMOUNT glass_cost = SHEET_MATERIAL_AMOUNT - power_used = 2000 + energy_used = 2 KILO JOULES starting_amount = SHEET_MATERIAL_AMOUNT * 5 // If the derelict gets lonely, make more friends. @@ -128,7 +128,7 @@ icon_creating = "hivebot_fab_on" iron_cost = 0 glass_cost = 0 - power_used = 0 + energy_used = 0 cooldownTime = 10 //Only 1 second - hivebots are extremely weak dispense_type = /mob/living/basic/hivebot begin_create_message = "closes and begins fabricating something within." @@ -177,8 +177,8 @@ if(DRONE_PRODUCTION) materials.use_materials(using_materials) - if(power_used) - use_power(power_used) + if(energy_used) + use_energy(energy_used) var/atom/A = new dispense_type(loc) A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) diff --git a/code/game/machinery/ecto_sniffer.dm b/code/game/machinery/ecto_sniffer.dm index 54d2b5e6f1e..7f94df42b72 100644 --- a/code/game/machinery/ecto_sniffer.dm +++ b/code/game/machinery/ecto_sniffer.dm @@ -29,9 +29,10 @@ activate(user) /obj/machinery/ecto_sniffer/proc/activate(mob/activator) + if(!use_energy(active_power_usage, force = FALSE)) + return flick("ecto_sniffer_flick", src) playsound(loc, 'sound/machines/ectoscope_beep.ogg', 75) - use_power(active_power_usage) say("Reporting [pick(world.file2list("strings/spook_levels.txt"))] levels of paranormal activity!") if(activator?.ckey) ectoplasmic_residues += activator.ckey diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 98d0ac1a02f..70da443872d 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -73,7 +73,7 @@ controller.cycle_close(door) else controller.only_close(door) - use_power(active_power_usage) + use_energy(active_power_usage) addtimer(CALLBACK(src, PROC_REF(not_busy)), 2 SECONDS) /obj/machinery/door_buttons/access_button/proc/not_busy() diff --git a/code/game/machinery/fat_sucker.dm b/code/game/machinery/fat_sucker.dm index 6e1f745772e..4567959b844 100644 --- a/code/game/machinery/fat_sucker.dm +++ b/code/game/machinery/fat_sucker.dm @@ -80,7 +80,7 @@ user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \ span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ span_hear("You hear a metallic creaking from [src].")) - if(do_after(user, breakout_time, target = src)) + if(do_after(user, breakout_time, target = src, hidden = TRUE)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) return free_exit = TRUE @@ -153,7 +153,7 @@ playsound(loc, 'sound/machines/chime.ogg', 30, FALSE) else next_fact-- - use_power(active_power_usage) + use_energy(active_power_usage * seconds_per_tick) /obj/machinery/fat_sucker/proc/start_extracting() if(state_open || !occupant || processing || !powered()) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 077bb3683aa..21494d17b99 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -406,7 +406,7 @@ else if(istype(tool, /obj/item/electroadaptive_pseudocircuit)) var/obj/item/electroadaptive_pseudocircuit/pseudoc = tool - if(!pseudoc.adapt_circuit(user, 15)) + if(!pseudoc.adapt_circuit(user, circuit_cost = 15 KILO JOULES)) return user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ span_notice("You adapt a fire alarm circuit and slot it into the assembly.")) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 678b2c65509..94612b8c9db 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -113,7 +113,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) flash_lighting_fx() COOLDOWN_START(src, flash_cooldown, flash_cooldown_duration) - use_power(1000) + use_energy(1 KILO JOULES) var/flashed = FALSE for(var/mob/living/living_mob in viewers(src, null)) diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index e1c2c8c73d6..72ac0e746f4 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -99,6 +99,9 @@ /obj/machinery/gulag_item_reclaimer/proc/drop_items(mob/user) if(!stored_items[user]) return + if(!use_energy(active_power_usage, force = FALSE)) + balloon_alert(user, "not enough energy!") + return var/drop_location = drop_location() for(var/i in stored_items[user]) var/obj/item/W = i @@ -106,4 +109,3 @@ W.forceMove(drop_location) stored_items -= user user.log_message("has reclaimed their items from the gulag item reclaimer.", LOG_GAME) - use_power(active_power_usage) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index 2fffb98d56c..1799e51564b 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -135,27 +135,30 @@ The console is located at computer/gulag_teleporter.dm if(!locked) open_machine() -// strips and stores all occupant's items -/obj/machinery/gulag_teleporter/proc/strip_occupant() - if(linked_reclaimer) - linked_reclaimer.stored_items[occupant] = list() - var/mob/living/mob_occupant = occupant - for(var/obj/item/W in mob_occupant) - if(!is_type_in_typecache(W, telegulag_required_items)) - if(mob_occupant.temporarilyRemoveItemFromInventory(W)) - if(istype(W, /obj/item/restraints/handcuffs)) - W.forceMove(get_turf(src)) - continue - if(linked_reclaimer) - linked_reclaimer.stored_items[mob_occupant] += W - W.forceMove(linked_reclaimer) - else - W.forceMove(src) +/// Strips the occupant of any items that are not allowed to be teleported to the gulag. +/// Will either place those items in the linked_reclaimer or on the ground if the reclaimer is deleted. +/obj/machinery/gulag_teleporter/proc/strip_prisoner(mob/living/carbon/human/victim) + if(!QDELETED(linked_reclaimer)) + linked_reclaimer.stored_items[victim] = list() + + for(var/obj/item/thing in victim) + if(is_type_in_typecache(thing, telegulag_required_items)) + continue + + if(!victim.temporarilyRemoveItemFromInventory(thing)) + continue + + if(QDELETED(linked_reclaimer) || istype(thing, /obj/item/restraints/handcuffs)) + thing.forceMove(get_turf(src)) + continue + + linked_reclaimer.stored_items[victim] += thing + thing.forceMove(linked_reclaimer) /obj/machinery/gulag_teleporter/proc/handle_prisoner(obj/item/id, datum/record/crew/target) if(!ishuman(occupant)) return - strip_occupant() + strip_prisoner(occupant) var/mob/living/carbon/human/prisoner = occupant if(!isplasmaman(prisoner) && jumpsuit_type) var/suit_or_skirt = prisoner.jumpsuit_style == PREF_SKIRT ? jumpskirt_type : jumpsuit_type //Check player prefs for jumpsuit or jumpskirt toggle, then give appropriate prison outfit. @@ -169,7 +172,7 @@ The console is located at computer/gulag_teleporter.dm if(target) target.wanted_status = WANTED_PRISONER - use_power(active_power_usage) + use_energy(active_power_usage) /obj/item/circuitboard/machine/gulag_teleporter name = "labor camp teleporter (Machine Board)" diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 612277d5784..09599b0cbff 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -136,7 +136,7 @@ organ_to_remove.forceMove(target) //Some organs, like chest ones, are different so we need to manually move them operation_order.Remove(limb_to_remove) break - use_power(active_power_usage) + use_energy(active_power_usage) addtimer(CALLBACK(src, PROC_REF(harvest)), interval) /obj/machinery/harvester/proc/end_harvesting(success = TRUE) @@ -171,7 +171,7 @@ return TRUE /obj/machinery/harvester/default_pry_open(obj/item/tool) //wew - . = !(state_open || panel_open || (obj_flags & NO_DECONSTRUCTION)) && tool.tool_behaviour == TOOL_CROWBAR //We removed is_operational here + . = !(state_open || panel_open) && tool.tool_behaviour == TOOL_CROWBAR //We removed is_operational here if(.) tool.play_tool_sound(src, 50) visible_message(span_notice("[usr] pries open \the [src]."), span_notice("You pry open [src].")) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 5b62c5b402b..18ccc976f06 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -111,6 +111,9 @@ Possible to do for anyone motivated enough: ) AddElement(/datum/element/contextual_screentip_mob_typechecks, hovering_mob_typechecks) + if(on_network) + holopads += src + /obj/machinery/holopad/secure name = "secure holopad" desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls." @@ -175,11 +178,6 @@ Possible to do for anyone motivated enough: if(!replay_mode && (disk?.record)) replay_start() -/obj/machinery/holopad/Initialize(mapload) - . = ..() - if(on_network) - holopads += src - /obj/machinery/holopad/Destroy() if(outgoing_call) outgoing_call.ConnectionFailure(src) diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index ecf47b39633..4594e09a9af 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -115,7 +115,7 @@ "...an annoying buzz in your ears..."\ )]") - use_power(active_power_usage * seconds_per_tick) + use_energy(active_power_usage * seconds_per_tick) /obj/machinery/hypnochair/proc/finish_interrogation() interrogating = FALSE diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 75d0566e42c..9ad6bcac58d 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -113,12 +113,13 @@ on = FALSE if(machine_stat & NOPOWER) on = FALSE + if(!use_energy(active_power_usage, force = FALSE)) // Use energy to keep the turf hot. Doesn't necessarily use the correct amount of energy though (this should be changed). + on = FALSE if(!on) update_appearance() return PROCESS_KILL location.hotspot_expose(1000, 500, 1) - use_power(active_power_usage) //use power to keep the turf hot /obj/machinery/igniter/update_icon_state() icon_state = "[base_icon_state][on]" @@ -250,11 +251,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26) if(!isturf(location) || !isopenturf(location)) return FALSE + if(!use_energy(active_power_usage, force = FALSE)) + return FALSE + flick("[initial(icon_state)]-spark", src) spark_system.start() last_spark = world.time location.hotspot_expose(1000, 2500, 1) - use_power(active_power_usage) return TRUE diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index a950750f4d8..57047c25cac 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -203,7 +203,7 @@ playsound(target, 'sound/weapons/emitter2.ogg', 25, TRUE) // use a lot of power - use_power(active_power_usage) + use_energy(active_power_usage) var/turf/source = target var/list/log_msg = list() @@ -304,7 +304,7 @@ if(!briefcase || !usr.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) return usr.visible_message(span_notice("[usr] starts closing [src]..."), span_notice("You start closing [src]...")) - if(do_after(usr, 30, target = usr)) + if(do_after(usr, 3 SECONDS, target = usr)) usr.put_in_hands(briefcase) moveToNullspace() //hides it from suitcase contents closed = TRUE @@ -343,7 +343,7 @@ return add_fingerprint(user) user.visible_message(span_notice("[user] starts setting down [src]..."), span_notice("You start setting up [pad]...")) - if(do_after(user, 30, target = user)) + if(do_after(user, 3 SECONDS, target = user)) pad.forceMove(get_turf(src)) pad.update_indicator() pad.closed = FALSE diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 197feb4118d..b63d13648eb 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -184,7 +184,7 @@ power = max(active_power_usage, (power + consumed_reagents_list[reagent_id])) busy = TRUE - use_power(power) + use_energy(power) flick("limbgrower_fill", src) icon_state = "limbgrower_idleon" var/temp_category = params["active_tab"] @@ -283,7 +283,6 @@ /obj/machinery/limbgrower/fullupgrade //Inherently cheaper organ production. This is to NEVER be inherently emagged, no valids. desc = "It grows new limbs using Synthflesh. This alien model seems more efficient." - obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION circuit = /obj/item/circuitboard/machine/limbgrower/fullupgrade /obj/machinery/limbgrower/fullupgrade/Initialize(mapload) diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm index a3c074937f0..4edb3215e2b 100644 --- a/code/game/machinery/machine_frame.dm +++ b/code/game/machinery/machine_frame.dm @@ -12,23 +12,15 @@ /obj/structure/frame/machine/Initialize(mapload) . = ..() register_context() - update_appearance(UPDATE_ICON_STATE) /obj/structure/frame/machine/Destroy() QDEL_LIST(components) return ..() -/obj/structure/frame/machine/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(state >= FRAME_STATE_WIRED) - new /obj/item/stack/cable_coil(drop_location(), 5) - dump_contents() - return ..() - -/obj/structure/frame/machine/try_dissassemble(mob/living/user, obj/item/tool, disassemble_time) - if(anchored) - balloon_alert(user, "must be unsecured first!") - return FALSE +/obj/structure/frame/machine/atom_deconstruct(disassembled = TRUE) + if(state >= FRAME_STATE_WIRED) + new /obj/item/stack/cable_coil(drop_location(), 5) + dump_contents() return ..() /obj/structure/frame/machine/add_context(atom/source, list/context, obj/item/held_item, mob/user) @@ -36,14 +28,15 @@ if(isnull(held_item)) return + if(held_item.tool_behaviour == TOOL_WRENCH && !circuit?.needs_anchored) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" + return CONTEXTUAL_SCREENTIP_SET + switch(state) if(FRAME_STATE_EMPTY) if(istype(held_item, /obj/item/stack/cable_coil)) context[SCREENTIP_CONTEXT_LMB] = "Wire Frame" return CONTEXTUAL_SCREENTIP_SET - else if(held_item.tool_behaviour == TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" - return CONTEXTUAL_SCREENTIP_SET else if(held_item.tool_behaviour == TOOL_WELDER) context[SCREENTIP_CONTEXT_LMB] = "Unweld frame" return CONTEXTUAL_SCREENTIP_SET @@ -61,11 +54,6 @@ if(held_item.tool_behaviour == TOOL_CROWBAR) context[SCREENTIP_CONTEXT_LMB] = "Pry out components" return CONTEXTUAL_SCREENTIP_SET - else if(held_item.tool_behaviour == TOOL_WRENCH) - if(!circuit.needs_anchored) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" - return CONTEXTUAL_SCREENTIP_SET - return NONE else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) var/needs_components = FALSE for(var/component in req_components) @@ -95,6 +83,8 @@ if(!circuit?.needs_anchored) . += span_notice("It can be [EXAMINE_HINT("anchored")] [anchored ? "loose" : "in place"]") if(state == FRAME_STATE_EMPTY) + if(!anchored) + . += span_notice("It can be [EXAMINE_HINT("welded")] or [EXAMINE_HINT("screwed")] apart.") . += span_warning("It needs [EXAMINE_HINT("5 cable")] pieces to wire it.") return if(state == FRAME_STATE_WIRED) @@ -470,5 +460,6 @@ return TRUE /obj/structure/frame/machine/secured + icon_state = "box_1" state = FRAME_STATE_WIRED anchored = TRUE diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index e3922415a66..6963b23afb0 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -43,7 +43,7 @@ /obj/machinery/mass_driver/proc/drive(amount) if(machine_stat & (BROKEN|NOPOWER) || panel_open) return - use_power(power_per_obj) + use_energy(power_per_obj) var/O_limit var/atom/target = get_edge_target_turf(src, dir) for(var/atom/movable/O in loc) @@ -54,7 +54,7 @@ if(O_limit >= 20) audible_message(span_notice("[src] lets out a screech, it doesn't seem to be able to handle the load.")) break - use_power(power_per_obj) + use_energy(power_per_obj) O.throw_at(target, drive_range * power, power) flick("mass_driver1", src) diff --git a/code/game/machinery/mechlaunchpad.dm b/code/game/machinery/mechlaunchpad.dm index 254467fc217..b8c282ae22c 100644 --- a/code/game/machinery/mechlaunchpad.dm +++ b/code/game/machinery/mechlaunchpad.dm @@ -60,7 +60,7 @@ "style" = STYLE_SEETHROUGH, "reverse_dropoff_coords" = list(reverse_turf.x, reverse_turf.y, reverse_turf.z) )) - use_power(active_power_usage) + use_energy(active_power_usage) /obj/structure/closet/supplypod/mechpod style = STYLE_SEETHROUGH diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index 298d31905de..3041423ea53 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -75,7 +75,7 @@ var/obj/item/card/id/card = paying.get_idcard(TRUE) if(card?.registered_account?.account_job?.paycheck_department == payment_department) - use_power(active_power_usage) + use_energy(active_power_usage) paying_customer = TRUE say("Hello, esteemed medical staff!") RefreshParts() @@ -83,7 +83,7 @@ var/bonus_fee = pandemonium ? rand(10,30) : 0 if(attempt_charge(src, paying, bonus_fee) & COMPONENT_OBJ_CANCEL_CHARGE ) return - use_power(active_power_usage) + use_energy(active_power_usage) paying_customer = TRUE icon_state = "[base_icon_state]_active" say("Thank you for your patronage!") diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index 5563000183c..b2068194e4b 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -14,6 +14,11 @@ /obj/item/reagent_containers/hypospray/medipen/oxandrolone = /datum/reagent/medicine/oxandrolone, /obj/item/reagent_containers/hypospray/medipen/salacid = /datum/reagent/medicine/sal_acid, /obj/item/reagent_containers/hypospray/medipen/penacid = /datum/reagent/medicine/pen_acid, + /obj/item/reagent_containers/hypospray/medipen/mutadone = /datum/reagent/medicine/mutadone, + /obj/item/reagent_containers/hypospray/medipen/methamphetamine = /datum/reagent/drug/methamphetamine, + /obj/item/reagent_containers/hypospray/medipen/survival = /datum/reagent/medicine/c2/libital, + /obj/item/reagent_containers/hypospray/medipen/survival/luxury = /datum/reagent/medicine/c2/penthrite, + /obj/item/reagent_containers/hypospray/medipen/invisibility = /datum/reagent/drug/saturnx, ) /obj/machinery/medipen_refiller/Initialize(mapload) @@ -80,14 +85,14 @@ medipen.add_initial_reagents() reagents.remove_reagent(allowed_pens[medipen.type], 10) balloon_alert(user, "refilled") - use_power(active_power_usage) + use_energy(active_power_usage) cut_overlays() return return ..() /obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) to_chat(user, span_notice("You start furiously plunging [name].")) - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) to_chat(user, span_notice("You finish plunging the [name].")) reagents.expose(get_turf(src), TOUCH) reagents.clear_reagents() diff --git a/code/game/machinery/modular_shield.dm b/code/game/machinery/modular_shield.dm index f4e15cfa878..cac65a032df 100644 --- a/code/game/machinery/modular_shield.dm +++ b/code/game/machinery/modular_shield.dm @@ -1,5 +1,5 @@ /obj/machinery/modular_shield_generator - name = "Modular Shield Generator" + name = "modular shield generator" desc = "A forcefield generator, it seems more stationary than its cousins. It cant handle G-force and will require frequent reboots when built on mobile craft." icon = 'icons/obj/machines/modular_shield_generator.dmi' icon_state = "gen_recovering_closed" @@ -382,7 +382,7 @@ ///The general code used for machines that want to connect to the network /obj/machinery/modular_shield/module - name = "Modular Shield Debugger" //Filler name and sprite for testing + name = "modular shield debugger" //Filler name and sprite for testing desc = "This is filler for testing you shouldn`t see this." icon = 'icons/obj/machines/mech_bay.dmi' icon_state = "recharge_port" @@ -506,7 +506,7 @@ /obj/machinery/modular_shield/module/node - name = "Modular Shield Node" + name = "modular shield node" desc = "A waist high mess of humming pipes and wires that extend the modular shield network." icon = 'icons/obj/machines/modular_shield_generator.dmi' icon_state = "node_off_closed" @@ -587,7 +587,7 @@ /obj/machinery/modular_shield/module/charger - name = "Modular Shield Charger" + name = "modular shield charger" desc = "A machine that somehow fabricates hardlight using electrons." icon = 'icons/obj/machines/modular_shield_generator.dmi' icon_state = "charger_off_closed" @@ -615,7 +615,7 @@ /obj/machinery/modular_shield/module/relay - name = "Modular Shield Relay" + name = "modular shield relay" desc = "It helps the shield generator project farther out." icon = 'icons/obj/machines/modular_shield_generator.dmi' icon_state = "relay_off_closed" @@ -643,7 +643,7 @@ /obj/machinery/modular_shield/module/well - name = "Modular Shield Well" + name = "modular shield well" desc = "A device used to hold more hardlight for the modular shield generator." icon = 'icons/obj/machines/modular_shield_generator.dmi' icon_state = "well_off_closed" @@ -672,12 +672,13 @@ //The shield itself /obj/structure/emergency_shield/modular - name = "Modular energy shield" + name = "modular energy shield" desc = "An energy shield with varying configurations." color = "#00ffff" density = FALSE alpha = 100 resistance_flags = INDESTRUCTIBLE //the shield itself is indestructible or atleast should be + no_damage_feedback = "weakening the generator sustaining it" ///The shield generator sustaining us var/obj/machinery/modular_shield_generator/shield_generator @@ -711,6 +712,7 @@ //Damage from emp /obj/structure/emergency_shield/modular/emp_act(severity) + . = ..() if(isnull(shield_generator)) qdel(src) return diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 5caa41d9089..c15421cbf5a 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -165,7 +165,7 @@ controls["cover_locked"] = cover_locked data["locked"] = controls_locked - data["siliconUser"] = issilicon(user) + data["siliconUser"] = HAS_SILICON_ACCESS(user) data["controls"] = controls return data @@ -190,7 +190,7 @@ controls_locked = !controls_locked return TRUE - if(controls_locked && !issilicon(usr)) + if(controls_locked && !HAS_SILICON_ACCESS(usr)) return switch(action) diff --git a/code/game/machinery/photobooth.dm b/code/game/machinery/photobooth.dm new file mode 100644 index 00000000000..d7775974269 --- /dev/null +++ b/code/game/machinery/photobooth.dm @@ -0,0 +1,228 @@ +/** + * Photobooth + * A machine used to change occupant's security record photos, working similarly to a + * camera, but doesn't give any physical photo to the user. + * Links to buttons for remote control. + */ +/obj/machinery/photobooth + name = "photobooth" + desc = "A machine with some drapes and a camera, used to update security record photos. Requires Law Office access to use." + icon = 'icons/obj/machines/photobooth.dmi' + icon_state = "booth_open" + base_icon_state = "booth" + state_open = TRUE + circuit = /obj/item/circuitboard/machine/photobooth + light_system = OVERLAY_LIGHT_DIRECTIONAL //Used as a flash here. + light_range = 6 + light_color = COLOR_WHITE + light_power = FLASH_LIGHT_POWER + light_on = FALSE + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND + req_one_access = list(ACCESS_LAWYER, ACCESS_SECURITY) + ///Boolean on whether we should add a height chart to the underlays of the people we take photos of. + var/add_height_chart = FALSE + ///Boolean on whether the machine is currently busy taking someone's pictures, so you can't start taking pictures while it's working. + var/taking_pictures = FALSE + ///The ID of the photobooth, used to connect it to a button. + var/button_id = "photobooth_machine_default" + +/** + * Security photobooth + * Adds a height chart in the background, used for people you want to evidently stick out as prisoners. + * Good for people you plan on putting in the permabrig. + */ +/obj/machinery/photobooth/security + name = "security photobooth" + desc = "A machine with some drapes and a camera, used to update security record photos. Requires Security access to use, and adds a height chart to the person." + circuit = /obj/item/circuitboard/machine/photobooth/security + req_one_access = list(ACCESS_SECURITY) + color = COLOR_LIGHT_GRAYISH_RED + add_height_chart = TRUE + +/obj/machinery/photobooth/Initialize(mapload) + . = ..() + register_context() + +/obj/machinery/photobooth/interact(mob/living/user, list/modifiers) + . = ..() + if(taking_pictures) + balloon_alert(user, "machine busy!") + return + if(state_open) + close_machine() + else + open_machine() + +/obj/machinery/photobooth/attack_hand_secondary(mob/user, list/modifiers) + if(taking_pictures) + balloon_alert(user, "machine busy!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(occupant) + if(allowed(user)) + start_taking_pictures() + else + balloon_alert(user, "access denied!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ..() + +/obj/machinery/photobooth/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(machine_stat & (BROKEN|NOPOWER) || !isnull(held_item)) + return NONE + + context[SCREENTIP_CONTEXT_LMB] = "[state_open ? "Close" : "Open"] Machine" + if(occupant) + context[SCREENTIP_CONTEXT_RMB] = "Take Pictures" + + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/photobooth/close_machine(mob/user, density_to_set = TRUE) + if(panel_open) + balloon_alert(user, "close panel first!") + return + playsound(src, 'sound/effects/curtain.ogg', 50, TRUE) + return ..() + +/obj/machinery/photobooth/open_machine(drop = TRUE, density_to_set = FALSE) + playsound(src, 'sound/effects/curtain.ogg', 50, TRUE) + return ..() + +/obj/machinery/photobooth/update_icon_state() + . = ..() + if(machine_stat & (BROKEN|NOPOWER)) + icon_state = "[base_icon_state]_off" + else if(state_open) + icon_state = "[base_icon_state]_open" + else + icon_state = "[base_icon_state]_closed" + +/obj/machinery/photobooth/update_overlays() + . = ..() + if((machine_stat & MAINT) || panel_open) + . += "[base_icon_state]_panel" + +/obj/machinery/photobooth/screwdriver_act(mob/living/user, obj/item/tool) + if(!has_buckled_mobs() && default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + update_appearance(UPDATE_ICON) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/photobooth/crowbar_act(mob/living/user, obj/item/tool) + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/machinery/photobooth/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + req_access = list() //in case someone sets this to something + req_one_access = list() + balloon_alert(user, "beeps softly") + obj_flags |= EMAGGED + return TRUE + +/** + * Handles the effects of taking pictures of the user, calling finish_taking_pictures + * to actually update the records. + */ +/obj/machinery/photobooth/proc/start_taking_pictures() + taking_pictures = TRUE + if(obj_flags & EMAGGED) + var/mob/living/carbon/carbon_occupant = occupant + for(var/i in 1 to 5) //play a ton of sounds to mimic it blinding you + playsound(src, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, TRUE) + if(carbon_occupant) + carbon_occupant.flash_act(5) + sleep(0.2 SECONDS) + if(carbon_occupant) + carbon_occupant.emote("scream") + finish_taking_pictures() + return + if(!do_after(occupant, 2 SECONDS, src, timed_action_flags = IGNORE_HELD_ITEM)) //gives them time to put their hand items away. + taking_pictures = FALSE + return + playsound(src, 'sound/items/polaroid1.ogg', 75, TRUE) + flash() + if(!do_after(occupant, 3 SECONDS, src, timed_action_flags = IGNORE_HELD_ITEM)) + taking_pictures = FALSE + return + playsound(src, 'sound/items/polaroid2.ogg', 75, TRUE) + flash() + if(!do_after(occupant, 2 SECONDS, src, timed_action_flags = IGNORE_HELD_ITEM)) + taking_pictures = FALSE + return + finish_taking_pictures() + +///Updates the records (if possible), giving feedback, and spitting the user out if all's well. +/obj/machinery/photobooth/proc/finish_taking_pictures() + taking_pictures = FALSE + if(!GLOB.manifest.change_pictures(occupant.name, occupant, add_height_chart = add_height_chart)) + balloon_alert(occupant, "record not found!") + return + balloon_alert(occupant, "records updated") + open_machine() + +///Mimicing the camera, gives a flash effect by turning the light on and calling flash_end. +/obj/machinery/photobooth/proc/flash() + set_light_on(TRUE) + addtimer(CALLBACK(src, PROC_REF(flash_end)), FLASH_LIGHT_DURATION, TIMER_OVERRIDE|TIMER_UNIQUE) + +///Called by a timer to turn the light off to end the flash effect. +/obj/machinery/photobooth/proc/flash_end() + set_light_on(FALSE) + + +/obj/machinery/button/photobooth + name = "photobooth control button" + desc = "Operates the photobooth from a distance, allowing people to update their security record photos." + device_type = /obj/item/assembly/control/photobooth_control + req_one_access = list(ACCESS_SECURITY, ACCESS_LAWYER) + id = "photobooth_machine_default" + +/obj/machinery/button/photobooth/Initialize(mapload) + . = ..() + if(device) + var/obj/item/assembly/control/photobooth_control/ours = device + ours.id = id + +/obj/machinery/button/photobooth/multitool_act(mob/living/user, obj/item/multitool/tool) + . = ..() + if(tool.buffer && !istype(tool.buffer, /obj/machinery/photobooth)) + return + var/obj/item/assembly/control/photobooth_control/controller = device + controller.booth_machine_ref = WEAKREF(tool.buffer) + id = null + controller.id = null + balloon_alert(user, "linked to [tool.buffer]") + +/obj/item/assembly/control/photobooth_control + name = "photobooth controller" + desc = "A remote controller for the HoP's photobooth." + ///Weakref to the photobooth we're connected to. + var/datum/weakref/booth_machine_ref + +/obj/item/assembly/control/photobooth_control/Initialize(mapload) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/item/assembly/control/photobooth_control/LateInitialize() + find_machine() + +/// Locate the photobooth we're linked via ID +/obj/item/assembly/control/photobooth_control/proc/find_machine() + for(var/obj/machinery/photobooth/booth as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/photobooth)) + if(booth.button_id == id) + booth_machine_ref = WEAKREF(booth) + if(booth_machine_ref) + return TRUE + return FALSE + +/obj/item/assembly/control/photobooth_control/activate(mob/activator) + if(!booth_machine_ref) + return + var/obj/machinery/photobooth/machine = booth_machine_ref.resolve() + if(!machine) + return + if(machine.taking_pictures) + balloon_alert(activator, "machine busy!") + return + machine.start_taking_pictures() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index af6b477e90b..d9e3787fd9e 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -248,7 +248,7 @@ Buildable meters return TRUE // no conflicts found - var/obj/machinery/atmospherics/built_machine = new pipe_type(loc, , , p_init_dir) + var/obj/machinery/atmospherics/built_machine = new pipe_type(loc, null, fixed_dir(), p_init_dir) build_pipe(built_machine) built_machine.on_construction(user, pipe_color, piping_layer) transfer_fingerprints_to(built_machine) @@ -356,9 +356,6 @@ Buildable meters return FALSE /obj/item/pipe/proc/build_pipe(obj/machinery/atmospherics/A) - A.setDir(fixed_dir()) - A.set_init_directions(p_init_dir) - if(pipename) A.name = pipename if(A.on) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 809171af1ef..d4cf080da69 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -103,6 +103,8 @@ DEFINE_BITFIELD(turret_flags, list( var/datum/action/turret_toggle/toggle_action /// Mob that is remotely controlling the turret var/mob/remote_controller + /// While the cooldown is still going on, it cannot be re-enabled. + COOLDOWN_DECLARE(disabled_time) /datum/armor/machinery_porta_turret melee = 50 @@ -133,18 +135,32 @@ DEFINE_BITFIELD(turret_flags, list( if(!has_cover) INVOKE_ASYNC(src, PROC_REF(popUp)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + AddElement(/datum/element/hostile_machine) -/obj/machinery/porta_turret/proc/toggle_on(set_to) - var/current = on - if (!isnull(set_to)) - on = set_to - else - on = !on - if (current != on) - check_should_process() - if (!on) - popDown() +///Toggles the turret on or off depending on the value of the turn_on arg. +/obj/machinery/porta_turret/proc/toggle_on(turn_on = TRUE) + if(on == turn_on) + return + if(on && !COOLDOWN_FINISHED(src, disabled_time)) + return + on = turn_on + check_should_process() + if (!on) + popDown() + +///Prevents turned from being turned on for a duration, then restarts them after that if the second ard is true. +/obj/machinery/porta_turret/proc/set_disabled(duration = 6 SECONDS, will_restart = on) + COOLDOWN_START(src, disabled_time, duration) + if(will_restart) + addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), duration + 1) //the cooldown isn't over until the tick after its end. + toggle_on(FALSE) + +/obj/machinery/porta_turret/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(set_disabled), disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS /obj/machinery/porta_turret/proc/check_should_process() if (datum_flags & DF_ISPROCESSING) @@ -256,7 +272,7 @@ DEFINE_BITFIELD(turret_flags, list( switch(action) if("power") if(anchored) - toggle_on() + toggle_on(!on) return TRUE else to_chat(usr, span_warning("It has to be secured first!")) @@ -364,10 +380,8 @@ DEFINE_BITFIELD(turret_flags, list( audible_message(span_hear("[src] hums oddly...")) obj_flags |= EMAGGED controllock = TRUE - toggle_on(FALSE) //turns off the turret temporarily + set_disabled(6 SECONDS) update_appearance() - //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), 6 SECONDS) //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here return TRUE @@ -385,11 +399,9 @@ DEFINE_BITFIELD(turret_flags, list( if(prob(20)) turret_flags |= TURRET_FLAG_SHOOT_ALL // Shooting everyone is a pretty big deal, so it's least likely to get turned on - toggle_on(FALSE) + set_disabled(rand(6 SECONDS, 20 SECONDS)) remove_control() - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), rand(60,600)) - /obj/machinery/porta_turret/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(. && atom_integrity > 0) //damage received @@ -397,7 +409,7 @@ DEFINE_BITFIELD(turret_flags, list( spark_system.start() if(on && !(turret_flags & TURRET_FLAG_SHOOT_ALL_REACT) && !(obj_flags & EMAGGED)) turret_flags |= TURRET_FLAG_SHOOT_ALL_REACT - addtimer(CALLBACK(src, PROC_REF(reset_attacked)), 60) + addtimer(CALLBACK(src, PROC_REF(reset_attacked)), 6 SECONDS) /obj/machinery/porta_turret/proc/reset_attacked() turret_flags &= ~TURRET_FLAG_SHOOT_ALL_REACT @@ -626,11 +638,11 @@ DEFINE_BITFIELD(turret_flags, list( var/obj/projectile/A //any emagged turrets drains 2x power and uses a different projectile? if(mode == TURRET_STUN) - use_power(reqpower) + use_energy(reqpower) A = new stun_projectile(T) playsound(loc, stun_projectile_sound, 75, TRUE) else - use_power(reqpower * 2) + use_energy(reqpower * 2) A = new lethal_projectile(T) playsound(loc, lethal_projectile_sound, 75, TRUE) @@ -815,9 +827,9 @@ DEFINE_BITFIELD(turret_flags, list( if(target) setDir(get_dir(base, target))//even if you can't shoot, follow the target shootAt(target) - addtimer(CALLBACK(src, PROC_REF(shootAt), target), 5) - addtimer(CALLBACK(src, PROC_REF(shootAt), target), 10) - addtimer(CALLBACK(src, PROC_REF(shootAt), target), 15) + addtimer(CALLBACK(src, PROC_REF(shootAt), target), 0.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(shootAt), target), 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(shootAt), target), 1.5 SECONDS) return TRUE /obj/machinery/porta_turret/ai @@ -948,14 +960,14 @@ DEFINE_BITFIELD(turret_flags, list( . += {"[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/attackby(obj/item/I, mob/user, params) +/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, params) if(machine_stat & BROKEN) return - if(I.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, I)) + if(attacking_item.tool_behaviour == TOOL_MULTITOOL) + if(!multitool_check_buffer(user, attacking_item)) return - var/obj/item/multitool/M = I + var/obj/item/multitool/M = attacking_item if(M.buffer && istype(M.buffer, /obj/machinery/porta_turret)) turrets |= WEAKREF(M.buffer) to_chat(user, span_notice("You link \the [M.buffer] with \the [src].")) @@ -964,16 +976,20 @@ DEFINE_BITFIELD(turret_flags, list( if (issilicon(user)) return attack_hand(user) - if ( get_dist(src, user) == 0 ) // trying to unlock the interface - if (allowed(usr)) - if(obj_flags & EMAGGED) - to_chat(user, span_warning("The turret control is unresponsive!")) - return + var/id = attacking_item.GetID() - locked = !locked - to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the panel.")) - else - to_chat(user, span_alert("Access denied.")) + 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) @@ -1186,17 +1202,14 @@ DEFINE_BITFIELD(turret_flags, list( installation = /obj/item/gun/energy/laser/bluetag team_color = "blue" -/obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/P) +/obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/projectile) . = ..() - if(on) - if(team_color == "blue") - if(istype(P, /obj/projectile/beam/lasertag/redtag)) - toggle_on(FALSE) - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), 10 SECONDS) - else if(team_color == "red") - if(istype(P, /obj/projectile/beam/lasertag/bluetag)) - toggle_on(FALSE) - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), 10 SECONDS) + if(!on) + return + if(team_color == "blue" && istype(projectile, /obj/projectile/beam/lasertag/redtag)) + set_disabled(10 SECONDS) + else if(team_color == "red" && istype(projectile, /obj/projectile/beam/lasertag/bluetag)) + set_disabled(10 SECONDS) #undef TURRET_STUN #undef TURRET_LETHAL diff --git a/code/game/machinery/prisonlabor.dm b/code/game/machinery/prisonlabor.dm index 2144b957326..aaf1e6a342e 100644 --- a/code/game/machinery/prisonlabor.dm +++ b/code/game/machinery/prisonlabor.dm @@ -53,12 +53,12 @@ update_appearance() to_chat(user, span_notice("You start pressing a new license plate!")) - if(!do_after(user, 40, target = src)) + if(!do_after(user, 4 SECONDS, target = src)) pressing = FALSE update_appearance() return FALSE - use_power(active_power_usage) + use_energy(active_power_usage) to_chat(user, span_notice("You finish pressing a new license plate!")) pressing = FALSE diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 037b4692fc7..047b8a86caa 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -89,7 +89,7 @@ interact(user, K.qpad) else to_chat(user, span_notice("You insert [K] into [src]'s card slot, initiating the link procedure.")) - if(do_after(user, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) to_chat(user, span_notice("You complete the link between [K] and [src].")) K.set_pad(src) @@ -164,7 +164,7 @@ last_teleport = world.time // use a lot of power - use_power(active_power_usage / power_efficiency) + use_energy(active_power_usage / power_efficiency) sparks() target_pad.sparks() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 1a20bf90e18..4e7f1483c84 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -42,7 +42,7 @@ if(using_power) status_display_message_shown = TRUE . += span_notice("The status display reads:") - . += span_notice("- Recharging [recharge_coeff*10]% cell charge per cycle.") + . += span_notice("- Recharging efficiency: [recharge_coeff*100]%.") if(isnull(charging)) return @@ -163,8 +163,7 @@ var/obj/item/stock_parts/cell/charging_cell = charging.get_cell() if(charging_cell) if(charging_cell.charge < charging_cell.maxcharge) - charging_cell.give(charging_cell.chargerate * recharge_coeff * seconds_per_tick / 2) - use_power(active_power_usage * recharge_coeff * seconds_per_tick) + charge_cell(charging_cell.chargerate * recharge_coeff * seconds_per_tick, charging_cell) using_power = TRUE update_appearance() @@ -172,7 +171,7 @@ var/obj/item/ammo_box/magazine/recharge/power_pack = charging if(power_pack.stored_ammo.len < power_pack.max_ammo) power_pack.stored_ammo += new power_pack.ammo_type(power_pack) - use_power(active_power_usage * recharge_coeff * seconds_per_tick) + use_energy(active_power_usage * recharge_coeff * seconds_per_tick) using_power = TRUE update_appearance() return diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f875617bd40..d067c3e8cbb 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -3,6 +3,7 @@ desc = "This device recharges energy dependent lifeforms, like cyborgs, ethereals and MODsuit users." icon = 'icons/obj/machines/borg_charger.dmi' icon_state = "borgcharger0" + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.1 density = FALSE req_access = list(ACCESS_ROBOTICS) state_open = TRUE @@ -11,6 +12,8 @@ processing_flags = NONE var/recharge_speed var/repairs + ///Callback for borgs & modsuits to provide their cell to us for charging + 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 @@ -24,6 +27,7 @@ mapload, \ mat_container_flags = MATCONTAINER_NO_INSERT, \ ) + charge_cell = CALLBACK(src, PROC_REF(charge_target_cell)) update_appearance() if(is_operational) @@ -41,21 +45,38 @@ return GLOB.roundstart_station_borgcharger_areas += area_name +/obj/machinery/recharge_station/Destroy() + materials = null + charge_cell = null + return ..() + +/** + * Mobs & borgs invoke this through a callback to recharge their cells + * Arguments + * + * * obj/item/stock_parts/cell/target - the cell to charge, optional if provided else will draw power used directly + * * seconds_per_tick - supplied from process() + */ +/obj/machinery/recharge_station/proc/charge_target_cell(obj/item/stock_parts/cell/target, seconds_per_tick) + PRIVATE_PROC(TRUE) + + return charge_cell(recharge_speed * seconds_per_tick, target, grid_only = TRUE) + /obj/machinery/recharge_station/RefreshParts() . = ..() recharge_speed = 0 repairs = 0 for(var/datum/stock_part/capacitor/capacitor in component_parts) - recharge_speed += capacitor.tier * 100 + recharge_speed += (capacitor.tier * STANDARD_CELL_CHARGE * 0.1) for(var/datum/stock_part/servo/servo in component_parts) repairs += servo.tier - 1 for(var/obj/item/stock_parts/cell/cell in component_parts) - recharge_speed *= cell.maxcharge / 10000 + recharge_speed *= cell.maxcharge /obj/machinery/recharge_station/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Recharging [recharge_speed]J per cycle.") + . += span_notice("The status display reads: Recharging: [display_power(recharge_speed, convert = FALSE)].") if(materials.silo) . += span_notice("The ore silo link indicator is lit, and cyborg restocking can be toggled by Right-Clicking [src].") if(repairs) @@ -156,7 +177,8 @@ /obj/machinery/recharge_station/proc/process_occupant(seconds_per_tick) if(!occupant) return - var/main_draw = use_power_from_net(recharge_speed * seconds_per_tick, take_any = TRUE) //Pulls directly from the Powernet to dump into the cell - if(!main_draw) + + if(!use_energy(active_power_usage * seconds_per_tick)) return - SEND_SIGNAL(occupant, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, main_draw, repairs, sendmats) + + SEND_SIGNAL(occupant, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, charge_cell, seconds_per_tick, repairs, sendmats) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 1014393c008..405a38e4167 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -19,22 +19,9 @@ var/datum/component/material_container/materials /obj/machinery/recycler/Initialize(mapload) - var/list/allowed_materials = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/silver, - /datum/material/plasma, - /datum/material/gold, - /datum/material/diamond, - /datum/material/plastic, - /datum/material/uranium, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/bluespace - ) materials = AddComponent( /datum/component/material_container, \ - allowed_materials, \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_NO_INSERT \ ) @@ -180,7 +167,7 @@ if(!is_operational) //we ran out of power after recycling a large amount to living stuff, time to stop break crush_living(CRUNCH) - use_power(active_power_usage) + use_energy(active_power_usage) else // Stop processing right now without eating anything. emergency_stop() return @@ -193,7 +180,7 @@ for(var/i = length(nom); i >= 1; i--) if(!is_operational) //we ran out of power after recycling a large amount to items, time to stop break - use_power(active_power_usage / (recycle_item(nom[i]) ? 1 : 2)) //recycling stuff that produces no material takes just half the power + use_energy(active_power_usage / (recycle_item(nom[i]) ? 1 : 2)) //recycling stuff that produces no material takes just half the power 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(not_eaten) diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 45a69e0b41a..ba4a5136a89 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -224,9 +224,9 @@ playsound(src, 'sound/machines/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_animation)), 30) + addtimer(CALLBACK(src, PROC_REF(finish_play_animation)), 3 SECONDS) - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/roulette/proc/finish_play_animation() icon_state = "idle" @@ -448,7 +448,7 @@ return loc.visible_message(span_warning("\The [src] begins to beep loudly!")) used = TRUE - addtimer(CALLBACK(src, PROC_REF(launch_payload)), 40) + addtimer(CALLBACK(src, PROC_REF(launch_payload)), 4 SECONDS) /obj/item/roulette_wheel_beacon/proc/launch_payload() var/obj/structure/closet/supplypod/centcompod/toLaunch = new() diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index 4c1c8590157..4ff8161de1b 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -244,7 +244,7 @@ assembly?.activate() set_scanline("scanning", 10) - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/scanner_gate/proc/alarm_beep() if(next_beep <= world.time) diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm index 69bebfca69e..bff759a6c72 100644 --- a/code/game/machinery/sheetifier.dm +++ b/code/game/machinery/sheetifier.dm @@ -50,13 +50,13 @@ var/mutable_appearance/processing_overlay = mutable_appearance(icon, "processing") processing_overlay.color = last_inserted_material.color flick_overlay_static(processing_overlay, src, 64) - addtimer(CALLBACK(src, PROC_REF(finish_processing)), 64) + addtimer(CALLBACK(src, PROC_REF(finish_processing)), 6.4 SECONDS) /obj/machinery/sheetifier/proc/finish_processing() busy_processing = FALSE update_appearance() materials.retrieve_all() //Returns all as sheets - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/sheetifier/wrench_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index d1206cfc1c5..edcf8269c8f 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -94,7 +94,7 @@ /obj/structure/emergency_shield/cult/weak name = "Invoker's Shield" desc = "A weak shield summoned by cultists to protect them while they carry out delicate rituals." - color = "#FF0000" + color = COLOR_RED max_integrity = 20 mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = ABOVE_MOB_LAYER @@ -187,7 +187,7 @@ . = ..() if(.) return - if(locked && !issilicon(user)) + if(locked && !HAS_SILICON_ACCESS(user)) to_chat(user, span_warning("The machine is locked, you are unable to use it!")) return if(panel_open) @@ -243,7 +243,7 @@ to_chat(user, span_warning("You need one length of cable to repair [src]!")) return to_chat(user, span_notice("You begin to replace the wires...")) - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) if(coil.get_amount() < 1) return coil.use(1) @@ -479,7 +479,7 @@ if(!anchored) balloon_alert(user, "not secured!") return - if(locked && !issilicon(user)) + if(locked && !HAS_SILICON_ACCESS(user)) balloon_alert(user, "locked!") return if(!powernet) diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm index daa474029f6..f768381548a 100644 --- a/code/game/machinery/sleepers.dm +++ b/code/game/machinery/sleepers.dm @@ -147,7 +147,7 @@ return FALSE /obj/machinery/sleeper/default_pry_open(obj/item/I) //wew - . = !(state_open || panel_open || (obj_flags & NO_DECONSTRUCTION)) && I.tool_behaviour == TOOL_CROWBAR + . = !(state_open || panel_open) && I.tool_behaviour == TOOL_CROWBAR if(.) I.play_tool_sound(src, 50) visible_message(span_notice("[usr] pries open [src]."), span_notice("You pry open [src].")) @@ -178,7 +178,7 @@ . += span_notice("Alt-click [src] to [state_open ? "close" : "open"] it.") /obj/machinery/sleeper/process() - use_power(idle_power_usage) + use_energy(idle_power_usage) /obj/machinery/sleeper/nap_violation(mob/violator) . = ..() diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index b7eec3994b8..842f01ae754 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -238,8 +238,10 @@ //WARNING: no sanity checking for user since it's not needed and would complicate things (machine should still spin even if user is gone), be wary of this if you're changing this code. /obj/machinery/computer/slot_machine/proc/do_spin() + if(!use_energy(active_power_usage, force = FALSE)) + say("Not enough energy!") + return randomize_reels() - use_power(active_power_usage) /obj/machinery/computer/slot_machine/proc/finish_spinning(spin_loop, mob/user, the_name) toggle_reel_spin(0, REEL_DEACTIVATE_DELAY) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 844abeabf2f..b8afa4d57d4 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -2,6 +2,7 @@ #define HEATER_MODE_HEAT "heat" #define HEATER_MODE_COOL "cool" #define HEATER_MODE_AUTO "auto" +#define BASE_HEATING_ENERGY (40 KILO JOULES) /obj/machinery/space_heater anchored = FALSE @@ -28,9 +29,9 @@ ///The temperature we trying to get to var/target_temperature = T20C ///How much heat/cold we can deliver - var/heating_power = 40000 + var/heating_energy = 40 KILO JOULES ///How efficiently we can deliver that heat/cold (higher indicates less cell consumption) - var/efficiency = 20000 + var/efficiency = 20 ///The amount of degrees above and below the target temperature for us to change mode to heater or cooler var/temperature_tolerance = 1 ///What's the middle point of our settable temperature (30 °C) @@ -93,11 +94,18 @@ if(cell) . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." else - . += "There is no power cell installed." + . += span_warning("There is no power cell installed.") if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Temperature range at [settable_temperature_range]°C.
Heating power at [siunit(heating_power, "W", 1)].
Power consumption at [(efficiency*-0.0025)+150]%.") //100%, 75%, 50%, 25% + . += heating_examine() . += span_notice("Right-click to toggle [on ? "off" : "on"].") +///Returns the heating power of this machine as an examine +/obj/machinery/space_heater/proc/heating_examine() + var/target_temp = round(target_temperature - T0C, 1) + var/min_temp = max(settable_temperature_median - settable_temperature_range, TCMB) - T0C + var/max_temp = settable_temperature_median + settable_temperature_range - T0C + return span_notice("The status display reads:
Heating power: [display_power(heating_energy, convert = TRUE, scheduler = SSair)] at [(efficiency / 20) * 100]% efficiency.
Target temperature: [target_temp]°C [min_temp]°C - [max_temp]°C]\n") + /obj/machinery/space_heater/update_icon_state() . = ..() icon_state = "[base_icon_state]-[on ? mode : "off"]" @@ -112,14 +120,10 @@ return ..() /obj/machinery/space_heater/process_atmos() - if(!on || !is_operational) + if(!on || !is_operational || QDELETED(cell) || cell.charge <= 1) if (on) // If it's broken, turn it off too on = FALSE - return PROCESS_KILL - - if(!cell || cell.charge <= 1) - on = FALSE - update_appearance() + update_appearance() return PROCESS_KILL var/turf/local_turf = loc @@ -144,22 +148,23 @@ if(mode == HEATER_MODE_STANDBY) return - var/heat_capacity = enviroment.heat_capacity() - var/required_energy = abs(enviroment.temperature - target_temperature) * heat_capacity - required_energy = min(required_energy, heating_power) - + var/list/turfs = (local_turf.atmos_adjacent_turfs || list()) + local_turf + var/required_energy = abs(enviroment.temperature - target_temperature) * enviroment.heat_capacity() + required_energy = min(required_energy, heating_energy, (cell.charge * efficiency) / length(turfs)) if(required_energy < 1) return - var/delta_temperature = required_energy / heat_capacity + var/delta_energy = required_energy if(mode == HEATER_MODE_COOL) - delta_temperature *= -1 - if(delta_temperature) - for (var/turf/open/turf in ((local_turf.atmos_adjacent_turfs || list()) + local_turf)) - var/datum/gas_mixture/turf_gasmix = turf.return_air() - turf_gasmix.temperature += delta_temperature - air_update_turf(FALSE, FALSE) - cell.use(required_energy / efficiency) + delta_energy *= -1 + if(delta_energy == 0) + return + + for(var/turf/open/turf in turfs) + var/datum/gas_mixture/turf_gasmix = turf.return_air() + turf_gasmix.temperature += delta_energy / turf_gasmix.heat_capacity() + air_update_turf(FALSE, FALSE) + cell.use((required_energy * length(turfs)) / efficiency, force = TRUE) /obj/machinery/space_heater/RefreshParts() . = ..() @@ -170,10 +175,10 @@ for(var/datum/stock_part/capacitor/capacitor in component_parts) cap += capacitor.tier - heating_power = laser * 40000 + heating_energy = laser * BASE_HEATING_ENERGY settable_temperature_range = cap * 30 - efficiency = (cap + 1) * 10000 + efficiency = (cap + 1) * 10 target_temperature = clamp(target_temperature, max(settable_temperature_median - settable_temperature_range, TCMB), @@ -313,38 +318,52 @@ . = ..() QDEL_NULL(beaker) +/obj/machinery/space_heater/improvised_chem_heater/heating_examine() + . = ..() + + var/power_mod = 0.1 * chem_heating_power + if(set_mode == HEATER_MODE_AUTO) + power_mod *= 0.5 + . += span_notice("Heating power for beaker: [display_power(heating_energy * power_mod, convert = TRUE)]") + +/obj/machinery/space_heater/improvised_chem_heater/toggle_power(user) + . = ..() + if(on) + begin_processing() + /obj/machinery/space_heater/improvised_chem_heater/process(seconds_per_tick) - if(!on) - update_appearance() + if(!on || !is_operational || QDELETED(cell) || cell.charge <= 1 || QDELETED(beaker)) + if (on) // If it's broken, turn it off too + on = FALSE + update_appearance() return PROCESS_KILL - if(!is_operational || !cell || cell.charge <= 0) - on = FALSE - update_appearance() - return PROCESS_KILL - - if(!beaker)//No beaker to heat - update_appearance() - return - if(beaker.reagents.total_volume) var/power_mod = 0.1 * chem_heating_power switch(set_mode) if(HEATER_MODE_AUTO) power_mod *= 0.5 - beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) - beaker.reagents.handle_reactions() if(HEATER_MODE_HEAT) if(target_temperature < beaker.reagents.chem_temp) return - beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) if(HEATER_MODE_COOL) if(target_temperature > beaker.reagents.chem_temp) return - beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) - var/required_energy = heating_power * seconds_per_tick * (power_mod * 4) - cell.use(required_energy / efficiency) + + var/required_energy = abs(target_temperature - beaker.reagents.chem_temp) * power_mod * seconds_per_tick * beaker.reagents.heat_capacity() + required_energy = min(required_energy, heating_energy, cell.charge * efficiency) + if(required_energy < 1) + return + + var/delta_energy = required_energy + if(mode == HEATER_MODE_COOL) + delta_energy *= -1 + if(delta_energy == 0) + return + + beaker.reagents.adjust_thermal_energy(delta_energy) beaker.reagents.handle_reactions() + cell.use(required_energy / efficiency, force = TRUE) update_appearance() /obj/machinery/space_heater/improvised_chem_heater/ui_data() @@ -395,7 +414,6 @@ item.afterattack(beaker, user, 1) return - /obj/machinery/space_heater/improvised_chem_heater/on_deconstruction(disassembled = TRUE) . = ..() if(disassembled) @@ -450,18 +468,19 @@ for(var/datum/stock_part/capacitor/capacitor in component_parts) capacitors_rating += capacitor.tier - heating_power = lasers_rating * 20000 + heating_energy = lasers_rating * 20000 settable_temperature_range = capacitors_rating * 50 //-20 - 80 at base - efficiency = (capacitors_rating + 1) * 10000 + efficiency = (capacitors_rating + 1) * 10 target_temperature = clamp(target_temperature, max(settable_temperature_median - settable_temperature_range, TCMB), settable_temperature_median + settable_temperature_range) - chem_heating_power = efficiency/20000 //1-2.5 + chem_heating_power = efficiency / 20 #undef HEATER_MODE_STANDBY #undef HEATER_MODE_HEAT #undef HEATER_MODE_COOL #undef HEATER_MODE_AUTO +#undef BASE_HEATING_ENERGY diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index b34f7873648..d95668975f5 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -53,11 +53,11 @@ /// Cooldown for occupant breakout messages via relaymove() var/message_cooldown /// How long it takes to break out of the SSU. - var/breakout_time = 300 + var/breakout_time = 30 SECONDS /// Power contributed by this machine to charge the mod suits cell without any capacitors - var/base_charge_rate = 200 + var/base_charge_rate = 200 KILO WATTS /// Final charge rate which is base_charge_rate + contribution by capacitors - var/final_charge_rate = 250 + var/final_charge_rate = 250 KILO WATTS /// is the card reader installed in this machine var/card_reader_installed = FALSE /// physical reference of the players id card to check for PERSONAL access level @@ -287,7 +287,7 @@ . = ..() for(var/datum/stock_part/capacitor/capacitor in component_parts) - final_charge_rate = base_charge_rate + (capacitor.tier * 50) + final_charge_rate = base_charge_rate + (capacitor.tier * 50 KILO WATTS) set_access() @@ -375,7 +375,7 @@ src, choices, custom_check = CALLBACK(src, PROC_REF(check_interactable), user), - require_near = !issilicon(user), + require_near = !HAS_SILICON_ACCESS(user), autopick_single_option = FALSE ) @@ -468,7 +468,7 @@ else target.visible_message(span_warning("[user] starts shoving [target] into [src]!"), span_userdanger("[user] starts shoving you into [src]!")) - if(do_after(user, 30, target)) + if(do_after(user, 3 SECONDS, target)) if(occupant || helmet || suit || storage) return if(target == user) @@ -501,7 +501,7 @@ if(iscarbon(mob_occupant) && mob_occupant.stat < UNCONSCIOUS) //Awake, organic and screaming mob_occupant.emote("scream") - addtimer(CALLBACK(src, PROC_REF(cook)), 50) + addtimer(CALLBACK(src, PROC_REF(cook)), 5 SECONDS) else uv_cycles = initial(uv_cycles) uv = FALSE @@ -553,17 +553,21 @@ dump_inventory_contents() /obj/machinery/suit_storage_unit/process(seconds_per_tick) - var/obj/item/stock_parts/cell/cell - if(suit && istype(suit)) - cell = suit.cell - if(mod) - cell = mod.get_cell() - if(!cell || cell.charge == cell.maxcharge) + var/list/cells_to_charge = list() + for(var/obj/item/charging in list(mod, suit, helmet, mask, storage)) + var/obj/item/stock_parts/cell/cell_charging = charging.get_cell() + if(!istype(cell_charging) || cell_charging.charge == cell_charging.maxcharge) + continue + + cells_to_charge += cell_charging + + var/cell_count = length(cells_to_charge) + if(cell_count <= 0) return - var/cell_charged = cell.give(final_charge_rate * seconds_per_tick) - if(cell_charged) - use_power((active_power_usage + final_charge_rate) * seconds_per_tick) + var/charge_per_item = (final_charge_rate * seconds_per_tick) / cell_count + for(var/obj/item/stock_parts/cell/cell as anything in cells_to_charge) + charge_cell(charge_per_item, cell, grid_only = TRUE) /obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) if(!prob(prb)) @@ -604,7 +608,7 @@ if(locked) visible_message(span_notice("You see [user] kicking against the doors of [src]!"), \ span_notice("You start kicking against the doors...")) - addtimer(CALLBACK(src, PROC_REF(resist_open), user), 300) + addtimer(CALLBACK(src, PROC_REF(resist_open), user), 30 SECONDS) else open_machine() dump_inventory_contents() @@ -790,21 +794,21 @@ causes the SSU to break due to state_open being set to TRUE at the end, and the panel becoming inaccessible. */ /obj/machinery/suit_storage_unit/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) - if(!(obj_flags & NO_DECONSTRUCTION) && screwdriver.tool_behaviour == TOOL_SCREWDRIVER && (uv || locked)) + if(screwdriver.tool_behaviour == TOOL_SCREWDRIVER && (uv || locked)) to_chat(user, span_warning("You cant open the panel while its [locked ? "locked" : "decontaminating"]")) return TRUE return ..() /obj/machinery/suit_storage_unit/default_pry_open(obj/item/crowbar)//needs to check if the storage is locked. - . = !(state_open || panel_open || is_operational || locked || (obj_flags & NO_DECONSTRUCTION)) && crowbar.tool_behaviour == TOOL_CROWBAR + . = !(state_open || panel_open || is_operational || locked) && crowbar.tool_behaviour == TOOL_CROWBAR if(.) crowbar.play_tool_sound(src, 50) visible_message(span_notice("[usr] pries open \the [src]."), span_notice("You pry open \the [src].")) open_machine() /obj/machinery/suit_storage_unit/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct) - . = (!locked && panel_open && !(obj_flags & NO_DECONSTRUCTION) && crowbar.tool_behaviour == TOOL_CROWBAR) + . = (!locked && panel_open && crowbar.tool_behaviour == TOOL_CROWBAR) if(.) return ..() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index ebe24b44974..693668e9e89 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -484,7 +484,7 @@ chem_splash(get_turf(src), reagents, spread_range, list(reactants), temp_boost) // Detonate it again in one second, until it's out of juice. - addtimer(CALLBACK(src, PROC_REF(detonate)), 10) + addtimer(CALLBACK(src, PROC_REF(detonate)), 1 SECONDS) // If it's not a time release bomb, do normal explosion diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index e202a508ecf..25b5ddd2127 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -70,7 +70,7 @@ race = "Humanoid" // NT knows a lot about slimes, but not aliens. Can identify slimes - else if(ispath(mobtype, /mob/living/simple_animal/slime)) + else if(ispath(mobtype, /mob/living/basic/slime)) race = "Slime" // sometimes M gets deleted prematurely for AIs... just check the job diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 3fb86271699..5086f7e91a7 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -88,7 +88,7 @@ return var/mob/living/current_user = usr - if(!issilicon(current_user)) + if(!HAS_SILICON_ACCESS(current_user)) if(!istype(current_user.get_active_held_item(), /obj/item/multitool)) return @@ -248,7 +248,7 @@ /obj/machinery/telecomms/proc/get_multitool(mob/user) var/obj/item/multitool/multitool = null // Let's double check - if(!issilicon(user) && istype(user.get_active_held_item(), /obj/item/multitool)) + if(!HAS_SILICON_ACCESS(user) && istype(user.get_active_held_item(), /obj/item/multitool)) multitool = user.get_active_held_item() else if(isAI(user)) var/mob/living/silicon/ai/U = user @@ -259,6 +259,6 @@ return multitool /obj/machinery/telecomms/proc/canAccess(mob/user) - if(issilicon(user) || in_range(user, src)) + if(HAS_SILICON_ACCESS(user) || in_range(user, src)) return TRUE return FALSE diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index f8a6b66c049..f159339193e 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -22,6 +22,12 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION +/obj/machinery/telecomms/allinone/indestructible/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) + return NONE + +/obj/machinery/telecomms/allinone/indestructible/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct) + return NONE + /obj/machinery/telecomms/allinone/receive_signal(datum/signal/subspace/signal) if(!istype(signal) || signal.transmission_method != TRANSMISSION_SUBSPACE) // receives on subspace only return diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm index a3b4caecf39..1ad464b3b68 100644 --- a/code/game/machinery/telecomms/machines/broadcaster.dm +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -56,7 +56,7 @@ GLOBAL_VAR_INIT(message_delay, FALSE) /* --- Do a snazzy animation! --- */ flick("broadcaster_send", src) - use_power(idle_power_usage) + use_energy(idle_power_usage) /** * Simply resets the message delay and the recent messages list, to ensure that diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm index 8ac8297b612..15d20b3d1eb 100644 --- a/code/game/machinery/telecomms/machines/bus.dm +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -47,7 +47,7 @@ if(relay_information(signal, send)) break - use_power(idle_power_usage) + use_energy(idle_power_usage) // Preset Buses diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm index 094180a6e70..83d0f6e3209 100644 --- a/code/game/machinery/telecomms/machines/hub.dm +++ b/code/game/machinery/telecomms/machines/hub.dm @@ -31,7 +31,7 @@ // Then broadcast that signal to relay_information(signal, /obj/machinery/telecomms/broadcaster) - use_power(idle_power_usage) + use_energy(idle_power_usage) /obj/machinery/telecomms/hub/update_power() var/old_on = on diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index ff3064e73c7..8d6f8c85f43 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -30,7 +30,7 @@ if(!relay_information(signal_copy, /obj/machinery/telecomms/hub)) relay_information(signal_copy, /obj/machinery/telecomms/bus) - use_power(idle_power_usage) + use_energy(idle_power_usage) /** * Checks whether the signal can be received by this receiver or not, based on diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 2173a519be4..504702e3176 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -32,7 +32,7 @@ else signal.levels |= SSmapping.get_connected_levels(relay_turf) - use_power(idle_power_usage) + use_energy(idle_power_usage) /** * Checks to see if the relay can send/receive the signal, by checking if it's diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index fedcf519ff2..0c87a6101d1 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -61,7 +61,7 @@ if(!can_send) relay_information(signal, /obj/machinery/telecomms/broadcaster) - use_power(idle_power_usage) + use_energy(idle_power_usage) #undef MAX_LOG_ENTRIES diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 8b6601dd471..00e27ec23a4 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -75,7 +75,7 @@ return if (ismovable(M)) if(do_teleport(M, target, channel = TELEPORT_CHANNEL_BLUESPACE)) - use_power(active_power_usage) + use_energy(active_power_usage) if(!calibrated && prob(30 - ((accuracy) * 10))) //oh dear a problem if(ishuman(M))//don't remove people from the round randomly you jerks var/mob/living/carbon/human/human = M @@ -216,7 +216,7 @@ to_chat(user, span_alert("The teleporter hub isn't responding.")) else engaged = !engaged - use_power(active_power_usage) + use_energy(active_power_usage) to_chat(user, span_notice("Teleporter [engaged ? "" : "dis"]engaged!")) else teleporter_console.target_ref = null diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index d60cc70a451..ecb7ef941aa 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -20,7 +20,7 @@ /// How long until the next mob can be processed var/cooldown_timer /// The created cyborg's cell chage - var/robot_cell_charge = 5000 + var/robot_cell_charge = STANDARD_CELL_CHARGE * 5 /// The visual countdown effect var/obj/effect/countdown/transformer/countdown /// Who the master AI is that created this factory @@ -99,7 +99,7 @@ // Sleep for a couple of ticks to allow the human to see the pain sleep(0.5 SECONDS) - use_power(active_power_usage) // Use a lot of power. + use_energy(active_power_usage) // Use a lot of power. var/mob/living/silicon/robot/new_borg = victim.Robotize() new_borg.cell = new /obj/item/stock_parts/cell/upgraded/plus(new_borg, robot_cell_charge) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index fd0fea92292..483a1bd563b 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -24,7 +24,8 @@ GLOBAL_LIST_INIT(dye_registry, list( DYE_REDCOAT = /obj/item/clothing/under/costume/redcoat, DYE_PRISONER = /obj/item/clothing/under/rank/prisoner, DYE_SYNDICATE = /obj/item/clothing/under/syndicate, - DYE_CENTCOM = /obj/item/clothing/under/rank/centcom/commander + DYE_CENTCOM = /obj/item/clothing/under/rank/centcom/commander, + DYE_COSMIC = /obj/item/clothing/under/rank/station_trait/human_ai, ), DYE_REGISTRY_JUMPSKIRT = list( DYE_RED = /obj/item/clothing/under/color/jumpskirt/red, @@ -226,7 +227,7 @@ GLOBAL_LIST_INIT(dye_registry, list( qdel(color_source) color_source = null update_appearance() - use_power(active_power_usage) + use_energy(active_power_usage) /obj/item/proc/dye_item(dye_color, dye_key_override) var/dye_key_selector = dye_key_override ? dye_key_override : dying_key diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 2ad1096ac58..e4fc4592b79 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -128,6 +128,7 @@ post_buckle_mob(M) SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force) + SEND_SIGNAL(M, COMSIG_MOB_BUCKLED, src) return TRUE /obj/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) @@ -163,6 +164,7 @@ if(!length(buckled_mobs)) UnregisterSignal(src, COMSIG_MOVABLE_SET_ANCHORED) SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force) + SEND_SIGNAL(buckled_mob, COMSIG_MOB_UNBUCKLED, src) if(can_fall) var/turf/location = buckled_mob.loc diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index c6190a0d84a..6832b07d125 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -338,7 +338,7 @@ name = "Space" icon = 'icons/effects/effects.dmi' icon_state = "blessed" - window_colour = "#000000" + window_colour = COLOR_BLACK material = /datum/material/glass replace_floors = list(/turf/open/floor/fakespace = 1) replace_walls = /turf/closed/wall/rock/porous @@ -362,32 +362,42 @@ /obj/structure/chair = list(/obj/structure/chair/comfy = 1), /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), ) - ///cooldown for changing carpets, It's kinda dull to always use the same one, but we also can't make it too random. + /// Cooldown for changing carpets, It's kinda dull to always use the same one, but we also can't make it too random. COOLDOWN_DECLARE(carpet_switch_cd) + /// List of carpets we can pick from, set up in New + var/list/valid_carpets + /// List of tables we can pick from, set up in New + var/list/valid_tables -#define FANCY_CARPETS list(\ - /turf/open/floor/eighties, \ - /turf/open/floor/eighties/red, \ - /turf/open/floor/carpet/lone/star, \ - /turf/open/floor/carpet/black, \ - /turf/open/floor/carpet/blue, \ - /turf/open/floor/carpet/cyan, \ - /turf/open/floor/carpet/green, \ - /turf/open/floor/carpet/orange, \ - /turf/open/floor/carpet/purple, \ - /turf/open/floor/carpet/red, \ - /turf/open/floor/carpet/royalblack, \ - /turf/open/floor/carpet/royalblue,) +/datum/dimension_theme/fancy/New() + . = ..() + valid_carpets = list( + /turf/open/floor/carpet/black, + /turf/open/floor/carpet/blue, + /turf/open/floor/carpet/cyan, + /turf/open/floor/carpet/green, + /turf/open/floor/carpet/lone/star, + /turf/open/floor/carpet/orange, + /turf/open/floor/carpet/purple, + /turf/open/floor/carpet/red, + /turf/open/floor/carpet/royalblack, + /turf/open/floor/carpet/royalblue, + /turf/open/floor/eighties, + /turf/open/floor/eighties/red, + ) + valid_tables = subtypesof(/obj/structure/table/wood/fancy) + randomize_theme() + +/datum/dimension_theme/fancy/proc/randomize_theme() + replace_floors = list(pick(valid_carpets) = 1) + replace_objs[/obj/structure/table/wood] = list(pick(valid_tables) = 1) /datum/dimension_theme/fancy/apply_theme(turf/affected_turf, skip_sound = FALSE, show_effect = FALSE) if(COOLDOWN_FINISHED(src, carpet_switch_cd)) - replace_floors = list(pick(FANCY_CARPETS) = 1) - replace_objs[/obj/structure/table/wood] = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1) + randomize_theme() COOLDOWN_START(src, carpet_switch_cd, 90 SECONDS) return ..() -#undef FANCY_CARPETS - /datum/dimension_theme/disco name = "Disco" icon = 'icons/obj/lighting.dmi' diff --git a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm index 7a04aaf2435..412cca04952 100644 --- a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm +++ b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm @@ -178,7 +178,7 @@ candidate_list += GLOB.current_observers_list candidate_list += GLOB.dead_player_list - var/list/candidates = SSpolling.poll_candidates("Would you like to participate in a spooky ghost swarm? (Warning: you will not be able to return to your body!)", check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, group = candidate_list, pic_source = src, role_name_text = "ghost swarm") + var/list/candidates = SSpolling.poll_candidates("Would you like to participate in a spooky ghost swarm? (Warning: you will not be able to return to your body!)", check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, group = candidate_list, alert_pic = src, role_name_text = "ghost swarm") for(var/mob/dead/observer/candidate_ghost as anything in candidates) var/mob/living/basic/ghost/swarm/new_ghost = new(get_turf(src)) ghosts_spawned += new_ghost diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm index 87221eeec9f..9cb92a6961d 100644 --- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -32,19 +32,13 @@ tile.atmos_spawn_air("[GAS_O2]=500;[GAS_PLASMA]=500;[TURF_TEMPERATURE(1000)]") //Make it hot and burny for the new slime var/new_colour = pick(/datum/slime_type/red, /datum/slime_type/orange) - var/mob/living/simple_animal/slime/pyro = new(tile, new_colour) - pyro.rabid = TRUE - pyro.amount_grown = SLIME_EVOLUTION_THRESHOLD - pyro.Evolve() - var/datum/action/innate/slime/reproduce/repro_action = new - repro_action.Grant(pyro) + var/mob/living/basic/slime/pyro = new(tile, new_colour, SLIME_LIFE_STAGE_ADULT) + pyro.set_enraged_behaviour() - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a pyroclastic anomaly slime?", check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, target_mob = pyro, ignore_category = POLL_IGNORE_PYROSLIME, pic_source = pyro, role_name_text = "pyroclastic anomaly slime") - if(!LAZYLEN(candidates)) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, checked_target = pyro, ignore_category = POLL_IGNORE_PYROSLIME, alert_pic = pyro, role_name_text = "pyroclastic anomaly slime") + if(isnull(chosen_one)) return - - var/mob/dead/observer/chosen = pick(candidates) - pyro.key = chosen.key + pyro.key = chosen_one.key pyro.mind.special_role = ROLE_PYROCLASTIC_SLIME pyro.mind.add_antag_datum(/datum/antagonist/pyro_slime) pyro.log_message("was made into a slime by pyroclastic anomaly", LOG_GAME) diff --git a/code/game/objects/effects/cursor_catcher.dm b/code/game/objects/effects/cursor_catcher.dm index 3624018afc8..3229cd44b70 100644 --- a/code/game/objects/effects/cursor_catcher.dm +++ b/code/game/objects/effects/cursor_catcher.dm @@ -3,6 +3,7 @@ icon_state = "fullscreen_blocker" // Fullscreen semi transparent icon plane = HUD_PLANE mouse_opacity = MOUSE_OPACITY_ICON + default_click = TRUE /// The mob whose cursor we are tracking. var/mob/owner /// Client view size of the scoping mob. diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 7fe6c59075f..f21bfc47884 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -124,11 +124,28 @@ desc = "You know who to call." light_power = 2 +/obj/effect/decal/cleanable/greenglow/radioactive + name = "radioactive goo" + desc = "Holy crap, stop looking at this and move away immediately! It's radioactive!" + light_power = 5 + light_range = 3 + light_color = LIGHT_COLOR_NUCLEAR + +/obj/effect/decal/cleanable/greenglow/radioactive/Initialize(mapload, list/datum/disease/diseases) + . = ..() + AddComponent( + /datum/component/radioactive_emitter, \ + cooldown_time = 5 SECONDS, \ + range = 4, \ + threshold = RAD_MEDIUM_INSULATION, \ + ) + /obj/effect/decal/cleanable/cobweb name = "cobweb" desc = "Somebody should remove that." gender = NEUTER layer = WALL_OBJ_LAYER + icon = 'icons/effects/web.dmi' icon_state = "cobweb1" resistance_flags = FLAMMABLE beauty = -100 diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index f0db747c2ce..e42ee4d491f 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -9,7 +9,7 @@ flags_1 = ALLOW_DARK_PAINTS_1 var/do_icon_rotate = TRUE var/rotation = 0 - var/paint_colour = "#FFFFFF" + var/paint_colour = COLOR_WHITE /obj/effect/decal/cleanable/crayon/Initialize(mapload, main, type, e_name, graf_rot, alt_icon = null) . = ..() @@ -41,3 +41,29 @@ cost *= 0.5 spraycan.use_charges(user, cost, requires_full = FALSE) return DONT_USE_SPRAYCAN_CHARGES + +///Common crayon decals in map. +/obj/effect/decal/cleanable/crayon/rune4 + icon_state = "rune4" + paint_colour = COLOR_CRAYON_RED + +/obj/effect/decal/cleanable/crayon/rune2 + icon_state = "rune2" + +/obj/effect/decal/cleanable/crayon/x + icon_state = "x" + name = "graffiti" + paint_colour = COLOR_CRAYON_ORANGE + +/obj/effect/decal/cleanable/crayon/l + icon_state = "l" + +/obj/effect/decal/cleanable/crayon/i + icon_state = "i" + +/obj/effect/decal/cleanable/crayon/e + icon_state = "e" + +/obj/effect/decal/cleanable/crayon/i/orange + name = "graffiti" + paint_colour = COLOR_CRAYON_ORANGE diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm index 237ea9eb4ff..3aeb1c4f38f 100644 --- a/code/game/objects/effects/decals/turfdecal/markings.dm +++ b/code/game/objects/effects/decals/turfdecal/markings.dm @@ -354,7 +354,7 @@ icon_state = "siding_thinplating_end" /obj/effect/turf_decal/siding/thinplating/light - color = "#FFFFFF" + color = COLOR_WHITE /obj/effect/turf_decal/siding/thinplating/light/corner icon_state = "siding_thinplating_corner" @@ -393,7 +393,7 @@ icon_state = "siding_wideplating_end" /obj/effect/turf_decal/siding/wideplating/light - color = "#FFFFFF" + color = COLOR_WHITE /obj/effect/turf_decal/siding/wideplating/light/corner icon_state = "siding_wideplating_corner" diff --git a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm index ec307a87d98..6e5173790b2 100644 --- a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm +++ b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm @@ -140,7 +140,7 @@ TILE_DECAL_SUBTYPE_HELPER(/obj/effect/turf_decal/tile/dark) /// Date-specific tiles /obj/effect/turf_decal/tile/holiday name = "ERROR tile decal" - color = "#FF0000" + color = COLOR_RED /obj/effect/turf_decal/tile/holiday/Initialize(mapload) color = request_holiday_colors(src, pattern) @@ -241,6 +241,9 @@ TILE_DECAL_SUBTYPE_HELPER(/obj/effect/turf_decal/tile/holiday/random) ##path/filled/warning {\ icon_state = "trimline_warn_fill";\ }\ +##path/filled/warning/corner {\ + icon_state = "trimline_corner_warn_fill";\ +}\ ##path/filled/mid_joiner {\ icon_state = "trimline_mid_fill";\ }\ @@ -254,7 +257,7 @@ TILE_DECAL_SUBTYPE_HELPER(/obj/effect/turf_decal/tile/holiday/random) /// White trimlines /obj/effect/turf_decal/trimline/white - color = "#FFFFFF" + color = COLOR_WHITE TRIMLINE_SUBTYPE_HELPER(/obj/effect/turf_decal/trimline/white) diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index 231feb2ec3d..32be64c9353 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -63,4 +63,4 @@ /datum/effect_system/explosion/smoke/start() ..() - addtimer(CALLBACK(src, PROC_REF(create_smoke)), 5) + addtimer(CALLBACK(src, PROC_REF(create_smoke)), 0.5 SECONDS) diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index c3fad6d26b6..874c53fa83c 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -17,8 +17,8 @@ icon_state = "sparks" anchored = TRUE light_system = OVERLAY_LIGHT - light_range = 2 - light_power = 0.5 + light_range = 1.5 + light_power = 0.8 light_color = LIGHT_COLOR_FIRE /obj/effect/particle_effect/sparks/Initialize(mapload) diff --git a/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm b/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm index 5ce9fe02bd4..8d1eea88213 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm @@ -154,7 +154,7 @@ blame_msg = " with no known fingerprints" else source_msg = "with no known source" - - if(!istype(holder, /obj/machinery/plumbing)) //excludes standard plumbing equipment from spamming admins with this shit + var/area/fluid_area = get_area(location) + if(!istype(holder, /obj/machinery/plumbing) && !(fluid_area.area_flags & QUIET_LOGS)) //excludes standard plumbing equipment as well as deathmatch from spamming admins with this shit message_admins("\A [flood] flood started at [ADMIN_VERBOSEJMP(location)] [source_msg][blame_msg].") log_game("\A [flood] flood started at [location || "nonexistant location"] [holder ? "from [holder] last touched by [holder || "N/A"]" : "with no known source"].") diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index efb5b1fbb91..6d968574c68 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -416,6 +416,12 @@ alpha = 120 max_integrity = 10 pass_flags_self = PASSGLASS + var/static/list/ignored_gases = typecacheof(list( + /datum/gas/nitrogen, + /datum/gas/oxygen, + /datum/gas/pluoxium, + /datum/gas/halon, + )) /obj/structure/foamedmetal/resin/Initialize(mapload) . = ..() @@ -424,6 +430,7 @@ return location.ClearWet() + location.temperature = T20C if(location.air) var/datum/gas_mixture/air = location.air air.temperature = T20C @@ -432,11 +439,8 @@ var/list/gases = air.gases for(var/gas_type in gases) - switch(gas_type) - if(/datum/gas/oxygen, /datum/gas/nitrogen) - continue - else - gases[gas_type][MOLES] = 0 + if(!(ignored_gases[gas_type])) + gases[gas_type][MOLES] = 0 air.garbage_collect() for(var/obj/machinery/atmospherics/components/unary/comp in location) @@ -450,6 +454,22 @@ for(var/obj/item/potential_tinder in location) potential_tinder.extinguish() +/datum/effect_system/fluid_spread/foam/metal/resin/halon + effect_type = /obj/effect/particle_effect/fluid/foam/metal/resin/halon + +/// A variant of resin foam that is created from halon combustion. It does not dissolve in heat to allow the gas to spread before foaming. +/obj/effect/particle_effect/fluid/foam/metal/resin/halon + +/obj/effect/particle_effect/fluid/foam/metal/resin/halon/Initialize(mapload) + . = ..() + RemoveElement(/datum/element/atmos_sensitive) // Doesn't dissolve in heat. + +/obj/effect/particle_effect/fluid/foam/metal/resin/halon/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return FALSE // Doesn't dissolve in heat. + +/obj/effect/particle_effect/fluid/foam/metal/resin/halon/atmos_expose(datum/gas_mixture/air, exposed_temperature) + return // Doesn't dissolve in heat. + /datum/effect_system/fluid_spread/foam/dirty effect_type = /obj/effect/particle_effect/fluid/foam/dirty 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 2d524e19042..e651c8a3e24 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 @@ -235,7 +235,7 @@ /// Green smoke that makes you cough. /obj/effect/particle_effect/fluid/smoke/bad/green name = "green smoke" - color = "#00FF00" + color = COLOR_VIBRANT_LIME opacity = FALSE /// A factory which produces green smoke that makes you cough. @@ -431,17 +431,18 @@ contained_reagents += "[reagent.volume]u [reagent]" var/where = "[AREACOORD(location)]" - var/contained = length(contained_reagents) ? "[contained_reagents.Join(", ", " \[", "\]")] @ [chemholder.chem_temp]K" : null + var/contained = length(contained_reagents) ? "\[[contained_reagents.Join(", ")]\] @ [chemholder.chem_temp]K" : null + var/area/fluid_area = get_area(location) if(carry.my_atom?.fingerprintslast) //Some reagents don't have a my_atom in some cases var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) var/more = "" if(M) more = "[ADMIN_LOOKUPFLW(M)] " - if(!istype(carry.my_atom, /obj/machinery/plumbing)) + if(!istype(carry.my_atom, /obj/machinery/plumbing) && !(fluid_area.area_flags & QUIET_LOGS)) // I like to be able to see my logs thank you message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. Key: [more ? more : carry.my_atom.fingerprintslast].") log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last touched by [carry.my_atom.fingerprintslast].") else - if(!istype(carry.my_atom, /obj/machinery/plumbing)) + if(!istype(carry.my_atom, /obj/machinery/plumbing) && !(fluid_area.area_flags & QUIET_LOGS)) // Deathmatch has way too much smoke to log message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. No associated key.") log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 377c8470480..0c050579de4 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -48,6 +48,7 @@ ///The abstract effect ignores even more effects and is often typechecked for atoms that should truly not be fucked with. /obj/effect/abstract + resistance_flags = parent_type::resistance_flags | SHUTTLE_CRUSH_PROOF /obj/effect/abstract/singularity_pull() return diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 5d591738ec9..cf1257308d9 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -107,3 +107,6 @@ /obj/effect/forcefield/cosmic_field/fast initial_duration = 5 SECONDS + +/obj/effect/forcefield/cosmic_field/extrafast + initial_duration = 2.5 SECONDS diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index f6151a3cbf6..0ac4188328f 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -36,7 +36,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) /obj/effect/landmark/start/proc/after_round_start() // We'd like to keep these around for unit tests, so we can check that they exist. -#ifndef UNIT_TESTS +#if !defined(UNIT_TESTS) && !defined(MAP_TEST) if(delete_after_roundstart) qdel(src) #endif @@ -298,6 +298,16 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) GLOB.nukeop_leader_start += loc return INITIALIZE_HINT_QDEL +/obj/effect/landmark/start/nukeop_overwatch + name = "nukeop overwatch" + icon = 'icons/effects/landmarks_static.dmi' + icon_state = "snukeop_leader_spawn" + +/obj/effect/landmark/start/nukeop_overwatch/Initialize(mapload) + ..() + GLOB.nukeop_overwatch_start += loc + return INITIALIZE_HINT_QDEL + // Must be immediate because players will // join before SSatom initializes everything. INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) diff --git a/code/game/objects/effects/lighting.dm b/code/game/objects/effects/lighting.dm index 1de9fad39ee..caeedbd22bb 100644 --- a/code/game/objects/effects/lighting.dm +++ b/code/game/objects/effects/lighting.dm @@ -37,6 +37,7 @@ name = "mob fire lighting" light_color = LIGHT_COLOR_FIRE light_range = LIGHT_RANGE_FIRE + light_power = 2 /obj/effect/dummy/lighting_obj/moblight/species name = "species lighting" diff --git a/code/game/objects/effects/material_insert.dm b/code/game/objects/effects/material_insert.dm new file mode 100644 index 00000000000..9ca86226b24 --- /dev/null +++ b/code/game/objects/effects/material_insert.dm @@ -0,0 +1,22 @@ +/** + * Creates a mutable appearance with the material color applied for its insertion animation into an autolathe or techfab + * Arguments + * + * * color - the material color that will be applied + */ +/proc/material_insertion_animation(color) + RETURN_TYPE(/mutable_appearance) + + var/static/list/mutable_appearance/apps = list() + + var/mutable_appearance/cached_app = apps[color] + if(isnull(cached_app)) + var/icon/modified_icon = icon('icons/obj/machines/research.dmi', "material_insertion") + + //assuming most of the icon is white we find what ratio to scale the intensity of each part roughly + var/list/rgb_list = rgb2num(color) + modified_icon.SetIntensity(rgb_list[1] / 255, rgb_list[2] / 255, rgb_list[3] / 255) + cached_app = mutable_appearance(modified_icon, "material_insertion") + + apps[color] = cached_app + return cached_app diff --git a/code/game/objects/effects/particles/smoke.dm b/code/game/objects/effects/particles/smoke.dm index 4f31ffc0869..b41b4eb1d96 100644 --- a/code/game/objects/effects/particles/smoke.dm +++ b/code/game/objects/effects/particles/smoke.dm @@ -46,3 +46,16 @@ fadein = 0.7 SECONDS position = generator(GEN_VECTOR, list(-3, 5, 0), list(3, 6.5, 0), NORMAL_RAND) velocity = generator(GEN_VECTOR, list(-0.1, 0.4, 0), list(0.1, 0.5, 0), NORMAL_RAND) + +/particles/fog + icon = 'icons/effects/particles/smoke.dmi' + icon_state = list("chill_1" = 2, "chill_2" = 2, "chill_3" = 1) + +/particles/fog/breath + count = 1 + spawning = 1 + lifespan = 1 SECONDS + fade = 0.5 SECONDS + grow = 0.05 + spin = 2 + color = "#fcffff77" diff --git a/code/game/objects/effects/posters/contraband.dm b/code/game/objects/effects/posters/contraband.dm index 2bb2fcce50e..52528c251b6 100644 --- a/code/game/objects/effects/posters/contraband.dm +++ b/code/game/objects/effects/posters/contraband.dm @@ -625,3 +625,35 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/blood_geometer icon_state = "singletank_bomb" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/singletank_bomb, 32) + +///a special poster meant to fool people into thinking this is a bombable wall at a glance. +/obj/structure/sign/poster/contraband/fake_bombable + name = "fake bombable poster" + desc = "We do a little trolling." + icon_state = "fake_bombable" + never_random = TRUE + +/obj/structure/sign/poster/contraband/fake_bombable/Initialize(mapload) + . = ..() + var/turf/our_wall = get_turf_pixel(src) + name = our_wall.name + +/obj/structure/sign/poster/contraband/fake_bombable/examine(mob/user) + var/turf/our_wall = get_turf_pixel(src) + . = our_wall.examine(user) + . += span_notice("It seems to be slightly cracked...") + +/obj/structure/sign/poster/contraband/fake_bombable/ex_act(severity, target) + addtimer(CALLBACK(src, PROC_REF(fall_off_wall)), 2.5 SECONDS) + return FALSE + +/obj/structure/sign/poster/contraband/fake_bombable/proc/fall_off_wall() + if(QDELETED(src) || !isturf(loc)) + return + var/turf/our_wall = get_turf_pixel(src) + our_wall.balloon_alert_to_viewers("it was a ruse!") + roll_and_drop(loc) + playsound(loc, 'sound/items/handling/paper_drop.ogg', 50, TRUE) + + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/fake_bombable, 32) diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index 75a3a26ce26..c4703d700c4 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -180,7 +180,7 @@ 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) + roll_and_drop(Adjacent(user) ? get_turf(user) : loc, user) /obj/structure/sign/poster/attack_hand(mob/user, list/modifiers) . = ..() @@ -207,11 +207,12 @@ return FALSE return !user.gloves || !(user.gloves.body_parts_covered & HANDS) || HAS_TRAIT(user, TRAIT_FINGERPRINT_PASSTHROUGH) || HAS_TRAIT(user.gloves, TRAIT_FINGERPRINT_PASSTHROUGH) -/obj/structure/sign/poster/proc/roll_and_drop(atom/location) +/obj/structure/sign/poster/proc/roll_and_drop(atom/location, mob/user) pixel_x = 0 pixel_y = 0 var/obj/item/poster/rolled_poster = new poster_item_type(location, src) // /obj/structure/sign/poster/wanted/roll_and_drop() has some snowflake handling due to icon memes, if you make a major change to this, don't forget to update it too. <3 - forceMove(rolled_poster) + if(!user?.put_in_hands(rolled_poster)) + forceMove(rolled_poster) return rolled_poster //separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() @@ -246,7 +247,7 @@ 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) + placed_poster.roll_and_drop(user_drop_location, user) return placed_poster.on_placed_poster(user) diff --git a/code/game/objects/effects/spawners/costume.dm b/code/game/objects/effects/spawners/costume.dm index 68f189587b8..6eb3f801f73 100644 --- a/code/game/objects/effects/spawners/costume.dm +++ b/code/game/objects/effects/spawners/costume.dm @@ -2,7 +2,7 @@ name = "costume spawner" icon = 'icons/hud/screen_gen.dmi' icon_state = "x2" - color = "#00FF00" + color = COLOR_VIBRANT_LIME var/list/items diff --git a/code/game/objects/effects/spawners/random/ai_module.dm b/code/game/objects/effects/spawners/random/ai_module.dm index 1ca7a05f2e9..b63efa178e2 100644 --- a/code/game/objects/effects/spawners/random/ai_module.dm +++ b/code/game/objects/effects/spawners/random/ai_module.dm @@ -40,6 +40,7 @@ /obj/item/ai_module/remove, /obj/item/ai_module/core/full/dagothbot, // SKYRAT EDIT - EDITION /obj/item/ai_module/core/full/texas, // SKYRAT EDIT - EDITION + /obj/item/ai_module/core/full/emperor, // SKYRAT EDIT - EDITION ) /obj/effect/spawner/random/aimodule/harmful diff --git a/code/game/objects/effects/spawners/random/contraband.dm b/code/game/objects/effects/spawners/random/contraband.dm index ca5acbdbe67..e65a73cfe4c 100644 --- a/code/game/objects/effects/spawners/random/contraband.dm +++ b/code/game/objects/effects/spawners/random/contraband.dm @@ -21,22 +21,20 @@ /obj/item/storage/fancy/cigarettes/cigpack_syndicate = 10, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 10, /obj/item/storage/box/donkpockets = 10, + /obj/effect/spawner/random/contraband/plus = 10, /obj/item/reagent_containers/pill/maintenance = 5, - /obj/effect/spawner/random/contraband/plus = 5, ) /obj/effect/spawner/random/contraband/plus name = "contraband loot spawner plus" desc = "Where'd ya find this?" loot = list( - /obj/effect/spawner/random/contraband/prison = 40, /obj/item/clothing/under/syndicate = 20, /obj/item/reagent_containers/cup/bottle/thermite = 20, - /obj/item/reagent_containers/pill/maintenance = 10, /obj/item/restraints/legcuffs/beartrap = 10, - /obj/effect/spawner/random/contraband/narcotics = 10, - /obj/item/seeds/kronkus = 5, - /obj/item/seeds/odious_puffball = 5, + /obj/item/food/drug/saturnx = 5, + /obj/item/reagent_containers/cup/blastoff_ampoule = 5, + /obj/item/food/drug/moon_rock = 5, /obj/item/grenade/empgrenade = 5, /obj/effect/spawner/random/contraband/armory = 1, ) diff --git a/code/game/objects/effects/spawners/random/random.dm b/code/game/objects/effects/spawners/random/random.dm index 12f2f12fb78..2c98ba72a4e 100644 --- a/code/game/objects/effects/spawners/random/random.dm +++ b/code/game/objects/effects/spawners/random/random.dm @@ -94,19 +94,30 @@ /obj/effect/spawner/random/proc/make_item(spawn_loc, type_path_to_make) return new type_path_to_make(spawn_loc) -///If the spawner has a spawn_scatter_radius set, this creates a list of nearby turfs available +///If the spawner has a spawn_scatter_radius set, this creates a list of nearby turfs available that are in view and have an unblocked line to them. /obj/effect/spawner/random/proc/get_spawn_locations(radius) var/list/scatter_locations = list() - if(radius >= 0) - for(var/turf/turf_in_view in view(radius, get_turf(src))) - //if(isclosedturf(turf_in_view) || (isgroundlessturf(turf_in_view) && !GET_TURF_BELOW(turf_in_view))) BUBBERSTATION CHANGE: REMOVES BAD CODE THAT SPAWNED THINGS IN OPENTURFS. - if(isclosedturf(turf_in_view) || isgroundlessturf(turf_in_view)) //BUBBERSTATION CHANGE: ADDS GOOD CODE. - continue - scatter_locations += turf_in_view + if(!radius) + return scatter_locations + + for(var/turf/turf_in_view in view(radius, get_turf(src))) + if(isclosedturf(turf_in_view) || (isgroundlessturf(turf_in_view) && !GET_TURF_BELOW(turf_in_view))) + continue + if(!has_unblocked_line(turf_in_view)) + continue + + scatter_locations += turf_in_view return scatter_locations +/obj/effect/spawner/random/proc/has_unblocked_line(destination) + for(var/turf/potential_blockage as anything in get_line(get_turf(src), destination)) + if(!potential_blockage.is_blocked_turf(exclude_mobs = TRUE)) + continue + return FALSE + return TRUE + //finds the probabilities of items spawning from a loot spawner's loot pool /obj/item/loot_table_maker icon = 'icons/effects/landmarks_static.dmi' diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index b10dbc1f7f8..4ed9fe2a812 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -134,6 +134,13 @@ /obj/effect/spawner/random/trash/cigbutt = 2, ) +/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 -= /mob/living/basic/cockroach + return ..() + /obj/effect/spawner/random/trash/moisture name = "water hazard spawner" icon_state = "caution" @@ -150,6 +157,13 @@ /mob/living/basic/axolotl = 1, ) +/obj/effect/spawner/random/trash/moisture/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/frog, /mob/living/basic/axolotl) + return ..() + /obj/effect/spawner/random/trash/graffiti name = "random graffiti spawner" icon_state = "rune" diff --git a/code/game/objects/effects/spawners/random/vending.dm b/code/game/objects/effects/spawners/random/vending.dm index 74ece7f24f9..014f07d2967 100644 --- a/code/game/objects/effects/spawners/random/vending.dm +++ b/code/game/objects/effects/spawners/random/vending.dm @@ -18,6 +18,11 @@ loot_type_path = /obj/machinery/vending/snack loot = list() +/obj/effect/spawner/random/vending/snackvend/Initialize(mapload) + if(check_holidays(HOTDOG_DAY)) + loot += /obj/machinery/vending/hotdog + return ..() + /obj/effect/spawner/random/vending/colavend name = "spawn random cola vending machine" desc = "Automagically transforms into a random cola vendor. If you see this while in a shift, please create a bug report." diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index 5023f9bd825..2d0f1b9b14d 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -1,7 +1,8 @@ -//generic procs copied from obj/effect/alien +#define SPIDER_WEB_TINT "web_colour_tint" + /obj/structure/spider name = "web" - icon = 'icons/effects/effects.dmi' + icon = 'icons/effects/web.dmi' desc = "It's stringy and sticky." anchored = TRUE density = FALSE @@ -22,7 +23,7 @@ damage_amount *= 1.25 if(BRUTE) damage_amount *= 0.25 - . = ..() + return ..() /obj/structure/spider/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return exposed_temperature > 350 @@ -31,17 +32,37 @@ take_damage(5, BURN, 0, 0) /obj/structure/spider/stickyweb + plane = FLOOR_PLANE + layer = MID_TURF_LAYER + icon = 'icons/obj/smooth_structures/stickyweb.dmi' + base_icon_state = "stickyweb" + icon_state = "stickyweb-0" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SPIDER_WEB + canSmoothWith = SMOOTH_GROUP_SPIDER_WEB + SMOOTH_GROUP_WALLS ///Whether or not the web is from the genetics power var/genetic = FALSE ///Whether or not the web is a sealed web var/sealed = FALSE - icon_state = "stickyweb1" + ///Do we need to offset this based on a sprite frill? + var/has_frill = TRUE + /// Chance that someone will get stuck when trying to cross this tile + var/stuck_chance = 50 + /// Chance that a bullet will hit this instead of flying through it + var/projectile_stuck_chance = 30 + +/obj/structure/spider/stickyweb/Initialize(mapload) + // Offset on init so that they look nice in the map editor + if (has_frill) + pixel_x = -9 + pixel_y = -9 + return ..() /obj/structure/spider/stickyweb/attack_hand(mob/user, list/modifiers) .= ..() if(.) return - if(!HAS_TRAIT(user,TRAIT_WEB_WEAVER)) + if(!HAS_TRAIT(user, TRAIT_WEB_WEAVER)) return loc.balloon_alert_to_viewers("weaving...") if(!do_after(user, 2 SECONDS)) @@ -51,11 +72,6 @@ var/obj/item/stack/sheet/cloth/woven_cloth = new /obj/item/stack/sheet/cloth user.put_in_hands(woven_cloth) -/obj/structure/spider/stickyweb/Initialize(mapload) - if(!sealed && prob(50)) - icon_state = "stickyweb2" - . = ..() - /obj/structure/spider/stickyweb/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(genetic) @@ -67,65 +83,125 @@ return TRUE if(mover.pulledby && HAS_TRAIT(mover.pulledby, TRAIT_WEB_SURFER)) return TRUE - if(prob(50)) - loc.balloon_alert(mover, "stuck in web!") + if(prob(stuck_chance)) + stuck_react(mover) return FALSE - else if(isprojectile(mover)) - return prob(30) + return . + if(isprojectile(mover)) + return prob(projectile_stuck_chance) + return . -/obj/structure/spider/stickyweb/sealed - name = "sealed web" - desc = "A solid thick wall of web, airtight enough to block air flow." - icon_state = "sealedweb" - sealed = TRUE - can_atmos_pass = ATMOS_PASS_NO +/// Show some feedback when you can't pass through something +/obj/structure/spider/stickyweb/proc/stuck_react(atom/movable/stuck_guy) + loc.balloon_alert(stuck_guy, "stuck in web!") + stuck_guy.Shake(duration = 0.1 SECONDS) -/obj/structure/spider/stickyweb/sealed/Initialize(mapload) - . = ..() - air_update_turf(TRUE, TRUE) - -/obj/structure/spider/stickyweb/genetic //for the spider genes in genetics +/// Web made by geneticists, needs special handling to allow them to pass through their own webs +/obj/structure/spider/stickyweb/genetic genetic = TRUE + desc = "It's stringy, sticky, and came out of your coworker." + /// Mob with special permission to cross this web var/mob/living/allowed_mob /obj/structure/spider/stickyweb/genetic/Initialize(mapload, allowedmob) - allowed_mob = allowedmob . = ..() + // Tint it purple so that spiders don't get confused about why they can't cross this one + add_filter(SPIDER_WEB_TINT, 10, list("type" = "outline", "color" = "#ffaaf8ff", "size" = 0.1)) + +/obj/structure/spider/stickyweb/genetic/Initialize(mapload, allowedmob) + allowed_mob = allowedmob + return ..() /obj/structure/spider/stickyweb/genetic/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() //this is the normal spider web return aka a spider would make this TRUE + . = ..() if(mover == allowed_mob) return TRUE else if(isliving(mover)) //we change the spider to not be able to go through here if(mover.pulledby == allowed_mob) return TRUE if(prob(50)) - loc.balloon_alert(mover, "stuck in web!") + stuck_react(mover) return FALSE else if(isprojectile(mover)) return prob(30) + return . -/obj/structure/spider/solid - name = "solid web" - icon = 'icons/effects/effects.dmi' - desc = "A solid wall of web, thick enough to block air flow." - icon_state = "solidweb" +/// Web with a 100% chance to intercept movement +/obj/structure/spider/stickyweb/very_sticky + max_integrity = 20 + desc = "Extremely sticky silk, you're not easily getting through there." + stuck_chance = 100 + projectile_stuck_chance = 100 + +/obj/structure/spider/stickyweb/very_sticky/Initialize(mapload) + . = ..() + add_filter(SPIDER_WEB_TINT, 10, list("type" = "outline", "color" = "#ffffaaff", "size" = 0.1)) + +/obj/structure/spider/stickyweb/very_sticky/update_overlays() + . = ..() + var/mutable_appearance/web_overlay = mutable_appearance(icon = 'icons/effects/web.dmi', icon_state = "sticky_overlay", layer = layer + 1) + web_overlay.pixel_x -= pixel_x + web_overlay.pixel_y -= pixel_y + . += web_overlay + + +/// Web 'wall' +/obj/structure/spider/stickyweb/sealed + name = "sealed web" + desc = "A solid wall of web, dense enough to block air flow." + icon = 'icons/obj/smooth_structures/webwall.dmi' + base_icon_state = "webwall" + icon_state = "webwall-0" + smoothing_groups = SMOOTH_GROUP_SPIDER_WEB_WALL + canSmoothWith = SMOOTH_GROUP_SPIDER_WEB_WALL + plane = GAME_PLANE + layer = OBJ_LAYER + sealed = TRUE + has_frill = FALSE can_atmos_pass = ATMOS_PASS_NO + +/obj/structure/spider/stickyweb/sealed/Initialize(mapload) + . = ..() + air_update_turf(TRUE, TRUE) + +/// Walls which reflects lasers +/obj/structure/spider/stickyweb/sealed/reflector + name = "reflective silk screen" + desc = "Hardened webbing treated with special chemicals which cause it to repel projectiles." + icon = 'icons/obj/smooth_structures/webwall_reflector.dmi' + base_icon_state = "webwall_reflector" + icon_state = "webwall_reflector-0" + smoothing_groups = SMOOTH_GROUP_SPIDER_WEB_WALL_MIRROR + canSmoothWith = SMOOTH_GROUP_SPIDER_WEB_WALL_MIRROR + max_integrity = 30 + opacity = TRUE + flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD + receive_ricochet_chance_mod = INFINITY + +/// Opaque and durable web 'wall' +/obj/structure/spider/stickyweb/sealed/tough + name = "hardened web" + desc = "Webbing hardened through a chemical process into a durable barrier." + icon = 'icons/obj/smooth_structures/webwall_dark.dmi' + base_icon_state = "webwall_dark" + icon_state = "webwall_dark-0" + smoothing_groups = SMOOTH_GROUP_SPIDER_WEB_WALL_TOUGH + canSmoothWith = SMOOTH_GROUP_SPIDER_WEB_WALL_TOUGH opacity = TRUE - density = TRUE max_integrity = 90 layer = ABOVE_MOB_LAYER resistance_flags = FIRE_PROOF | FREEZE_PROOF -/obj/structure/spider/solid/Initialize(mapload) - . = ..() - air_update_turf(TRUE, TRUE) - +/// Web 'door', blocks atmos but not movement /obj/structure/spider/passage name = "web passage" - icon = 'icons/effects/effects.dmi' - desc = "A messy connection of webs blocking the other side, but not solid enough to prevent passage." - icon_state = "webpassage" + desc = "An opaque curtain of web which seals in air but doesn't impede passage." + icon = 'icons/obj/smooth_structures/stickyweb_rotated.dmi' + base_icon_state = "stickyweb_rotated" + icon_state = "stickyweb_rotated-0" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SPIDER_WEB_ROOF + canSmoothWith = SMOOTH_GROUP_SPIDER_WEB_ROOF + SMOOTH_GROUP_WALLS can_atmos_pass = ATMOS_PASS_NO opacity = TRUE max_integrity = 60 @@ -135,7 +211,10 @@ /obj/structure/spider/passage/Initialize(mapload) . = ..() + pixel_x = -9 + pixel_y = -9 air_update_turf(TRUE, TRUE) + add_filter(SPIDER_WEB_TINT, 10, list("type" = "outline", "color" = "#ffffffff", "alpha" = 0.8, "size" = 0.1)) /obj/structure/spider/cocoon name = "cocoon" @@ -165,56 +244,31 @@ A.forceMove(T) return ..() -/obj/structure/spider/sticky - name = "sticky web" - icon = 'icons/effects/effects.dmi' - desc = "Extremely soft and sticky silk." - icon_state = "verystickyweb" - max_integrity = 20 - -/obj/structure/spider/sticky/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(HAS_TRAIT(mover, TRAIT_WEB_SURFER)) - return TRUE - if(!isliving(mover)) - return - if(!isnull(mover.pulledby) && HAS_TRAIT(mover.pulledby, TRAIT_WEB_SURFER)) - return TRUE - loc.balloon_alert(mover, "stuck in web!") - return FALSE - +/// Web caltrops /obj/structure/spider/spikes name = "web spikes" - icon = 'icons/effects/effects.dmi' desc = "Silk hardened into small yet deadly spikes." - icon_state = "webspikes1" + plane = FLOOR_PLANE + layer = MID_TURF_LAYER + icon = 'icons/obj/smooth_structures/stickyweb_spikes.dmi' + base_icon_state = "stickyweb_spikes" + icon_state = "stickyweb_spikes-0" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SPIDER_WEB + canSmoothWith = SMOOTH_GROUP_SPIDER_WEB + SMOOTH_GROUP_WALLS max_integrity = 40 /obj/structure/spider/spikes/Initialize(mapload) . = ..() + pixel_x = -9 + pixel_y = -9 + add_filter(SPIDER_WEB_TINT, 10, list("type" = "outline", "color" = "#ac0000ff", "size" = 0.1)) AddComponent(/datum/component/caltrop, min_damage = 20, max_damage = 30, flags = CALTROP_NOSTUN | CALTROP_BYPASS_SHOES) -/obj/structure/spider/reflector - name = "Reflective silk screen" - icon = 'icons/effects/effects.dmi' - desc = "Made up of an extremly reflective silk material looking at it hurts." - icon_state = "reflector" - max_integrity = 30 - density = TRUE - opacity = TRUE - anchored = TRUE - flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD - receive_ricochet_chance_mod = INFINITY - -/obj/structure/spider/reflector/Initialize(mapload) - . = ..() - air_update_turf(TRUE, TRUE) - /obj/structure/spider/effigy name = "web effigy" - icon = 'icons/effects/effects.dmi' desc = "A giant spider! Fortunately, this one is just a statue of hardened webbing." - icon_state = "webcarcass" + icon_state = "effigy" max_integrity = 125 density = TRUE anchored = FALSE @@ -222,3 +276,5 @@ /obj/structure/spider/effigy/Initialize(mapload) . = ..() AddElement(/datum/element/temporary_atom, 1 MINUTES) + +#undef SPIDER_WEB_TINT diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 64fcc2635b8..b99b5817699 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -557,7 +557,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT obj_flags &= ~CAN_BE_HIT icon_state = "rcd_end" - addtimer(CALLBACK(src, PROC_REF(end)), 15) + addtimer(CALLBACK(src, PROC_REF(end)), 1.5 SECONDS) /obj/effect/constructing_effect/proc/end() qdel(src) diff --git a/code/game/objects/effects/wanted_poster.dm b/code/game/objects/effects/wanted_poster.dm index 6859a185d6e..001f0119b9d 100644 --- a/code/game/objects/effects/wanted_poster.dm +++ b/code/game/objects/effects/wanted_poster.dm @@ -10,7 +10,7 @@ /obj/item/poster/wanted icon_state = "rolled_poster_legit" var/postHeaderText = "WANTED" // MAX 7 Characters - var/postHeaderColor = "#FF0000" + var/postHeaderColor = COLOR_RED var/background = "wanted_background" var/postName = "wanted poster" var/postDesc = "A wanted poster for" @@ -19,7 +19,7 @@ postName = "missing poster" postDesc = "A missing poster for" postHeaderText = "MISSING" // MAX 7 Characters - postHeaderColor = "#0000FF" + postHeaderColor = COLOR_BLUE /obj/item/poster/wanted/Initialize(mapload, icon/person_icon, wanted_name, description, headerText, posterHeaderColor) @@ -93,9 +93,10 @@ poster_icon.Blend(letter_icon, ICON_OVERLAY) startX = startX + 4 -/obj/structure/sign/poster/wanted/roll_and_drop(atom/location) +/obj/structure/sign/poster/wanted/roll_and_drop(atom/location, mob/user) pixel_x = 0 pixel_y = 0 var/obj/item/poster/rolled_poster = new poster_item_type(location, original_icon, wanted_name, desc, posterHeaderText, posterHeaderColor) - forceMove(rolled_poster) + if(!user?.put_in_hands(rolled_poster)) + forceMove(rolled_poster) return rolled_poster diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b852b04a023..909db0ad46f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -630,8 +630,23 @@ playsound(src, block_sound, BLOCK_SOUND_VOLUME, vary = TRUE) return TRUE -/obj/item/proc/talk_into(mob/M, input, channel, spans, datum/language/language, list/message_mods) - return ITALICS | REDUCE_RANGE +/** + * Handles someone talking INTO an item + * + * Commonly used by someone holding it and using .r or .l + * Also used by radios + * + * * speaker - the atom that is doing the talking + * * message - the message being spoken + * * channel - the channel the message is being spoken on, only really used for radios + * * spans - the spans of the message + * * language - the language the message is in + * * message_mods - any message mods that should be applied to the message + * + * Return a flag that modifies the original message + */ +/obj/item/proc/talk_into(atom/movable/speaker, message, channel, list/spans, datum/language/language, list/message_mods) + return SEND_SIGNAL(src, COMSIG_ITEM_TALK_INTO, speaker, message, channel, spans, language, message_mods) || (ITALICS|REDUCE_RANGE) /// Called when a mob drops an item. /obj/item/proc/dropped(mob/user, silent = FALSE) @@ -969,7 +984,8 @@ return SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, microwave_source, microwaver, randomize_pixel_offset) -/obj/item/proc/grind_requirements(obj/machinery/reagentgrinder/R) //Used to check for extra requirements for grinding an object +//Used to check for extra requirements for blending(grinding or juicing) an object +/obj/item/proc/blend_requirements(obj/machinery/reagentgrinder/R) return TRUE ///Called BEFORE the object is ground up - use this to change grind results based on conditions. Return "-1" to prevent the grinding from occurring @@ -980,10 +996,12 @@ /obj/item/proc/grind(datum/reagents/target_holder, mob/user) if(on_grind() == -1) return FALSE - if(target_holder) + + if(length(grind_results)) target_holder.add_reagent_list(grind_results) - if(reagents) - reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + if(reagents?.total_volume) + reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + return TRUE ///Called BEFORE the object is ground up - use this to change grind results based on conditions. Return "-1" to prevent the grinding from occurring @@ -994,12 +1012,13 @@ ///Juice item, converting nutriments into juice_typepath and transfering to target_holder if specified /obj/item/proc/juice(datum/reagents/target_holder, mob/user) - if(on_juice() == -1) + if(on_juice() == -1 || !reagents?.total_volume) return FALSE - if(reagents) + + if(ispath(juice_typepath)) reagents.convert_reagent(/datum/reagent/consumable, juice_typepath, include_source_subtypes = TRUE) - if(target_holder) - reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + return TRUE /obj/item/proc/set_force_string() diff --git a/code/game/objects/items/AI_modules/_AI_modules.dm b/code/game/objects/items/AI_modules/_AI_modules.dm index 8d5375da1f0..55c1d09fe8d 100644 --- a/code/game/objects/items/AI_modules/_AI_modules.dm +++ b/code/game/objects/items/AI_modules/_AI_modules.dm @@ -166,7 +166,7 @@ name = "ai default lawset spawner" icon = 'icons/hud/screen_gen.dmi' icon_state = "x2" - color = "#00FF00" + color = COLOR_VIBRANT_LIME /obj/effect/spawner/round_default_module/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index eb3586bc917..39388da561b 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -29,11 +29,11 @@ /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. - var/turf/T = get_step(get_turf(user), user.dir) - if(iswallturf(T)) + 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.attackby(src, user) + mounted_apc.wallframe_act(user, src) return ITEM_INTERACT_SUCCESS - T.attackby(src, user) + turf.attackby(src, user) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/busts_and_figurines.dm b/code/game/objects/items/busts_and_figurines.dm new file mode 100644 index 00000000000..afc4a58334e --- /dev/null +++ b/code/game/objects/items/busts_and_figurines.dm @@ -0,0 +1,139 @@ +/obj/item/statuebust + name = "bust" + desc = "A priceless ancient marble bust, the kind that belongs in a museum." //or you can hit people with it + icon = 'icons/obj/art/statue.dmi' + icon_state = "bust" + force = 15 + throwforce = 10 + throw_speed = 5 + throw_range = 2 + attack_verb_continuous = list("busts") + attack_verb_simple = list("bust") + var/impressiveness = 45 + +/obj/item/statuebust/Initialize(mapload) + . = ..() + AddElement(/datum/element/art, impressiveness) + AddElement(/datum/element/beauty, 1000) + +/obj/item/statuebust/hippocratic + name = "hippocrates bust" + desc = "A bust of the famous Greek physician Hippocrates of Kos, often referred to as the father of western medicine." + icon_state = "hippocratic" + impressiveness = 50 + // If it hits the prob(reference_chance) chance, this is set to TRUE. Adds medical HUD when wielded, but has a 10% slower attack speed and is too bloody to make an oath with. + var/reference = FALSE + // Chance for above. + var/reference_chance = 1 + // Minimum time inbetween oaths. + COOLDOWN_DECLARE(oath_cd) + +/obj/item/statuebust/hippocratic/evil + reference_chance = 100 + +/obj/item/statuebust/hippocratic/Initialize(mapload) + . = ..() + if(prob(reference_chance)) + name = "Solemn Vow" + desc = "Art lovers will cherish the bust of Hippocrates, commemorating a time when medics still thought doing no harm was a good idea." + attack_speed = CLICK_CD_SLOW + reference = TRUE + +/obj/item/statuebust/hippocratic/examine(mob/user) + . = ..() + if(reference) + . += span_notice("You could activate the bust in-hand to swear or forswear a Hippocratic Oath... but it seems like somebody decided it was more of a Hippocratic Suggestion. This thing is caked with bits of blood and gore.") + return + . += span_notice("You can activate the bust in-hand to swear or forswear a Hippocratic Oath! This has no effects except pacifism or bragging rights. Does not remove other sources of pacifism. Do not eat.") + +/obj/item/statuebust/hippocratic/equipped(mob/living/carbon/human/user, slot) + ..() + if(!(slot & ITEM_SLOT_HANDS)) + return + var/datum/atom_hud/our_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + our_hud.show_to(user) + ADD_TRAIT(user, TRAIT_MEDICAL_HUD, type) + +/obj/item/statuebust/hippocratic/dropped(mob/living/carbon/human/user) + ..() + if(HAS_TRAIT_NOT_FROM(user, TRAIT_MEDICAL_HUD, type)) + return + var/datum/atom_hud/our_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + our_hud.hide_from(user) + REMOVE_TRAIT(user, TRAIT_MEDICAL_HUD, type) + +/obj/item/statuebust/hippocratic/attack_self(mob/user) + if(!iscarbon(user)) + to_chat(user, span_warning("You remember how the Hippocratic Oath specifies 'my fellow human beings' and realize that it's completely meaningless to you.")) + return + + if(reference) + to_chat(user, span_warning("As you prepare yourself to swear the Oath, you realize that doing so on a blood-caked bust is probably not a good idea.")) + return + + if(!COOLDOWN_FINISHED(src, oath_cd)) + to_chat(user, span_warning("You've sworn or forsworn an oath too recently to undo your decisions. The bust looks at you with disgust.")) + return + + COOLDOWN_START(src, oath_cd, 5 MINUTES) + + if(HAS_TRAIT_FROM(user, TRAIT_PACIFISM, type)) + to_chat(user, span_warning("You've already sworn a vow. You start preparing to rescind it...")) + if(do_after(user, 5 SECONDS, target = user)) + user.say("Yeah this Hippopotamus thing isn't working out. I quit!", forced = "hippocratic hippocrisy") + REMOVE_TRAIT(user, TRAIT_PACIFISM, type) + + // they can still do it for rp purposes + if(HAS_TRAIT_NOT_FROM(user, TRAIT_PACIFISM, type)) + to_chat(user, span_warning("You already don't want to harm people, this isn't going to do anything!")) + + + to_chat(user, span_notice("You remind yourself of the Hippocratic Oath's contents and prepare to swear yourself to it...")) + if(do_after(user, 4 SECONDS, target = user)) + user.say("I swear to fulfill, to the best of my ability and judgment, this covenant:", forced = "hippocratic oath") + else + return fuck_it_up(user) + if(do_after(user, 2 SECONDS, target = user)) + user.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.", forced = "hippocratic oath") + else + return fuck_it_up(user) + if(do_after(user, 3 SECONDS, target = user)) + user.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.", forced = "hippocratic oath") + else + + return fuck_it_up(user) + if(do_after(user, 3 SECONDS, target = user)) + user.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.", forced = "hippocratic oath") + else + return fuck_it_up(user) + + to_chat(user, span_notice("Contentment, understanding, and purpose washes over you as you finish the oath. You consider for a second the concept of harm and shudder.")) + ADD_TRAIT(user, TRAIT_PACIFISM, type) + +// Bully the guy for fucking up. +/obj/item/statuebust/hippocratic/proc/fuck_it_up(mob/living/carbon/user) + to_chat(user, span_warning("You forget what comes next like a dumbass. The Hippocrates bust looks down on you, disappointed.")) + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) + COOLDOWN_RESET(src, oath_cd) + +/obj/item/maneki_neko + name = "Maneki-Neko" + desc = "A figurine of a cat holding a coin, said to bring fortune and wealth, and perpetually moving its paw in a beckoning gesture." + icon = 'icons/obj/fluff/general.dmi' + icon_state = "maneki-neko" + w_class = WEIGHT_CLASS_SMALL + force = 5 + throwforce = 5 + throw_speed = 3 + throw_range = 5 + attack_verb_continuous = list("bashes", "beckons", "hit") + attack_verb_simple = list("bash", "beckon", "hit") + +/obj/item/maneki_neko/Initialize(mapload) + . = ..() + //Not compatible with greyscale configs because it's animated. + color = pick_weight(list(COLOR_WHITE = 3, COLOR_GOLD = 2, COLOR_DARK = 1)) + var/mutable_appearance/neko_overlay = mutable_appearance(icon, "maneki-neko-overlay", appearance_flags = RESET_COLOR) + add_overlay(neko_overlay) + AddElement(/datum/element/art, GOOD_ART) + AddElement(/datum/element/beauty, 800) diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index e50963a855e..71f3a244a30 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -92,10 +92,8 @@ if((damage_flag == BULLET || damage_flag == MELEE) && (damage_type == BRUTE) && prob(damage_sustained)) push_over() -/obj/item/cardboard_cutout/deconstruct(disassembled) - if(!(flags_1 & HOLOGRAM_1) || !(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/cardboard(loc, 1) - return ..() +/obj/item/cardboard_cutout/atom_deconstruct(disassembled) + new /obj/item/stack/sheet/cardboard(loc, 1) /proc/get_cardboard_cutout_instance(datum/cardboard_cutout/cardboard_cutout) ASSERT(ispath(cardboard_cutout), "[cardboard_cutout] is not a path of /datum/cardboard_cutout") diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index f655842e7ca..8c9ef30687a 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -1,9 +1,3 @@ -/** - * x1, y1, x2, y2 - Represents the bounding box for the ID card's non-transparent portion of its various icon_states. - * Used to crop the ID card's transparency away when chaching the icon for better use in tgui chat. - */ -#define ID_ICON_BORDERS 1, 9, 32, 24 - /// Fallback time if none of the config entries are set for USE_LOW_LIVING_HOUR_INTERN #define INTERN_THRESHOLD_FALLBACK_HOURS 15 @@ -125,9 +119,8 @@ /obj/item/card/id/Initialize(mapload) . = ..() - var/datum/bank_account/blank_bank_account = new /datum/bank_account("Unassigned", player_account = FALSE) + var/datum/bank_account/blank_bank_account = new("Unassigned", SSjob.GetJobType(/datum/job/unassigned), player_account = FALSE) registered_account = blank_bank_account - blank_bank_account.account_job = new /datum/job/unassigned registered_account.replaceable = TRUE // Applying the trim updates the label and icon, so don't do this twice. @@ -416,6 +409,13 @@ wildcard_access_list |= new_access +/// Helper proc that determines if a card can be used in certain types of payment transactions. +/obj/item/card/id/proc/can_be_used_in_payment(mob/living/user) + if(QDELETED(src) || isnull(registered_account?.account_job) || !isliving(user)) + return FALSE + + return TRUE + /obj/item/card/id/attack_self(mob/user) if(Adjacent(user)) var/minor @@ -446,7 +446,7 @@ context[SCREENTIP_CONTEXT_RMB] = "Project pay stand" 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" - if(!registered_account.replaceable || registered_account.account_balance > 0) + else if(registered_account.account_balance > 0) context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw credits" return CONTEXTUAL_SCREENTIP_SET @@ -454,8 +454,8 @@ if(!COOLDOWN_FINISHED(src, last_holopay_projection)) balloon_alert(user, "still recharging") return - if(!registered_account || !registered_account.account_job) - balloon_alert(user, "no account") + if(can_be_used_in_payment(user)) + balloon_alert(user, "no account!") to_chat(user, span_warning("You need a valid bank account to do this.")) return /// Determines where the holopay will be placed based on tile contents @@ -637,9 +637,9 @@ /// Helper proc. Can the user alt-click the ID? /obj/item/card/id/proc/alt_click_can_use_id(mob/living/user) if(!isliving(user)) - return + return FALSE if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return + return FALSE return TRUE @@ -1085,6 +1085,14 @@ assigned_icon_state = "assigned_silver" wildcard_slots = WILDCARD_LIMIT_SILVER +/obj/item/card/id/advanced/robotic + name = "magnetic identification card" + desc = "An integrated card which shows the work poured into opening doors." + icon_state = "card_carp" //im not a spriter + inhand_icon_state = "silver_id" + assigned_icon_state = "assigned_silver" + wildcard_slots = WILDCARD_LIMIT_GREY + /datum/id_trim/maint_reaper access = list(ACCESS_MAINT_TUNNELS) trim_state = "trim_janitor" @@ -1225,7 +1233,7 @@ /obj/item/card/id/advanced/debug name = "\improper Debug ID" - desc = "A debug ID card. Has ALL the all access, you really shouldn't have this." + desc = "A debug ID card. Has ALL the all access and a boatload of money, you really shouldn't have this." icon_state = "card_centcom" assigned_icon_state = "assigned_centcom" trim = /datum/id_trim/admin @@ -1233,8 +1241,26 @@ /obj/item/card/id/advanced/debug/Initialize(mapload) . = ..() - registered_account = SSeconomy.get_dep_account(ACCOUNT_CAR) - registered_account.account_job = new /datum/job/admin // so we can actually use this account without being filtered as a "departmental" card + registered_account = new(player_account = FALSE) + registered_account.account_id = ADMIN_ACCOUNT_ID // this is so bank_card_talk() can work. + registered_account.account_job = SSjob.GetJobType(/datum/job/admin) + registered_account.account_balance += 999999 // MONEY! We add more money to the account every time we spawn because it's a debug item and infinite money whoopie + +/obj/item/card/id/advanced/debug/alt_click_can_use_id(mob/living/user) + . = ..() + if(!. || isnull(user.client?.holder)) // admins only as a safety so people don't steal all the dollars. spawn in a holochip if you want them to get some dosh + registered_account.bank_card_talk(span_warning("Only authorized representatives of Nanotrasen may use this card."), force = TRUE) + return FALSE + + return TRUE + +/obj/item/card/id/advanced/debug/can_be_used_in_payment(mob/living/user) + . = ..() + if(!. || isnull(user.client?.holder)) + registered_account.bank_card_talk(span_warning("Only authorized representatives of Nanotrasen may use this card."), force = TRUE) + return FALSE + + return TRUE /obj/item/card/id/advanced/prisoner name = "prisoner ID card" @@ -1701,7 +1727,6 @@ icon_state = "ctf_green" #undef INTERN_THRESHOLD_FALLBACK_HOURS -#undef ID_ICON_BORDERS #undef HOLOPAY_PROJECTION_INTERVAL #define INDEX_NAME_COLOR 1 @@ -1729,7 +1754,7 @@ ///An icon state used as trim. var/scribbled_trim ///The colors for each of the above variables, for when overlays are updated. - var/details_colors = list("#000000", "#000000", "#000000") + var/details_colors = list(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK) /obj/item/card/cardboard/equipped(mob/user, slot, initial = FALSE) . = ..() @@ -1775,14 +1800,14 @@ return scribbled_name = input_name var/list/details = item.get_writing_implement_details() - details_colors[INDEX_NAME_COLOR] = details["color"] || "#000000" + details_colors[INDEX_NAME_COLOR] = details["color"] || COLOR_BLACK if("Assignment") var/input_assignment = tgui_input_text(user, "What assignment would you like to put on this card?", "Cardboard card job ssignment", scribbled_assignment || "Assistant", MAX_NAME_LEN) if(!after_input_check(user, item, input_assignment, scribbled_assignment)) return scribbled_assignment = sanitize(input_assignment) var/list/details = item.get_writing_implement_details() - details_colors[INDEX_ASSIGNMENT_COLOR] = details["color"] || "#000000" + details_colors[INDEX_ASSIGNMENT_COLOR] = details["color"] || COLOR_BLACK if("Trim") var/static/list/possible_trims if(!possible_trims) @@ -1797,12 +1822,12 @@ return scribbled_trim = "cardboard_[input_trim]" var/list/details = item.get_writing_implement_details() - details_colors[INDEX_TRIM_COLOR] = details["color"] || "#000000" + details_colors[INDEX_TRIM_COLOR] = details["color"] || COLOR_BLACK if("Reset") scribbled_name = null scribbled_assignment = null scribbled_trim = null - details_colors = list("#000000", "#000000", "#000000") + details_colors = list(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK) update_appearance() diff --git a/code/game/objects/items/choice_beacon.dm b/code/game/objects/items/choice_beacon.dm index 3971306b76b..06385b765cf 100644 --- a/code/game/objects/items/choice_beacon.dm +++ b/code/game/objects/items/choice_beacon.dm @@ -2,8 +2,8 @@ name = "choice beacon" desc = "Hey, why are you viewing this?!! Please let CentCom know about this odd occurrence." icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-blue" - inhand_icon_state = "radio" + icon_state = "generic_delivery" + inhand_icon_state = "generic_delivery" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' /// How many uses this item has before being deleted @@ -71,6 +71,10 @@ /obj/item/choice_beacon/music name = "instrument delivery beacon" desc = "Summon your tool of art." + icon_state = "sb_delivery" + inhand_icon_state = "sb_delivery" + company_source = "Sophronia Broadcasting" + company_message = span_bold("Please enjoy your Sophronia Broadcasting's 'Spinward Idol' Musical Instrument, exactly as shown in the hit show!") w_class = WEIGHT_CLASS_TINY /obj/item/choice_beacon/music/generate_display_names() @@ -132,6 +136,8 @@ name = "augment beacon" desc = "Summons augmentations. Can be used 3 times!" uses = 3 + icon_state = "self_delivery" + inhand_icon_state = "self_delivery" company_source = "S.E.L.F." company_message = span_bold("Request status: Recieved. Package status: Delivered. Notes: To assure optimal value, use supplied Interdyne-brand autosurgeons to change implantment status.") diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index a46732f171a..ac523644ab7 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -349,18 +349,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!istype(smoker)) // If not, check if it's a gas mask if(!istype(smoker, /obj/item/clothing/mask/gas)) - reagents.remove_any(to_smoke) + reagents.remove_all(to_smoke) return smoker = smoker.loc // If it is, check if that mask is on a carbon mob if(!istype(smoker) || smoker.get_item_by_slot(ITEM_SLOT_MASK) != loc) - reagents.remove_any(to_smoke) + reagents.remove_all(to_smoke) return else if(src != smoker.wear_mask) - reagents.remove_any(to_smoke) + reagents.remove_all(to_smoke) return reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1)) @@ -369,7 +369,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/smoker_resistance = HAS_TRAIT(smoker, TRAIT_SMOKER) ? 0.5 : 1 smoker.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm * smoker_resistance) if(!reagents.trans_to(smoker, to_smoke, methods = INGEST, ignore_stomach = TRUE)) - reagents.remove_any(to_smoke) + reagents.remove_all(to_smoke) /obj/item/clothing/mask/cigarette/process(seconds_per_tick) var/mob/living/user = isliving(loc) ? loc : null @@ -591,7 +591,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM // CIGARS // //////////// /obj/item/clothing/mask/cigarette/cigar - name = "premium cigar" + name = "cigar" desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!" icon_state = "cigaroff" icon_on = "cigaron" @@ -606,6 +606,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM list_reagents = list(/datum/reagent/drug/nicotine = 25) choke_time_max = 40 SECONDS +/obj/item/clothing/mask/cigarette/cigar/premium + name = "premium cigar" + //this is the version that actually spawns in premium cigar cases, the distinction is made so that the smoker quirk can differentiate between the default cigar box and its subtypes + /obj/item/clothing/mask/cigarette/cigar/cohiba name = "\improper Cohiba Robusto cigar" desc = "There's little more you could want from a cigar." @@ -744,7 +748,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM custom_price = PAYCHECK_CREW * 1.1 light_system = OVERLAY_LIGHT light_range = 2 - light_power = 0.6 + light_power = 1.3 light_color = LIGHT_COLOR_FIRE light_on = FALSE /// Whether the lighter is lit. @@ -885,7 +889,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND user.apply_damage(5, BURN, hitzone) user.visible_message( - span_warning("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn [user.p_their()] finger in the process."), + span_warning("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn[user.p_s()] [user.p_their()] finger in the process."), span_warning("You burn yourself while lighting the lighter!") ) user.add_mood_event("burnt_thumb", /datum/mood_event/burnt_thumb) @@ -1172,7 +1176,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/mob/living/carbon/vaper = loc if(!iscarbon(vaper) || src != vaper.wear_mask) - reagents.remove_any(REAGENTS_METABOLISM) + reagents.remove_all(REAGENTS_METABOLISM) return if(reagents.get_reagent_amount(/datum/reagent/fuel)) @@ -1187,7 +1191,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM qdel(src) if(!reagents.trans_to(vaper, REAGENTS_METABOLISM, methods = INGEST, ignore_stomach = TRUE)) - reagents.remove_any(REAGENTS_METABOLISM) + reagents.remove_all(REAGENTS_METABOLISM) /obj/item/clothing/mask/vape/process(seconds_per_tick) var/mob/living/M = loc diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 9cf1cdb7cbe..41950561571 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -599,28 +599,3 @@ /obj/item/circuitboard/computer/exodrone_console name = "Exploration Drone Control Console" build_path = /obj/machinery/computer/exodrone_control_console - -/obj/item/circuitboard/computer/service_orders - name = "Service Order" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/computer/department_orders/service - -/obj/item/circuitboard/computer/engineering_orders - name = "Engineering Order" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/computer/department_orders/engineering - -/obj/item/circuitboard/computer/science_orders - name = "Science Order" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/computer/department_orders/science - -/obj/item/circuitboard/computer/security_orders - name = "Security Order" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/computer/department_orders/security - -/obj/item/circuitboard/computer/medical_orders - name = "Medical Order" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/computer/department_orders/medical diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 3963fe21b2a..8d6c240ed0d 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -79,7 +79,6 @@ req_components = list(/datum/stock_part/capacitor = 1) needs_anchored = FALSE - /obj/item/circuitboard/machine/telecomms/broadcaster name = "Subspace Broadcaster" greyscale_colors = CIRCUIT_COLOR_ENGINEERING @@ -525,9 +524,11 @@ /obj/item/circuitboard/machine/reagentgrinder name = "All-In-One Grinder" greyscale_colors = CIRCUIT_COLOR_GENERIC - build_path = /obj/machinery/reagentgrinder/constructed + build_path = /obj/machinery/reagentgrinder req_components = list( - /datum/stock_part/servo = 1) + /datum/stock_part/servo = 1, + /datum/stock_part/matter_bin = 1, + ) needs_anchored = FALSE /obj/item/circuitboard/machine/smartfridge @@ -1120,6 +1121,19 @@ build_path = /obj/machinery/rnd/production/techfab/department/security //Service +/obj/item/circuitboard/machine/photobooth + name = "Photobooth" + greyscale_colors = CIRCUIT_COLOR_SERVICE + build_path = /obj/machinery/photobooth + req_components = list( + /datum/stock_part/matter_bin = 1, + /datum/stock_part/servo = 1, + ) + +/obj/item/circuitboard/machine/photobooth/security + name = "Security Photobooth" + greyscale_colors = CIRCUIT_COLOR_SECURITY + build_path = /obj/machinery/photobooth/security /obj/item/circuitboard/machine/biogenerator name = "Biogenerator" diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 1fef4a38438..de81caa22e9 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -3,7 +3,8 @@ #define WAND_EMERGENCY "emergency" /obj/item/door_remote - icon_state = "gangtool-white" + icon_state = "remote" + base_icon_state = "remote" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' @@ -11,6 +12,8 @@ name = "control wand" desc = "A remote for controlling a set of airlocks." w_class = WEIGHT_CLASS_TINY + + var/department = "civilian" var/mode = WAND_OPEN var/region_access = REGION_GENERAL var/list/access_list @@ -18,6 +21,7 @@ /obj/item/door_remote/Initialize(mapload) . = ..() access_list = SSid_access.get_region_access_list(list(region_access)) + update_icon_state() /obj/item/door_remote/attack_self(mob/user) var/static/list/desc = list(WAND_OPEN = "Open Door", WAND_BOLT = "Toggle Bolts", WAND_EMERGENCY = "Toggle Emergency Access") @@ -28,6 +32,7 @@ mode = WAND_EMERGENCY if(WAND_EMERGENCY) mode = WAND_OPEN + update_icon_state() balloon_alert(user, "mode: [desc[mode]]") // Airlock remote works by sending NTNet packets to whatever it's pointed at. @@ -85,46 +90,59 @@ airlock.emergency = !airlock.emergency airlock.update_appearance(UPDATE_ICON) +/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" + + icon_state = "[base_icon_state]_[department]_[icon_state_mode]" + return ..() + /obj/item/door_remote/omni name = "omni door remote" desc = "This control wand can access any door on the station." - icon_state = "gangtool-yellow" + department = "omni" region_access = REGION_ALL_STATION /obj/item/door_remote/captain name = "command door remote" - icon_state = "gangtool-yellow" + department = "command" region_access = REGION_COMMAND /obj/item/door_remote/chief_engineer name = "engineering door remote" - icon_state = "gangtool-orange" + department = "engi" region_access = REGION_ENGINEERING /obj/item/door_remote/research_director name = "research door remote" - icon_state = "gangtool-purple" + department = "sci" region_access = REGION_RESEARCH /obj/item/door_remote/head_of_security name = "security door remote" - icon_state = "gangtool-red" + department = "security" region_access = REGION_SECURITY /obj/item/door_remote/quartermaster name = "supply door remote" desc = "Remotely controls airlocks. This remote has additional Vault access." - icon_state = "gangtool-green" + department = "cargo" region_access = REGION_SUPPLY /obj/item/door_remote/chief_medical_officer name = "medical door remote" - icon_state = "gangtool-blue" + department = "med" region_access = REGION_MEDBAY /obj/item/door_remote/civilian name = "civilian door remote" - icon_state = "gangtool-white" + department = "civilian" region_access = REGION_GENERAL #undef WAND_OPEN diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index b865d9c4579..bbb5e9e177d 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -176,7 +176,7 @@ user.visible_message(span_warning("[user] begins to wipe [target]'s lipstick off with \the [src]."), \ span_notice("You begin to wipe off [target]'s lipstick...")) - if(!do_after(user, 10, target = target)) + if(!do_after(user, 1 SECONDS, target = target)) return user.visible_message(span_notice("[user] wipes [target]'s lipstick off with \the [src]."), \ span_notice("You wipe off [target]'s lipstick.")) diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 1e43197c47e..25582bc9189 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -106,7 +106,7 @@ add_overlay("flaps") add_overlay("hatch") add_overlay("legs_retracted") - addtimer(CALLBACK(src, PROC_REF(startUp)), 50) + addtimer(CALLBACK(src, PROC_REF(startUp)), 5 SECONDS) QDEL_IN(src, 8 MINUTES) //Self-destruct after 8 min ADD_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING, REF(src)) @@ -202,7 +202,7 @@ if (account) // get_bank_account() may return FALSE account.transfer_money(B, amount, "?VIVA¿: !LA CRABBE¡") B.bank_card_talk("You have lost [percentage_lost * 100]% of your funds! A spacecoin credit deposit machine is located at: [get_area(src)].") - addtimer(CALLBACK(src, PROC_REF(dump)), 150) //Drain every 15 seconds + addtimer(CALLBACK(src, PROC_REF(dump)), 15 SECONDS) //Drain every 15 seconds /obj/structure/checkoutmachine/process() var/anydir = pick(GLOB.cardinals) @@ -238,7 +238,7 @@ /obj/effect/dumpeet_target/Initialize(mapload, user) . = ..() bogdanoff = user - addtimer(CALLBACK(src, PROC_REF(startLaunch)), 100) + addtimer(CALLBACK(src, PROC_REF(startLaunch)), 10 SECONDS) sound_to_playing_players('sound/items/dump_it.ogg', 20) deadchat_broadcast("Protocol CRAB-17 has been activated. A space-coin market has been launched at the station!", turf_target = get_turf(src), message_type=DEADCHAT_ANNOUNCEMENT) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index e7c4e8eadde..c3eca2eb033 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -43,7 +43,7 @@ /// Crayon overlay to use if placed into a crayon box var/crayon_color = "red" /// Current paint colour - var/paint_color = "#FF0000" + var/paint_color = COLOR_RED /// Contains chosen symbol to draw var/drawtype @@ -512,7 +512,7 @@ if(istagger) wait_time *= 0.5 - if(!instant && !do_after(user, wait_time, target = target)) + if(!instant && !do_after(user, wait_time, target = target, max_interact_count = 4)) return if(!use_charges(user, cost)) @@ -809,7 +809,7 @@ if(pre_noise || post_noise) playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) if(can_change_colour) - set_painting_tool_color("#C0C0C0") + set_painting_tool_color(COLOR_SILVER) update_appearance() if(actually_paints) H.update_lips("spray_face", paint_color) @@ -1013,7 +1013,7 @@ expose_turfs = TRUE charges = 100 reagent_contents = list(/datum/reagent/clf3 = 1) - paint_color = "#000000" + paint_color = COLOR_BLACK /obj/item/toy/crayon/spraycan/hellcan/isValidSurface(surface) return isfloorturf(surface) @@ -1042,7 +1042,7 @@ overlay_paint_colour = FALSE can_change_colour = FALSE - paint_color = "#FFFFFF" //RGB + paint_color = COLOR_WHITE //RGB pre_noise = FALSE post_noise = FALSE diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 8e9fb78172f..83e6165b91d 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -67,7 +67,7 @@ if(20 to 49) overlay_color = "#358F34" if(50 to 99) - overlay_color = "#676767" + overlay_color = COLOR_SLIME_METAL if(100 to 199) overlay_color = "#009D9B" if(200 to 499) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index ba0cdcc76b1..5df85cdc666 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -28,7 +28,7 @@ /// If the cell can be removed via screwdriver var/cell_removable = TRUE var/obj/item/shockpaddles/paddles - var/obj/item/stock_parts/cell/high/cell + var/obj/item/stock_parts/cell/cell /// If true, revive through space suits, allow for combat shocking var/combat = FALSE /// How long does it take to recharge @@ -187,7 +187,7 @@ /obj/item/defibrillator/emp_act(severity) . = ..() if(cell && !(. & EMP_PROTECT_CONTENTS)) - deductcharge(1000 / severity) + deductcharge(STANDARD_CELL_CHARGE / severity) if (. & EMP_PROTECT_SELF) return @@ -239,15 +239,15 @@ return ..() /obj/item/defibrillator/proc/deductcharge(chrgdeductamt) - if(cell) - if(cell.charge < (paddles.revivecost+chrgdeductamt)) - powered = FALSE - update_power() - if(cell.use(chrgdeductamt)) - update_power() - return TRUE - else - return FALSE + if(QDELETED(cell)) + return + + if(cell.charge < (paddles.revivecost + chrgdeductamt)) + powered = FALSE + if(!cell.use(chrgdeductamt)) + powered = FALSE + + update_power() /obj/item/defibrillator/proc/cooldowncheck() addtimer(CALLBACK(src, PROC_REF(finish_charging)), cooldown_duration) @@ -346,7 +346,7 @@ resistance_flags = INDESTRUCTIBLE base_icon_state = "defibpaddles" - var/revivecost = 1000 + var/revivecost = STANDARD_CELL_CHARGE * 0.1 var/cooldown = FALSE var/busy = FALSE var/obj/item/defibrillator/defib diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 0ab7e5d94b5..c619f7d7018 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -16,6 +16,8 @@ /obj/item/aicard/Initialize(mapload) . = ..() + if(mapload && HAS_TRAIT(SSstation, STATION_TRAIT_HUMAN_AI)) + return INITIALIZE_HINT_QDEL ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) /obj/item/aicard/Destroy(force) diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm index f91150bb086..8aaa9f03111 100644 --- a/code/game/objects/items/devices/aicard_evil.dm +++ b/code/game/objects/items/devices/aicard_evil.dm @@ -34,14 +34,16 @@ if(isnull(op_datum)) balloon_alert(user, "invalid access!") return - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(on_poll_concluded), user, op_datum) - AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_SYNDICATE, \ - job_bans = ROLE_OPERATIVE, \ - to_call = to_call, \ - title = "Nuclear Operative Modsuit AI" \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + check_jobban = ROLE_OPERATIVE, + poll_time = 20 SECONDS, + checked_target = src, + ignore_category = POLL_IGNORE_SYNDICATE, + alert_pic = src, + role_name_text = "Nuclear Operative Modsuit AI", + chat_text_border_icon = mutable_appearance(icon, "syndicard-full"), ) + on_poll_concluded(user, op_datum, chosen_one) /// Poll has concluded with a ghost, create the AI /obj/item/aicard/syndie/loaded/proc/on_poll_concluded(mob/user, datum/antagonist/nukeop/op_datum, mob/dead/observer/ghost) diff --git a/code/game/objects/items/devices/battle_royale.dm b/code/game/objects/items/devices/battle_royale.dm new file mode 100644 index 00000000000..b4ea15c6de7 --- /dev/null +++ b/code/game/objects/items/devices/battle_royale.dm @@ -0,0 +1,117 @@ +/// Quietly implants people with battle royale implants +/obj/item/royale_implanter + name = "royale implanter" + desc = "Subtly implants people with rumble royale implants, \ + preparing them to struggle for their life for the enjoyment of the Syndicate's paying audience. \ + Implants may cause irritation at site of implantation." + icon = 'icons/obj/medical/syringe.dmi' + icon_state = "nanite_hypo" + w_class = WEIGHT_CLASS_SMALL + /// Do we have a linked remote? Just to prevent headdesk moments + var/linked = FALSE + +/obj/item/royale_implanter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + if (!istype(interacting_with, /obj/item/royale_remote)) + return NONE + var/obj/item/royale_remote/remote = interacting_with + remote.link_implanter(src, user) + return ITEM_INTERACT_SUCCESS + if (!linked) + balloon_alert(user, "no linked remote!") + return ITEM_INTERACT_BLOCKING + if (DOING_INTERACTION_WITH_TARGET(user, interacting_with)) + balloon_alert(user, "busy!") + return ITEM_INTERACT_BLOCKING + var/mob/living/potential_winner = interacting_with + if (potential_winner.stat != CONSCIOUS) + balloon_alert(user, "target unconscious!") + return ITEM_INTERACT_BLOCKING + if (!potential_winner.mind) + balloon_alert(user, "target too boring!") + return ITEM_INTERACT_BLOCKING + log_combat(user, potential_winner, "tried to implant a battle royale implant into") + if (!do_after(user, 1.5 SECONDS, potential_winner)) + balloon_alert(user, "interrupted!") + return ITEM_INTERACT_BLOCKING + + var/obj/item/implant/explosive/battle_royale/encouragement_implant = new + if(!encouragement_implant.implant(potential_winner, user)) + qdel(encouragement_implant) // no balloon alert - feedback is usually provided by the implant + return ITEM_INTERACT_BLOCKING + + potential_winner.balloon_alert(user, "implanted") + SEND_SIGNAL(src, COMSIG_ROYALE_IMPLANTED, encouragement_implant) + return ITEM_INTERACT_SUCCESS + +/// Activates implants implanted by linked royale implanter +/obj/item/royale_remote + name = "royale remote" + desc = "A single use device which will activate any linked rumble royale implants, starting the show." + icon = 'icons/obj/devices/remote.dmi' + icon_state = "designator_syndicate" + w_class = WEIGHT_CLASS_SMALL + /// Minimum number of contestants we should have + var/required_contestants = 6 + /// List of implanters we are linked to + var/list/linked_implanters = list() + /// List of implants of lucky contestants + var/list/implanted_implants = list() + +/obj/item/royale_remote/Destroy(force) + linked_implanters = null + implanted_implants = null + return ..() + +/obj/item/royale_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (!istype(interacting_with, /obj/item/royale_implanter)) + return NONE + link_implanter(interacting_with) + return ITEM_INTERACT_SUCCESS + +/obj/item/royale_remote/attack_self(mob/user, modifiers) + . = ..() + if (.) + return + var/contestant_count = length(implanted_implants) + if (contestant_count < required_contestants) + balloon_alert(user, "[required_contestants - contestant_count] contestants needed!") + return + + SSbattle_royale.start_battle(implanted_implants) + + for (var/obj/implanter as anything in linked_implanters) + do_sparks(3, cardinal_only = FALSE, source = implanter) + qdel(implanter) + do_sparks(3, cardinal_only = FALSE, source = src) + qdel(src) + +/// Link to an implanter +/obj/item/royale_remote/proc/link_implanter(obj/item/royale_implanter/implanter, mob/user) + if (implanter in linked_implanters) + if (user) + balloon_alert(user, "already linked!") + return + + if (user) + balloon_alert(user, "link established") + + implanter.linked = TRUE + linked_implanters += implanter + RegisterSignal(implanter, COMSIG_ROYALE_IMPLANTED, PROC_REF(record_contestant)) + RegisterSignal(implanter, COMSIG_QDELETING, PROC_REF(implanter_destroyed)) + +/// Record that someone just got implanted +/obj/item/royale_remote/proc/record_contestant(obj/item/implanter, obj/item/implant) + SIGNAL_HANDLER + implanted_implants |= implant + RegisterSignal(implant, COMSIG_QDELETING, PROC_REF(implant_destroyed)) + +/// A linked implanter was destroyed +/obj/item/royale_remote/proc/implanter_destroyed(obj/item/implanter) + SIGNAL_HANDLER + linked_implanters -= implanter + +/obj/item/royale_remote/proc/implant_destroyed(obj/item/implant) + SIGNAL_HANDLER + implanted_implants -= implant diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 6ea3b516069..907bdbc9e22 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -20,6 +20,7 @@ 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) light_system = OVERLAY_LIGHT_DIRECTIONAL + light_color = COLOR_LIGHT_ORANGE light_range = 4 light_power = 1 light_on = FALSE @@ -95,7 +96,7 @@ return light_on != old_light_on // If the value of light_on didn't change, return false. Otherwise true. /obj/item/flashlight/attack_self(mob/user) - toggle_light(user) + return toggle_light(user) /obj/item/flashlight/attack_hand_secondary(mob/user, list/modifiers) attack_self(user) @@ -295,6 +296,8 @@ w_class = WEIGHT_CLASS_TINY obj_flags = CONDUCTS_ELECTRICITY light_range = 2 + light_power = 0.8 + light_color = "#CCFFFF" COOLDOWN_DECLARE(holosign_cooldown) /obj/item/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag) @@ -352,6 +355,8 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' force = 9 // Not as good as a stun baton. light_range = 5 // A little better than the standard flashlight. + light_power = 0.8 + light_color = "#99ccff" hitsound = 'sound/weapons/genhit1.ogg' // the desk lamps are a bit special @@ -398,6 +403,7 @@ heat = 1000 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 @@ -416,7 +422,7 @@ /obj/item/flashlight/flare/Initialize(mapload) . = ..() if(randomize_fuel) - fuel = rand(25 MINUTES, 35 MINUTES) + fuel = rand(10 MINUTES, 15 MINUTES) if(light_on) attack_verb_continuous = string_list(list("burns", "singes")) attack_verb_simple = string_list(list("burn", "singe")) @@ -523,8 +529,9 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' w_class = WEIGHT_CLASS_TINY heat = 1000 - light_color = LIGHT_COLOR_FIRE light_range = 2 + light_power = 1.5 + light_color = LIGHT_COLOR_FIRE fuel = 35 MINUTES randomize_fuel = FALSE trash_type = /obj/item/trash/candle @@ -638,6 +645,7 @@ name = "torch" desc = "A torch fashioned from some leaves and a log." light_range = 4 + light_power = 1.3 icon_state = "torch" inhand_icon_state = "torch" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' @@ -655,20 +663,24 @@ lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' desc = "A mining lantern." - light_range = 6 // luminosity when on + light_range = 5 // luminosity when on + light_power = 1.5 + light_color = "#ffcc66" light_system = OVERLAY_LIGHT /obj/item/flashlight/lantern/heirloom_moth name = "old lantern" desc = "An old lantern that has seen plenty of use." - light_range = 4 + light_range = 3.5 /obj/item/flashlight/lantern/syndicate name = "suspicious lantern" desc = "A suspicious looking lantern." icon_state = "syndilantern" inhand_icon_state = "syndilantern" - light_range = 10 + light_range = 6 + light_power = 2 + light_color = "#ffffe6" /obj/item/flashlight/lantern/jade name = "jade lantern" @@ -686,7 +698,8 @@ w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT custom_materials = null - light_range = 7 //luminosity when on + light_range = 6 //luminosity when on + light_color = "#ffff66" light_system = OVERLAY_LIGHT /obj/item/flashlight/emp @@ -746,13 +759,14 @@ emp_cur_charges = 100 // Glowsticks, in the uncomfortable range of similar to flares, -// but not similar enough to make it worth a refactor +// Flares need to process (for hotspots) tho so this becomes irrelevant /obj/item/flashlight/glowstick name = "glowstick" desc = "A military-grade glowstick." custom_price = PAYCHECK_LOWER w_class = WEIGHT_CLASS_SMALL - light_range = 4 + light_range = 3.5 + light_power = 2 light_system = OVERLAY_LIGHT color = LIGHT_COLOR_GREEN icon_state = "glowstick" @@ -764,35 +778,74 @@ toggle_context = FALSE /// How many seconds of fuel we have left var/fuel = 0 + /// How much max fuel we have + var/max_fuel = 0 + /// The timer id powering our burning + var/timer_id = TIMER_ID_NULL /obj/item/flashlight/glowstick/Initialize(mapload) - fuel = rand(50 MINUTES, 60 MINUTES) + fuel = rand(20 MINUTES, 25 MINUTES) + max_fuel = fuel set_light_color(color) return ..() -/obj/item/flashlight/glowstick/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() +/// Burns down the glowstick by the specified time +/// Returns the amount of time we need to burn before a visual change will occur +/obj/item/flashlight/glowstick/proc/burn_down(amount = 0) + fuel -= amount + var/fuel_target = 0 + if(fuel >= max_fuel) + fuel_target = max_fuel * 0.4 + else if(fuel >= max_fuel * 0.4) + fuel_target = max_fuel * 0.3 + set_light_range(3) + set_light_power(1.5) + else if(fuel >= max_fuel * 0.3) + fuel_target = max_fuel * 0.2 + set_light_range(2) + set_light_power(1.25) + else if(fuel >= max_fuel * 0.2) + fuel_target = max_fuel * 0.1 + set_light_power(1) + else if(fuel >= max_fuel * 0.1) + fuel_target = 0 + set_light_range(1.5) + set_light_power(0.5) -/obj/item/flashlight/glowstick/process(seconds_per_tick) - fuel = max(fuel - seconds_per_tick * (1 SECONDS), 0) - if(fuel <= 0) + var/time_to_burn = round(fuel - fuel_target) + // Less then a ds? go home + if(time_to_burn <= 0) turn_off() - STOP_PROCESSING(SSobj, src) + + return time_to_burn + +/obj/item/flashlight/glowstick/proc/burn_loop(amount = 0) + timer_id = TIMER_ID_NULL + var/burn_next = burn_down(amount) + if(burn_next <= 0) + return + timer_id = addtimer(CALLBACK(src, PROC_REF(burn_loop), burn_next), burn_next, TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_OVERRIDE) + +/obj/item/flashlight/glowstick/proc/turn_on() + 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? + if(toggle) + remove_item_action(toggle) + burn_loop() /obj/item/flashlight/glowstick/proc/turn_off() + var/datum/action/toggle = locate(/datum/action/item_action/toggle_light) in actions + if(fuel && !toggle) + add_item_action(/datum/action/item_action/toggle_light) + if(timer_id != TIMER_ID_NULL) + var/expected_burn_time = burn_down(0) // This is dumb I'm sorry + burn_down(expected_burn_time - timeleft(timer_id)) + deltimer(timer_id) + timer_id = TIMER_ID_NULL set_light_on(FALSE) update_appearance(UPDATE_ICON) -/obj/item/flashlight/glowstick/update_appearance(updates=ALL) - . = ..() - if(fuel <= 0) - set_light_on(FALSE) - return - if(light_on) - set_light_on(TRUE) - return - /obj/item/flashlight/glowstick/update_icon_state() . = ..() icon_state = "[base_icon_state][(fuel <= 0) ? "-empty" : ""]" @@ -807,6 +860,13 @@ glowstick_overlay.color = color . += glowstick_overlay +/obj/item/flashlight/glowstick/toggle_light(mob/user) + if(fuel <= 0) + return FALSE + if(light_on) + return FALSE + return ..() + /obj/item/flashlight/glowstick/attack_self(mob/user) if(fuel <= 0) balloon_alert(user, "glowstick is spent!") @@ -818,7 +878,7 @@ . = ..() if(.) user.visible_message(span_notice("[user] cracks and shakes [src]."), span_notice("You crack and shake [src], turning it on!")) - START_PROCESSING(SSobj, src) + turn_on() /obj/item/flashlight/glowstick/suicide_act(mob/living/carbon/human/user) if(!fuel) @@ -829,7 +889,7 @@ user.visible_message(span_suicide("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but [user.p_they()] don't have any!")) return SHAME user.visible_message(span_suicide("[user] is squirting [src]'s fluids into [user.p_their()] eyes! It looks like [user.p_theyre()] trying to commit suicide!")) - fuel = 0 + burn_loop(fuel) return FIRELOSS /obj/item/flashlight/glowstick/red @@ -862,7 +922,7 @@ icon_state = null light_system = OVERLAY_LIGHT light_range = 4 - light_power = 10 + light_power = 2 alpha = 0 plane = FLOOR_PLANE anchored = TRUE @@ -907,9 +967,6 @@ /obj/item/flashlight/eyelight name = "eyelight" desc = "This shouldn't exist outside of someone's head, how are you seeing this?" - light_system = OVERLAY_LIGHT - light_range = 15 - light_power = 1 obj_flags = CONDUCTS_ELECTRICITY item_flags = DROPDEL actions_types = list() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index a9046145168..026e560cc97 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -63,6 +63,15 @@ . = ..() diode = new /obj/item/stock_parts/micro_laser/ultra +/obj/item/laser_pointer/infinite_range + name = "infinite laser pointer" + desc = "Used to shine in the eyes of Cyborgs who need a bit of a push, this works through camera consoles." + max_range = INFINITE + +/obj/item/laser_pointer/infinite_range/Initialize(mapload) + . = ..() + diode = new /obj/item/stock_parts/servo/femto + /obj/item/laser_pointer/screwdriver_act(mob/living/user, obj/item/tool) if(diode) tool.play_tool_sound(src) @@ -193,16 +202,17 @@ to_chat(user, span_warning("Your fingers can't press the button!")) return - if(!IN_GIVEN_RANGE(target, user, max_range)) - to_chat(user, span_warning("\The [target] is too far away!")) - return - if(!(user in (view(max_range, target)))) //check if we are visible from the target's PoV - if(isnull(crystal_lens)) - to_chat(user, span_warning("You can't point with [src] through walls!")) - return - if(!((user.sight & SEE_OBJS) || (user.sight & SEE_MOBS))) //only let it work if we have xray or thermals. mesons don't count because they are easier to get. - to_chat(user, span_notice("You can't quite make out your target and you fail to shine at it.")) + if(max_range != INFINITE) + if(!IN_GIVEN_RANGE(target, user, max_range)) + to_chat(user, span_warning("\The [target] is too far away!")) return + if(!(user in (view(max_range, target)))) //check if we are visible from the target's PoV + if(isnull(crystal_lens)) + to_chat(user, span_warning("You can't point with [src] through walls!")) + return + if(!((user.sight & SEE_OBJS) || (user.sight & SEE_MOBS))) //only let it work if we have xray or thermals. mesons don't count because they are easier to get. + to_chat(user, span_notice("You can't quite make out your target and you fail to shine at it.")) + return add_fingerprint(user) @@ -251,7 +261,7 @@ //cameras: chance to EMP the camera else if(istype(target, /obj/machinery/camera)) var/obj/machinery/camera/target_camera = target - if(!target_camera.status && !target_camera.emped) + if(!target_camera.camera_enabled && !target_camera.emped) outmsg = span_notice("You point [src] at [target_camera], but it seems to be disabled.") else if(prob(effectchance * diode.rating)) target_camera.emp_act(EMP_HEAVY) diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm index 5b7fd42d6f6..e3faa678238 100644 --- a/code/game/objects/items/devices/polycircuit.dm +++ b/code/game/objects/items/devices/polycircuit.dm @@ -40,7 +40,7 @@ if("APC") circuit_type = /obj/item/electronics/apc to_chat(user, span_notice("You spot your circuit, and carefully attempt to remove it from [src], hold still!")) - if(do_after(user, 30, target = user)) + if(do_after(user, 3 SECONDS, target = user)) if(!src || QDELETED(src))//Sanity Check. return var/returned_circuit = new circuit_type(src) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 2a0a78c626a..1b000ea2f91 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -158,7 +158,7 @@ /// Drains power from the connected powernet, if any. /obj/item/powersink/proc/drain_power() - var/datum/powernet/PN = attached.powernet + var/datum/powernet/powernet = attached.powernet var/drained = 0 set_light(5) @@ -167,14 +167,11 @@ attached.add_delayedload(drained) // If tried to drain more than available on powernet, now look for APCs and drain their cells - for(var/obj/machinery/power/terminal/T in PN.nodes) - if(istype(T.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = T.master - if(A.operating && A.cell) - A.cell.charge = max(0, A.cell.charge - 50) - drained += 50 - if(A.charging == 2) // If the cell was full - A.charging = 1 // It's no longer full + for(var/obj/machinery/power/terminal/terminal in powernet.nodes) + if(istype(terminal.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/apc = terminal.master + if(apc.operating && apc.cell) + drained += 0.001 * apc.cell.use(50 KILO JOULES, force = TRUE) internal_heat += drained /obj/item/powersink/process() diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm index c12c030c928..abffdcca4d5 100644 --- a/code/game/objects/items/devices/quantum_keycard.dm +++ b/code/game/objects/items/devices/quantum_keycard.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/devices/tool.dmi' icon_state = "quantum_keycard_gags" greyscale_config = /datum/greyscale_config/quantum_keycard - greyscale_colors = "#FFFFFF" + greyscale_colors = COLOR_WHITE inhand_icon_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' @@ -44,7 +44,7 @@ if(!istype(user) || !user.can_perform_action(src, NEED_DEXTERITY)) return to_chat(user, span_notice("You start pressing [src]'s unlink button...")) - if(do_after(user, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) to_chat(user, span_notice("The keycard beeps twice and disconnects the quantum link.")) set_pad() diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 426e673437e..af19c6cd4f5 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -64,7 +64,7 @@ if(shock_cooldown) return shock_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, shock_cooldown, FALSE), 100) + addtimer(VARSET_CALLBACK(src, shock_cooldown, FALSE), 10 SECONDS) var/mob/living/L = loc step(L, pick(GLOB.cardinals)) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 7774902b83b..b7a96d777ef 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -188,7 +188,31 @@ greyscale_colors = "#24a157#dca01b" /obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI. - channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1) + channels = list( + RADIO_CHANNEL_COMMAND = 1, + RADIO_CHANNEL_SECURITY = 1, + RADIO_CHANNEL_ENGINEERING = 1, + RADIO_CHANNEL_SCIENCE = 1, + RADIO_CHANNEL_MEDICAL = 1, + RADIO_CHANNEL_SUPPLY = 1, + RADIO_CHANNEL_SERVICE = 1, + RADIO_CHANNEL_AI_PRIVATE = 1, + ) + +/obj/item/encryptionkey/ai_with_binary + name = "ai encryption key" + channels = list( + RADIO_CHANNEL_COMMAND = 1, + RADIO_CHANNEL_SECURITY = 1, + RADIO_CHANNEL_ENGINEERING = 1, + RADIO_CHANNEL_SCIENCE = 1, + RADIO_CHANNEL_MEDICAL = 1, + RADIO_CHANNEL_SUPPLY = 1, + RADIO_CHANNEL_SERVICE = 1, + RADIO_CHANNEL_AI_PRIVATE = 1, + ) + translate_binary = TRUE + translated_language = /datum/language/machine /obj/item/encryptionkey/ai/evil //ported from NT, this goes 'inside' the AI. name = "syndicate binary encryption key" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 08bf47dcc07..fff7b0a655a 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -117,6 +117,8 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/dropped(mob/user, silent) . = ..() + if(QDELETED(src)) //This can be called as a part of destroy + return for(var/language in language_list) user.remove_language(language, language_flags = UNDERSTOOD_LANGUAGE, source = LANGUAGE_RADIOKEY) @@ -250,6 +252,14 @@ GLOBAL_LIST_INIT(channel_tokens, list( 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 + /obj/item/radio/headset/heads/hos/alt name = "\proper the head of security's bowman headset" desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs." @@ -340,17 +350,25 @@ GLOBAL_LIST_INIT(channel_tokens, list( AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) /obj/item/radio/headset/silicon/pai - name = "\proper mini Integrated Subspace Transceiver " + name = "\proper mini Integrated Subspace Transceiver" subspace_transmission = FALSE /obj/item/radio/headset/silicon/ai - name = "\proper Integrated Subspace Transceiver " + name = "\proper Integrated Subspace Transceiver" keyslot2 = new /obj/item/encryptionkey/ai command = TRUE +/obj/item/radio/headset/silicon/human_ai + name = "\proper Disconnected Subspace Transceiver" + desc = "A headset that is rumored to be one day implanted into a brain in a jar directly." + icon_state = "rob_headset" + worn_icon_state = "rob_headset" + keyslot2 = new /obj/item/encryptionkey/ai_with_binary + command = TRUE + /obj/item/radio/headset/silicon/ai/evil - name = "\proper Evil Integrated Subspace Transceiver " + name = "\proper Evil Integrated Subspace Transceiver" keyslot2 = new /obj/item/encryptionkey/ai/evil command = FALSE diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 85a027935fd..ebcbc411592 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -120,6 +120,8 @@ slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ ) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + /obj/item/radio/Destroy() remove_radio_all(src) //Just to be sure QDEL_NULL(wires) @@ -127,6 +129,12 @@ QDEL_NULL(keyslot) return ..() +/obj/item/radio/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(broadcasting) //no broadcasting but it can still be used to send radio messages. + set_broadcasting(FALSE) + return COMSIG_SABOTEUR_SUCCESS + /obj/item/radio/proc/set_frequency(new_frequency) SEND_SIGNAL(src, COMSIG_RADIO_NEW_FREQUENCY, args) remove_radio(src, frequency) @@ -262,17 +270,29 @@ /obj/item/radio/talk_into(atom/movable/talking_movable, message, channel, list/spans, datum/language/language, list/message_mods) if(SEND_SIGNAL(talking_movable, COMSIG_MOVABLE_USING_RADIO, src) & COMPONENT_CANNOT_USE_RADIO) - return + return NONE if(SEND_SIGNAL(src, COMSIG_RADIO_NEW_MESSAGE, talking_movable, message, channel) & COMPONENT_CANNOT_USE_RADIO) - return + return NONE if(!spans) spans = list(talking_movable.speech_span) if(!language) language = talking_movable.get_selected_language() - INVOKE_ASYNC(src, PROC_REF(talk_into_impl), talking_movable, message, channel, spans.Copy(), language, message_mods) + INVOKE_ASYNC(src, PROC_REF(talk_into_impl), talking_movable, message, channel, LAZYLISTDUPLICATE(spans), language, LAZYLISTDUPLICATE(message_mods)) return ITALICS | REDUCE_RANGE +/** + * Handles talking into the radio + * + * Unlike most speech related procs, spans and message_mods are not guaranteed to be lists + * + * * talking_movable - the atom that is talking + * * message - the message to be spoken + * * channel - the channel to be spoken on + * * spans - the spans to be used, lazylist + * * language - the language to be spoken in. (Should) never be null + * * message_mods - the message mods to be used, lazylist + */ /obj/item/radio/proc/talk_into_impl(atom/movable/talking_movable, message, channel, list/spans, datum/language/language, list/message_mods) if(!on) return // the device has to be on @@ -343,7 +363,7 @@ // Non-subspace radios will check in a couple of seconds, and if the signal // was never received, send a mundane broadcast (no headsets). - addtimer(CALLBACK(src, PROC_REF(backup_transmission), signal), 20) + addtimer(CALLBACK(src, PROC_REF(backup_transmission), signal), 2 SECONDS) /obj/item/radio/proc/backup_transmission(datum/signal/subspace/vocal/signal) var/turf/T = get_turf(src) @@ -358,9 +378,9 @@ /obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) . = ..() - if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range) + if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range || message_mods[MODE_RELAY]) return - var/filtered_mods = list() + var/list/filtered_mods = list() if (message_mods[MODE_SING]) filtered_mods[MODE_SING] = message_mods[MODE_SING] @@ -523,7 +543,7 @@ for (var/ch_name in channels) channels[ch_name] = 0 set_on(FALSE) - addtimer(CALLBACK(src, PROC_REF(end_emp_effect), curremp), 200) + addtimer(CALLBACK(src, PROC_REF(end_emp_effect), curremp), 20 SECONDS) /obj/item/radio/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] starts bouncing [src] off [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 72383cabc8a..2b4d09fb308 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -207,8 +207,8 @@ message += span_notice("Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") message += span_notice("Volume: [volume] L") message += span_notice("Pressure: [round(pressure, 0.01)] kPa") - message += span_notice("Heat Capacity: [display_joules(heat_capacity)] / K") - message += span_notice("Thermal Energy: [display_joules(thermal_energy)]") + message += span_notice("Heat Capacity: [display_energy(heat_capacity)] / K") + message += span_notice("Thermal Energy: [display_energy(thermal_energy)]") else message += airs.len > 1 ? span_notice("This node is empty!") : span_notice("[target] is empty!") message += span_notice("Volume: [volume] L") // don't want to change the order volume appears in, suck it diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index dac9f60b5ba..0e9e4f193bc 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -33,7 +33,8 @@ /obj/item/healthanalyzer/examine(mob/user) . = ..() - . += span_notice("Alt-click [src] to toggle the limb damage readout.") + if(src.mode != SCANNER_NO_MODE) + . += span_notice("Alt-click [src] to toggle the limb damage readout.") /obj/item/healthanalyzer/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!")) diff --git a/code/game/objects/items/devices/scanners/sequence_scanner.dm b/code/game/objects/items/devices/scanners/sequence_scanner.dm index 4a80179f60e..3d212cbb771 100644 --- a/code/game/objects/items/devices/scanners/sequence_scanner.dm +++ b/code/game/objects/items/devices/scanners/sequence_scanner.dm @@ -55,7 +55,7 @@ //no scanning if its a husk, DNA-less Species or DNA that isn't able to be copied by a changeling/disease if (!HAS_TRAIT(interacting_with, TRAIT_GENELESS) && !HAS_TRAIT(interacting_with, TRAIT_BADDNA) && !HAS_TRAIT(interacting_with, TRAIT_NO_DNA_COPY)) user.visible_message(span_warning("[user] is scanning [interacting_with]'s genetic makeup.")) - if(!do_after(user, 3 SECONDS)) + if(!do_after(user, 3 SECONDS, interacting_with)) balloon_alert(user, "scan failed!") user.visible_message(span_warning("[user] fails to scan [interacting_with]'s genetic makeup.")) return ITEM_INTERACT_BLOCKING diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm index 90da09e16e9..ee8567ac6cc 100644 --- a/code/game/objects/items/devices/scanners/slime_scanner.dm +++ b/code/game/objects/items/devices/scanners/slime_scanner.dm @@ -21,18 +21,18 @@ if (!isslime(interacting_with)) to_chat(user, span_warning("This device can only scan slimes!")) return ITEM_INTERACT_BLOCKING - var/mob/living/simple_animal/slime/scanned_slime = interacting_with + var/mob/living/basic/slime/scanned_slime = interacting_with slime_scan(scanned_slime, user) return ITEM_INTERACT_SUCCESS -/proc/slime_scan(mob/living/simple_animal/slime/scanned_slime, mob/living/user) +/proc/slime_scan(mob/living/basic/slime/scanned_slime, mob/living/user) var/to_render = "Slime scan results:\ \n[span_notice("[scanned_slime.slime_type.colour] [scanned_slime.life_stage] slime")]\ - \nNutrition: [scanned_slime.nutrition]/[scanned_slime.max_nutrition]" + \nNutrition: [scanned_slime.nutrition]/[SLIME_MAX_NUTRITION]" - if (scanned_slime.nutrition < scanned_slime.starve_nutrition) + if (scanned_slime.nutrition < SLIME_STARVE_NUTRITION) to_render += "\n[span_warning("Warning: slime is starving!")]" - else if (scanned_slime.nutrition < scanned_slime.hunger_nutrition) + else if (scanned_slime.nutrition < SLIME_HUNGER_NUTRITION) to_render += "\n[span_warning("Warning: slime is hungry")]" to_render += "\nElectric charge strength: [scanned_slime.powerlevel]\nHealth: [round(scanned_slime.health/scanned_slime.maxHealth,0.01)*100]%" diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm index 33754527c8f..8be7666bf96 100644 --- a/code/game/objects/items/devices/spyglasses.dm +++ b/code/game/objects/items/devices/spyglasses.dm @@ -87,7 +87,7 @@ /obj/item/paper/fluff/nerddocs name = "Espionage For Dummies" - color = "#FFFF00" + color = COLOR_YELLOW desc = "An eye gougingly yellow pamphlet with a badly designed image of a detective on it. the subtext says \" The Latest way to violate privacy guidelines!\" " default_raw_text = @{" diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index ed0f632b381..e7a749fc978 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -61,7 +61,7 @@ var/mob/holder = linked_swapper.loc to_chat(holder, span_notice("[linked_swapper] starts buzzing.")) next_use = world.time + cooldown //only the one used goes on cooldown - addtimer(CALLBACK(src, PROC_REF(swap), user), 25) + addtimer(CALLBACK(src, PROC_REF(swap), user), 2.5 SECONDS) /obj/item/swapper/examine(mob/user) . = ..() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 985d2761a02..c686eeb04a7 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -159,6 +159,9 @@ /obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), message_range) . = ..() + if(message_mods[MODE_RELAY]) + return + if(mytape && recording) mytape.timestamp += mytape.used_capacity mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss")]\] [raw_message]" diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 3515e7f52c3..8e8f2578fa4 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -202,9 +202,104 @@ effective or pretty fucking useless. target = round(target) wavelength = clamp(target, 0, 120) +/datum/action/item_action/stealth_mode + name = "Toggle Stealth" + desc = "Makes you invisible to the naked eye." + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "ninja_cloak" + /// Whether stealth is active or not + var/stealth_engaged = FALSE + /// The amount of time the stealth mode can be active for, drains to 0 when active + var/charge = 30 SECONDS + /// The maximum amount of time the stealth mode can be active for + var/max_charge = 30 SECONDS + /// The minimum alpha value for the stealth mode + var/min_alpha = 0 + /// Whether the stealth mode recharges while active + /// if TRUE standing in darkness will recharge even while active + /// if FALSE it will not uncharge, but not recharge while in darkness + var/recharge_while_active = TRUE + +/datum/action/item_action/stealth_mode/is_action_active(atom/movable/screen/movable/action_button/current_button) + return stealth_engaged + +/datum/action/item_action/stealth_mode/Grant(mob/grant_to) + . = ..() + START_PROCESSING(SSobj, src) + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/datum/action/item_action/stealth_mode/Remove(mob/remove_from) + if(!isnull(owner) && stealth_engaged) + stealth_off() + STOP_PROCESSING(SSobj, src) + return ..() + +/datum/action/item_action/stealth_mode/Trigger(trigger_flags) + . = ..() + if(!.) + return + + if(stealth_engaged) + stealth_off() + else + stealth_on() + +/datum/action/item_action/stealth_mode/proc/stealth_on() + animate(owner, alpha = get_alpha(), time = 0.5 SECONDS) + apply_wibbly_filters(owner) + stealth_engaged = TRUE + build_all_button_icons(UPDATE_BUTTON_STATUS|UPDATE_BUTTON_BACKGROUND) + owner.balloon_alert(owner, "stealth mode engaged") + +/datum/action/item_action/stealth_mode/proc/stealth_off() + owner.alpha = initial(owner.alpha) + remove_wibbly_filters(owner) + stealth_engaged = FALSE + build_all_button_icons(UPDATE_BUTTON_STATUS|UPDATE_BUTTON_BACKGROUND) + owner.balloon_alert(owner, "stealth mode disengaged") + +/datum/action/item_action/stealth_mode/proc/get_alpha() + return clamp(255 - (255 * charge / max_charge), min_alpha, 255) + +/datum/action/item_action/stealth_mode/process(seconds_per_tick) + if(!stealth_engaged) + // Recharge over time + charge = min(max_charge, charge + (max_charge * 0.04) * seconds_per_tick) + build_all_button_icons(UPDATE_BUTTON_STATUS) + return + + if(charge <= 0) + stealth_off() + return + + var/turf/our_turf = get_turf(owner) + var/lumcount = our_turf?.get_lumcount() || 0 + if(lumcount > 0.3) + // Decay charge while invisible+ in the light + charge = max(0, charge - (max_charge * 0.05) * seconds_per_tick) + build_all_button_icons(UPDATE_BUTTON_STATUS) + + else if(recharge_while_active) + // Return charage while invisible + in the darkness + recharge_while_active + charge = min(max_charge, charge + (max_charge * 0.1) * seconds_per_tick) + build_all_button_icons(UPDATE_BUTTON_STATUS) + + animate(owner, alpha = get_alpha(), time = 1 SECONDS, flags = ANIMATION_PARALLEL) + +/datum/action/item_action/stealth_mode/update_button_status(atom/movable/screen/movable/action_button/current_button, force) + . = ..() + current_button.maptext_x = 9 + current_button.maptext = MAPTEXT_TINY_UNICODE("[round(charge / max_charge * 100, 0.01)]%") + +/datum/action/item_action/stealth_mode/weaker + charge = 15 SECONDS + max_charge = 15 SECONDS + min_alpha = 20 + recharge_while_active = FALSE + /obj/item/shadowcloak name = "cloaker belt" - desc = "Makes you invisible for short periods of time. Recharges in darkness." + desc = "Makes you invisible for short periods of time. Recharges in darkness, even while active." icon = 'icons/obj/clothing/belts.dmi' icon_state = "utility" inhand_icon_state = "utility" @@ -214,66 +309,16 @@ effective or pretty fucking useless. slot_flags = ITEM_SLOT_BELT attack_verb_continuous = list("whips", "lashes", "disciplines") attack_verb_simple = list("whip", "lash", "discipline") - - var/mob/living/carbon/human/user = null - var/charge = 300 - var/max_charge = 300 - var/on = FALSE - actions_types = list(/datum/action/item_action/toggle) - -/obj/item/shadowcloak/ui_action_click(mob/user) - if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) - if(!on) - Activate(usr) - - else - Deactivate() - - return + actions_types = list(/datum/action/item_action/stealth_mode) /obj/item/shadowcloak/item_action_slot_check(slot, mob/user) - if(slot & ITEM_SLOT_BELT) - return 1 + return slot & slot_flags -/obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user) - if(!user) - return - - to_chat(user, span_notice("You activate [src].")) - src.user = user - START_PROCESSING(SSobj, src) - on = TRUE - -/obj/item/shadowcloak/proc/Deactivate() - to_chat(user, span_notice("You deactivate [src].")) - STOP_PROCESSING(SSobj, src) - if(user) - user.alpha = initial(user.alpha) - - on = FALSE - user = null - -/obj/item/shadowcloak/dropped(mob/user) - ..() - if(user && user.get_item_by_slot(ITEM_SLOT_BELT) != src) - Deactivate() - -/obj/item/shadowcloak/process(seconds_per_tick) - if(user.get_item_by_slot(ITEM_SLOT_BELT) != src) - Deactivate() - return - - var/turf/T = get_turf(src) - if(on) - var/lumcount = T.get_lumcount() - - if(lumcount > 0.3) - charge = max(0, charge - 12.5 * seconds_per_tick)//Quick decrease in light - - else - charge = min(max_charge, charge + 25 * seconds_per_tick) //Charge in the dark - - animate(user,alpha = clamp(255 - charge,0,255),time = 10) +/obj/item/shadowcloak/weaker + name = "stealth belt" + desc = "Makes you nigh-invisible to the naked eye for a short period of time. \ + Lasts indefinitely in darkness, but will not recharge unless inactive." + actions_types = list(/datum/action/item_action/stealth_mode/weaker) /// Checks if a given atom is in range of a radio jammer, returns TRUE if it is. /proc/is_within_radio_jammer_range(atom/source) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 2ef6c4e7aa8..01ff7eb5f08 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -71,6 +71,66 @@ result = roll(sides) update_appearance() +/obj/item/dice/attack_self(mob/user) + diceroll(user, in_hand = TRUE) + +/obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + var/mob/thrown_by = thrownby?.resolve() + if(thrown_by) + diceroll(thrown_by) + return ..() + +/obj/item/dice/proc/diceroll(mob/user, in_hand=FALSE) + result = roll(sides) + if(rigged != DICE_NOT_RIGGED && result != rigged_value) + if(rigged == DICE_BASICALLY_RIGGED && prob(clamp(1/(sides - 1) * 100, 25, 80))) + result = rigged_value + else if(rigged == DICE_TOTALLY_RIGGED) + result = rigged_value + + . = result + + var/fake_result = roll(sides)//Daredevil isn't as good as he used to be + var/comment = "" + if(sides > MIN_SIDES_ALERT && result == 1) // less comment spam + comment = "Ouch, bad luck." + if(sides == 20 && result == 20) + comment = "NAT 20!" + update_appearance() + result = manipulate_result(result) + if(special_faces.len == sides) + comment = "" // its not a number + result = special_faces[result] + if(!ISINTEGER(result)) + comment = special_faces[result] // should be a str now + + if(in_hand) //Dice was rolled in someone's hand + user.visible_message( + span_notice("[user] rolls [src]. It lands on [result]. [comment]"), + span_notice("You roll [src]. It lands on [result]. [comment]"), + span_hear("You hear [src] rolling, it sounds like a [fake_result]."), + ) + else + visible_message(span_notice("[src] rolls to a stop, landing on [result]. [comment]")) + + return . + + +/obj/item/dice/update_overlays() + . = ..() + . += "[icon_state]-[result]" + +/obj/item/dice/microwave_act(obj/machinery/microwave/microwave_source, mob/microwaver, randomize_pixel_offset) + if(microwave_riggable) + rigged = DICE_BASICALLY_RIGGED + rigged_value = result + + return ..() | COMPONENT_MICROWAVE_SUCCESS + +/// A proc to modify the displayed result. (Does not affect what the icon_state is passed.) +/obj/item/dice/proc/manipulate_result(original) + return original + /obj/item/dice/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS @@ -214,61 +274,6 @@ AddElement(/datum/element/update_icon_blocker) return ..() -/obj/item/dice/attack_self(mob/user) - diceroll(user) - -/obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - var/mob/thrown_by = thrownby?.resolve() - if(thrown_by) - diceroll(thrown_by) - return ..() - -/obj/item/dice/proc/diceroll(mob/user) - result = roll(sides) - if(rigged != DICE_NOT_RIGGED && result != rigged_value) - if(rigged == DICE_BASICALLY_RIGGED && prob(clamp(1/(sides - 1) * 100, 25, 80))) - result = rigged_value - else if(rigged == DICE_TOTALLY_RIGGED) - result = rigged_value - - . = result - - var/fake_result = roll(sides)//Daredevil isn't as good as he used to be - var/comment = "" - if(sides > MIN_SIDES_ALERT && result == 1) // less comment spam - comment = "Ouch, bad luck." - if(sides == 20 && result == 20) - comment = "NAT 20!" // maint wanted this hardcoded to nat20 don't blame me - update_appearance() - result = manipulate_result(result) - if(special_faces.len == sides) - comment = "" // its not a number - result = special_faces[result] - if(!ISINTEGER(result)) - comment = special_faces[result] // should be a str now - - if(user != null) //Dice was rolled in someone's hand - user.visible_message(span_notice("[user] throws [src]. It lands on [result]. [comment]"), \ - span_notice("You throw [src]. It lands on [result]. [comment]"), \ - span_hear("You hear [src] rolling, it sounds like a [fake_result].")) - else if(!src.throwing) //Dice was thrown and is coming to rest - visible_message(span_notice("[src] rolls to a stop, landing on [result]. [comment]")) - -/obj/item/dice/update_overlays() - . = ..() - . += "[icon_state]-[result]" - -/obj/item/dice/microwave_act(obj/machinery/microwave/microwave_source, mob/microwaver, randomize_pixel_offset) - if(microwave_riggable) - rigged = DICE_BASICALLY_RIGGED - rigged_value = result - - return ..() | COMPONENT_MICROWAVE_SUCCESS - -/// A proc to modify the displayed result. (Does not affect what the icon_state is passed.) -/obj/item/dice/proc/manipulate_result(original) - return original - // Die of fate stuff /obj/item/dice/d20/fate name = "\improper Die of Fate" @@ -309,7 +314,7 @@ /obj/item/dice/d20/fate/stealth/cursed/one_use reusable = FALSE -/obj/item/dice/d20/fate/diceroll(mob/user) +/obj/item/dice/d20/fate/diceroll(mob/user, in_hand=FALSE) if(!COOLDOWN_FINISHED(src, roll_cd)) to_chat(user, span_warning("Hold on, [src] isn't caught up with your last roll!")) return @@ -431,11 +436,10 @@ var/mob/living/carbon/human/human_servant = new(drop_location()) do_smoke(0, holder = src, location = drop_location()) - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as [user.real_name]'s Servant?", check_jobban = ROLE_WIZARD, role = ROLE_WIZARD, poll_time = 5 SECONDS, target_mob = human_servant, pic_source = user, role_name_text = "dice servant") - if(LAZYLEN(candidates)) - var/mob/dead/observer/candidate = pick(candidates) - message_admins("[ADMIN_LOOKUPFLW(candidate)] was spawned as Dice Servant") - human_servant.key = candidate.key + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_danger("[user.real_name]'s")] [span_notice("Servant")]?", check_jobban = ROLE_WIZARD, role = ROLE_WIZARD, poll_time = 5 SECONDS, checked_target = human_servant, alert_pic = user, role_name_text = "dice servant") + if(chosen_one) + message_admins("[ADMIN_LOOKUPFLW(chosen_one)] was spawned as Dice Servant") + human_servant.key = chosen_one.key human_servant.equipOutfit(/datum/outfit/butler) var/datum/mind/servant_mind = new /datum/mind() diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm index 6c9651a3142..6f9944bc949 100644 --- a/code/game/objects/items/dna_probe.dm +++ b/code/game/objects/items/dna_probe.dm @@ -114,8 +114,7 @@ /obj/item/dna_probe/carp_scanner/examine_more(mob/user) . = ..() - if(IS_TRAITOR(user)) - . = list(span_notice("Using this on a Space Carp will harvest its DNA. Use it in-hand once complete to mutate it with yourself.")) + . = list(span_notice("Using this on a Space Carp will harvest its DNA. Use it in-hand once complete to mutate it with yourself.")) /obj/item/dna_probe/carp_scanner/scan_dna(atom/target, mob/user) if(istype(target, /mob/living/basic/carp)) @@ -127,8 +126,6 @@ /obj/item/dna_probe/carp_scanner/attack_self(mob/user, modifiers) . = ..() - if(!is_special_character(user)) - return if(!carp_dna_loaded) to_chat(user, span_notice("Space carp DNA is required to use the self-mutation mechanism!")) return @@ -136,7 +133,7 @@ if(!do_after(user, CARP_MIX_DNA_TIMER)) return var/mob/living/basic/space_dragon/new_dragon = user.change_mob_type(/mob/living/basic/space_dragon, location = loc, delete_old_mob = TRUE) - new_dragon.add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5)) + new_dragon.add_filter("anger_glow", 3, list("type" = "outline", "color" = COLOR_CARP_RIFT_RED, "size" = 5)) new_dragon.add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage) priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert") qdel(src) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index b571688f1a8..0b2daeb655d 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -124,6 +124,7 @@ tanktype = /obj/structure/reagent_dispensers/foamtank sprite_name = "foam_extinguisher" precision = TRUE + max_water = 100 /obj/item/extinguisher/advanced/empty starting_water = FALSE @@ -215,7 +216,7 @@ if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) var/obj/B = user.buckled var/movementdirection = REVERSE_DIR(direction) - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/extinguisher, move_chair), B, movementdirection), 1) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/extinguisher, move_chair), B, movementdirection), 0.1 SECONDS) else user.newtonian_move(REVERSE_DIR(direction)) @@ -279,13 +280,8 @@ /obj/item/extinguisher/proc/EmptyExtinguisher(mob/user) if(loc == user && reagents.total_volume) + reagents.expose(user.loc, TOUCH) reagents.clear_reagents() - - var/turf/T = get_turf(loc) - if(isopenturf(T)) - var/turf/open/theturf = T - theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) - 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 @@ -297,3 +293,10 @@ user.put_in_hands(new /obj/item/bot_assembly/firebot) else ..() + +/obj/item/extinguisher/anti + name = "fire extender" + desc = "A traditional red fire extinguisher. Made in Britain... wait, what?" + chem = /datum/reagent/fuel + tanktype = /obj/structure/reagent_dispensers/fueltank + cooling_power = 0 diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 1a31c5d58a2..346b8597533 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -16,6 +16,9 @@ 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 var/status = FALSE var/lit = FALSE //on or off @@ -82,12 +85,13 @@ return // too close 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...")) + log_combat(user, target, "attempted to flamethrower", src, "with gas mixture: {[print_gas_mixture(ptank.return_analyzable_air())]}, flamethrower: \"[name]\" ([src]), igniter: \"[igniter.name]\", tank: \"[ptank.name]\" and tank distribution pressure: \"[siunit(1000 * ptank.distribute_pressure, unit = "Pa", maxdecimals = 9)]\"" + (lit ? " while lit" : "" + " but failed due to pacifism.")) return 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 = get_line(user, target_turf) - log_combat(user, target, "flamethrowered", src) + log_combat(user, target, "flamethrowered", src, "with gas mixture: {[print_gas_mixture(ptank.return_analyzable_air())]}, flamethrower: \"[name]\", igniter: \"[igniter.name]\", tank: \"[ptank.name]\" and tank distribution pressure: \"[siunit(1000 * ptank.distribute_pressure, unit = "Pa", maxdecimals = 9)]\"" + (lit ? " while lit." : ".")) flame_turf(turflist) /obj/item/flamethrower/wrench_act(mob/living/user, obj/item/tool) diff --git a/code/game/objects/items/food/bait.dm b/code/game/objects/items/food/bait.dm index aa9a0e7bd9e..047a8a7cd58 100644 --- a/code/game/objects/items/food/bait.dm +++ b/code/game/objects/items/food/bait.dm @@ -36,9 +36,8 @@ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' inhand_icon_state = "pen" - food_reagents = list(/datum/reagent/drug/kronkaine = 1) + food_reagents = list(/datum/reagent/drug/kronkaine = 2) //The kronkaine is the thing that makes this a great bait. tastes = list("hypocrisy" = 1) - bait_quality = TRAIT_GREAT_QUALITY_BAIT /obj/item/food/bait/doughball name = "doughball" diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index ba1845bb40d..0f95aac6d85 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -481,6 +481,7 @@ foodtypes = GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_2 + custom_price = PAYCHECK_CREW /obj/item/food/butterdog/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/food/dough.dm b/code/game/objects/items/food/dough.dm index 6ca618bc6e0..283cd347f55 100644 --- a/code/game/objects/items/food/dough.dm +++ b/code/game/objects/items/food/dough.dm @@ -46,7 +46,7 @@ /obj/item/food/pizzabread/Initialize(mapload) . = ..() - AddComponent(/datum/component/customizable_reagent_holder, /obj/item/food/pizza/margherita, CUSTOM_INGREDIENT_ICON_SCATTER, max_ingredients = 12) + AddComponent(/datum/component/customizable_reagent_holder, /obj/item/food/pizza, CUSTOM_INGREDIENT_ICON_SCATTER, max_ingredients = 12) /obj/item/food/doughslice name = "dough slice" diff --git a/code/game/objects/items/food/frozen.dm b/code/game/objects/items/food/frozen.dm index 0bd0cd3a606..27052507bfd 100644 --- a/code/game/objects/items/food/frozen.dm +++ b/code/game/objects/items/food/frozen.dm @@ -12,6 +12,7 @@ foodtypes = GRAIN | DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD crafting_complexity = FOOD_COMPLEXITY_2 + crafted_food_buff = /datum/status_effect/food/chilling /obj/item/food/strawberryicecreamsandwich name = "strawberry ice cream sandwich" @@ -27,7 +28,7 @@ foodtypes = FRUIT | DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD crafting_complexity = FOOD_COMPLEXITY_3 - + crafted_food_buff = /datum/status_effect/food/chilling /obj/item/food/spacefreezy name = "space freezy" @@ -43,6 +44,7 @@ tastes = list("blue cherries" = 2, "ice cream" = 2) foodtypes = FRUIT | DAIRY | SUGAR crafting_complexity = FOOD_COMPLEXITY_3 + crafted_food_buff = /datum/status_effect/food/chilling /obj/item/food/spacefreezy/make_edible() . = ..() @@ -62,6 +64,7 @@ tastes = list("ice cream" = 1, "banana" = 1) foodtypes = FRUIT | DAIRY | SUGAR crafting_complexity = FOOD_COMPLEXITY_3 + crafted_food_buff = /datum/status_effect/food/chilling /obj/item/food/sundae/make_edible() . = ..() @@ -81,6 +84,7 @@ tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1) foodtypes = FRUIT | DAIRY | SUGAR crafting_complexity = FOOD_COMPLEXITY_4 + crafted_food_buff = /datum/status_effect/food/chilling /obj/item/food/honkdae/make_edible() . = ..() @@ -104,6 +108,7 @@ foodtypes = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit food_flags = FOOD_FINGER_FOOD crafting_complexity = FOOD_COMPLEXITY_2 + crafted_food_buff = /datum/status_effect/food/chilling /obj/item/food/snowcones/lime name = "lime snowcone" @@ -330,6 +335,7 @@ foodtypes = DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD crafting_complexity = FOOD_COMPLEXITY_3 + crafted_food_buff = /datum/status_effect/food/chilling var/overlay_state = "creamsicle_o" //This is the edible part of the popsicle. var/bite_states = 4 //This value value is used for correctly setting the bite_consumption to ensure every bite changes the sprite. Do not set to zero. @@ -434,6 +440,7 @@ foodtypes = DAIRY | SUGAR venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_3 + crafted_food_buff = /datum/status_effect/food/chilling /obj/item/food/popsicle/meatsicle name = "Meatsicle" diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm index 5f7092c64db..47b5ff75109 100644 --- a/code/game/objects/items/food/lizard.dm +++ b/code/game/objects/items/food/lizard.dm @@ -34,6 +34,7 @@ foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_2 + custom_price = PAYCHECK_CREW /obj/item/food/raw_headcheese name = "raw headcheese block" @@ -494,6 +495,7 @@ //Pizza Dishes /obj/item/food/pizza/flatbread icon = 'icons/obj/food/lizard.dmi' + icon_state = null slice_type = null /obj/item/food/pizza/flatbread/rustic diff --git a/code/game/objects/items/food/martian.dm b/code/game/objects/items/food/martian.dm index 2441ac0f674..7ceaf187817 100644 --- a/code/game/objects/items/food/martian.dm +++ b/code/game/objects/items/food/martian.dm @@ -732,6 +732,7 @@ foodtypes = MEAT | VEGETABLES | FRUIT | PINEAPPLE w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_4 + custom_price = PAYCHECK_CREW * 1.2 /obj/item/food/salt_chilli_fries name = "salt n' chilli fries" @@ -1210,6 +1211,7 @@ foodtypes = FRUIT | MEAT | PINEAPPLE | VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_4 //Uses Sambal + custom_price = PAYCHECK_CREW * 2 /obj/item/food/frickles name = "frickles" diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index b9a6c34df04..537c7688d2d 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -554,6 +554,7 @@ w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP crafting_complexity = FOOD_COMPLEXITY_2 + custom_price = PAYCHECK_CREW * 0.6 /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") @@ -734,6 +735,7 @@ foodtypes = MEAT | DAIRY | GRAIN w_class = WEIGHT_CLASS_TINY crafting_complexity = FOOD_COMPLEXITY_3 + custom_price = PAYCHECK_CREW /obj/item/food/bbqribs name = "bbq ribs" @@ -750,19 +752,6 @@ foodtypes = MEAT | SUGAR crafting_complexity = FOOD_COMPLEXITY_2 -///Special private component to handle how bbq is grilled, not meant to be used anywhere else -/datum/component/grillable/bbq - -/datum/component/grillable/bbq/finish_grilling(atom/grill_source) - //when on a grill allow it to roast without deleting itself - if(istype(grill_source, /obj/machinery/grill)) - grill_source.visible_message(span_notice("[parent] is grilled to perfection!")) - else //when on a girddle allow it to burn into an mouldy mess - return ..() - -/obj/item/food/bbqribs/make_grillable() - AddComponent(/datum/component/grillable/bbq, /obj/item/food/badrecipe, rand(30 SECONDS, 40 SECONDS), FALSE) - /obj/item/food/meatclown name = "meat clown" desc = "A delicious, round piece of meat clown. How horrifying." diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm index c1b5a6a186f..7816fb0e83a 100644 --- a/code/game/objects/items/food/meatslab.dm +++ b/code/game/objects/items/food/meatslab.dm @@ -39,7 +39,7 @@ tastes = list("meat" = 1) foodtypes = MEAT | RAW ///Legacy code, handles the coloring of the overlay of the cutlets made from this. - var/slab_color = "#FF0000" + var/slab_color = COLOR_RED /obj/item/food/meat/slab/Initialize(mapload) diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index 277e6efaff8..e1449007b71 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -77,6 +77,10 @@ w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_2 +/obj/item/food/waffles/make_edible() + . = ..() + AddComponent(/datum/component/ice_cream_holder, max_scoops = 1, x_offset = -2) + /obj/item/food/soylentgreen name = "\improper Soylent Green" desc = "Not made of people. Honest." //Totally people. @@ -123,6 +127,10 @@ w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_3 +/obj/item/food/rofflewaffles/make_edible() + . = ..() + AddComponent(/datum/component/ice_cream_holder, max_scoops = 1, x_offset = -2) + ////////////////////////////////////////////OTHER//////////////////////////////////////////// /obj/item/food/cookie @@ -356,7 +364,7 @@ bite_consumption = 4 foodtypes = DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD - crafting_complexity = FOOD_COMPLEXITY_3 + crafting_complexity = FOOD_COMPLEXITY_2 max_volume = 10 //The max volumes scales up with the number of scoops of ice cream served. /// These two variables are used by the ice cream vat. Latter is the one that shows on the UI. var/list/ingredients = list( @@ -371,14 +379,10 @@ */ var/list/prefill_flavours -/obj/item/food/icecream/New(loc, list/prefill_flavours) +/obj/item/food/icecream/Initialize(mapload, list/prefill_flavours) if(ingredients) ingredients_text = "Requires: [reagent_paths_list_to_text(ingredients)]" - return ..() - -/obj/item/food/icecream/Initialize(mapload, list/prefill_flavours) - if(prefill_flavours) - src.prefill_flavours = prefill_flavours + src.prefill_flavours = prefill_flavours return ..() /obj/item/food/icecream/make_edible() @@ -398,7 +402,6 @@ /datum/reagent/consumable/sugar, /datum/reagent/consumable/coco, ) - crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/icecream/korta name = "korta cone" diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm index b93cd7ed721..834484872d6 100644 --- a/code/game/objects/items/food/pizza.dm +++ b/code/game/objects/items/food/pizza.dm @@ -1,25 +1,28 @@ // Pizza (Whole) /obj/item/food/pizza + name = "pizza" icon = 'icons/obj/food/pizza.dmi' w_class = WEIGHT_CLASS_NORMAL max_volume = 80 + icon_state = "pizzamargherita" food_reagents = list( /datum/reagent/consumable/nutriment = 28, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5, ) - tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) - foodtypes = GRAIN | DAIRY | VEGETABLES + tastes = list("crust" = 1, "tomato" = 1) + foodtypes = GRAIN venue_value = FOOD_PRICE_CHEAP crafting_complexity = FOOD_COMPLEXITY_2 /// type is spawned 6 at a time and replaces this pizza when processed by cutting tool var/obj/item/food/pizzaslice/slice_type + slice_type = /obj/item/food/pizzaslice ///What label pizza boxes use if this pizza spawns in them. var/boxtag = "" /obj/item/food/pizza/raw - foodtypes = GRAIN | DAIRY | VEGETABLES | RAW + foodtypes = GRAIN | RAW slice_type = null crafting_complexity = FOOD_COMPLEXITY_2 @@ -34,9 +37,11 @@ // Pizza Slice /obj/item/food/pizzaslice + name = "pizza slice" icon = 'icons/obj/food/pizza.dmi' food_reagents = list(/datum/reagent/consumable/nutriment = 5) - foodtypes = GRAIN | DAIRY | VEGETABLES + icon_state = "pizzamargheritaslice" + foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL decomp_type = /obj/item/food/pizzaslice/moldy crafting_complexity = FOOD_COMPLEXITY_2 diff --git a/code/game/objects/items/food/sandwichtoast.dm b/code/game/objects/items/food/sandwichtoast.dm index c6488f67a1e..e440a1039e6 100644 --- a/code/game/objects/items/food/sandwichtoast.dm +++ b/code/game/objects/items/food/sandwichtoast.dm @@ -152,6 +152,7 @@ w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP crafting_complexity = FOOD_COMPLEXITY_3 + custom_price = PAYCHECK_CREW * 0.7 // Used for unit tests, do not delete /obj/item/food/hotdog/debug @@ -174,6 +175,7 @@ w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_4 + custom_price = PAYCHECK_CREW /obj/item/food/sandwich/blt name = "\improper BLT" diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index bb1cade96b8..4c737ed53f3 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -22,6 +22,8 @@ var/dud_flags = NONE ///Is this grenade currently armed? var/active = FALSE + ///Is it a cluster grenade? We dont wanna spam admin logs with these. + var/type_cluster = FALSE ///How long it takes for a grenade to explode after being armed var/det_time = 5 SECONDS ///Will this state what it's det_time is when examined? @@ -61,11 +63,9 @@ sleep(det_time)//so you dont die instantly return dud_flags ? SHAME : BRUTELOSS -/obj/item/grenade/deconstruct(disassembled = TRUE) +/obj/item/grenade/atom_deconstruct(disassembled = TRUE) if(!disassembled) detonate() - if(!QDELETED(src)) - qdel(src) /obj/item/grenade/apply_fantasy_bonuses(bonus) . = ..() @@ -135,7 +135,8 @@ arm_grenade(user) /obj/item/grenade/proc/log_grenade(mob/user) - log_bomber(user, "has primed a", src, "for detonation", message_admins = !dud_flags) + if(!type_cluster) + log_bomber(user, "has primed a", src, "for detonation", message_admins = dud_flags != NONE) /** * arm_grenade (formerly preprime) refers to when a grenade with a standard time fuze is activated, making it go beepbeepbeep and then detonate a few seconds later. diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index e4862919c1c..b27285e0786 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -95,6 +95,7 @@ var/obj/item/grenade/grenade = new type(loc) if(istype(grenade)) grenade.active = TRUE + grenade.type_cluster = TRUE addtimer(CALLBACK(grenade, TYPE_PROC_REF(/obj/item/grenade, detonate)), rand(RANDOM_DETONATE_MIN_TIME, RANDOM_DETONATE_MAX_TIME)) var/steps = rand(1, 4) for(var/step in 1 to steps) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index ea758c8993e..8e8aeb2617f 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -111,7 +111,7 @@ to_chat(user, span_notice("You start planting [src]. The timer is set to [det_time]...")) - if(do_after(user, 30, target = bomb_target)) + if(do_after(user, 3 SECONDS, target = bomb_target)) if(!user.temporarilyRemoveItemFromInventory(src)) return . target = bomb_target diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index d461746478d..2619a6cb65f 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -41,7 +41,7 @@ if(!istype(sucker) || !in_range(owner, sucker)) return - addtimer(CALLBACK(src, PROC_REF(waitASecond), owner, sucker), 4) + addtimer(CALLBACK(src, PROC_REF(waitASecond), owner, sucker), 0.4 SECONDS) /// Stage 2: Fear sets in /obj/item/hand_item/circlegame/proc/waitASecond(mob/living/owner, mob/living/sucker) @@ -50,10 +50,10 @@ if(owner == sucker) // big mood to_chat(owner, span_danger("Wait a second... you just looked at your own [src.name]!")) - addtimer(CALLBACK(src, PROC_REF(selfGottem), owner), 10) + addtimer(CALLBACK(src, PROC_REF(selfGottem), owner), 1 SECONDS) else to_chat(sucker, span_danger("Wait a second... was that a-")) - addtimer(CALLBACK(src, PROC_REF(GOTTEM), owner, sucker), 6) + addtimer(CALLBACK(src, PROC_REF(GOTTEM), owner, sucker), 0.6 SECONDS) /// Stage 3A: We face our own failures /obj/item/hand_item/circlegame/proc/selfGottem(mob/living/owner) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index e00a2aa61f3..8db6b3556a0 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -485,7 +485,7 @@ /obj/item/restraints/legcuffs/beartrap/energy/Initialize(mapload) . = ..() - addtimer(CALLBACK(src, PROC_REF(dissipate)), 100) + addtimer(CALLBACK(src, PROC_REF(dissipate)), 10 SECONDS) /** * Handles energy snares disappearing diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index cc64788e597..4541bbdbdad 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -119,7 +119,7 @@ * Arguments: * * mob/living/source - What the implant is being removed from * * silent - unused here - * * special - unused here + * * special - Set to true if removed by admin panel, should bypass any side effects */ /obj/item/implant/proc/removed(mob/living/source, silent = FALSE, special = 0) moveToNullspace() diff --git a/code/game/objects/items/implants/implant_battle_royale.dm b/code/game/objects/items/implants/implant_battle_royale.dm new file mode 100644 index 00000000000..11f68ec9345 --- /dev/null +++ b/code/game/objects/items/implants/implant_battle_royale.dm @@ -0,0 +1,142 @@ + +/// Implant used by the traitor Battle Royale objective, is not active immediately +/obj/item/implant/explosive/battle_royale + name = "rumble royale implant" + actions_types = null + instant_explosion = FALSE + master_implant = TRUE + delay = 10 SECONDS + panic_beep_sound = TRUE + announce_activation = FALSE + /// Where is this going to tell us to go to avoid death? + var/target_area_name = "" + /// Is this implant active yet? + var/battle_started = FALSE + /// Are we enforcing a specific area yet? + var/area_limited = FALSE + /// Are we presently exploding? + var/has_exploded = FALSE + /// How likely are we to blow up if removed? + var/removed_explode_chance = 70 + /// Reference to our applied camera component + var/camera + /// We will explode if we're not in here after a set time + var/list/limited_areas = list() + +/obj/item/implant/explosive/battle_royale/get_data() + return "Implant Specifications:
\ + Name: Donk Co. 'Rumble Royale' Contestant Motivation Implant
\ + Life: Activates upon death, or expiry of an internal timer.
\ + Important Notes: Explodes.
\ +
\ + Implant Details:
\ + Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death. \ + Upon triggering the timer, the implant will begin to broadcast the surrounding area for the purposes of televised entertainment. This signal can be detected by GPS trackers.
\ + Special Features: Exploding.
" + +/obj/item/implant/explosive/battle_royale/on_death(datum/source, gibbed) + if (!battle_started) + return + return ..() + +/obj/item/implant/explosive/battle_royale/implant(mob/living/target, mob/user, silent, force) + . = ..() + if (!.) + return + RegisterSignal(target, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + if (!battle_started) + return + name = "[name] - [imp_in.real_name]" + camera = target.AddComponent( \ + /datum/component/simple_bodycam, \ + camera_name = "rumble royale tracker", \ + c_tag = "Competitor [target.real_name]", \ + network = BATTLE_ROYALE_CAMERA_NET, \ + emp_proof = TRUE, \ + ) + announce() + if (area_limited) + limit_areas() + +/obj/item/implant/explosive/battle_royale/removed(mob/target, silent, special) + . = ..() + UnregisterSignal(target, list(COMSIG_LIVING_LIFE, COMSIG_ENTER_AREA)) + QDEL_NULL(camera) + if (has_exploded || QDELETED(src)) + return + if (!special && prob(removed_explode_chance)) + target.visible_message(span_boldwarning("[src] beeps ominously.")) + playsound(loc, 'sound/items/timer.ogg', 50, vary = FALSE) + explode(target) + target?.mind?.remove_antag_datum(/datum/antagonist/survivalist/battle_royale) + +/obj/item/implant/explosive/battle_royale/emp_act(severity) + removed_explode_chance = rand(0, 100) + return ..() + +/obj/item/implant/explosive/battle_royale/explode(atom/override_explode_target = null) + has_exploded = TRUE + return ..() + +/// Give a slight tell +/obj/item/implant/explosive/battle_royale/proc/on_life(mob/living/source) + SIGNAL_HANDLER + if (prob(98)) + return + if (!source.itch() || prob(80)) + return + to_chat(source, span_boldwarning("You feel a lump which shouldn't be there.")) + +/// Start the battle royale +/obj/item/implant/explosive/battle_royale/proc/start_battle(target_area_name, list/limited_areas) + if (isnull(imp_in)) + explode() + return + src.target_area_name = target_area_name + src.limited_areas = limited_areas + battle_started = TRUE + name = "[name] - [imp_in.real_name]" + imp_in.AddComponent( \ + /datum/component/simple_bodycam, \ + camera_name = "rumble royale tracker", \ + c_tag = "Competitor [imp_in.real_name]", \ + network = BATTLE_ROYALE_CAMERA_NET, \ + emp_proof = TRUE, \ + ) + AddComponent(/datum/component/gps, "Rumble Royale - [imp_in.real_name]") + playsound(loc, 'sound/items/timer.ogg', 50, vary = FALSE) + +/// Limit the owner to the specified area +/obj/item/implant/explosive/battle_royale/proc/limit_areas() + if (isnull(imp_in)) + explode() + return + area_limited = TRUE + RegisterSignal(imp_in, COMSIG_ENTER_AREA, PROC_REF(check_area)) + check_area(imp_in) + +/// Called when our implantee moves somewhere +/obj/item/implant/explosive/battle_royale/proc/check_area(mob/living/source) + SIGNAL_HANDLER + if (!length(limited_areas)) + return + if (is_type_in_list(get_area(source), limited_areas)) + return + playsound(imp_in, 'sound/items/timer.ogg', 50, vary = FALSE) + to_chat(imp_in, span_boldwarning("You are out of bounds! Get to the [target_area_name] quickly!")) + addtimer(CALLBACK(src, PROC_REF(check_area_deadly)), 5 SECONDS, TIMER_DELETE_ME) + +/// After a grace period they're still out of bounds, killing time +/obj/item/implant/explosive/battle_royale/proc/check_area_deadly() + if (isnull(imp_in) || has_exploded) + return + var/area/our_area = get_area(imp_in) + if (is_type_in_list(our_area, limited_areas)) + return + log_combat(src, imp_in, "exploded due to out of bounds", addition = "target area was [target_area_name], area was [our_area]") + explode() + +/// Add the antag datum to our new contestant, also printing some flavour text +/obj/item/implant/explosive/battle_royale/proc/announce() + var/datum/antagonist/survivalist/battle_royale/royale = imp_in.mind?.add_antag_datum(/datum/antagonist/survivalist/battle_royale) + royale?.set_target_area(target_area_name) diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 25966a24c68..687b8db014e 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -19,6 +19,8 @@ var/active = FALSE ///The final countdown (delay before we explode) var/delay = MICROBOMB_DELAY + ///If the delay is equal or lower to MICROBOMB_DELAY (0.7 sec), the explosion will be instantaneous. + var/instant_explosion = TRUE ///Radius of weak devastation explosive impact var/explosion_light = MICROBOMB_EXPLOSION_LIGHT ///Radius of medium devastation explosive impact @@ -33,7 +35,10 @@ var/no_paralyze = FALSE ///Do we override other explosive implants? var/master_implant = FALSE - + ///Will this implant notify ghosts when activated? + var/notify_ghosts = TRUE + ///Do we tell people when they activated it? + var/announce_activation = TRUE /obj/item/implant/explosive/proc/on_death(datum/source, gibbed) SIGNAL_HANDLER @@ -68,12 +73,13 @@ return FALSE if(cause == "death" && HAS_TRAIT(imp_in, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION)) return FALSE - to_chat(imp_in, span_notice("You activate your [name].")) + if(announce_activation) + to_chat(imp_in, span_notice("You activate your [name].")) active = TRUE var/turf/boomturf = get_turf(imp_in) message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(boomturf)], with cause of [cause].") //If the delay is shorter or equal to the default delay, just blow up already jeez - if(delay <= MICROBOMB_DELAY) + if(delay <= MICROBOMB_DELAY && instant_explosion) explode() return timed_explosion() @@ -83,7 +89,7 @@ if(istype(target_implant, /obj/item/implant/explosive)) //we don't use our own type here, because macrobombs inherit this proc and need to be able to upgrade microbombs var/obj/item/implant/explosive/other_implant = target_implant if(other_implant.master_implant && master_implant) //we cant have two master implants at once - target.balloon_alert(target, "cannot fit implant!") + target.balloon_alert(user, "cannot fit implant!") return FALSE if(master_implant) merge_implants(src, other_implant) @@ -117,16 +123,19 @@ * Make the implantee beep a few times, keel over and explode. Usually to a devastating effect. */ /obj/item/implant/explosive/proc/timed_explosion() - imp_in.visible_message(span_warning("[imp_in] starts beeping ominously!")) - - notify_ghosts( - "[imp_in] is about to detonate their explosive implant!", - source = src, - header = "Tick Tick Tick...", - notify_flags = NOTIFY_CATEGORY_NOFLASH, - ghost_sound = 'sound/machines/warning-buzzer.ogg', - notify_volume = 75, - ) + if (isnull(imp_in)) + visible_message(span_warning("[src] starts beeping ominously!")) + else + imp_in.visible_message(span_warning("[imp_in] starts beeping ominously!")) + if(notify_ghosts) + notify_ghosts( + "[imp_in] is about to detonate their explosive implant!", + source = src, + header = "Tick Tick Tick...", + notify_flags = NOTIFY_CATEGORY_NOFLASH, + ghost_sound = 'sound/machines/warning-buzzer.ogg', + notify_volume = 75, + ) playsound(loc, 'sound/items/timer.ogg', 30, FALSE) if(!panic_beep_sound) @@ -156,14 +165,15 @@ ///When called, just explodes -/obj/item/implant/explosive/proc/explode() +/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(src, devastation_range = explosion_devastate, heavy_impact_range = explosion_heavy, light_impact_range = explosion_light, flame_range = explosion_light, flash_range = explosion_light, explosion_cause = src) - if(imp_in) - imp_in.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS) - imp_in.gib(DROP_ORGANS|DROP_BODYPARTS) + 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)) + kill_mob.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS) + kill_mob.gib(DROP_ORGANS|DROP_BODYPARTS) qdel(src) ///Macrobomb has the strength and delay of 10 microbombs @@ -203,6 +213,13 @@ if(source.health < source.crit_threshold) INVOKE_ASYNC(src, PROC_REF(activate), "deniability") +/obj/item/implant/explosive/deathmatch + name = "deathmatch microbomb implant" + delay = 0.5 SECONDS + actions_types = null + instant_explosion = FALSE + notify_ghosts = FALSE + /obj/item/implanter/explosive name = "implanter (microbomb)" imp_type = /obj/item/implant/explosive diff --git a/code/game/objects/items/implants/implant_stealth.dm b/code/game/objects/items/implants/implant_stealth.dm index 101cc4a807d..54bb83e8d19 100644 --- a/code/game/objects/items/implants/implant_stealth.dm +++ b/code/game/objects/items/implants/implant_stealth.dm @@ -39,6 +39,9 @@ /obj/structure/closet/cardboard/agent/Bump(atom/A) . = ..() + if(istype(A, /obj/machinery/door)) + for(var/mob/mob_in_box in contents) + A.Bumped(mob_in_box) if(isliving(A)) reveal() diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index f2493bf869d..086b965e1ac 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -7,7 +7,7 @@ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' force = 7 - var/powertransfer = 1000 + var/powertransfer = STANDARD_CELL_CHARGE var/opened = FALSE var/cell_type = /obj/item/stock_parts/cell/high var/obj/item/stock_parts/cell/cell @@ -106,7 +106,7 @@ return FALSE if(recharging) return TRUE - + recharging = TRUE var/obj/item/stock_parts/cell/our_cell = get_cell() var/obj/item/stock_parts/cell/target_cell = target.get_cell() @@ -127,7 +127,7 @@ user.visible_message(span_notice("[user] starts recharging [target] with [src]."), span_notice("You start recharging [target] with [src].")) while(target_cell.charge < target_cell.maxcharge) - if(do_after(user, 10, target = user) && our_cell.charge) + if(do_after(user, 1 SECONDS, target = user) && our_cell.charge) done_any = TRUE induce(target_cell, coefficient) do_sparks(1, FALSE, target) @@ -203,5 +203,5 @@ icon_state = "inducer-syndi" inhand_icon_state = "inducer-syndi" desc = "A tool for inductively charging internal power cells. This one has a suspicious colour scheme, and seems to be rigged to transfer charge at a much faster rate." - powertransfer = 2000 + powertransfer = 2 * STANDARD_CELL_CHARGE cell_type = /obj/item/stock_parts/cell/super diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index c0b6a5dd145..2f25e53c1fb 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -26,10 +26,10 @@ var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/crap ///Cell cover status var/cell_cover_open = FALSE - ///Power used per print in cell units - var/power_per_print = INSPECTOR_POWER_USAGE_NORMAL - ///Power used to say an error message - var/power_to_speak = 1 + ///Energy used per print. + var/energy_per_print = INSPECTOR_ENERGY_USAGE_NORMAL + ///Energy used to say an error message. + var/energy_to_speak = 1 KILO JOULES /obj/item/inspector/Initialize(mapload) . = ..() @@ -111,8 +111,8 @@ if(cell.charge == 0) to_chat(user, "\The [src] doesn't seem to be on... Perhaps it ran out of power?") return - if(!cell.use(power_per_print)) - if(cell.use(power_to_speak)) + if(!cell.use(energy_per_print)) + if(cell.use(energy_to_speak)) say("ERROR! POWER CELL CHARGE LEVEL TOO LOW TO PRINT REPORT!") return @@ -238,8 +238,8 @@ * * Can print things way faster, at full power the reports printed by this will destroy * themselves and leave water behind when folding is attempted by someone who isn't an - * origami master. Printing at full power costs INSPECTOR_POWER_USAGE_HONK cell units - * instead of INSPECTOR_POWER_USAGE_NORMAL cell units. + * origami master. Printing at full power costs INSPECTOR_ENERGY_USAGE_HONK cell units + * instead of INSPECTOR_ENERGY_USAGE_NORMAL cell units. */ /obj/item/inspector/clown/bananium name = "\improper Bananium HONK-spect scanner" @@ -258,11 +258,11 @@ /obj/item/inspector/clown/bananium/proc/check_settings_legality() if(print_sound_mode == INSPECTOR_PRINT_SOUND_MODE_NORMAL && time_mode == INSPECTOR_TIME_MODE_HONK) - if(cell.use(power_to_speak)) + if(cell.use(energy_to_speak)) say("Setting combination forbidden by Geneva convention revision CCXXIII selected, reverting to defaults") time_mode = INSPECTOR_TIME_MODE_SLOW print_sound_mode = INSPECTOR_PRINT_SOUND_MODE_NORMAL - power_per_print = INSPECTOR_POWER_USAGE_NORMAL + energy_per_print = INSPECTOR_ENERGY_USAGE_NORMAL /obj/item/inspector/clown/bananium/screwdriver_act(mob/living/user, obj/item/tool) . = ..() @@ -296,7 +296,7 @@ if(time_mode != INSPECTOR_TIME_MODE_HONK) return ..() if(paper_charges == 0) - if(cell.use(power_to_speak)) + if(cell.use(energy_to_speak)) say("ERROR! OUT OF PAPER! MAXIMUM PRINTING SPEED UNAVAIBLE! SWITCH TO A SLOWER SPEED TO OR PROVIDE PAPER!") else to_chat(user, "\The [src] doesn't seem to be on... Perhaps it ran out of power?") @@ -308,7 +308,7 @@ var/message switch(time_mode) if(INSPECTOR_TIME_MODE_HONK) - power_per_print = INSPECTOR_POWER_USAGE_NORMAL + energy_per_print = INSPECTOR_ENERGY_USAGE_NORMAL time_mode = INSPECTOR_TIME_MODE_SLOW message = "SLOW." if(INSPECTOR_TIME_MODE_SLOW) @@ -316,7 +316,7 @@ message = "LIGHTNING FAST." else time_mode = INSPECTOR_TIME_MODE_HONK - power_per_print = INSPECTOR_POWER_USAGE_HONK + energy_per_print = INSPECTOR_ENERGY_USAGE_HONK message = "HONK!" balloon_alert(user, "scanning speed set to [message]") diff --git a/code/game/objects/items/machine_wand.dm b/code/game/objects/items/machine_wand.dm new file mode 100644 index 00000000000..71ea2fae1b6 --- /dev/null +++ b/code/game/objects/items/machine_wand.dm @@ -0,0 +1,181 @@ +///When EMPed, how long the remote will be disabled for by default. +#define EMP_TIMEOUT_DURATION (2 MINUTES) + +/obj/item/machine_remote + name = "machine wand" + desc = "A remote for controlling machines and bots around the station." + icon = 'icons/obj/antags/syndicate_tools.dmi' + icon_state = "weakpoint_locator" + inhand_icon_state = "weakpoint_locator" + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + ///If we're unable to be used, this is how long we have left to wait. + COOLDOWN_DECLARE(timeout_time) + ///The appearance put onto machines being actively controlled. + var/mutable_appearance/bug_appearance + ///Direct reference to the moving bug effect that moves towards machines we direct it at. + var/obj/effect/bug_moving/moving_bug + ///The machine that's currently being controlled. + var/atom/movable/controlling_machine_or_bot + +/obj/item/machine_remote/Initialize(mapload) + . = ..() + bug_appearance = mutable_appearance('icons/effects/effects.dmi', "fly-surrounding", ABOVE_WINDOW_LAYER) + register_context() + +/obj/item/machine_remote/Destroy(force) + . = ..() + if(controlling_machine_or_bot) + remove_old_machine() + QDEL_NULL(moving_bug) + QDEL_NULL(bug_appearance) + +/obj/item/machine_remote/examine(mob/user) + . = ..() + if(controlling_machine_or_bot) + . += span_notice("It is currently controlling [controlling_machine_or_bot]. Use in-hand to interact with it.") + +/obj/item/machine_remote/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(controlling_machine_or_bot) + context[SCREENTIP_CONTEXT_LMB] = "Use [controlling_machine_or_bot]" + context[SCREENTIP_CONTEXT_ALT_LMB] = "Flush Control" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/item/machine_remote/proc/on_control_destroy(obj/machinery/source) + SIGNAL_HANDLER + remove_old_machine() + +/obj/item/machine_remote/ui_interact(mob/user, datum/tgui/ui) + if(!COOLDOWN_FINISHED(src, timeout_time)) + playsound(src, 'sound/machines/synth_no.ogg', 30 , TRUE) + say("Remote control disabled temporarily. Please try again soon.") + return FALSE + if(!controlling_machine_or_bot) + return + if(controlling_machine_or_bot.ui_interact(user, ui)) + return + controlling_machine_or_bot.interact(user) //no ui, interact instead (to open windoors and such) + +/obj/item/machine_remote/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(controlling_machine_or_bot) + return controlling_machine_or_bot.ui_act(action, params, ui, state) + +/obj/item/machine_remote/AltClick(mob/user) + . = ..() + if(moving_bug) //we have a bug in transit, so let's kill it. + QDEL_NULL(moving_bug) + if(!controlling_machine_or_bot) + return + say("Remote control over [controlling_machine_or_bot] stopped.") + remove_old_machine() + +/obj/item/machine_remote/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!COOLDOWN_FINISHED(src, timeout_time)) + playsound(src, 'sound/machines/synth_no.ogg', 30 , TRUE) + say("Remote control disabled temporarily. Please try again soon.") + return FALSE + if(!ismachinery(target) && !isbot(target)) + return + if(moving_bug) //we have a bug in transit already, so let's kill it. + QDEL_NULL(moving_bug) + var/turf/spawning_turf = (controlling_machine_or_bot ? get_turf(controlling_machine_or_bot) : get_turf(src)) + moving_bug = new(spawning_turf, src, target) + remove_old_machine() + +///Sets a controlled machine to a new machine, if possible. Checks if AIs can even control it. +/obj/item/machine_remote/proc/set_controlled_machine(obj/machinery/new_machine) + if(controlling_machine_or_bot == new_machine) + return + remove_old_machine() + if(istype(new_machine, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/new_apc = new_machine + if(new_apc.aidisabled) + say("AI wire cut, machine uncontrollable.") + return + else if(istype(new_machine, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/new_airlock = new_machine + if(!new_airlock.canAIControl()) + say("AI wire cut, machine uncontrollable.") + return + controlling_machine_or_bot = new_machine + controlling_machine_or_bot.add_overlay(bug_appearance) + RegisterSignal(controlling_machine_or_bot, COMSIG_QDELETING, PROC_REF(on_control_destroy)) + RegisterSignal(controlling_machine_or_bot, COMSIG_ATOM_EMP_ACT, PROC_REF(on_machine_emp)) + +///Removes the machine being controlled as the current machine, taking its signals and overlays with it. +/obj/item/machine_remote/proc/remove_old_machine() + if(!controlling_machine_or_bot) + return + UnregisterSignal(controlling_machine_or_bot, list(COMSIG_ATOM_EMP_ACT, COMSIG_QDELETING)) + controlling_machine_or_bot.cut_overlay(bug_appearance) + controlling_machine_or_bot = null + +///Called when the machine we're controlling is EMP, removing our control from it. +/obj/item/machine_remote/proc/on_machine_emp(datum/source, severity, protection) + SIGNAL_HANDLER + if(severity & EMP_PROTECT_CONTENTS) + return + disable_remote(EMP_TIMEOUT_DURATION) + +/obj/item/machine_remote/proc/disable_remote(timeout_duration) + remove_old_machine() + COOLDOWN_START(src, timeout_time, timeout_duration) + +///The effect of the bug moving towards the selected machinery to mess with. +/obj/effect/bug_moving + name = "bug" + desc = "Where da bug goin?" + icon_state = "fly" + obj_flags = CAN_BE_HIT + max_integrity = 20 + uses_integrity = TRUE + plane = ABOVE_GAME_PLANE + layer = FLY_LAYER + movement_type = PHASING + ///The controller that's sending us out to the machine. + var/obj/item/machine_remote/controller + ///The machine we are trying to get remote access to. + var/atom/movable/thing_moving_towards + +/obj/effect/bug_moving/Initialize(mapload, obj/item/machine_remote/controller, atom/movable/thing_moving_towards) + . = ..() + if(!controller) + CRASH("a moving bug has been created by something that isn't a machine remote controller!") + if(!thing_moving_towards) + CRASH("a moving bug has been created but isn't moving towards anything!") + src.controller = controller + src.thing_moving_towards = thing_moving_towards + var/datum/move_loop/loop = SSmove_manager.home_onto(src, thing_moving_towards, delay = 5, flags = MOVEMENT_LOOP_NO_DIR_UPDATE) + RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(reached_destination_check)) + RegisterSignal(thing_moving_towards, COMSIG_QDELETING, PROC_REF(on_machine_del)) + +/obj/effect/bug_moving/Destroy(force) + if(controller) + controller.moving_bug = null + controller = null + thing_moving_towards = null + return ..() + +/obj/effect/bug_moving/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + controller.disable_remote(EMP_TIMEOUT_DURATION) + qdel(src) + +/obj/effect/bug_moving/proc/reached_destination_check(datum/move_loop/source, result) + SIGNAL_HANDLER + if(!Adjacent(thing_moving_towards)) + return + controller.set_controlled_machine(thing_moving_towards) + qdel(src) + +/obj/effect/bug_moving/proc/on_machine_del(datum/move_loop/source) + SIGNAL_HANDLER + qdel(src) + +#undef EMP_TIMEOUT_DURATION diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index 50b81ab6bc3..3a86d267af2 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -87,8 +87,8 @@ pixel_y = stamp_offset_y + bonus_stamp_offset ) stamp_image.appearance_flags |= RESET_COLOR - add_overlay(stamp_image) bonus_stamp_offset -= 5 + . += stamp_image if(postmarked == TRUE) var/image/postmark_image = image( @@ -98,7 +98,7 @@ pixel_y = stamp_offset_y + rand(bonus_stamp_offset + 3, 1) ) postmark_image.appearance_flags |= RESET_COLOR - add_overlay(postmark_image) + . += postmark_image /obj/item/mail/attackby(obj/item/W, mob/user, params) // Destination tagging diff --git a/code/game/objects/items/maintenance_loot.dm b/code/game/objects/items/maintenance_loot.dm index 538e4cac93d..52ed1880081 100644 --- a/code/game/objects/items/maintenance_loot.dm +++ b/code/game/objects/items/maintenance_loot.dm @@ -29,8 +29,8 @@ icon = 'icons/obj/maintenance_loot.dmi' icon_state = "lead_battery" throwforce = 10 - maxcharge = 20000 //decent max charge - chargerate = 1400 //charging is about 30% less efficient than lithium batteries. + maxcharge = STANDARD_CELL_CHARGE * 20 //decent max charge + chargerate = STANDARD_CELL_CHARGE * 0.7 //charging is about 30% less efficient than lithium batteries. charge_light_type = null connector_type = "leadacid" rating = 2 //Kind of a mid-tier battery diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index b692b58bfcf..b576ef5d41c 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -190,7 +190,6 @@ if(user) target.lastattacker = user.real_name target.lastattackerckey = user.ckey - target.LAssailant = WEAKREF(user) if(log_stun_attack) log_combat(user, target, "stun attacked", src) if(baton_effect(target, user, modifiers) && user) @@ -437,7 +436,7 @@ var/throw_stun_chance = 35 var/obj/item/stock_parts/cell/cell var/preload_cell_type //if not empty the baton starts with this type of cell - var/cell_hit_cost = 1000 + var/cell_hit_cost = STANDARD_CELL_CHARGE var/can_remove_cell = TRUE var/convertible = TRUE //if it can be converted with a conversion kit @@ -454,6 +453,7 @@ else cell = new preload_cell_type(src) RegisterSignal(src, COMSIG_ATOM_ATTACKBY, PROC_REF(convert)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) update_appearance() /obj/item/melee/baton/security/get_cell() @@ -488,6 +488,14 @@ qdel(item) qdel(src) +/obj/item/melee/baton/security/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(!active) + return + toggle_light() + active = FALSE + update_appearance() + return COMSIG_SABOTEUR_SUCCESS /obj/item/melee/baton/security/Exited(atom/movable/mov_content) . = ..() if(mov_content == cell) @@ -651,7 +659,7 @@ if (!cell) return if (!(. & EMP_PROTECT_SELF)) - deductcharge(1000 / severity) + deductcharge(STANDARD_CELL_CHARGE / severity) if (cell.charge >= cell_hit_cost) var/scramble_time scramble_mode() @@ -685,7 +693,7 @@ w_class = WEIGHT_CLASS_HUGE force = 3 throwforce = 5 - cell_hit_cost = 2000 + cell_hit_cost = STANDARD_CELL_CHARGE * 2 throw_stun_chance = 10 slot_flags = ITEM_SLOT_BACK convertible = FALSE @@ -749,7 +757,7 @@ force = 5 throwforce = 5 throw_range = 5 - cell_hit_cost = 2000 + cell_hit_cost = STANDARD_CELL_CHARGE * 2 throw_stun_chance = 99 //Have you prayed today? convertible = 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) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 9c6da93717a..2dc637b1361 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -213,7 +213,7 @@ name = "cyborg energy sword" sword_color_icon = "red" /// The cell cost of hitting something. - var/hitcost = 50 + var/hitcost = 0.05 * STANDARD_CELL_CHARGE /obj/item/melee/energy/sword/cyborg/attack(mob/target, mob/living/silicon/robot/user) if(!user.cell) @@ -238,7 +238,7 @@ icon_state = "esaw" hitsound = 'sound/weapons/circsawhit.ogg' force = 18 - hitcost = 75 // Costs more than a standard cyborg esword. + hitcost = 0.075 * STANDARD_CELL_CHARGE // Costs more than a standard cyborg esword. w_class = WEIGHT_CLASS_NORMAL sharpness = SHARP_EDGED light_color = LIGHT_COLOR_LIGHT_CYAN diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 56404e132c8..ffbc54dbc98 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -446,7 +446,7 @@ finish_roasting(user, target) /obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target) - if(do_after(user, 100, target = user)) + if(do_after(user, 10 SECONDS, target = user)) to_chat(user, span_notice("You finish roasting [held_sausage].")) playsound(src, 'sound/items/welder2.ogg', 50, TRUE) held_sausage.add_atom_colour(rgb(103, 63, 24), FIXED_COLOUR_PRIORITY) @@ -470,7 +470,7 @@ greyscale_config_inhand_left = /datum/greyscale_config/cleric_mace_lefthand greyscale_config_inhand_right = /datum/greyscale_config/cleric_mace_righthand greyscale_config_worn = /datum/greyscale_config/cleric_mace - greyscale_colors = "#FFFFFF" + greyscale_colors = COLOR_WHITE 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*6) //Defaults to an Iron Mace. diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 8874b9337db..8e93cbcf67a 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -67,7 +67,7 @@ var/val2remove = 1 if(cleaner?.mind) val2remove = round(cleaner.mind.get_skill_modifier(/datum/skill/cleaning, SKILL_SPEED_MODIFIER), 0.1) - reagents.remove_any(val2remove) //reaction() doesn't use up the reagents + reagents.remove_all(val2remove) //reaction() doesn't use up the reagents /obj/item/mop/cyborg/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 86c548ea4de..bbbeb86602c 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -77,12 +77,13 @@ playsound(user, 'sound/machines/boltsup.ogg', 30, TRUE) update_appearance() -/obj/item/pet_carrier/attack(mob/living/target, mob/living/user) - if(user.combat_mode) - return ..() +/obj/item/pet_carrier/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(user.combat_mode || !isliving(interacting_with)) + return NONE if(!open) to_chat(user, span_warning("You need to open [src]'s door!")) - return + return ITEM_INTERACT_BLOCKING + var/mob/living/target = interacting_with if(target.mob_size > max_occupant_weight) if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -92,11 +93,12 @@ to_chat(user, span_warning("Humans, generally, do not fit into pet carriers.")) else to_chat(user, span_warning("You get the feeling [target] isn't meant for a [name].")) - return + return ITEM_INTERACT_BLOCKING if(user == target) to_chat(user, span_warning("Why would you ever do that?")) - return + return ITEM_INTERACT_BLOCKING load_occupant(user, target) + return ITEM_INTERACT_SUCCESS /obj/item/pet_carrier/relaymove(mob/living/user, direction) if(open) @@ -129,7 +131,7 @@ else loc.visible_message(span_warning("[src] starts rattling as something pushes against the door!"), null, null, null, user) to_chat(user, span_notice("You start pushing out of [src]... (This will take about 20 seconds.)")) - if(!do_after(user, 200, target = user) || open || !locked || !(user in occupants)) + if(!do_after(user, 20 SECONDS, target = user) || open || !locked || !(user in occupants)) return loc.visible_message(span_warning("[user] shoves out of [src]!"), null, null, null, user) to_chat(user, span_notice("You shove open [src]'s door against the lock's resistance and fall out!")) diff --git a/code/game/objects/items/piggy_bank.dm b/code/game/objects/items/piggy_bank.dm new file mode 100644 index 00000000000..b6294dbc4dd --- /dev/null +++ b/code/game/objects/items/piggy_bank.dm @@ -0,0 +1,148 @@ +/** + * Piggy banks. They store your hard-earned money until you or someone destroys it. + * If the persistence id is set, money will be carried between rounds until broken. + */ +/obj/item/piggy_bank + name = "piggy bank" + desc = "A pig-shaped money container made of porkelain, oink. Do not throw." //pun very intended. + icon = 'icons/obj/fluff/general.dmi' + icon_state = "piggy_bank" + max_integrity = 8 + w_class = WEIGHT_CLASS_NORMAL + force = 12 + throwforce = 15 + throw_speed = 3 + throw_range = 7 + greyscale_config = /datum/greyscale_config/piggy_bank + ///Some piggy banks are persistent, meaning they carry dosh between rounds. + var/persistence_id + ///Callback to execute upon roundend to save the current amount of cash it has stored, IF persistent. + var/datum/callback/persistence_cb + ///How much dosh can this piggy bank hold. + var/maximum_value = PAYCHECK_COMMAND * 20 + ///A limit to much dosh can you put inside this piggy bank each round. If 0, there's no limit. Only applies to persistent piggies. + var/maximum_savings_per_shift = 0 + ///How much dosh this piggy bank spawns with. + var/initial_value = 0 + +/obj/item/piggy_bank/Initialize(mapload) + if(!greyscale_colors) + greyscale_colors = pick(COLOR_PINK, + COLOR_LIGHT_ORANGE, + COLOR_GREEN_GRAY, + COLOR_PALE_BLUE_GRAY, + COLOR_DARK_MODERATE_LIME_GREEN, + COLOR_OFF_WHITE, + ) + + . = ..() + + AddElement(/datum/element/can_shatter, shattering_sound = SFX_SHATTER, shatters_as_weapon = TRUE) + AddElement(/datum/element/beauty, 500) + if(!persistence_id) + if(initial_value) + new /obj/item/holochip(src, initial_value) + return + + SSpersistence.load_piggy_bank(src) + persistence_cb = CALLBACK(src, PROC_REF(save_cash)) + SSticker.OnRoundend(persistence_cb) + + if(initial_value && initial_value + calculate_dosh_amount() <= maximum_value) + new /obj/item/holochip(src, initial_value) + + if(maximum_savings_per_shift) + maximum_value = calculate_dosh_amount() + maximum_savings_per_shift + +/obj/item/piggy_bank/proc/save_cash() + SSpersistence.save_piggy_bank(src) + +/obj/item/piggy_bank/Destroy() + if(persistence_cb) + LAZYREMOVE(SSticker.round_end_events, persistence_cb) //cleanup the callback. + persistence_cb = null + return ..() + +/obj/item/piggy_bank/atom_deconstruct(disassembled = TRUE) + for(var/obj/item/thing as anything in contents) + thing.forceMove(loc) + //Smashing the piggy after the round is over doesn't count. + if(persistence_id && SSticker.current_state < GAME_STATE_FINISHED) + LAZYADD(SSpersistence.queued_broken_piggy_ids, persistence_id) + return ..() + +/obj/item/piggy_bank/attack_self(mob/user, modifiers) + . = ..() + if(DOING_INTERACTION_WITH_TARGET(user, src)) + return + balloon_alert(user, "rattle rattle...") + if(!do_after(user, 0.5 SECONDS, src)) + return + var/percentile = round(calculate_dosh_amount()/maximum_value * 100, 1) + if(percentile >= 10) + playsound(src, SFX_RATTLE, percentile * 0.5, FALSE, FALSE) + switch(percentile) + if(0) + balloon_alert(user, "it's empty") + if(1 to 9) + balloon_alert(user, "it's almost empty") + if(10 to 25) + balloon_alert(user, "it's some cash") + if(25 to 45) + balloon_alert(user, "it's plenty of cash") + if(45 to 70) + balloon_alert(user, "it feels almost full") + if(70 to 95) + balloon_alert(user, "it feels full") + if(95 to INFINITY) + balloon_alert(user, "brimming with cash") + +/obj/item/piggy_bank/attackby(obj/item/item, mob/user, params) + var/creds_value = item.get_item_credit_value() + if(isnull(creds_value)) + return ..() + + var/dosh_amount = calculate_dosh_amount() + + if(dosh_amount >= maximum_value) + balloon_alert(user, "it's full!") + else if(dosh_amount + creds_value > maximum_value) + balloon_alert(user, "too much cash!") + else if(!user.transferItemToLoc(item, src)) + balloon_alert(user, "stuck in your hands!") + else + balloon_alert(user, "inserted [creds_value] creds") + return TRUE + +///Returns the total amount of credits that its contents amount to. +/obj/item/piggy_bank/proc/calculate_dosh_amount() + var/total_value = 0 + for(var/obj/item/item in contents) + total_value += item.get_item_credit_value() + return total_value + +/obj/item/piggy_bank/museum + name = "Pigston Swinelord VI" + desc = "The museum's mascot piggy bank and favorite embezzler, known to carry donations between shifts without paying taxes. The space IRS hates him." + persistence_id = "museum_piggy" + greyscale_colors = COLOR_PINK + maximum_value = PAYCHECK_COMMAND * 100 + initial_value = PAYCHECK_COMMAND * 4 + +/obj/item/piggy_bank/museum/Initialize(mapload) + . = ..() + AddComponent(/datum/component/areabound) //do not steal. + +/obj/item/piggy_bank/vault + name = "vault piggy bank" + desc = "A pig-shaped money container made of porkelain, containing the station's emergency funds carried between shifts, oink. Do not throw." + persistence_id = "vault_piggy" + greyscale_colors = COLOR_LIGHT_ORANGE + maximum_value = PAYCHECK_COMMAND * 33 + 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. + +/obj/item/piggy_bank/vault/Initialize(mapload) + . = ..() + //one piggy bank should exist, preferibly inside the vault's safe. + REGISTER_REQUIRED_MAP_ITEM(1, 1) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index ca669a9733e..1d5c37ffc22 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -44,7 +44,8 @@ /obj/item/toy/plush/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, squeak_override) - AddElement(/datum/element/bed_tuckable, 6, -5, 90) + AddElement(/datum/element/bed_tuckable, mapload, 6, -5, 90) + AddElement(/datum/element/toy_talk) //have we decided if Pinocchio goes in the blue or pink aisle yet? if(gender == NEUTER) @@ -523,7 +524,7 @@ generated_lizard_color = "#66ff33" // Set our greyscale colors to the lizard color we made + black eyes - set_greyscale(colors = list(generated_lizard_color, "#000000")) + set_greyscale(colors = list(generated_lizard_color, COLOR_BLACK)) // Preset lizard plushie that uses the original lizard plush green. (Or close to it) /obj/item/toy/plush/lizard_plushie/green diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 7ac22d00897..77b07488d6c 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -16,6 +16,9 @@ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF var/puzzle_id = null +/obj/item/keycard/get_save_vars() + return ..() + NAMEOF(src, puzzle_id) + //Two test keys for use alongside the two test doors. /obj/item/keycard/yellow name = "yellow keycard" @@ -53,6 +56,9 @@ /// Message that occurs when the door is opened var/open_message = "The door beeps, and slides opens." +/obj/machinery/door/puzzle/get_save_vars() + return ..() + NAMEOF(src, puzzle_id) + //Standard Expressions to make keycard doors basically un-cheeseable /datum/armor/door_puzzle melee = 100 @@ -68,6 +74,7 @@ . = ..() if(!isnull(puzzle_id) && uses_queuelinks) SSqueuelinks.add_to_queue(src, puzzle_id) + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/machinery/door/puzzle/MatchedLinks(id, list/partners) for(var/partner in partners) @@ -82,9 +89,6 @@ /obj/machinery/door/puzzle/Bumped(atom/movable/AM) return !density && ..() -/obj/machinery/door/puzzle/emp_act(severity) - return - /obj/machinery/door/puzzle/ex_act(severity, target) return FALSE @@ -162,6 +166,9 @@ var/reward = /obj/item/food/cookie var/claimed = FALSE +/obj/item/pressure_plate/hologrid/get_save_vars() + return ..() + NAMEOF(src, reward) + /obj/item/pressure_plate/hologrid/Initialize(mapload) . = ..() if(undertile_pressureplate) @@ -212,6 +219,9 @@ /// queue size, must match count of objects this activates! var/queue_size = 2 +/obj/structure/light_puzzle/get_save_vars() + return ..() + list(NAMEOF(src, queue_size), NAMEOF(src, puzzle_id)) + /datum/armor/structure_light_puzzle melee = 100 bullet = 100 @@ -289,28 +299,50 @@ // literally just buttons // -/obj/machinery/puzzle_button - name = "control panel" - desc = "A panel that controls something nearby. I'm sure it being covered in hazard stripes is fine." +/obj/machinery/puzzle + name = "abstract puzzle gizmo" icon = 'icons/obj/machines/wallmounts.dmi' - icon_state = "lockdown0" resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF - base_icon_state = "lockdown" /// have we been pressed already? var/used = FALSE /// can we be pressed only once? var/single_use = TRUE /// puzzle id we send on press - var/id = "0" //null would literally open every puzzle door without an id + var/id //null would literally open every puzzle door without an id /// queue size, must match count of objects this activates! var/queue_size = 2 + /// should the puzzle machinery perform the final step of the queue link on LateInitialize? An alternative to queue size + var/late_initialize_pop = FALSE -/obj/machinery/puzzle_button/Initialize(mapload) +/obj/machinery/puzzle/get_save_vars() + return ..() + list(NAMEOF(src, queue_size), NAMEOF(src, id)) + +/obj/machinery/puzzle/Initialize(mapload) . = ..() if(!isnull(id)) - SSqueuelinks.add_to_queue(src, id, queue_size) + SSqueuelinks.add_to_queue(src, id, late_initialize_pop ? 0 : queue_size) + return late_initialize_pop ? INITIALIZE_HINT_LATELOAD : . -/obj/machinery/puzzle_button/attack_hand(mob/user, list/modifiers) +/obj/machinery/puzzle/LateInitialize() + . = ..() + if(late_initialize_pop && id && SSqueuelinks.queues[id]) + SSqueuelinks.pop_link(id) + +/obj/machinery/puzzle/proc/on_puzzle_complete() //incase someone wants to make this do something else for some reason + SEND_SIGNAL(src, COMSIG_PUZZLE_COMPLETED) + +/obj/machinery/puzzle/update_icon_state() + icon_state = "[base_icon_state][used]" + return ..() + +/obj/machinery/puzzle/button + name = "control panel" + desc = "A panel that controls something nearby. I'm sure it being covered in hazard stripes is fine." + icon = 'icons/obj/machines/wallmounts.dmi' + icon_state = "lockdown0" + base_icon_state = "lockdown" + +/obj/machinery/puzzle/button/attack_hand(mob/user, list/modifiers) . = ..() if(.) return @@ -320,37 +352,17 @@ update_icon_state() visible_message(span_notice("[user] presses a button on [src]."), span_notice("You press a button on [src].")) playsound(src, 'sound/machines/terminal_button07.ogg', 45, TRUE) - open_doors() + on_puzzle_complete() -/obj/machinery/puzzle_button/proc/open_doors() //incase someone wants to make this do something else for some reason - SEND_SIGNAL(src, COMSIG_PUZZLE_COMPLETED) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/button, 32) -/obj/machinery/puzzle_button/update_icon_state() - icon_state = "[base_icon_state][used]" - return ..() - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_button, 32) - -/obj/machinery/puzzle_keycardpad +/obj/machinery/puzzle/keycardpad name = "keycard panel" desc = "A panel that controls something nearby. Accepts keycards." - icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "keycardpad0" - resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF base_icon_state = "keycardpad" - /// were we used successfully? - var/used = FALSE - /// puzzle id we send if the correct card is swiped - var/id = "0" - /// queue size, must match count of objects this activates! - var/queue_size = 2 -/obj/machinery/puzzle_keycardpad/Initialize(mapload) - . = ..() - if(!isnull(id)) - SSqueuelinks.add_to_queue(src, id, queue_size) - -/obj/machinery/puzzle_keycardpad/attackby(obj/item/attacking_item, mob/user, params) +/obj/machinery/puzzle/keycardpad/attackby(obj/item/attacking_item, mob/user, params) . = ..() if(!istype(attacking_item, /obj/item/keycard) || used) return @@ -363,13 +375,81 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_button, 32) used = TRUE update_icon_state() playsound(src, 'sound/machines/beep.ogg', 45, TRUE) - SEND_SIGNAL(src, COMSIG_PUZZLE_COMPLETED) + on_puzzle_complete() -/obj/machinery/puzzle_keycardpad/update_icon_state() - icon_state = "[base_icon_state][used]" - return ..() +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/keycardpad, 32) -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_keycardpad, 32) +/obj/machinery/puzzle/password + name = "password panel" + desc = "A panel that controls something nearby. This one requires a (case-sensitive) password, and it's not \"Swordfish\"." + icon_state = "passpad0" + base_icon_state = "passpad" + ///The password to this door. + var/password = "" + ///The text shown in the tgui input popup + var/tgui_text = "Please enter the password." + ///The title of the tgui input popup + var/tgui_title = "What's the password?" + ///Decides whether the max length of the input is MAX_NAME_LEN or the length of the password. + var/input_max_len_is_pass = FALSE + +/obj/machinery/puzzle/password/get_save_vars() + return ..() + list(NAMEOF(src, password), NAMEOF(src, tgui_text), NAMEOF(src, tgui_title), NAMEOF(src, input_max_len_is_pass)) + +/obj/machinery/puzzle/password/interact(mob/user, list/modifiers) + if(used && single_use) + return + if(!user.can_perform_action(src, ALLOW_SILICON_REACH) || !user.can_interact_with(src)) + return + var/pass_input = tgui_input_text(user, tgui_text, tgui_title, max_length = input_max_len_is_pass ? length(password) : MAX_NAME_LEN) + if(isnull(pass_input) || !user.can_perform_action(src, ALLOW_SILICON_REACH) || !user.can_interact_with(src)) + return + var/correct = pass_input == password + balloon_alert_to_viewers("[correct ? "correct" : "wrong"] password[correct ? "" : "!"]") + if(!correct) + playsound(src, 'sound/machines/buzz-sigh.ogg', 45, TRUE) + return + used = single_use + update_icon_state() + playsound(src, 'sound/machines/terminal_button07.ogg', 45, TRUE) + on_puzzle_complete() + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/password, 32) + +/obj/machinery/puzzle/password/pin + desc = "A panel that controls something nearby. This one requires a PIN password, so let's start by typing in 1234..." + tgui_text = "Please enter the PIN code." + tgui_title = "What's the PIN code?" + input_max_len_is_pass = TRUE + ///The length of the PIN. Suggestion: something between 4 and 12. + var/pin_length = 6 + ///associate a color to each digit that may be found in the password. + var/list/digit_to_color = list() + +/obj/machinery/puzzle/password/pin/get_save_vars() + return ..() + NAMEOF(src, pin_length) + +/obj/machinery/puzzle/password/pin/Initialize(mapload) + . = ..() + + for(var/iteration in 1 to pin_length) + password += "[rand(1, 9)]" + + var/list/possible_colors = list( + "white", + "black", + "red", + "green", + "blue", + "yellow", + "orange", + "brown", + "gray", + ) + for(var/digit in 0 to 9) + digit_to_color["[digit]"] = pick_n_take(possible_colors) + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/password/pin, 32) // // blockade @@ -389,6 +469,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_keycardpad, 32) /// if we receive a puzzle signal with this id we get destroyed var/id +/obj/structure/puzzle_blockade/get_save_vars() + return ..() + NAMEOF(src, id) + /obj/structure/puzzle_blockade/Initialize(mapload) . = ..() if(!isnull(id)) @@ -440,12 +523,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_keycardpad, 32) /// door id var/id +/obj/effect/puzzle_poddoor_open/get_save_vars() + return ..() + list(NAMEOF(src, queue_id), NAMEOF(src, id)) + /obj/effect/puzzle_poddoor_open/Initialize(mapload) . = ..() if(isnull(id) || isnull(queue_id)) log_mapping("[src] id:[id] has no id or door id and has been deleted") return INITIALIZE_HINT_QDEL - + SSqueuelinks.add_to_queue(src, queue_id) /obj/effect/puzzle_poddoor_open/MatchedLinks(id, list/partners) @@ -461,3 +547,108 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_keycardpad, 32) if(isnull(openclose)) openclose = door.density INVOKE_ASYNC(door, openclose ? TYPE_PROC_REF(/obj/machinery/door/poddoor, open) : TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) + +#define MAX_PUZZLE_DOTS_PER_ROW 4 +#define PUZZLE_DOTS_VERTICAL_OFFSET 7 +#define PUZZLE_DOTS_HORIZONTAL_OFFSET 7 + +///A dotted board that can be used as clue for PIN puzzle machinery +/obj/effect/decal/puzzle_dots + name = "dotted board" + desc = "A board filled with colored dots. What could this mean?" + icon = 'icons/obj/fluff/puzzle_small.dmi' + icon_state = "puzzle_dots" + plane = GAME_PLANE //visible over walls + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | UNACIDABLE | LAVA_PROOF + flags_1 = UNPAINTABLE_1 + ///The id of the puzzle we're linked to. + var/id + +/obj/effect/decal/puzzle_dots/get_save_vars() + return ..() + NAMEOF(src, id) + +/obj/effect/decal/puzzle_dots/Initialize(mapload) + . = ..() + if(id) + SSqueuelinks.add_to_queue(src, id) + +/obj/effect/decal/puzzle_dots/MatchedLinks(id, partners) + var/obj/machinery/puzzle/password/pin/pad = locate() in partners + var/list/pass_digits = splittext(pad.password, "") + var/pass_len = length(pass_digits) + var/extra_rows = CEILING((pass_len/MAX_PUZZLE_DOTS_PER_ROW)-1, 1) + if(extra_rows) + pixel_y += round(extra_rows*(PUZZLE_DOTS_VERTICAL_OFFSET*0.5)) + for(var/i in 1 to extra_rows) + var/mutable_appearance/row = mutable_appearance(icon, icon_state) + row.pixel_y = -i*PUZZLE_DOTS_VERTICAL_OFFSET + add_overlay(row) + for(var/i in 1 to pass_len) + var/mutable_appearance/colored_dot = mutable_appearance(icon, "puzzle_dot_single") + colored_dot.color = pad.digit_to_color[pass_digits[i]] + colored_dot.pixel_x = PUZZLE_DOTS_HORIZONTAL_OFFSET * ((i-1)%MAX_PUZZLE_DOTS_PER_ROW) + colored_dot.pixel_y -= CEILING((i/MAX_PUZZLE_DOTS_PER_ROW)-1, 1)*PUZZLE_DOTS_VERTICAL_OFFSET + add_overlay(colored_dot) + +#undef MAX_PUZZLE_DOTS_PER_ROW +#undef PUZZLE_DOTS_VERTICAL_OFFSET +#undef PUZZLE_DOTS_HORIZONTAL_OFFSET + + +/obj/effect/decal/cleanable/crayon/puzzle + name = "Password character" + icon_state = "0" + ///The id of the puzzle we're linked to. + var/puzzle_id + +/obj/effect/decal/cleanable/crayon/puzzle/get_save_vars() + return ..() + NAMEOF(src, puzzle_id) + +/obj/effect/decal/cleanable/crayon/puzzle/Initialize(mapload, main, type, e_name, graf_rot, alt_icon = null) + . = ..() + name = "number" + if(puzzle_id) + SSqueuelinks.add_to_queue(src, puzzle_id) + +/obj/effect/decal/cleanable/crayon/puzzle/MatchedLinks(id, partners) + var/obj/machinery/puzzle/password/pad = locate() in partners + var/list/pass_character = splittext(pad.password, "") + var/chosen_character = icon_state + if(!findtext(chosen_character, GLOB.is_alphanumeric)) + qdel(src) + return FALSE + icon_state = pick(pass_character) + if(!text2num(icon_state)) + name = "letter" + desc = "A letter vandalizing the station." + return TRUE + +/obj/effect/decal/cleanable/crayon/puzzle/pin + name = "PIN number" + +/obj/effect/decal/cleanable/crayon/puzzle/pin/MatchedLinks(id, partners) + . = ..() + var/obj/machinery/puzzle/password/pin/pad = locate() in partners + add_atom_colour(pad.digit_to_color[icon_state], FIXED_COLOUR_PRIORITY) + +/obj/item/paper/fluff/scrambled_pass + name = "gibberish note" + icon_state = "scrap" + ///The ID associated to the puzzle we're part of. + var/puzzle_id + +/obj/item/paper/fluff/scrambled_pass/get_save_vars() + return ..() + NAMEOF(src, puzzle_id) + +/obj/item/paper/fluff/scrambled_pass/Initialize(mapload) + . = ..() + if(mapload && puzzle_id) + SSqueuelinks.add_to_queue(src, puzzle_id) + +/obj/item/paper/fluff/scrambled_pass/MatchedLinks(id, partners) + var/obj/machinery/puzzle/password/pad = locate() in partners + var/scrambled_text = "" + var/list/pass_characters = splittext(pad.password, "") + for(var/i in 1 to rand(200, 300)) + scrambled_text += pick(pass_characters) + add_raw_text(scrambled_text) diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 9570614b400..91b51053b0e 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -203,6 +203,11 @@ * * [mob][user]- the user building this structure */ /obj/item/construction/rcd/proc/rcd_create(atom/target, mob/user) + //straight up cant touch this + if(mode == RCD_DECONSTRUCT && (target.resistance_flags & INDESTRUCTIBLE)) + balloon_alert(user, "too durable!") + return + //does this atom allow for rcd actions? var/list/rcd_results = target.rcd_vals(user, src) if(!rcd_results) @@ -219,7 +224,14 @@ delay *= FREQUENT_USE_DEBUFF_MULTIPLIER current_active_effects += 1 - _rcd_create_effect(target, user, delay, rcd_results) + + 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/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]") + current_active_effects -= 1 /** @@ -406,7 +418,7 @@ buzz loudly!","[src] begins \ vibrating violently!") // 5 seconds to get rid of it - addtimer(CALLBACK(src, PROC_REF(detonate_pulse_explode)), 50) + addtimer(CALLBACK(src, PROC_REF(detonate_pulse_explode)), 5 SECONDS) /obj/item/construction/rcd/proc/detonate_pulse_explode() explosion(src, light_impact_range = 3, flame_range = 1, flash_range = 1) @@ -415,7 +427,8 @@ /obj/item/construction/rcd/borg desc = "A device used to rapidly build walls and floors." banned_upgrades = RCD_UPGRADE_SILO_LINK - var/energyfactor = 72 + /// enery usage + var/energyfactor = 72 KILO JOULES /obj/item/construction/rcd/borg/get_matter(mob/user) if(!iscyborg(user)) @@ -457,7 +470,7 @@ desc = "A reverse-engineered RCD with black market upgrades that allow this device to deconstruct reinforced walls. Property of Donk Co." icon_state = "ircd" inhand_icon_state = "ircd" - energyfactor = 66 + energyfactor = 66 KILO JOULES canRturf = TRUE /obj/item/construction/rcd/loaded @@ -508,6 +521,9 @@ has_ammobar = FALSE upgrade = RCD_ALL_UPGRADES & ~RCD_UPGRADE_SILO_LINK +///How much charge is used up for each matter unit. +#define MASS_TO_ENERGY (16 KILO JOULES) + /obj/item/construction/rcd/exosuit name = "mounted RCD" desc = "An exosuit-mounted Rapid Construction Device." @@ -518,8 +534,6 @@ resistance_flags = FIRE_PROOF | INDESTRUCTIBLE // should NOT be destroyed unless the equipment is destroyed item_flags = NO_MAT_REDEMPTION | NOBLUDGEON | DROPDEL // already qdeleted in the equipment's Destroy() but you can never be too sure delay_mod = 0.5 - ///How much charge is used up for each matter unit. - var/mass_to_energy = 16 /obj/item/construction/rcd/exosuit/ui_status(mob/user, datum/ui_state/state) if(ismecha(owner)) @@ -532,7 +546,7 @@ if(!ismecha(owner)) return 0 var/obj/vehicle/sealed/mecha/gundam = owner - return round(gundam.get_charge() / mass_to_energy) + return round(gundam.get_charge() / MASS_TO_ENERGY) /obj/item/construction/rcd/exosuit/useResource(amount, mob/user) if(silo_link) @@ -540,7 +554,7 @@ if(!ismecha(owner)) return 0 var/obj/vehicle/sealed/mecha/gundam = owner - if(!gundam.use_power(amount * mass_to_energy)) + if(!gundam.use_energy(amount * MASS_TO_ENERGY)) gundam.balloon_alert(user, "insufficient charge!") return FALSE return TRUE @@ -551,11 +565,13 @@ if(!ismecha(owner)) return 0 var/obj/vehicle/sealed/mecha/gundam = owner - if(!gundam.has_charge(amount * mass_to_energy)) + if(!gundam.has_charge(amount * MASS_TO_ENERGY)) gundam.balloon_alert(user, "insufficient charge!") return FALSE return TRUE +#undef MASS_TO_ENERGY + #undef FREQUENT_USE_DEBUFF_MULTIPLIER /obj/item/rcd_ammo diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index c2184bcacf9..e5100d11c04 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -275,7 +275,7 @@ if(machine_target.anchored) balloon_alert(user, "unanchor first!") return - if(do_after(user, 20, target = target)) + if(do_after(user, 2 SECONDS, target = target)) machine_target.deconstruct() //Let's not substract matter playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect return diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index a747f813ace..1878b0c1e00 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -60,10 +60,7 @@ if(DISPENSE_LOLLIPOP_MODE) food_item = new /obj/item/food/lollipop/cyborg(turf_to_dispense_to) if(DISPENSE_ICECREAM_MODE) - food_item = new /obj/item/food/icecream( - loc = turf_to_dispense_to, - prefill_flavours = list(ICE_CREAM_VANILLA), - ) + food_item = new /obj/item/food/icecream(turf_to_dispense_to, list(ICE_CREAM_VANILLA)) food_item.desc = "Eat the ice cream." var/into_hands = FALSE @@ -124,7 +121,7 @@ check_amount() if(iscyborg(user)) var/mob/living/silicon/robot/robot_user = user - if(!robot_user.cell.use(12)) + if(!robot_user.cell.use(12 KILO JOULES)) to_chat(user, span_warning("Not enough power.")) return AFTERATTACK_PROCESSED_ITEM switch(mode) diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index 7ebd87408f6..b9f28b4003e 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -12,12 +12,13 @@ /obj/item/borg icon = 'icons/mob/silicon/robot_items.dmi' +/// Cost to use the stun arm +#define CYBORG_STUN_CHARGE_COST (0.2 * STANDARD_CELL_CHARGE) + /obj/item/borg/stun name = "electrically-charged arm" icon_state = "elecarm" var/stamina_damage = 60 //Same as normal batong - /// Cost to use the stun arm - var/charge_cost = 200 var/cooldown_check = 0 /// cooldown between attacks var/cooldown = 4 SECONDS // same as baton @@ -33,7 +34,7 @@ return FALSE if(iscyborg(user)) var/mob/living/silicon/robot/robot_user = user - if(!robot_user.cell.use(charge_cost)) + if(!robot_user.cell.use(CYBORG_STUN_CHARGE_COST)) return user.do_attack_animation(attacked_mob) @@ -57,6 +58,8 @@ cooldown_check = world.time + cooldown log_combat(user, attacked_mob, "stunned", src, "(Combat mode: [user.combat_mode ? "On" : "Off"])") +#undef CYBORG_STUN_CHARGE_COST + /obj/item/borg/cyborghug name = "hugging module" icon_state = "hugmodule" @@ -182,7 +185,7 @@ span_danger("You shock [attacked_mob] to no effect."), ) playsound(loc, 'sound/effects/sparks2.ogg', 50, TRUE, -1) - user.cell.charge -= 500 + user.cell.use(0.5 * STANDARD_CELL_CHARGE, force = TRUE) COOLDOWN_START(src, shock_cooldown, HUG_SHOCK_COOLDOWN) if(HUG_MODE_CRUSH) if (!COOLDOWN_FINISHED(src, crush_cooldown)) @@ -199,7 +202,7 @@ ) playsound(loc, 'sound/weapons/smash.ogg', 50, TRUE, -1) attacked_mob.adjustBruteLoss(15) - user.cell.charge -= 300 + user.cell.use(0.3 * STANDARD_CELL_CHARGE, force = TRUE) COOLDOWN_START(src, crush_cooldown, HUG_CRUSH_COOLDOWN) /obj/item/borg/cyborghug/peacekeeper @@ -244,17 +247,14 @@ return to_chat(user, span_notice("You connect to [target_machine]'s power line...")) - while(do_after(user, 15, target = target_machine, progress = 0)) + while(do_after(user, 1.5 SECONDS, target = target_machine, progress = FALSE)) if(!user || !user.cell || mode != "draw") return if((target_machine.machine_stat & (NOPOWER|BROKEN)) || !target_machine.anchored) break - if(!user.cell.give(150)) - break - - target_machine.use_power(200) + target_machine.charge_cell(0.15 * STANDARD_CELL_CHARGE, user.cell) to_chat(user, span_notice("You stop charging yourself.")) @@ -278,7 +278,7 @@ to_chat(user, span_notice("You connect to [target]'s power port...")) - while(do_after(user, 15, target = target, progress = 0)) + while(do_after(user, 1.5 SECONDS, target = target, progress = FALSE)) if(!user || !user.cell || mode != "draw") return @@ -316,7 +316,7 @@ to_chat(user, span_notice("You connect to [target]'s power port...")) - while(do_after(user, 15, target = target, progress = 0)) + while(do_after(user, 1.5 SECONDS, target = target, progress = FALSE)) if(!user || !user.cell || mode != "charge") return diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm index d9ac9f511e4..8ab81a46234 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -108,7 +108,7 @@ */ var/max_volume_per_reagent = 30 /// Cell cost for charging a reagent - var/charge_cost = 50 + var/charge_cost = 50 KILO JOULES /// Counts up to the next time we charge var/charge_timer = 0 /// Time it takes for shots to recharge (in seconds) @@ -310,7 +310,7 @@ Also metabolizes potassium iodide for radiation poisoning, inacusiate for ear damage and morphine for offense." icon_state = "borghypo_s" tgui_theme = "syndicate" - charge_cost = 20 + charge_cost = 20 KILO JOULES recharge_time = 2 default_reagent_types = BASE_SYNDICATE_REAGENTS bypass_protection = TRUE @@ -323,7 +323,7 @@ icon_state = "shaker" possible_transfer_amounts = list(5,10,20,1) // Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. - charge_cost = 20 + charge_cost = 20 KILO JOULES recharge_time = 3 dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP //Water stays wet, ice stays ice default_reagent_types = BASE_SERVICE_REAGENTS @@ -395,7 +395,7 @@ icon_state = "flour" possible_transfer_amounts = list(5,10,20,1) // Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. - charge_cost = 40 //Costs double the power of the borgshaker due to synthesizing solids + charge_cost = 40 KILO JOULES //Costs double the power of the borgshaker due to synthesizing solids recharge_time = 6 //Double the recharge time too, for the same reason. dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP default_reagent_types = EXPANDED_SERVICE_REAGENTS diff --git a/code/game/objects/items/robot/items/tools.dm b/code/game/objects/items/robot/items/tools.dm index 773458964f7..538fd1b7ca1 100644 --- a/code/game/objects/items/robot/items/tools.dm +++ b/code/game/objects/items/robot/items/tools.dm @@ -1,4 +1,5 @@ #define PKBORG_DAMPEN_CYCLE_DELAY (2 SECONDS) +#define POWER_RECHARGE_CYBORG_DRAIN_MULTIPLIER (0.4 KILO WATTS) /obj/item/cautery/prt //it's a subtype of cauteries so that it inherits the cautery sprites and behavior and stuff, because I'm too lazy to make sprites for this thing name = "plating repair tool" @@ -24,8 +25,6 @@ var/energy = 1500 /// Recharging rate in energy per second var/energy_recharge = 37.5 - /// Charge draining right - var/energy_recharge_cyborg_drain_coefficient = 0.4 /// Critical power level percentage var/cyborg_cell_critical_percentage = 0.05 /// The owner of the dampener @@ -156,7 +155,7 @@ energy = clamp(energy + energy_recharge * seconds_per_tick, 0, maxenergy) return if(host.cell && (host.cell.charge >= (host.cell.maxcharge * cyborg_cell_critical_percentage)) && (energy < maxenergy)) - host.cell.use(energy_recharge * seconds_per_tick * energy_recharge_cyborg_drain_coefficient) + host.cell.use(energy_recharge * seconds_per_tick * POWER_RECHARGE_CYBORG_DRAIN_MULTIPLIER) energy += energy_recharge * seconds_per_tick /obj/item/borg/projectile_dampen/proc/dampen_projectile(datum/source, obj/projectile/projectile) @@ -176,3 +175,4 @@ projectile.cut_overlay(projectile_effect) #undef PKBORG_DAMPEN_CYCLE_DELAY +#undef POWER_RECHARGE_CYBORG_DRAIN_MULTIPLIER diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 0876c28a1e8..efc541aee34 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -295,7 +295,7 @@ /// Minimum time between repairs in seconds var/repair_cooldown = 4 var/on = FALSE - var/powercost = 10 + var/energy_cost = 10 KILO JOULES var/datum/action/toggle_action /obj/item/borg/upgrade/selfrepair/action(mob/living/silicon/robot/R, user = usr) @@ -355,7 +355,7 @@ deactivate_sr() return - if(cyborg.cell.charge < powercost * 2) + if(cyborg.cell.charge < energy_cost * 2) to_chat(cyborg, span_alert("Self-repair module deactivated. Please recharge.")) deactivate_sr() return @@ -363,16 +363,16 @@ if(cyborg.health < cyborg.maxHealth) if(cyborg.health < 0) repair_amount = -2.5 - powercost = 30 + energy_cost = 30 KILO JOULES else repair_amount = -1 - powercost = 10 + energy_cost = 10 KILO JOULES cyborg.adjustBruteLoss(repair_amount) cyborg.adjustFireLoss(repair_amount) cyborg.updatehealth() - cyborg.cell.use(powercost) + cyborg.cell.use(energy_cost) else - cyborg.cell.use(5) + cyborg.cell.use(5 KILO JOULES) next_repair = world.time + repair_cooldown * 10 // Multiply by 10 since world.time is in deciseconds if(TIMER_COOLDOWN_FINISHED(src, COOLDOWN_BORG_SELF_REPAIR)) @@ -657,7 +657,6 @@ /obj/item/inducer/cyborg name = "Internal inducer" - powertransfer = 1500 icon = 'icons/obj/tools.dmi' icon_state = "inducer-engi" cell_type = null diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 3e3af7bc36f..66dd5a34b6a 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -231,7 +231,7 @@ return else to_chat(user, span_notice("You begin to replace the bulb...")) - if(do_after(user, 20, target = user)) + if(do_after(user, 2 SECONDS, target = user)) if(QDELETED(flash) || flash.burnt_out) return playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index cdc786fc8db..c07bc780c91 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -35,6 +35,9 @@ wound_bonus = 30 embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=1) +/obj/projectile/bullet/shrapnel/short_range + range = 5 + /obj/projectile/bullet/shrapnel/mega name = "flying shrapnel hunk" range = 45 diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 19b518157c8..75c35eabb18 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -74,7 +74,7 @@ attack_verb_simple = list("bluespace polybash", "bluespace polybatter", "bluespace polybludgeon", "bluespace polythrash", "bluespace polysmash") novariants = TRUE grind_results = list(/datum/reagent/bluespace = 20) - point_value = 30 + point_value = 90 merge_type = /obj/item/stack/sheet/bluespace_crystal material_type = /datum/material/bluespace var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined 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 514ab36ed66..c55a39c20f7 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 @@ -168,7 +168,7 @@ alert_icon_state = "sheet-plasma" alert_desc = "You are protected from high pressure and can convert heat damage into power." /// What do we multiply our damage by to convert it into power? - var/power_multiplier = 5 + var/energy_per_damage = 5 KILO JOULES /// Multiplier to apply to burn damage, not 0 so that we can reverse it more easily var/burn_multiplier = 0.05 @@ -195,7 +195,7 @@ if(damagetype != BURN) return - var/power = damage * power_multiplier + var/power = damage * energy_per_damage var/obj/machinery/power/energy_accumulator/ground = get_closest_atom(/obj/machinery/power/energy_accumulator, view(4, owner), owner) if (ground) zap_effect(ground) @@ -433,15 +433,14 @@ var/glow_range = 3 var/glow_power = 1 var/glow_color = LIGHT_COLOR_DEFAULT - var/datum/component/overlay_lighting/lightbulb + var/obj/effect/dummy/lighting_obj/moblight/lightbulb /datum/status_effect/golem_lightbulb/on_apply() . = ..() if (!.) return to_chat(owner, span_notice("You start to emit a healthy glow.")) - owner.light_system = OVERLAY_LIGHT - lightbulb = owner.AddComponent(/datum/component/overlay_lighting, _range = glow_range, _power = glow_power, _color = glow_color) + lightbulb = owner.mob_light(glow_range, glow_power, glow_color) owner.add_filter(LIGHTBULB_FILTER, 2, list("type" = "outline", "color" = glow_color, "alpha" = 60, "size" = 1)) /datum/status_effect/golem_lightbulb/on_remove() diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 306bc0fa9f9..1f33384b393 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -310,6 +310,7 @@ name = "improvised gauze" singular_name = "improvised gauze" desc = "A roll of cloth roughly cut from something that does a decent job of stabilizing wounds, but less efficiently so than real medical gauze." + icon_state = "gauze_imp" self_delay = 6 SECONDS other_delay = 3 SECONDS splint_factor = 0.85 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 5a789d34350..d6bd65afe31 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) - point_value = 4 + point_value = 12 matter_amount = 6 tableVariant = /obj/structure/table/reinforced/rglass @@ -197,7 +197,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ 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) - point_value = 23 + point_value = 69 matter_amount = 8 tableVariant = /obj/structure/table/reinforced/plasmarglass diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index e9426a913ec..851e544ff8a 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -322,7 +322,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ if(W.get_sharpness()) playsound(loc, 'sound/weapons/slice.ogg', 50, TRUE, -1) user.visible_message(span_notice("[user] starts cutting hair off \the [src]."), span_notice("You start cutting the hair off \the [src]..."), span_hear("You hear the sound of a knife rubbing against flesh.")) - if(do_after(user, 50, target = src)) + if(do_after(user, 5 SECONDS, target = src)) to_chat(user, span_notice("You cut the hair from [src.name].")) new /obj/item/stack/sheet/hairlesshide(user.drop_location(), amount) use(amount) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 8eafe6d52e5..0620d82cd9b 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ sheettype = "diamond" mats_per_unit = list(/datum/material/diamond=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/carbon = 20) - point_value = 25 + point_value = 75 merge_type = /obj/item/stack/sheet/mineral/diamond material_type = /datum/material/diamond walltype = /turf/closed/wall/mineral/diamond @@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ sheettype = "uranium" mats_per_unit = list(/datum/material/uranium=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/uranium = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/uranium material_type = /datum/material/uranium walltype = /turf/closed/wall/mineral/uranium @@ -157,7 +157,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ max_integrity = 100 mats_per_unit = list(/datum/material/plasma=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/toxin/plasma = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/plasma material_type = /datum/material/plasma walltype = /turf/closed/wall/mineral/plasma @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ sheettype = "gold" mats_per_unit = list(/datum/material/gold=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/gold = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/gold material_type = /datum/material/gold walltype = /turf/closed/wall/mineral/gold @@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ sheettype = "silver" mats_per_unit = list(/datum/material/silver=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/silver = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/silver material_type = /datum/material/silver tableVariant = /obj/structure/table/optable @@ -245,7 +245,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ sheettype = "bananium" mats_per_unit = list(/datum/material/bananium=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/consumable/banana = 20) - point_value = 50 + point_value = 150 merge_type = /obj/item/stack/sheet/mineral/bananium material_type = /datum/material/bananium walltype = /turf/closed/wall/mineral/bananium @@ -276,7 +276,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ throw_range = 3 sheettype = "titanium" mats_per_unit = list(/datum/material/titanium=SHEET_MATERIAL_AMOUNT) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/titanium material_type = /datum/material/titanium walltype = /turf/closed/wall/mineral/titanium @@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ throw_range = 3 sheettype = "plastitanium" mats_per_unit = list(/datum/material/alloy/plastitanium=SHEET_MATERIAL_AMOUNT) - point_value = 45 + point_value = 135 material_type = /datum/material/alloy/plastitanium merge_type = /obj/item/stack/sheet/mineral/plastitanium material_flags = NONE @@ -482,7 +482,7 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list( singular_name = "metal hydrogen sheet" w_class = WEIGHT_CLASS_NORMAL resistance_flags = FIRE_PROOF | LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE - point_value = 100 + point_value = 300 mats_per_unit = list(/datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT) material_type = /datum/material/metalhydrogen merge_type = /obj/item/stack/sheet/mineral/metal_hydrogen @@ -497,7 +497,7 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list( inhand_icon_state = "sheet-zaukerite" singular_name = "zaukerite crystal" w_class = WEIGHT_CLASS_NORMAL - point_value = 120 + point_value = 360 mats_per_unit = list(/datum/material/zaukerite = SHEET_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/mineral/zaukerite material_type = /datum/material/zaukerite diff --git a/code/game/objects/items/stacks/sheets/runed_metal.dm b/code/game/objects/items/stacks/sheets/runed_metal.dm index a1febc091b7..b60cd67d389 100644 --- a/code/game/objects/items/stacks/sheets/runed_metal.dm +++ b/code/game/objects/items/stacks/sheets/runed_metal.dm @@ -8,7 +8,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ time = 4 SECONDS, \ one_per_turf = TRUE, \ on_solid_ground = TRUE, \ - desc = span_cultbold("Pylon: Heals and regenerates the blood of nearby blood cultists and constructs, and also \ + desc = span_cult_bold("Pylon: Heals and regenerates the blood of nearby blood cultists and constructs, and also \ converts nearby floor tiles into engraved flooring, which allows blood cultists to scribe runes faster."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ time = 4 SECONDS, \ one_per_turf = TRUE, \ on_solid_ground = TRUE, \ - desc = span_cultbold("Altar: Can make Eldritch Whetstones, Construct Shells, and Flasks of Unholy Water."), \ + desc = span_cult_bold("Altar: Can make Eldritch Whetstones, Construct Shells, and Flasks of Unholy Water."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ ), \ @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ time = 4 SECONDS, \ one_per_turf = TRUE, \ on_solid_ground = TRUE, \ - desc = span_cultbold("Archives: Can make Zealot's Blindfolds, Shuttle Curse Orbs, \ + desc = span_cult_bold("Archives: Can make Zealot's Blindfolds, Shuttle Curse Orbs, \ and Veil Walker equipment. Emits Light."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ @@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ time = 4 SECONDS, \ one_per_turf = TRUE, \ on_solid_ground = TRUE, \ - desc = span_cultbold("Daemon Forge: Can make Nar'Sien Hardened Armor, Flagellant's Robes, \ + desc = span_cult_bold("Daemon Forge: Can make Nar'Sien Hardened Armor, Flagellant's Robes, \ and Eldritch Longswords. Emits Light."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ time = 5 SECONDS, \ one_per_turf = TRUE, \ on_solid_ground = TRUE, \ - desc = span_cultbold("Runed Door: A weak door which stuns non-blood cultists who touch it."), \ + desc = span_cult_bold("Runed Door: A weak door which stuns non-blood cultists who touch it."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ ), \ @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ time = 5 SECONDS, \ one_per_turf = TRUE, \ on_solid_ground = TRUE, \ - desc = span_cultbold("Runed Girder: A weak girder that can be instantly destroyed by ritual daggers. Not a recommended usage of runed metal."), \ + desc = span_cult_bold("Runed Girder: A weak girder that can be instantly destroyed by ritual daggers. Not a recommended usage of runed metal."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ ), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 24254339e95..e5ba265e98e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -48,6 +48,11 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new /datum/stack_recipe("bench (left)", /obj/structure/chair/sofa/bench/left, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ new /datum/stack_recipe("bench (right)", /obj/structure/chair/sofa/bench/right, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ new /datum/stack_recipe("bench (corner)", /obj/structure/chair/sofa/bench/corner, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (solo)", /obj/structure/chair/sofa/bench/tram/solo, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (middle)", /obj/structure/chair/sofa/bench/tram, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (left)", /obj/structure/chair/sofa/bench/tram/left, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (right)", /obj/structure/chair/sofa/bench/tram/right, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (corner)", /obj/structure/chair/sofa/bench/tram/corner, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ )), \ new /datum/stack_recipe_list("chess pieces", list( \ new /datum/stack_recipe("White Pawn", /obj/structure/chess/whitepawn, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ @@ -152,7 +157,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/iron grind_results = list(/datum/reagent/iron = 20) - point_value = 2 + point_value = 6 tableVariant = /obj/structure/table material_type = /datum/material/iron matter_amount = 4 @@ -279,7 +284,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) - point_value = 23 + point_value = 69 tableVariant = /obj/structure/table/reinforced material_flags = NONE matter_amount = 12 @@ -788,7 +793,8 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ ) GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("plastic floor tile", /obj/item/stack/tile/plastic, 1, 4, 20, time = 2 SECONDS, check_density = FALSE, category = CAT_TILES), \ - new /datum/stack_recipe("thermoplastic tram tile", /obj/item/stack/thermoplastic, 1, 2, time = 4 SECONDS, check_density = FALSE, placement_checks = STACK_CHECK_TRAM_EXCLUSIVE, category = CAT_TILES), \ + new /datum/stack_recipe("light tram tile", /obj/item/stack/thermoplastic/light, 1, 4, 20, time = 2 SECONDS, check_density = FALSE, category = CAT_TILES), \ + new /datum/stack_recipe("dark tram tile", /obj/item/stack/thermoplastic, 1, 4, 20, time = 2 SECONDS, check_density = FALSE, category = CAT_TILES), \ new /datum/stack_recipe("folding plastic chair", /obj/structure/chair/plastic, 2, check_density = FALSE, category = CAT_FURNITURE), \ new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_solid_ground = TRUE, time = 4 SECONDS, category = CAT_FURNITURE), \ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/empty, check_density = FALSE, category = CAT_CONTAINERS), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d31dc5caea6..7a025bc6bcc 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -145,7 +145,7 @@ /obj/item/stack/set_custom_materials(list/materials, multiplier=1, is_update=FALSE) return is_update ? ..() : set_mats_per_unit(materials, multiplier/(amount || 1)) -/obj/item/stack/grind_requirements() +/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!")) return diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index c52fbe870f8..4a8a1c1871f 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -29,9 +29,9 @@ //If colors are too dark, set to original colors if(base_hsv[3] < 50) - generated_base_color = "#00FF00" + generated_base_color = COLOR_VIBRANT_LIME if(ribbon_hsv[3] < 50) - generated_ribbon_color = "#FF0000" + generated_ribbon_color = COLOR_RED //Set layers to these colors, base then ribbon set_greyscale(colors = list(generated_base_color, generated_ribbon_color)) diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm deleted file mode 100644 index 459c8d211e4..00000000000 --- a/code/game/objects/items/sticker.dm +++ /dev/null @@ -1,131 +0,0 @@ -/// parent type for all other stickers. do not spawn directly -/obj/item/sticker - name = "sticker" - desc = "A sticker with some strong adhesive on the back, sticks to stuff!" - item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny - resistance_flags = FLAMMABLE - icon = 'icons/obj/toys/stickers.dmi' - w_class = WEIGHT_CLASS_TINY - throw_range = 3 - vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER - ///If not null, pick an icon_state from this list - var/icon_states - /// If the sticker should be disincluded from normal sticker boxes. - var/contraband = FALSE - -/obj/item/sticker/Initialize(mapload) - . = ..() - if(icon_states) - icon_state = pick(icon_states) - pixel_y = rand(-3,3) - pixel_x = rand(-3,3) - AddElement(/datum/element/sticker) - -/obj/item/sticker/smile - name = "smiley sticker" - icon_state = "smile" - -/obj/item/sticker/frown - name = "frowny sticker" - icon_state = "frown" - -/obj/item/sticker/left_arrow - name = "left arrow sticker" - icon_state = "larrow" - -/obj/item/sticker/right_arrow - name = "right arrow sticker" - icon_state = "rarrow" - -/obj/item/sticker/star - name = "star sticker" - icon_state = "star1" - icon_states = list("star1","star2") - -/obj/item/sticker/heart - name = "heart sticker" - icon_state = "heart" - -/obj/item/sticker/googly - name = "googly eye sticker" - icon_state = "googly1" - icon_states = list("googly1","googly2") - -/obj/item/sticker/rev - name = "blue R sticker" - desc = "A sticker of FUCK THE SYSTEM, the galaxy's premiere hardcore punk band." - icon_state = "revhead" - -/obj/item/sticker/pslime - name = "slime plushie sticker" - icon_state = "pslime" - -/obj/item/sticker/pliz - name = "lizard plushie sticker" - icon_state = "plizard" - -/obj/item/sticker/pbee - name = "bee plushie sticker" - icon_state = "pbee" - -/obj/item/sticker/psnake - name = "snake plushie sticker" - icon_state = "psnake" - -/obj/item/sticker/robot - name = "bot sticker" - icon_state = "tile" - icon_states = list("tile","medbot","clean") - -/obj/item/sticker/toolbox - name = "toolbox sticker" - icon_state = "toolbox" - -/obj/item/sticker/clown - name = "clown sticker" - icon_state = "honkman" - -/obj/item/sticker/mime - name = "mime sticker" - icon_state = "silentman" - -/obj/item/sticker/assistant - name = "assistant sticker" - icon_state = "tider" - -/obj/item/sticker/syndicate - name = "syndicate sticker" - icon_state = "synd" - contraband = TRUE - -/obj/item/sticker/syndicate/c4 - name = "C-4 sticker" - icon_state = "c4" - -/obj/item/sticker/syndicate/bomb - name = "syndicate bomb sticker" - icon_state = "sbomb" - -/obj/item/sticker/syndicate/apc - name = "broken APC sticker" - icon_state = "milf" - -/obj/item/sticker/syndicate/larva - name = "larva sticker" - icon_state = "larva" - -/obj/item/sticker/syndicate/cult - name = "bloody paper sticker" - icon_state = "cult" - -/obj/item/sticker/syndicate/flash - name = "flash sticker" - icon_state = "flash" - -/obj/item/sticker/syndicate/op - name = "operative sticker" - icon_state = "newcop" - -/obj/item/sticker/syndicate/trap - name = "bear trap sticker" - icon_state = "trap" diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm new file mode 100644 index 00000000000..a02cfd9515e --- /dev/null +++ b/code/game/objects/items/stickers.dm @@ -0,0 +1,207 @@ +#define MAX_STICKER_COUNT 15 + +/** + * What stickers can do? + * + * - They can be attached to any object. + * - They inherit cursor position when attached. + * - They are unclickable by mouse, I suppose? + * - They can be washed off. + * - They can be burnt off. + * - They can be attached to the object they collided with. + * - They play "attack" animation when attached. + * + */ + +/obj/item/sticker + name = "sticker" + desc = "A sticker with some strong adhesive on the back, sticks to stuff!" + + icon = 'icons/obj/toys/stickers.dmi' + + max_integrity = 50 + resistance_flags = FLAMMABLE + + throw_range = 3 + pressure_resistance = 0 + + item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny ~Jimmyl + w_class = WEIGHT_CLASS_TINY + + /// `list` or `null`, contains possible alternate `icon_states`. + var/list/icon_states + /// Whether sticker is legal and allowed to generate inside non-syndicate boxes. + var/contraband = FALSE + +/obj/item/sticker/Initialize(mapload) + . = ..() + + if(length(icon_states)) + icon_state = pick(icon_states) + +/obj/item/sticker/Bump(atom/bumped_atom) + if(prob(50) && attempt_attach(bumped_atom)) + bumped_atom.balloon_alert_to_viewers("sticker landed on sticky side!") + +/obj/item/sticker/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isatom(interacting_with)) + return NONE + + var/cursor_x = text2num(LAZYACCESS(modifiers, ICON_X)) + var/cursor_y = text2num(LAZYACCESS(modifiers, ICON_Y)) + + if(isnull(cursor_x) || isnull(cursor_y)) + return NONE + + if(attempt_attach(interacting_with, user, cursor_x, cursor_y)) + return ITEM_INTERACT_SUCCESS + + return NONE + +/** + * Attempts to attach sticker to an object. Returns `FALSE` if atom has more than + * `MAX_STICKER_COUNT` stickers, `TRUE` otherwise. If no `px` or `py` were passed + * picks random coordinates based on a `target`'s icon. + */ +/obj/item/sticker/proc/attempt_attach(atom/target, mob/user, px, py) + if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_STICKER_COUNT) + balloon_alert_to_viewers("sticker won't stick!") + return FALSE + + if(isnull(px) || isnull(py)) + var/icon/target_mask = icon(target.icon, target.icon_state) + + if(isnull(px)) + px = rand(1, target_mask.Width()) + + if(isnull(py)) + py = rand(1, target_mask.Height()) + + if(!isnull(user)) + user.do_attack_animation(target, used_item = src) + target.balloon_alert(user, "sticker sticked") + var/mob/living/victim = target + if(istype(victim) && !isnull(victim.client)) + user.log_message("stuck [src] to [key_name(victim)]", LOG_ATTACK) + victim.log_message("had [src] stuck to them by [key_name(user)]", LOG_ATTACK) + + target.AddComponent(/datum/component/sticker, src, get_dir(target, src), px, py) + return TRUE + +#undef MAX_STICKER_COUNT + +/obj/item/sticker/smile + name = "smiley sticker" + icon_state = "smile" + +/obj/item/sticker/frown + name = "frowny sticker" + icon_state = "frown" + +/obj/item/sticker/left_arrow + name = "left arrow sticker" + icon_state = "arrow-left" + +/obj/item/sticker/right_arrow + name = "right arrow sticker" + icon_state = "arrow-right" + +/obj/item/sticker/star + name = "star sticker" + icon_state = "star" + +/obj/item/sticker/heart + name = "heart sticker" + icon_state = "heart" + +/obj/item/sticker/googly + name = "googly eye sticker" + icon_state = "googly" + icon_states = list("googly", "googly-alt") + +/obj/item/sticker/rev + name = "blue R sticker" + desc = "A sticker of FUCK THE SYSTEM, the galaxy's premiere hardcore punk band." + icon_state = "revhead" + +/obj/item/sticker/pslime + name = "slime plushie sticker" + icon_state = "pslime" + +/obj/item/sticker/pliz + name = "lizard plushie sticker" + icon_state = "plizard" + +/obj/item/sticker/pbee + name = "bee plushie sticker" + icon_state = "pbee" + +/obj/item/sticker/psnake + name = "snake plushie sticker" + icon_state = "psnake" + +/obj/item/sticker/robot + name = "bot sticker" + icon_state = "tile" + icon_states = list("tile", "medbot", "clean") + +/obj/item/sticker/toolbox + name = "toolbox sticker" + icon_state = "soul" + +/obj/item/sticker/clown + name = "clown sticker" + icon_state = "honkman" + +/obj/item/sticker/mime + name = "mime sticker" + icon_state = "silentman" + +/obj/item/sticker/assistant + name = "assistant sticker" + icon_state = "tider" + +/obj/item/sticker/skub + name = "skub sticker" + icon_state = "skub" + +/obj/item/sticker/anti_skub + name = "anti-skub sticker" + icon_state = "anti_skub" + +/obj/item/sticker/syndicate + name = "syndicate sticker" + icon_state = "synd" + contraband = TRUE + +/obj/item/sticker/syndicate/c4 + name = "C-4 sticker" + icon_state = "c4" + +/obj/item/sticker/syndicate/bomb + name = "syndicate bomb sticker" + icon_state = "sbomb" + +/obj/item/sticker/syndicate/apc + name = "broken APC sticker" + icon_state = "milf" + +/obj/item/sticker/syndicate/larva + name = "larva sticker" + icon_state = "larva" + +/obj/item/sticker/syndicate/cult + name = "bloody paper sticker" + icon_state = "cult" + +/obj/item/sticker/syndicate/flash + name = "flash sticker" + icon_state = "flash" + +/obj/item/sticker/syndicate/op + name = "operative sticker" + icon_state = "newcop" + +/obj/item/sticker/syndicate/trap + name = "bear trap sticker" + icon_state = "trap" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index b6b2770c293..451dc82c89c 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -246,6 +246,7 @@ /obj/item/clothing/mask/muzzle, /obj/item/clothing/mask/surgical, /obj/item/clothing/suit/toggle/labcoat/hospitalgown, //SKYRAT EDIT ADDITION - adds surgery gowns to belts + /obj/item/clothing/head/utility/surgerycap, /obj/item/construction/plumbing, /obj/item/dnainjector, /obj/item/extinguisher/mini, @@ -256,6 +257,7 @@ /obj/item/hemostat, /obj/item/holosign_creator/medical, /obj/item/hypospray/mkii, //SKYRAT EDIT ADDITION - HYPOSPRAYS + /obj/item/storage/hypospraykit/, //SKYRAT EDIT ADDITION - HYPOSPRAYS /obj/item/implant, /obj/item/implantcase, /obj/item/implanter, diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index 18a6ec31d87..6b4e995a276 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -47,10 +47,14 @@ new /obj/item/clothing/head/syndicatefake(src) new /obj/item/clothing/suit/syndicatefake(src) -/obj/item/storage/box/syndie_kit/space_dragon/PopulateContents() - new /obj/item/dna_probe/carp_scanner(src) - new /obj/item/clothing/suit/hooded/carp_costume/spaceproof/old(src) - new /obj/item/clothing/mask/gas/carp(src) +/obj/item/storage/box/syndie_kit/battle_royale + name = "rumble royale broadcast kit" + desc = "Contains everything you need to host the galaxy's greatest show; Rumble Royale." + +/obj/item/storage/box/syndie_kit/battle_royale/PopulateContents() + var/obj/item/royale_implanter/implanter = new(src) + var/obj/item/royale_remote/remote = new(src) + remote.link_implanter(implanter) /obj/item/storage/box/deputy name = "box of deputy armbands" @@ -211,3 +215,11 @@ new /obj/item/clothing/gloves/combat/floortile(src) new /obj/item/clothing/shoes/jackboots/floortile(src) new /obj/item/storage/backpack/floortile(src) + +/obj/item/storage/box/collar_bomb + name = "collar bomb box" + desc = "A small print on the back reads 'For research purposes only. Handle with care. In case of emergency, call the following number:'... the rest is scratched out with a marker..." + +/obj/item/storage/box/collar_bomb/PopulateContents() + var/obj/item/collar_bomb_button/button = new(src) + new /obj/item/clothing/neck/collar_bomb(src, button) diff --git a/code/game/objects/items/storage/boxes/security_boxes.dm b/code/game/objects/items/storage/boxes/security_boxes.dm index 8e55986fb40..459c0ab7ce2 100644 --- a/code/game/objects/items/storage/boxes/security_boxes.dm +++ b/code/game/objects/items/storage/boxes/security_boxes.dm @@ -174,6 +174,16 @@ for(var/i in 1 to 7) new /obj/item/ammo_casing/shotgun/buckshot(src) +/obj/item/storage/box/slugs + name = "box of shotgun shells (Lethal - Slugs)" + desc = "A box full of lethal shotgun slugs, designed for shotguns." + icon_state = "breacher_box" + illustration = null + +/obj/item/storage/box/slugs/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun(src) + /obj/item/storage/box/beanbag name = "box of shotgun shells (Less Lethal - Beanbag)" desc = "A box full of beanbag shotgun shells, designed for shotguns." diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 14656f0f5f7..8dcc1f4f6b6 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -209,16 +209,21 @@ desc = "A box full of random stickers. Do give to the clown." /obj/item/storage/box/stickers/proc/generate_non_contraband_stickers_list() - . = list() + var/list/allowed_stickers = list() + for(var/obj/item/sticker/sticker_type as anything in subtypesof(/obj/item/sticker)) - if(!initial(sticker_type.contraband)) - . += sticker_type - return . + if(!sticker_type::contraband) + allowed_stickers += sticker_type + + return allowed_stickers + /obj/item/storage/box/stickers/PopulateContents() var/static/list/non_contraband - if(!non_contraband) + + if(isnull(non_contraband)) non_contraband = generate_non_contraband_stickers_list() - for(var/i in 1 to rand(4,8)) + + for(var/i in 1 to rand(4, 8)) var/type = pick(non_contraband) new type(src) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index a7fbe6e7452..95eb304509f 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -223,7 +223,7 @@ balloon_alert(user, "ooh, free coupon") var/obj/item/coupon/attached_coupon = new user.put_in_hands(attached_coupon) - attached_coupon.generate(rigged_omen ? COUPON_OMEN : null) + attached_coupon.generate(rigged_omen ? COUPON_OMEN : null, null, user) attached_coupon = null spawn_coupon = FALSE name = "discarded cigarette packet" @@ -424,7 +424,7 @@ base_icon_state = "cigarcase" w_class = WEIGHT_CLASS_NORMAL contents_tag = "premium cigar" - spawn_type = /obj/item/clothing/mask/cigarette/cigar + spawn_type = /obj/item/clothing/mask/cigarette/cigar/premium spawn_count = 5 spawn_coupon = FALSE display_cigs = FALSE diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index 2e937571b27..ec0856e6e19 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -129,6 +129,8 @@ new /obj/item/clothing/under/rank/medical/chief_medical_officer(src) new /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt(src) new /obj/item/clothing/under/rank/medical/chief_medical_officer/scrubs(src) + new /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck(src) + new /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck/skirt(src) new /obj/item/clothing/suit/hooded/wintercoat/medical/cmo(src) new /obj/item/clothing/suit/toggle/labcoat/cmo(src) new /obj/item/clothing/gloves/latex/nitrile(src) @@ -140,6 +142,8 @@ /obj/item/storage/bag/garment/engineering_chief/PopulateContents() new /obj/item/clothing/under/rank/engineering/chief_engineer(src) new /obj/item/clothing/under/rank/engineering/chief_engineer/skirt(src) + new /obj/item/clothing/under/rank/engineering/chief_engineer/turtleneck(src) + new /obj/item/clothing/under/rank/engineering/chief_engineer/turtleneck/skirt(src) new /obj/item/clothing/suit/hooded/wintercoat/engineering/ce(src) new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/clothing/gloves/chief_engineer(src) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index e389b990a4c..5b09b5e0605 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -271,6 +271,24 @@ /obj/item/storage/pill_bottle/penacid = 1) generate_items_inside(items_inside,src) +/obj/item/storage/medkit/tactical_lite + name = "combat first aid kit" + icon_state = "medkit_tactical" + inhand_icon_state = "medkit-tactical" + damagetype_healed = HEAL_ALL_DAMAGE + +/obj/item/storage/medkit/tactical_lite/PopulateContents() + if(empty) + return + var/static/list/items_inside = list( + /obj/item/healthanalyzer/advanced = 1, + /obj/item/reagent_containers/hypospray/medipen/atropine = 1, + /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/suture/medicated = 2, + /obj/item/stack/medical/mesh/advanced = 2, + ) + generate_items_inside(items_inside, src) + /obj/item/storage/medkit/tactical name = "combat medical kit" desc = "I hope you've got insurance." @@ -724,7 +742,7 @@ return if(istype(I, /obj/item/plunger)) balloon_alert(user, "plunging...") - if(do_after(user, 10, target = src)) + if(do_after(user, 1 SECONDS, target = src)) balloon_alert(user, "plunged") reagents.clear_reagents() return diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index cfdfef8a459..8631d62e79e 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -55,7 +55,6 @@ max_total_storage, list/canhold, list/canthold, - storage_type = /datum/storage, storage_type, ) // If no type was passed in, default to what we already have diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 271fa8b0315..aacf45e239d 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -10,6 +10,7 @@ #define KIT_SNIPER "sniper" #define KIT_NUKEOPS_METAGAME "metaops" #define KIT_LORD_SINGULOTH "lordsingulo" +#define KIT_REVOLUTIONARY "revolutionary" #define KIT_JAMES_BOND "bond" #define KIT_NINJA "ninja" @@ -19,6 +20,9 @@ #define KIT_BEES "bee" #define KIT_MR_FREEZE "mr_freeze" #define KIT_TRAITOR_2006 "ancient" +#define KIT_DEAD_MONEY "dead_money" +#define KIT_SAM_FISHER "sam_fisher" +#define KIT_PROP_HUNT "prop_hunt" /// last audited december 2022 /obj/item/storage/box/syndicate @@ -35,7 +39,8 @@ KIT_IMPLANTS = 1, KIT_HACKER = 3, KIT_SNIPER = 1, - KIT_NUKEOPS_METAGAME = 1 + KIT_NUKEOPS_METAGAME = 1, + KIT_REVOLUTIONARY = 2 ))) if(KIT_RECON) new /obj/item/clothing/glasses/thermal/xray(src) // ~8 tc? @@ -165,6 +170,18 @@ new /obj/item/card/emag(src) // 4 tc new /obj/item/card/emag/doorjack(src) // 3 tc + if(KIT_REVOLUTIONARY) + new /obj/item/healthanalyzer/rad_laser(src) // 3 TC + new /obj/item/assembly/flash/hypnotic(src) // 7 TC + new /obj/item/storage/pill_bottle/lsd(src) // ~1 TC + new /obj/item/pen/sleepy(src) // 4 TC + new /obj/item/gun/ballistic/revolver/nagant(src) // 13 TC comparable to 357. revolvers + new /obj/item/megaphone(src) + new /obj/item/bedsheet/rev(src) + new /obj/item/clothing/suit/armor/vest/russian_coat(src) + new /obj/item/clothing/head/helmet/rus_ushanka(src) + new /obj/item/storage/box/syndie_kit/poster_box(src) + /obj/item/storage/box/syndicate/bundle_b/PopulateContents() switch (pick_weight(list( KIT_JAMES_BOND = 2, @@ -174,7 +191,10 @@ KIT_MAD_SCIENTIST = 2, KIT_BEES = 1, KIT_MR_FREEZE = 2, - KIT_TRAITOR_2006 = 1 + KIT_DEAD_MONEY = 2, + KIT_TRAITOR_2006 = 1, + KIT_SAM_FISHER = 1, + KIT_PROP_HUNT = 1 ))) if(KIT_JAMES_BOND) new /obj/item/gun/ballistic/automatic/pistol(src) // 7 tc @@ -261,9 +281,37 @@ new /obj/item/gun/energy/laser/thermal/cryo(src) // ~6 tc new /obj/item/melee/energy/sword/saber/blue(src) //see see it fits the theme bc its blue and ice is blue, 8 tc - if(KIT_TRAITOR_2006) //A kit so old, it's probably older than you. //This bundle is filled with the entire unlink contents traitors had access to in 2006, from OpenSS13. Notably the esword was not a choice but existed in code. + if(KIT_TRAITOR_2006) //A kit so old, it's probably older than you. //This bundle is filled with the entire uplink contents traitors had access to in 2006, from OpenSS13. Notably the esword was not a choice but existed in code. new /obj/item/storage/toolbox/emergency/old/ancientbundle(src) //Items fit neatly into a classic toolbox just to remind you what the theme is. + if(KIT_DEAD_MONEY) + for(var/i in 1 to 4) + new /obj/item/clothing/neck/collar_bomb(src) // These let you remotely kill people with a signaler, though you have to get them first. + new /obj/item/storage/box/syndie_kit/signaler(src) + new /obj/item/mod/control/pre_equipped/responsory/inquisitory/syndie(src) // basically a snowflake yet better elite modsuit, so like, 8 + 5 tc. + new /obj/item/card/id/advanced/chameleon(src) // 2 tc + new /obj/item/clothing/mask/chameleon(src) + new /obj/item/melee/baton/telescopic/contractor_baton(src) // 7 tc + new /obj/item/jammer(src) // 5 tc + new /obj/item/pinpointer/crew(src) //priceless + + if(KIT_SAM_FISHER) + new /obj/item/clothing/under/syndicate/combat(src) + new /obj/item/clothing/suit/armor/vest/marine/pmc(src) //The armor kit is comparable to the infiltrator, 6 TC + 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/shoes/jackboots(src) + new /obj/item/storage/belt/military/assault/fisher(src) //items in this belt easily costs 18 TC + + if(KIT_PROP_HUNT) + new /obj/item/chameleon(src) // 7 TC + new /obj/item/card/emag/doorjack(src) // 3 TC + new /obj/item/storage/box/syndie_kit/imp_stealth(src) //8 TC + new /obj/item/gun/ballistic/automatic/pistol(src) // 7 TC + new /obj/item/clothing/glasses/thermal(src) // 4 TC + /obj/item/storage/toolbox/emergency/old/ancientbundle/ //So the subtype works /obj/item/storage/toolbox/emergency/old/ancientbundle/PopulateContents() @@ -276,6 +324,17 @@ new /obj/item/implanter/freedom(src) // 5 tc new /obj/item/stack/telecrystal(src) //The failsafe/self destruct isn't an item we can physically include in the kit, but 1 TC is technically enough to buy the equivalent. +/obj/item/storage/belt/military/assault/fisher + +/obj/item/storage/belt/military/assault/fisher/PopulateContents() + new /obj/item/gun/ballistic/automatic/pistol/clandestine(src) // 7 TC + new /obj/item/suppressor(src) // 3 TC + new /obj/item/ammo_box/magazine/m10mm(src) // 1 TC + new /obj/item/ammo_box/magazine/m10mm(src) + new /obj/item/gun/energy/recharge/fisher(src) // Acquirable through black market, shit utility item 1 TC + new /obj/item/card/emag/doorjack(src) // 3 TC + new /obj/item/knife/combat(src) //comparable to the e-dagger, 2 TC + /obj/item/storage/box/syndie_kit name = "box" desc = "A sleek, sturdy box." @@ -628,6 +687,7 @@ /obj/item/storage/box/syndie_kit/stickers/PopulateContents() var/list/types = subtypesof(/obj/item/sticker/syndicate) + for(var/i in 1 to atom_storage.max_slots) var/type = pick(types) new type(src) @@ -807,6 +867,7 @@ #undef KIT_SNIPER #undef KIT_NUKEOPS_METAGAME #undef KIT_LORD_SINGULOTH +#undef KIT_REVOLUTIONARY #undef KIT_JAMES_BOND #undef KIT_NINJA @@ -816,3 +877,6 @@ #undef KIT_BEES #undef KIT_MR_FREEZE #undef KIT_TRAITOR_2006 +#undef KIT_DEAD_MONEY +#undef KIT_SAM_FISHER +#undef KIT_PROP_HUNT diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index 1839245929e..48be955b2ed 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -176,12 +176,10 @@ for(var/atom/movable/tool as anything in contents) tool.forceMove(drop_point) -/obj/item/surgery_tray/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - dump_contents() - new /obj/item/stack/rods(drop_location(), 2) - new /obj/item/stack/sheet/mineral/silver(drop_location()) - return ..() +/obj/item/surgery_tray/atom_deconstruct(disassembled = TRUE) + dump_contents() + new /obj/item/stack/rods(drop_location(), 2) + new /obj/item/stack/sheet/mineral/silver(drop_location()) /obj/item/surgery_tray/deployed is_portable = FALSE diff --git a/code/game/objects/items/syndie_spraycan.dm b/code/game/objects/items/syndie_spraycan.dm index 02a576a2cb9..774219fa122 100644 --- a/code/game/objects/items/syndie_spraycan.dm +++ b/code/game/objects/items/syndie_spraycan.dm @@ -86,7 +86,7 @@ if(HAS_TRAIT(user, TRAIT_TAGGER)) wait_time *= 0.5 - if(!do_after(user, wait_time, target)) + if(!do_after(user, wait_time, target, hidden = TRUE)) user.balloon_alert(user, "interrupted!") drawing_rune = FALSE return FALSE diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index a670a966805..8772e2f41c9 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -174,7 +174,7 @@ if(tank_assembly) . += span_warning("There is some kind of device [EXAMINE_HINT("rigged")] to the tank!") -/obj/item/tank/deconstruct(disassembled = TRUE) +/obj/item/tank/atom_deconstruct(disassembled = TRUE) var/atom/location = loc if(location) location.assume_air(air_contents) @@ -440,7 +440,7 @@ if(LAZYLEN(assembly.assemblies) == igniter_count) return - + if(isitem(loc)) // we are in a storage item balloon_alert(user, "can't reach!") return @@ -553,7 +553,7 @@ var/turf/T = get_turf(src) if(!T) return - log_atmos("[type] released its contents of ", air_contents) + log_atmos("[type] released its contents of ", removed) T.assume_air(removed) #undef ASSEMBLY_BOMB_BASE diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 29dcdbcf702..9950b8e9c93 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -304,7 +304,7 @@ balloon_alert(user, "still recharging!") return COOLDOWN_START(src, resin_cooldown, 10 SECONDS) - R.remove_any(100) + R.remove_all(100) var/obj/effect/resin_container/resin = new (get_turf(src)) user.log_message("used Resin Launcher", LOG_GAME) playsound(src,'sound/items/syringeproj.ogg',40,TRUE) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 214187b7708..eabd9bc8304 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -371,6 +371,7 @@ playsound(src, 'sound/machines/twobeep.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) /obj/item/syndicate_teleporter/emp_act(severity) + . = ..() if(!prob(50/severity)) return var/teleported_something = FALSE diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index e695dedbca3..5f0404c3423 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -61,7 +61,7 @@ core = ncore icon_state = "core_container_loaded" to_chat(user, span_warning("Container is sealing...")) - addtimer(CALLBACK(src, PROC_REF(seal)), 50) + addtimer(CALLBACK(src, PROC_REF(seal)), 5 SECONDS) return TRUE /obj/item/nuke_core_container/proc/seal() @@ -236,7 +236,7 @@ T.icon_state = "supermatter_tongs" icon_state = "core_container_loaded" to_chat(user, span_warning("Container is sealing...")) - addtimer(CALLBACK(src, PROC_REF(seal)), 50) + addtimer(CALLBACK(src, PROC_REF(seal)), 5 SECONDS) return TRUE /obj/item/nuke_core_container/supermatter/seal() diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index bc4e0a94c16..56d7344f31b 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -52,7 +52,6 @@ belt_icon_state = "crowbar_alien" toolspeed = 0.1 - /obj/item/crowbar/large name = "large crowbar" desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big." diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index c0fedb4380d..31efb0ef273 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -19,7 +19,7 @@ pickup_sound = 'sound/items/handling/weldingtool_pickup.ogg' light_system = OVERLAY_LIGHT light_range = 2 - light_power = 0.75 + light_power = 1.5 light_color = LIGHT_COLOR_FIRE light_on = FALSE throw_speed = 3 diff --git a/code/game/objects/items/toy_mechs.dm b/code/game/objects/items/toy_mechs.dm index ce3ce4600c7..c50908738fe 100644 --- a/code/game/objects/items/toy_mechs.dm +++ b/code/game/objects/items/toy_mechs.dm @@ -53,6 +53,7 @@ /obj/item/toy/mecha/Initialize(mapload) . = ..() AddElement(/datum/element/series, /obj/item/toy/mecha, "Mini-Mecha action figures") + AddElement(/datum/element/toy_talk) combat_health = max_combat_health switch(special_attack_type) if(SPECIAL_ATTACK_DAMAGE) @@ -263,12 +264,8 @@ if(wins || losses) . += span_notice("This toy has [wins] wins, and [losses] losses.") -/** - * Override the say proc if they're mute - */ -/obj/item/toy/mecha/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) - if(!quiet) - . = ..() +/obj/item/toy/mecha/can_speak(allow_mimes) + return !quiet && ..() /** * The 'master' proc of the mech battle. Processes the entire battle's events and makes sure it start and finishes correctly. diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index c91f6eb6c44..67192b829a7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -555,7 +555,7 @@ update_appearance() playsound(src, 'sound/effects/pope_entry.ogg', 100) Rumble() - addtimer(CALLBACK(src, PROC_REF(stopRumble)), 600) + addtimer(CALLBACK(src, PROC_REF(stopRumble)), 60 SECONDS) else to_chat(user, span_warning("[src] is already active!")) @@ -1013,6 +1013,7 @@ /obj/item/toy/figure/Initialize(mapload) . = ..() desc = "A \"Space Life\" brand [src]." + AddElement(/datum/element/toy_talk) /obj/item/toy/figure/attack_self(mob/user as mob) if(cooldown <= world.time) @@ -1245,13 +1246,9 @@ to_chat(user, span_notice("You name the dummy as \"[doll_name]\".")) name = "[initial(name)] - [doll_name]" -/obj/item/toy/dummy/talk_into(atom/movable/A, message, channel, list/spans, datum/language/language, list/message_mods) - var/mob/M = A - if (istype(M)) - M.log_talk(message, LOG_SAY, tag="dummy toy") - - say(message, language, sanitize = FALSE) - return NOPASS +/obj/item/toy/dummy/Initialize(mapload) + . = ..() + AddElement(/datum/element/toy_talk) /obj/item/toy/dummy/GetVoice() return doll_name diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 0383767ce66..7084b313dff 100644 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -19,8 +19,10 @@ w_class = WEIGHT_CLASS_BULKY armor_type = /datum/armor/item_vending_refill - // Built automatically from the corresponding vending machine. - // If null, considered to be full. Otherwise, is list(/typepath = amount). + /** + * Built automatically from the corresponding vending machine. + * If null, considered to be full. Otherwise, is list(/typepath = amount). + */ var/list/products var/list/product_categories var/list/contraband diff --git a/code/game/objects/items/virgin_mary.dm b/code/game/objects/items/virgin_mary.dm index a8447e07811..b0446abadbd 100644 --- a/code/game/objects/items/virgin_mary.dm +++ b/code/game/objects/items/virgin_mary.dm @@ -6,50 +6,49 @@ resistance_flags = FLAMMABLE ///Has this item been used already. var/used_up = FALSE - ///List of mobs that have already been mobbed. - var/static/list/mob_mobs = list() #define NICKNAME_CAP (MAX_NAME_LEN/2) -/obj/item/virgin_mary/attackby(obj/item/W, mob/user, params) +/obj/item/virgin_mary/attackby(obj/item/potential_lighter, mob/living/user, params) . = ..() if(resistance_flags & ON_FIRE) return - if(!burn_paper_product_attackby_check(W, user, TRUE)) + if(!istype(user) || !user.mind) //A sentient mob needs to be burning it, ya cheezit. + return + + if(HAS_TRAIT(user, TRAIT_MAFIAINITIATE)) //Only one nickname fuckhead + to_chat(user, span_warning("You have already been initiated into the mafioso life.")) + return + + if(!burn_paper_product_attackby_check(potential_lighter, user, TRUE)) return if(used_up) return - if(!isliving(user) || !user.mind) //A sentient mob needs to be burning it, ya cheezit. - return - var/mob/living/joe = user - if(joe in mob_mobs) //Only one nickname fuckhead - to_chat(joe, span_warning("You have already been initiated into the mafioso life.")) - return - - to_chat(joe, span_notice("As you burn the picture, a nickname comes to mind...")) - var/nickname = tgui_input_text(joe, "Pick a nickname", "Mafioso Nicknames", max_length = NICKNAME_CAP) + ADD_TRAIT(user, TRAIT_MAFIAINITIATE, TRAIT_GENERIC) // Adding the trait early because you could burn multiple at once for a very long name + to_chat(user, span_notice("As you burn the picture, a nickname comes to mind...")) + var/nickname = tgui_input_text(user, "Pick a nickname", "Mafioso Nicknames", max_length = NICKNAME_CAP) nickname = reject_bad_name(nickname, allow_numbers = FALSE, max_length = NICKNAME_CAP, ascii_only = TRUE) if(!nickname) + REMOVE_TRAIT(user, TRAIT_MAFIAINITIATE, TRAIT_GENERIC) return var/new_name - var/space_position = findtext(joe.real_name, " ") + var/space_position = findtext(user.real_name, " ") if(space_position)//Can we find a space? - new_name = "[copytext(joe.real_name, 1, space_position)] \"[nickname]\" [copytext(joe.real_name, space_position)]" + new_name = "[copytext(user.real_name, 1, space_position)] \"[nickname]\" [copytext(user.real_name, space_position)]" else //Append otherwise - new_name = "[joe.real_name] \"[nickname]\"" - joe.real_name = new_name + new_name = "[user.real_name] \"[nickname]\"" + user.real_name = new_name used_up = TRUE - mob_mobs += joe - joe.say("My soul will burn like this saint if I betray my family. I enter alive and I will have to get out dead.", forced = /obj/item/virgin_mary) - to_chat(joe, span_userdanger("Being inducted into the mafia does not grant antagonist status.")) + user.say("My soul will burn like this saint if I betray my family. I enter alive and I will have to get out dead.", forced = /obj/item/virgin_mary) + to_chat(user, span_userdanger("Being inducted into the mafia does not grant antagonist status.")) #undef NICKNAME_CAP /obj/item/virgin_mary/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] starts saying their Hail Mary's at a terrifying pace! It looks like [user.p_theyre()] trying to enter the afterlife!")) user.say("Hail Mary, full of grace, the Lord is with thee. Blessed are thou amongst women, and blessed is the fruit of thy womb, Jesus. Holy Mary, mother of God, pray for us sinners, now and at the hour of our death. Amen. ", forced = /obj/item/virgin_mary) - addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), 75) - addtimer(CALLBACK(user, TYPE_PROC_REF(/atom/movable, say), "O my Mother, preserve me this day from mortal sin..."), 50) + addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), 7.5 SECONDS) + addtimer(CALLBACK(user, TYPE_PROC_REF(/atom/movable, say), "O my Mother, preserve me this day from mortal sin..."), 5 SECONDS) return MANUAL_SUICIDE /obj/item/virgin_mary/proc/manual_suicide(mob/living/user) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 059f78b80c9..1f2078f0037 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -161,7 +161,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/highlander/process() if(ishuman(loc)) var/mob/living/carbon/human/holder = loc - layer = ABOVE_ALL_MOB_LAYER //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) + holder.layer = ABOVE_ALL_MOB_LAYER //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) ADD_TRAIT(holder, TRAIT_NOBLOOD, HIGHLANDER_TRAIT) //AND WE WON'T BLEED OUT LIKE COWARDS else if(!(flags_1 & ADMIN_SPAWNED_1)) @@ -285,7 +285,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 return INITIALIZE_HINT_QDEL /obj/item/claymore/highlander/robot/process() - layer = ABOVE_ALL_MOB_LAYER + loc.layer = ABOVE_ALL_MOB_LAYER /obj/item/katana name = "katana" @@ -554,124 +554,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/ectoplasm/mystic icon_state = "mysticplasm" -/obj/item/statuebust - name = "bust" - desc = "A priceless ancient marble bust, the kind that belongs in a museum." //or you can hit people with it - icon = 'icons/obj/art/statue.dmi' - icon_state = "bust" - force = 15 - throwforce = 10 - throw_speed = 5 - throw_range = 2 - attack_verb_continuous = list("busts") - attack_verb_simple = list("bust") - var/impressiveness = 45 - -/obj/item/statuebust/Initialize(mapload) - . = ..() - AddElement(/datum/element/art, impressiveness) - AddElement(/datum/element/beauty, 1000) - -/obj/item/statuebust/hippocratic - name = "hippocrates bust" - desc = "A bust of the famous Greek physician Hippocrates of Kos, often referred to as the father of western medicine." - icon_state = "hippocratic" - impressiveness = 50 - // If it hits the prob(reference_chance) chance, this is set to TRUE. Adds medical HUD when wielded, but has a 10% slower attack speed and is too bloody to make an oath with. - var/reference = FALSE - // Chance for above. - var/reference_chance = 1 - // Minimum time inbetween oaths. - COOLDOWN_DECLARE(oath_cd) - -/obj/item/statuebust/hippocratic/evil - reference_chance = 100 - -/obj/item/statuebust/hippocratic/Initialize(mapload) - . = ..() - if(prob(reference_chance)) - name = "Solemn Vow" - desc = "Art lovers will cherish the bust of Hippocrates, commemorating a time when medics still thought doing no harm was a good idea." - attack_speed = CLICK_CD_SLOW - reference = TRUE - -/obj/item/statuebust/hippocratic/examine(mob/user) - . = ..() - if(reference) - . += span_notice("You could activate the bust in-hand to swear or forswear a Hippocratic Oath... but it seems like somebody decided it was more of a Hippocratic Suggestion. This thing is caked with bits of blood and gore.") - return - . += span_notice("You can activate the bust in-hand to swear or forswear a Hippocratic Oath! This has no effects except pacifism or bragging rights. Does not remove other sources of pacifism. Do not eat.") - -/obj/item/statuebust/hippocratic/equipped(mob/living/carbon/human/user, slot) - ..() - if(!(slot & ITEM_SLOT_HANDS)) - return - var/datum/atom_hud/our_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - our_hud.show_to(user) - ADD_TRAIT(user, TRAIT_MEDICAL_HUD, type) - -/obj/item/statuebust/hippocratic/dropped(mob/living/carbon/human/user) - ..() - if(HAS_TRAIT_NOT_FROM(user, TRAIT_MEDICAL_HUD, type)) - return - var/datum/atom_hud/our_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - our_hud.hide_from(user) - REMOVE_TRAIT(user, TRAIT_MEDICAL_HUD, type) - -/obj/item/statuebust/hippocratic/attack_self(mob/user) - if(!iscarbon(user)) - to_chat(user, span_warning("You remember how the Hippocratic Oath specifies 'my fellow human beings' and realize that it's completely meaningless to you.")) - return - - if(reference) - to_chat(user, span_warning("As you prepare yourself to swear the Oath, you realize that doing so on a blood-caked bust is probably not a good idea.")) - return - - if(!COOLDOWN_FINISHED(src, oath_cd)) - to_chat(user, span_warning("You've sworn or forsworn an oath too recently to undo your decisions. The bust looks at you with disgust.")) - return - - COOLDOWN_START(src, oath_cd, 5 MINUTES) - - if(HAS_TRAIT_FROM(user, TRAIT_PACIFISM, type)) - to_chat(user, span_warning("You've already sworn a vow. You start preparing to rescind it...")) - if(do_after(user, 5 SECONDS, target = user)) - user.say("Yeah this Hippopotamus thing isn't working out. I quit!", forced = "hippocratic hippocrisy") - REMOVE_TRAIT(user, TRAIT_PACIFISM, type) - - // they can still do it for rp purposes - if(HAS_TRAIT_NOT_FROM(user, TRAIT_PACIFISM, type)) - to_chat(user, span_warning("You already don't want to harm people, this isn't going to do anything!")) - - - to_chat(user, span_notice("You remind yourself of the Hippocratic Oath's contents and prepare to swear yourself to it...")) - if(do_after(user, 4 SECONDS, target = user)) - user.say("I swear to fulfill, to the best of my ability and judgment, this covenant:", forced = "hippocratic oath") - else - return fuck_it_up(user) - if(do_after(user, 2 SECONDS, target = user)) - user.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.", forced = "hippocratic oath") - else - return fuck_it_up(user) - if(do_after(user, 3 SECONDS, target = user)) - user.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.", forced = "hippocratic oath") - else - - return fuck_it_up(user) - if(do_after(user, 3 SECONDS, target = user)) - user.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.", forced = "hippocratic oath") - else - return fuck_it_up(user) - - to_chat(user, span_notice("Contentment, understanding, and purpose washes over you as you finish the oath. You consider for a second the concept of harm and shudder.")) - ADD_TRAIT(user, TRAIT_PACIFISM, type) - -// Bully the guy for fucking up. -/obj/item/statuebust/hippocratic/proc/fuck_it_up(mob/living/carbon/user) - to_chat(user, span_warning("You forget what comes next like a dumbass. The Hippocrates bust looks down on you, disappointed.")) - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) - COOLDOWN_RESET(src, oath_cd) - /obj/item/tailclub name = "tail club" desc = "For the beating to death of lizards with their own tails." @@ -909,26 +791,28 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 hitsound = 'sound/effects/snap.ogg' w_class = WEIGHT_CLASS_SMALL /// Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. - var/list/splattable + 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/list/strong_against + 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) . = ..() - splattable = typecacheof(list( - /mob/living/basic/ant, - /mob/living/basic/butterfly, - /mob/living/basic/cockroach, - /mob/living/basic/spider/growing/spiderling, - /mob/living/basic/bee, - /obj/effect/decal/cleanable/ants, - /obj/item/queen_bee, - )) - strong_against = typecacheof(list( - /mob/living/basic/spider/giant, - )) + if (isnull(splattable)) + splattable = typecacheof(list( + /mob/living/basic/ant, + /mob/living/basic/butterfly, + /mob/living/basic/cockroach, + /mob/living/basic/spider/growing/spiderling, + /mob/living/basic/bee, + /obj/effect/decal/cleanable/ants, + /obj/item/queen_bee, + )) + if (isnull(strong_against)) + strong_against = typecacheof(list( + /mob/living/basic/spider, + )) /obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag) diff --git a/code/game/objects/items/wizard_weapons.dm b/code/game/objects/items/wizard_weapons.dm index 533ae118dc2..8c2677d3ee3 100644 --- a/code/game/objects/items/wizard_weapons.dm +++ b/code/game/objects/items/wizard_weapons.dm @@ -73,7 +73,7 @@ playsound(user, 'sound/weapons/marauder.ogg', 50, TRUE) var/turf/target = get_turf(A) vortex(target,user) - addtimer(CALLBACK(src, PROC_REF(recharge)), 100) + addtimer(CALLBACK(src, PROC_REF(recharge)), 10 SECONDS) return . /obj/item/mjollnir diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 1057eaabaa3..4f22a5e256b 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -41,7 +41,7 @@ ) if(hitting_projectile.suppressed != SUPPRESSED_VERY) visible_message( - span_danger("[src] is hit by \a [hitting_projectile][damage_sustained ? "" : ", without leaving a mark"]!"), + span_danger("[src] is hit by \a [hitting_projectile][damage_sustained ? "" : ", [no_damage_feedback]"]!"), vision_distance = COMBAT_MESSAGE_RANGE, ) @@ -54,7 +54,7 @@ else playsound(src, 'sound/effects/bang.ogg', 50, TRUE) var/damage = take_damage(hulk_damage(), BRUTE, MELEE, 0, get_dir(src, user)) - user.visible_message(span_danger("[user] smashes [src][damage ? "" : ", without leaving a mark"]!"), span_danger("You smash [src][damage ? "" : ", without leaving a mark"]!"), null, COMBAT_MESSAGE_RANGE) + user.visible_message(span_danger("[user] smashes [src][damage ? "" : ", [no_damage_feedback]"]!"), span_danger("You smash [src][damage ? "" : ", [no_damage_feedback]"]!"), null, COMBAT_MESSAGE_RANGE) return TRUE /obj/blob_act(obj/structure/blob/B) @@ -156,9 +156,48 @@ var/mob/living/buckled_mob = m buckled_mob.electrocute_act((clamp(round(strength * 1.25e-3), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) -///the obj is deconstructed into pieces, whether through careful disassembly or when destroyed. +/** + * Custom behaviour per atom subtype on how they should deconstruct themselves + * Arguments + * + * * disassembled - TRUE means we cleanly took this atom apart using tools. FALSE means this was destroyed in a violent way + */ +/obj/proc/atom_deconstruct(disassembled = TRUE) + PROTECTED_PROC(TRUE) + + return + +/** + * The interminate proc between deconstruct() & atom_deconstruct(). By default this delegates deconstruction to + * atom_deconstruct if NO_DECONSTRUCTION is absent but subtypes can override this to handle NO_DECONSTRUCTION in their + * own unique way. Override this if for example you want to dump out important content like mobs from the + * atom before deconstruction regardless if NO_DECONSTRUCTION is present or not + * Arguments + * + * * disassembled - TRUE means we cleanly took this atom apart using tools. FALSE means this was destroyed in a violent way + */ +/obj/proc/handle_deconstruct(disassembled = TRUE) + SHOULD_CALL_PARENT(FALSE) + + if(!(obj_flags & NO_DECONSTRUCTION)) + atom_deconstruct(disassembled) + +/** + * The obj is deconstructed into pieces, whether through careful disassembly or when destroyed. + * Arguments + * + * * disassembled - TRUE means we cleanly took this atom apart using tools. FALSE means this was destroyed in a violent way + */ /obj/proc/deconstruct(disassembled = TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + + //allow objects to deconstruct themselves + handle_deconstruct(disassembled) + + //inform objects we were deconstructed SEND_SIGNAL(src, COMSIG_OBJ_DECONSTRUCT, disassembled) + + //delete our self qdel(src) ///what happens when the obj's integrity reaches zero. diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index cb57c5049bb..d84fc46de43 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -7,6 +7,8 @@ /// Extra examine line to describe controls, such as right-clicking, left-clicking, etc. var/desc_controls + /// The context returned when an attack against this object doesnt deal any traditional damage to the object. + var/no_damage_feedback = "without leaving a mark" /// Icon to use as a 32x32 preview in crafting menus and such var/icon_preview var/icon_state_preview @@ -28,14 +30,6 @@ var/current_skin //Has the item been reskinned? var/list/unique_reskin //List of options to reskin. - // Access levels, used in modules\jobs\access.dm - /// List of accesses needed to use this object: The user must possess all accesses in this list in order to use the object. - /// Example: If req_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have both ACCESS_ENGINE and ACCESS_CE in order to use the object. - var/list/req_access - /// List of accesses needed to use this object: The user must possess at least one access in this list in order to use the object. - /// Example: If req_one_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have either ACCESS_ENGINE or ACCESS_CE in order to use the object. - var/list/req_one_access - /// Custom fire overlay icon, will just use the default overlay if this is null var/custom_fire_overlay /// Particles this obj uses when burning, if any @@ -88,8 +82,8 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) if(attacking_item.demolition_mod < 1) damage_verb = "ineffectively pierce" - user.visible_message(span_danger("[user] [damage_verb][plural_s(damage_verb)] [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), \ - span_danger("You [damage_verb] [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), null, COMBAT_MESSAGE_RANGE) + user.visible_message(span_danger("[user] [damage_verb][plural_s(damage_verb)] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), \ + span_danger("You [damage_verb] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), null, COMBAT_MESSAGE_RANGE) log_combat(user, src, "attacked", attacking_item) /obj/assume_air(datum/gas_mixture/giver) @@ -373,8 +367,6 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) /// If we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't. /obj/proc/can_be_unfasten_wrench(mob/user, silent) - if(obj_flags & NO_DECONSTRUCTION) - return CANT_UNFASTEN if(!(isfloorturf(loc) || isindestructiblefloor(loc)) && !anchored) to_chat(user, span_warning("[src] needs to be on the floor to be secured!")) return FAILED_UNFASTEN diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index eef6059d984..6207a4031c1 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -214,7 +214,7 @@ if(C.get_amount() >= 5) playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) balloon_alert(user, "adding cables to frame...") - if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use(5)) + 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() @@ -241,7 +241,7 @@ if(G.get_amount() >= 2) playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) balloon_alert(user, "adding glass panel...") - if(do_after(user, 20, target = src) && state == CABLED_CORE && G.use(2)) + 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() @@ -380,7 +380,7 @@ icon_state = "ai-empty" return ..() -/obj/structure/ai_core/deconstruct(disassembled = TRUE) +/obj/structure/ai_core/atom_deconstruct(disassembled = TRUE) if(state >= GLASS_CORE) new /obj/item/stack/sheet/rglass(loc, 2) if(state >= CABLED_CORE) @@ -389,7 +389,6 @@ circuit.forceMove(loc) circuit = null new /obj/item/stack/sheet/plasteel(loc, 4) - qdel(src) /// 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() @@ -441,4 +440,9 @@ That prevents a few funky behaviors. 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/aliens.dm b/code/game/objects/structures/aliens.dm index 886d0b9bcba..6d8e8ca701e 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -41,10 +41,8 @@ icon = 'icons/obj/fluff/general.dmi' icon_state = "gelmound" -/obj/structure/alien/gelpod/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/effect/mob_spawn/corpse/human/damaged(get_turf(src)) - qdel(src) +/obj/structure/alien/gelpod/atom_deconstruct(disassembled = TRUE) + new /obj/effect/mob_spawn/corpse/human/damaged(get_turf(src)) /* * Resin @@ -416,7 +414,7 @@ status = BURSTING proximity_monitor.set_range(0) flick("egg_opening", src) - addtimer(CALLBACK(src, PROC_REF(finish_bursting), kill), 15) + addtimer(CALLBACK(src, PROC_REF(finish_bursting), kill), 1.5 SECONDS) /obj/structure/alien/egg/proc/finish_bursting(kill = TRUE) status = BURST @@ -446,9 +444,8 @@ /obj/structure/alien/egg/atom_break(damage_flag) . = ..() - if(!(obj_flags & NO_DECONSTRUCTION)) - if(status != BURST) - Burst(kill=TRUE) + if(status != BURST) + Burst(kill=TRUE) /obj/structure/alien/egg/HasProximity(atom/movable/AM) if(status == GROWN) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 0a157dc98a1..1654cecff45 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -12,10 +12,18 @@ smoothing_groups = SMOOTH_GROUP_ALIEN_NEST canSmoothWith = SMOOTH_GROUP_ALIEN_NEST build_stack_type = null - obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION elevation = 0 var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/nonhuman-player/alien.dmi', "nestoverlay", LYING_MOB_LAYER) +/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 + + return ..() + +/obj/structure/bed/nest/wrench_act_secondary(mob/living/user, obj/item/weapon) + return ITEM_INTERACT_BLOCKING + /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) if(has_buckled_mobs()) for(var/buck in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index e2038cb623b..5c5fac60eaa 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -34,12 +34,11 @@ /obj/structure/bed/examine(mob/user) . = ..() - if(!(obj_flags & NO_DECONSTRUCTION)) - . += span_notice("It's held together by a couple of bolts.") + . += span_notice("It's held together by a couple of bolts.") /obj/structure/bed/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) if(held_item) - if(held_item.tool_behaviour != TOOL_WRENCH || obj_flags & NO_DECONSTRUCTION) + if(held_item.tool_behaviour != TOOL_WRENCH) return context[SCREENTIP_CONTEXT_RMB] = "Dismantle" @@ -49,19 +48,14 @@ context[SCREENTIP_CONTEXT_LMB] = "Unbuckle" return CONTEXTUAL_SCREENTIP_SET -/obj/structure/bed/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(build_stack_type) - new build_stack_type(loc, build_stack_amount) - ..() +/obj/structure/bed/atom_deconstruct(disassembled = TRUE) + if(build_stack_type) + new build_stack_type(loc, build_stack_amount) /obj/structure/bed/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) /obj/structure/bed/wrench_act_secondary(mob/living/user, obj/item/weapon) - if(obj_flags & NO_DECONSTRUCTION) - return TRUE - ..() weapon.play_tool_sound(src) deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 2fe14ed1dd9..0808c306ddb 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -36,16 +36,12 @@ SSjob.latejoin_trackers -= src //These may be here due to the arrivals shuttle return ..() -/obj/structure/chair/deconstruct(disassembled) - // If we have materials, and don't have the NOCONSTRUCT flag - if(!(obj_flags & NO_DECONSTRUCTION)) - if(buildstacktype) - new buildstacktype(loc,buildstackamount) - else - for(var/i in custom_materials) - var/datum/material/M = i - new M.sheet_type(loc, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1)) - ..() +/obj/structure/chair/atom_deconstruct(disassembled) + if(buildstacktype) + new buildstacktype(loc,buildstackamount) + else + for(var/datum/material/mat as anything in custom_materials) + new mat.sheet_type(loc, FLOOR(custom_materials[mat] / SHEET_MATERIAL_AMOUNT, 1)) /obj/structure/chair/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -56,8 +52,6 @@ qdel(src) /obj/structure/chair/attackby(obj/item/W, mob/user, params) - if(obj_flags & NO_DECONSTRUCTION) - return . = ..() if(istype(W, /obj/item/assembly/shock_kit) && !HAS_TRAIT(src, TRAIT_ELECTRIFIED_BUCKLE)) electrify_self(W, user) return @@ -85,8 +79,6 @@ /obj/structure/chair/wrench_act_secondary(mob/living/user, obj/item/weapon) - if(obj_flags & NO_DECONSTRUCTION) - return TRUE ..() weapon.play_tool_sound(src) deconstruct(disassembled = TRUE) @@ -279,7 +271,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0) /obj/structure/chair/MouseDrop(over_object, src_location, over_location) . = ..() if(over_object == usr && Adjacent(usr)) - if(!item_chair || has_buckled_mobs() || src.obj_flags & NO_DECONSTRUCTION) + if(!item_chair || has_buckled_mobs()) return if(!usr.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) return @@ -495,6 +487,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION alpha = 0 +/obj/structure/chair/mime/wrench_act_secondary(mob/living/user, obj/item/weapon) + return ITEM_INTERACT_BLOCKING + /obj/structure/chair/mime/post_buckle_mob(mob/living/M) M.pixel_y += 5 diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index f80042f5679..108ca3fe9b8 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -35,7 +35,7 @@ LINEN BINS /obj/item/bedsheet/Initialize(mapload) . = ..() AddComponent(/datum/component/surgery_initiator) - AddElement(/datum/element/bed_tuckable, 0, 0, 0) + AddElement(/datum/element/bed_tuckable, mapload, 0, 0, 0) if(bedsheet_type == BEDSHEET_DOUBLE) stack_amount *= 2 dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET @@ -609,8 +609,6 @@ LINEN BINS ..() /obj/structure/bedsheetbin/screwdriver_act(mob/living/user, obj/item/tool) - if(obj_flags & NO_DECONSTRUCTION) - return FALSE if(amount) to_chat(user, span_warning("The [src] must be empty first!")) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 987b9bcc37b..02f611eb4e3 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -85,7 +85,7 @@ if(burning) to_chat(user, span_warning("You need to extinguish [src] before removing the logs!")) return - if(!has_buckled_mobs() && do_after(user, 50, target = src)) + if(!has_buckled_mobs() && do_after(user, 5 SECONDS, target = src)) for(var/obj/item/grown/log/bonfire_log in contents) bonfire_log.forceMove(drop_location()) bonfire_log.pixel_x += rand(1,4) diff --git a/code/game/objects/structures/cannons/cannonballs.dm b/code/game/objects/structures/cannons/cannonballs.dm index 08533bdcebd..855292e8521 100644 --- a/code/game/objects/structures/cannons/cannonballs.dm +++ b/code/game/objects/structures/cannons/cannonballs.dm @@ -29,7 +29,7 @@ name = "explosive shellballs" singular_name = "explosive shellball" desc = "An explosive anti-materiel and counter-battery projectile cannonball. Makes great work out of any wall, for easy entrances." - color = "#FF0000" + color = COLOR_RED merge_type = /obj/item/stack/cannonball/shellball projectile_type = /obj/projectile/bullet/cannonball/explosive diff --git a/code/game/objects/structures/construction_console/construction_console.dm b/code/game/objects/structures/construction_console/construction_console.dm index 720f568369e..d3ae2984e31 100644 --- a/code/game/objects/structures/construction_console/construction_console.dm +++ b/code/game/objects/structures/construction_console/construction_console.dm @@ -10,7 +10,7 @@ /obj/machinery/computer/camera_advanced/base_construction name = "generic base construction console" desc = "An industrial computer integrated with a camera-assisted rapid construction drone." - networks = list("ss13") + networks = list(CAMERANET_NETWORK_SS13) circuit = /obj/item/circuitboard/computer/base_construction off_action = /datum/action/innate/camera_off/base_construction jump_action = null diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b3d3c7085bd..3eb29fc1526 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -94,6 +94,11 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /// Volume of the internal air var/air_volume = TANK_STANDARD_VOLUME * 3 + /// How many pixels the closet can shift on the x axis when shaking + var/x_shake_pixel_shift = 2 + /// how many pixels the closet can shift on the y axes when shaking + var/y_shake_pixel_shift = 1 + /datum/armor/structure_closet melee = 20 bullet = 10 @@ -362,7 +367,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) context[SCREENTIP_CONTEXT_LMB] = opened ? "Close" : "Open" screentip_change = TRUE - if(istype(held_item) && held_item.tool_behaviour == TOOL_WELDER) + if(istype(held_item, cutting_tool)) if(opened) context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" screentip_change = TRUE @@ -576,25 +581,23 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) else return open(user) -/obj/structure/closet/deconstruct(disassembled = TRUE) - if (!(obj_flags & NO_DECONSTRUCTION)) - if(ispath(material_drop) && material_drop_amount) - new material_drop(loc, material_drop_amount) - if (secure) - var/obj/item/electronics/airlock/electronics = new(drop_location()) - if(length(req_one_access)) - electronics.one_access = TRUE - electronics.accesses = req_one_access - else - electronics.accesses = req_access - if(card_reader_installed) - new /obj/item/stock_parts/card_reader(drop_location()) +/obj/structure/closet/atom_deconstruct(disassembled = TRUE) + if(ispath(material_drop) && material_drop_amount) + new material_drop(loc, material_drop_amount) + if (secure) + var/obj/item/electronics/airlock/electronics = new(drop_location()) + if(length(req_one_access)) + electronics.one_access = TRUE + electronics.accesses = req_one_access + else + electronics.accesses = req_access + if(card_reader_installed) + new /obj/item/stock_parts/card_reader(drop_location()) dump_contents() - qdel(src) /obj/structure/closet/atom_break(damage_flag) . = ..() - if(!broken && !(obj_flags & NO_DECONSTRUCTION)) + if(!broken) bust_open() /obj/structure/closet/CheckParts(list/parts_list) @@ -1031,6 +1034,9 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) user.visible_message(span_warning("[src] begins to shake violently!"), \ span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ span_hear("You hear banging from [src].")) + + addtimer(CALLBACK(src, PROC_REF(check_if_shake)), 1 SECONDS) + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) ) return @@ -1045,6 +1051,23 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /obj/structure/closet/relay_container_resist_act(mob/living/user, obj/container) container.container_resist_act() +/// Check if someone is still resisting inside, and choose to either keep shaking or stop shaking the closet +/obj/structure/closet/proc/check_if_shake() + // Assuming we decide to shake again, how long until we check to shake again + var/next_check_time = 1 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.3 SECONDS + + for(var/mob/living/mob in contents) + if(DOING_INTERACTION_WITH_TARGET(mob, src)) + // Shake and queue another check_if_shake + Shake(x_shake_pixel_shift, y_shake_pixel_shift, shake_duration, shake_interval = 0.1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(check_if_shake)), next_check_time) + return TRUE + + // If we reach here, nobody is resisting, so dont shake + return FALSE /obj/structure/closet/proc/bust_open() SIGNAL_HANDLER diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 1e7fede5842..fecacd678c7 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -39,7 +39,6 @@ /obj/structure/closet/gimmick/tacticool/PopulateContents() ..() new /obj/item/clothing/glasses/eyepatch(src) - new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/gloves/tackler/combat(src) new /obj/item/clothing/gloves/tackler/combat(src) new /obj/item/clothing/head/helmet/swat(src) @@ -53,6 +52,8 @@ new /obj/item/clothing/under/syndicate/tacticool(src) new /obj/item/clothing/under/syndicate/tacticool(src) +/obj/structure/closet/gimmick/tacticool/populate_contents_immediate() + new /obj/item/clothing/glasses/sunglasses(src) /obj/structure/closet/thunderdome name = "\improper Thunderdome closet" @@ -69,8 +70,6 @@ new /obj/item/clothing/suit/armor/tdome/red(src) for(var/i in 1 to 3) new /obj/item/melee/energy/sword/saber(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser(src) for(var/i in 1 to 3) new /obj/item/melee/baton/security/loaded(src) for(var/i in 1 to 3) @@ -78,6 +77,10 @@ for(var/i in 1 to 3) new /obj/item/clothing/head/helmet/thunderdome(src) +/obj/structure/closet/thunderdome/tdred/populate_contents_immediate() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser(src) + /obj/structure/closet/thunderdome/tdgreen name = "green-team Thunderdome closet" icon_door = "green" @@ -88,8 +91,6 @@ new /obj/item/clothing/suit/armor/tdome/green(src) for(var/i in 1 to 3) new /obj/item/melee/energy/sword/saber(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser(src) for(var/i in 1 to 3) new /obj/item/melee/baton/security/loaded(src) for(var/i in 1 to 3) @@ -97,6 +98,10 @@ for(var/i in 1 to 3) new /obj/item/clothing/head/helmet/thunderdome(src) +/obj/structure/closet/thunderdome/tdgreen/populate_contents_immediate() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser(src) + /obj/structure/closet/malf/suits desc = "It's a storage unit for operational gear." icon_state = "syndicate" 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 1ac7e65884e..1e19671a455 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -36,10 +36,8 @@ flags_1 &= ~PREVENT_CONTENTS_EXPLOSION_1 return FALSE -/obj/structure/closet/secure_closet/freezer/deconstruct(disassembled) - if (!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/assembly/igniter/condenser(drop_location()) - . = ..() +/obj/structure/closet/secure_closet/freezer/atom_deconstruct(disassembled) + new /obj/item/assembly/igniter/condenser(drop_location()) /obj/structure/closet/secure_closet/freezer/empty name = "freezer" 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 5f2c694ed21..e5eed4cb295 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -102,7 +102,7 @@ // Traitor steal objective //new /obj/item/reagent_containers/hypospray/cmo(src) - ORIGINAL - new /obj/item/storage/hypospraykit/cmo(src) //SKYRAT EDIT ADDITION - New Hyposprays + new /obj/item/storage/hypospraykit/cmo/preloaded(src) //SKYRAT EDIT ADDITION - New Hyposprays /obj/structure/closet/secure_closet/animal name = "animal control locker" 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 63c63c1664a..ad6f95f086c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -16,12 +16,14 @@ new /obj/item/computer_disk/command/captain(src) new /obj/item/radio/headset/heads/captain/alt(src) new /obj/item/radio/headset/heads/captain(src) - new /obj/item/storage/belt/sabre(src) - new /obj/item/gun/energy/e_gun(src) new /obj/item/door_remote/captain(src) new /obj/item/storage/photo_album/captain(src) new /obj/item/card/id/departmental_budget(src) //SKYRAT EDIT ADDITION +/obj/structure/closet/secure_closet/captains/populate_contents_immediate() + new /obj/item/gun/energy/e_gun(src) + new /obj/item/storage/belt/sabre(src) + /obj/structure/closet/secure_closet/hop name = "head of personnel's locker" icon_state = "hop" @@ -38,7 +40,6 @@ new /obj/item/storage/box/silver_ids(src) new /obj/item/megaphone/command(src) new /obj/item/assembly/flash/handheld(src) - new /obj/item/gun/energy/e_gun(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) new /obj/item/door_remote/civilian(src) @@ -47,6 +48,9 @@ new /obj/item/storage/lockbox/medal/hop(src) new /obj/item/card/id/departmental_budget/srv(src) //SKYRAT EDIT ADDITION +/obj/structure/closet/secure_closet/hop/populate_contents_immediate() + new /obj/item/gun/energy/e_gun(src) + /obj/structure/closet/secure_closet/hos name = "head of security's locker" icon_state = "hos" @@ -308,6 +312,8 @@ new /obj/item/storage/box/firingpins(src) for(var/i in 1 to 3) new /obj/item/storage/box/rubbershot(src) + +/obj/structure/closet/secure_closet/armory2/populate_contents_immediate() for(var/i in 1 to 3) new /obj/item/gun/ballistic/shotgun/riot(src) @@ -321,12 +327,14 @@ ..() 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) + +/obj/structure/closet/secure_closet/armory3/populate_contents_immediate() for(var/i in 1 to 3) new /obj/item/gun/energy/e_gun(src) for(var/i in 1 to 3) new /obj/item/gun/energy/laser(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser/thermal(src) /obj/structure/closet/secure_closet/tac name = "armory tac locker" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 89b6245a6a0..0154015fb0d 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -18,6 +18,8 @@ drag_slowdown = 0 door_anim_time = 0 // no animation pass_flags_self = PASSSTRUCTURE | LETPASSTHROW + x_shake_pixel_shift = 1 + y_shake_pixel_shift = 2 /// Mobs standing on it are nudged up by this amount. var/elevation = 14 /// The same, but when the crate is open @@ -378,6 +380,7 @@ /obj/structure/closet/crate/goldcrate name = "gold crate" + desc = "A rectangular steel crate. It seems to be painted to look like gold." icon_state = "gold" base_icon_state = "gold" @@ -393,6 +396,7 @@ /obj/structure/closet/crate/silvercrate name = "silver crate" + desc = "A rectangular steel crate. It seems to be painted to look like silver." icon_state = "silver" base_icon_state = "silver" diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index 6b865b84586..a686d53f392 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -47,7 +47,7 @@ /obj/structure/closet/crate/bin/proc/do_animate() playsound(loc, open_sound, 15, TRUE, -3) flick(base_icon_state + "_animate", src) - addtimer(CALLBACK(src, PROC_REF(do_close)), 11) + addtimer(CALLBACK(src, PROC_REF(do_close)), 1.1 SECONDS) /obj/structure/closet/crate/bin/proc/do_close() playsound(loc, close_sound, 15, TRUE, -3) diff --git a/code/game/objects/structures/crates_lockers/crates/cardboard.dm b/code/game/objects/structures/crates_lockers/crates/cardboard.dm index b4d14751a65..7b1e7dc7257 100644 --- a/code/game/objects/structures/crates_lockers/crates/cardboard.dm +++ b/code/game/objects/structures/crates_lockers/crates/cardboard.dm @@ -11,6 +11,7 @@ open_sound_volume = 25 close_sound_volume = 25 paint_jobs = null + cutting_tool = /obj/item/wirecutters /obj/structure/closet/crate/cardboard/mothic name = "\improper Mothic Fleet box" diff --git a/code/game/objects/structures/crates_lockers/crates/wooden.dm b/code/game/objects/structures/crates_lockers/crates/wooden.dm index a5e0b78cadb..5ff3c69aa6b 100644 --- a/code/game/objects/structures/crates_lockers/crates/wooden.dm +++ b/code/game/objects/structures/crates_lockers/crates/wooden.dm @@ -10,6 +10,7 @@ open_sound_volume = 25 close_sound_volume = 50 paint_jobs = null + cutting_tool = /obj/item/crowbar /obj/structure/closet/crate/wooden/toy name = "toy box" diff --git a/code/game/objects/structures/destructible_structures.dm b/code/game/objects/structures/destructible_structures.dm index f33c99b681a..beffa5d4fd7 100644 --- a/code/game/objects/structures/destructible_structures.dm +++ b/code/game/objects/structures/destructible_structures.dm @@ -4,16 +4,13 @@ var/break_sound = 'sound/magic/clockwork/invoke_general.ogg' //The sound played when a structure breaks var/list/debris = null //Parts left behind when a structure breaks, takes the form of list(path = amount_to_spawn) -/obj/structure/destructible/deconstruct(disassembled = TRUE) +/obj/structure/destructible/atom_deconstruct(disassembled = TRUE) if(!disassembled) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(islist(debris)) - for(var/I in debris) - for(var/i in 1 to debris[I]) - new I (get_turf(src)) - if(break_message) - visible_message(break_message) - if(break_sound) - playsound(src, break_sound, 50, TRUE) - qdel(src) - return 1 + if(islist(debris)) + for(var/I in debris) + for(var/i in 1 to debris[I]) + new I (get_turf(src)) + if(break_message) + visible_message(break_message) + if(break_sound) + playsound(src, break_sound, 50, TRUE) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 13ab18fdb0e..ae7cd5654ba 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -81,17 +81,15 @@ if(BURN) playsound(src, 'sound/items/welder.ogg', 100, TRUE) -/obj/structure/displaycase/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - dump() - if(!disassembled) - new /obj/item/shard(drop_location()) - trigger_alarm() - qdel(src) +/obj/structure/displaycase/atom_deconstruct(disassembled = TRUE) + dump() + if(!disassembled) + new /obj/item/shard(drop_location()) + trigger_alarm() /obj/structure/displaycase/atom_break(damage_flag) . = ..() - if(!broken && !(obj_flags & NO_DECONSTRUCTION)) + if(!broken) set_density(FALSE) broken = TRUE new /obj/item/shard(drop_location()) @@ -168,7 +166,7 @@ to_chat(user, span_warning("You need two glass sheets to fix the case!")) return to_chat(user, span_notice("You start fixing [src]...")) - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, target = src)) glass_sheet.use(2) broken = FALSE atom_integrity = max_integrity @@ -630,7 +628,7 @@ . = ..() if(atom_integrity <= (integrity_failure * max_integrity)) to_chat(user, span_notice("You start recalibrating [src]'s hover field...")) - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, target = src)) broken = FALSE atom_integrity = max_integrity update_appearance() @@ -673,7 +671,7 @@ /obj/structure/displaycase/forsale/atom_break(damage_flag) . = ..() - if(!broken && !(obj_flags & NO_DECONSTRUCTION)) + if(!broken) broken = TRUE playsound(src, SFX_SHATTER, 70, TRUE) update_appearance() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index f110cd8b43e..f75a8b9ce72 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -184,7 +184,7 @@ W.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, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) if( state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) return if(!user.transferItemToLoc(W, src)) @@ -224,7 +224,7 @@ playsound(src, 'sound/items/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, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) if(G.get_amount() < 1 || glass) return if(G.type == /obj/item/stack/sheet/rglass) @@ -247,7 +247,7 @@ playsound(src, 'sound/items/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, 40, target = src)) + 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.")) @@ -363,25 +363,22 @@ target.update_name() qdel(source) -/obj/structure/door_assembly/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/turf/T = get_turf(src) - if(!disassembled) - material_amt = rand(2,4) - new material_type(T, material_amt) - if(glass) - if(disassembled) - if(heat_proof_finished) - new /obj/item/stack/sheet/rglass(T) - else - new /obj/item/stack/sheet/glass(T) +/obj/structure/door_assembly/atom_deconstruct(disassembled = TRUE) + var/turf/target_turf = get_turf(src) + if(!disassembled) + material_amt = rand(2,4) + new material_type(target_turf, material_amt) + if(glass) + if(disassembled) + if(heat_proof_finished) + new /obj/item/stack/sheet/rglass(target_turf) else - new /obj/item/shard(T) - if(mineral) - var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") - new mineral_path(T, 2) - qdel(src) - + new /obj/item/stack/sheet/glass(target_turf) + else + new /obj/item/shard(target_turf) + if(mineral) + var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") + new mineral_path(target_turf, 2) /obj/structure/door_assembly/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index 589cad42bca..dd06f7e42a9 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -271,24 +271,21 @@ name = "large public airlock assembly" base_name = "large public airlock" -/obj/structure/door_assembly/door_assembly_material/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/turf/T = get_turf(src) - for(var/material in custom_materials) - var/datum/material/material_datum = material - var/material_count = FLOOR(custom_materials[material_datum] / SHEET_MATERIAL_AMOUNT, 1) - if(!disassembled) - material_count = rand(FLOOR(material_count/2, 1), material_count) - new material_datum.sheet_type(T, material_count) - if(glass) - if(disassembled) - if(heat_proof_finished) - new /obj/item/stack/sheet/rglass(T) - else - new /obj/item/stack/sheet/glass(T) +/obj/structure/door_assembly/door_assembly_material/atom_deconstruct(disassembled = TRUE) + var/turf/target_turf = get_turf(src) + for(var/datum/material/material_datum as anything in custom_materials) + var/material_count = FLOOR(custom_materials[material_datum] / SHEET_MATERIAL_AMOUNT, 1) + if(!disassembled) + material_count = rand(FLOOR(material_count/2, 1), material_count) + new material_datum.sheet_type(target_turf, material_count) + if(glass) + if(disassembled) + if(heat_proof_finished) + new /obj/item/stack/sheet/rglass(target_turf) else - new /obj/item/shard(T) - qdel(src) + new /obj/item/stack/sheet/glass(target_turf) + else + new /obj/item/shard(target_turf) /obj/structure/door_assembly/door_assembly_material/finish_door() var/obj/machinery/door/airlock/door = ..() diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 9232a992a5b..18332de296d 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -18,10 +18,8 @@ else return ..() -/obj/structure/dresser/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) - qdel(src) +/obj/structure/dresser/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) /obj/structure/dresser/attack_hand(mob/user, list/modifiers) . = ..() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index f8780a28d50..f218f4d77f7 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -164,7 +164,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) /obj/structure/extinguisher_cabinet/atom_break(damage_flag) . = ..() - if(!broken && !(obj_flags & NO_DECONSTRUCTION)) + if(!broken) broken = 1 opened = 1 if(stored_extinguisher) @@ -173,16 +173,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) update_appearance(UPDATE_ICON) -/obj/structure/extinguisher_cabinet/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - new /obj/item/wallframe/extinguisher_cabinet(loc) - else - new /obj/item/stack/sheet/iron (loc, 2) - if(stored_extinguisher) - stored_extinguisher.forceMove(loc) - stored_extinguisher = null - qdel(src) +/obj/structure/extinguisher_cabinet/atom_deconstruct(disassembled = TRUE) + if(disassembled) + new /obj/item/wallframe/extinguisher_cabinet(loc) + else + new /obj/item/stack/sheet/iron (loc, 2) + if(stored_extinguisher) + stored_extinguisher.forceMove(loc) + stored_extinguisher = null /obj/item/wallframe/extinguisher_cabinet name = "extinguisher cabinet frame" diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index eaf830b7db7..e9f9eb5d11e 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -49,7 +49,7 @@ opening = FALSE return update_appearance() - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/falsewall, toggle_open)), 5) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/falsewall, toggle_open)), 0.5 SECONDS) /obj/structure/falsewall/proc/toggle_open() if(!QDELETED(src)) @@ -133,14 +133,12 @@ playsound(src, 'sound/items/welder.ogg', 100, TRUE) deconstruct(disassembled) -/obj/structure/falsewall/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - new girder_type(loc) - if(mineral_amount) - for(var/i in 1 to mineral_amount) - new mineral(loc) - qdel(src) +/obj/structure/falsewall/atom_deconstruct(disassembled = TRUE) + if(disassembled) + new girder_type(loc) + if(mineral_amount) + for(var/i in 1 to mineral_amount) + new mineral(loc) /obj/structure/falsewall/get_dumping_location() return null @@ -387,14 +385,12 @@ canSmoothWith = SMOOTH_GROUP_MATERIAL_WALLS material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS -/obj/structure/falsewall/material/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - new girder_type(loc) - for(var/material in custom_materials) - var/datum/material/material_datum = material - new material_datum.sheet_type(loc, FLOOR(custom_materials[material_datum] / SHEET_MATERIAL_AMOUNT, 1)) - qdel(src) +/obj/structure/falsewall/material/atom_deconstruct(disassembled = TRUE) + if(disassembled) + new girder_type(loc) + for(var/material in custom_materials) + var/datum/material/material_datum = material + new material_datum.sheet_type(loc, FLOOR(custom_materials[material_datum] / SHEET_MATERIAL_AMOUNT, 1)) /obj/structure/falsewall/material/mat_update_desc(mat) desc = "A huge chunk of [mat] used to separate rooms." diff --git a/code/game/objects/structures/fans.dm b/code/game/objects/structures/fans.dm index ef34a07b5b6..4f0a5fc450b 100644 --- a/code/game/objects/structures/fans.dm +++ b/code/game/objects/structures/fans.dm @@ -10,21 +10,15 @@ var/buildstackamount = 5 can_atmos_pass = ATMOS_PASS_NO -/obj/structure/fans/deconstruct() - if(!(obj_flags & NO_DECONSTRUCTION)) - if(buildstacktype) - new buildstacktype(loc,buildstackamount) - qdel(src) +/obj/structure/fans/atom_deconstruct(disassembled = TRUE) + if(buildstacktype) + new buildstacktype(loc,buildstackamount) /obj/structure/fans/wrench_act(mob/living/user, obj/item/I) - ..() - if(obj_flags & NO_DECONSTRUCTION) - return TRUE - user.visible_message(span_warning("[user] disassembles [src]."), span_notice("You start to disassemble [src]..."), span_hear("You hear clanking and banging noises.")) if(I.use_tool(src, user, 20, volume=50)) - deconstruct() + deconstruct(TRUE) return TRUE /obj/structure/fans/tiny @@ -54,6 +48,6 @@ desc = "An tenuously thin energy shield only capable of holding in air, but not solid objects or people." icon = 'icons/effects/effects.dmi' icon_state = "shield-old" // We should probably get these their own icon at some point - light_color = "#6496FA" + light_color = LIGHT_COLOR_BLUE light_range = 4 diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index ab7d410f096..ab69b7bc7a4 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -108,19 +108,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) /obj/structure/fireaxecabinet/atom_break(damage_flag) . = ..() - if(!broken && !(obj_flags & NO_DECONSTRUCTION)) + if(!broken) update_appearance() broken = TRUE playsound(src, 'sound/effects/glassbr3.ogg', 100, TRUE) new /obj/item/shard(loc) new /obj/item/shard(loc) -/obj/structure/fireaxecabinet/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(held_item && loc) - held_item.forceMove(loc) - new /obj/item/wallframe/fireaxecabinet(loc) - qdel(src) +/obj/structure/fireaxecabinet/atom_deconstruct(disassembled = TRUE) + if(held_item && loc) + held_item.forceMove(loc) + new /obj/item/wallframe/fireaxecabinet(loc) /obj/structure/fireaxecabinet/blob_act(obj/structure/blob/B) if(held_item) @@ -230,12 +228,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/empty, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/mechremoval, 32) -/obj/structure/fireaxecabinet/mechremoval/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(held_item && loc) - held_item.forceMove(loc) - new /obj/item/wallframe/fireaxecabinet/mechremoval(loc) - qdel(src) +/obj/structure/fireaxecabinet/mechremoval/atom_deconstruct(disassembled = TRUE) + if(held_item && loc) + held_item.forceMove(loc) + new /obj/item/wallframe/fireaxecabinet/mechremoval(loc) /obj/structure/fireaxecabinet/mechremoval/empty populate_contents = FALSE diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index aac22154030..a0ef37aa0b3 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -267,13 +267,11 @@ var/matrix/M = matrix(transform) transform = M.Turn(-previous_rotation) -/obj/structure/flora/deconstruct() - if(!(obj_flags & NO_DECONSTRUCTION)) - if(harvested) - return ..() +/obj/structure/flora/atom_deconstruct(disassembled = TRUE) + if(harvested) + return ..() - harvest(product_amount_multiplier = 0.6) - . = ..() + harvest(product_amount_multiplier = 0.6) /********* * Trees * diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 82e89314d68..82569c8f9e7 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -25,6 +25,7 @@ qdel(src) return ..() + /** * Empty terrariums are created when a preserved terrarium in a lavaland seed vault is activated. */ @@ -34,6 +35,7 @@ icon = 'icons/obj/mining_zones/spawners.dmi' icon_state = "terrarium_open" density = TRUE + /** * Empty sleepers are created by a good few ghost roles in lavaland. */ @@ -51,6 +53,7 @@ /obj/structure/fluff/empty_sleeper/syndicate icon_state = "sleeper_s-open" + /** * Empty cryostasis sleepers are created when a malfunctioning cryostasis sleeper in a lavaland shelter is activated. */ @@ -75,6 +78,17 @@ deconstructible = FALSE layer = EDGED_TURF_LAYER +/** + * shower drain placed usually under showers just so it looks like something picks the water up. + */ +/obj/structure/fluff/shower_drain + name = "shower drain" + desc = "Ew, I think I see a hairball." + icon = 'icons/obj/mining_zones/survival_pod.dmi' + icon_state = "fan_tiny" + plane = FLOOR_PLANE + layer = LOW_OBJ_LAYER + /** * A variety of statue in disrepair; parts are broken off and a gemstone is missing */ diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d5cc2cb177f..a1cb0f82696 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -81,7 +81,7 @@ balloon_alert(user, "need [amount] rods!") return balloon_alert(user, "concealing entrance...") - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, target = src)) if(rod.get_amount() < amount) return rod.use(amount) @@ -94,7 +94,7 @@ balloon_alert(user, "need [amount] rods!") return balloon_alert(user, "adding plating...") - if(do_after(user, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) if(rod.get_amount() < amount) return rod.use(amount) @@ -176,7 +176,7 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "concealing entrance...") - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, target = src)) if(sheets.get_amount() < amount) return sheets.use(amount) @@ -242,7 +242,7 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "concealing entrance...") - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, target = src)) if(sheets.get_amount() < amount) return sheets.use(amount) @@ -264,7 +264,7 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "adding plating...") - if (do_after(user, 40, target = src)) + if (do_after(user, 4 SECONDS, target = src)) if(sheets.get_amount() < amount) return sheets.use(amount) @@ -383,11 +383,9 @@ return TRUE return FALSE -/obj/structure/girder/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/remains = pick(/obj/item/stack/rods, /obj/item/stack/sheet/iron) - new remains(loc) - qdel(src) +/obj/structure/girder/atom_deconstruct(disassembled = TRUE) + var/remains = pick(/obj/item/stack/rods, /obj/item/stack/sheet/iron) + new remains(loc) /obj/structure/girder/narsie_act() new /obj/structure/girder/cult(loc) @@ -409,11 +407,10 @@ max_integrity = 350 /obj/structure/girder/tram - name = "tram frame" + name = "tram girder" desc = "Titanium framework to construct tram walls. Can be plated with titanium glass or other wall materials." icon_state = "tram" state = GIRDER_TRAM - density = FALSE obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN /obj/structure/girder/tram/corner @@ -447,7 +444,7 @@ balloon_alert(user, "need [amount] sheet!") return balloon_alert(user, "adding plating...") - if(do_after(user, 50, target = src)) + if(do_after(user, 5 SECONDS, target = src)) if(R.get_amount() < amount) return R.use(amount) @@ -461,10 +458,8 @@ /obj/structure/girder/cult/narsie_act() return -/obj/structure/girder/cult/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/runed_metal(drop_location(), 1) - qdel(src) +/obj/structure/girder/cult/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/runed_metal(drop_location(), 1) /obj/structure/girder/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) @@ -519,7 +514,7 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "adding plating...") - if(do_after(user, 50, target = src)) + if(do_after(user, 5 SECONDS, target = src)) if(B.get_amount() < amount) return B.use(amount) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index da023942518..a25dfaada50 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -52,8 +52,6 @@ /obj/structure/grille/examine(mob/user) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return if(anchored) . += span_notice("It's secured in place with screws. The rods look like they could be cut through.") @@ -200,10 +198,8 @@ add_fingerprint(user) if(shock(user, 100)) return - if(obj_flags & NO_DECONSTRUCTION) - return FALSE tool.play_tool_sound(src, 100) - deconstruct() + deconstruct(TRUE) return ITEM_INTERACT_SUCCESS /obj/structure/grille/screwdriver_act(mob/living/user, obj/item/tool) @@ -212,8 +208,6 @@ add_fingerprint(user) if(shock(user, 90)) return FALSE - if(obj_flags & NO_DECONSTRUCTION) - return FALSE if(!tool.use_tool(src, user, 0, volume=100)) return FALSE set_anchored(!anchored) @@ -296,18 +290,13 @@ playsound(src, 'sound/items/welder.ogg', 80, TRUE) -/obj/structure/grille/deconstruct(disassembled = TRUE) - if(!loc) //if already qdel'd somehow, we do nothing - return - if(!(obj_flags & NO_DECONSTRUCTION)) - var/obj/R = new rods_type(drop_location(), rods_amount) - transfer_fingerprints_to(R) - qdel(src) - ..() +/obj/structure/grille/atom_deconstruct(disassembled = TRUE) + var/obj/rods = new rods_type(drop_location(), rods_amount) + transfer_fingerprints_to(rods) /obj/structure/grille/atom_break() . = ..() - if(!broken && !(obj_flags & NO_DECONSTRUCTION)) + if(!broken) icon_state = "brokengrille" set_density(FALSE) atom_integrity = 20 diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index bc56b3838ca..a51e82498e2 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -192,7 +192,7 @@ if (blade_status == GUILLOTINE_BLADE_RAISED) if (blade_sharpness < GUILLOTINE_BLADE_MAX_SHARP) blade_status = GUILLOTINE_BLADE_SHARPENING - if(do_after(user, 7, target = src)) + if(do_after(user, 0.7 SECONDS, target = src)) blade_status = GUILLOTINE_BLADE_RAISED user.visible_message(span_notice("[user] sharpens the large blade of the guillotine."), span_notice("You sharpen the large blade of the guillotine.")) diff --git a/code/game/objects/structures/gym/punching_bag.dm b/code/game/objects/structures/gym/punching_bag.dm index 9c67bd89cfc..f441887f2c1 100644 --- a/code/game/objects/structures/gym/punching_bag.dm +++ b/code/game/objects/structures/gym/punching_bag.dm @@ -44,17 +44,22 @@ flick("[icon_state]-punch", src) playsound(loc, pick(hit_sounds), 25, TRUE, -1) + if(!iscarbon(user)) + return + + var/is_heavy_gravity = user.has_gravity() > STANDARD_GRAVITY + var/stamina_exhaustion = 3 if(ishuman(user)) var/mob/living/carbon/human/boxer = user var/obj/item/clothing/gloves/boxing/boxing_gloves = boxer.get_item_by_slot(ITEM_SLOT_GLOVES) if(istype(boxing_gloves)) stamina_exhaustion = 2 + if (is_heavy_gravity) + stamina_exhaustion *= 1.5 - if(!iscarbon(user)) - return user.adjustStaminaLoss(stamina_exhaustion) - user.mind?.adjust_experience(/datum/skill/fitness, 0.1) + user.mind?.adjust_experience(/datum/skill/fitness, is_heavy_gravity ? 0.2 : 0.1) user.apply_status_effect(/datum/status_effect/exercised) /obj/structure/punching_bag/wrench_act_secondary(mob/living/user, obj/item/tool) diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index 055c9788c95..d3614ee6815 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -133,8 +133,9 @@ user.adjust_nutrition(-5) // feel the burn if(iscarbon(user)) + var/gravity_modifier = user.has_gravity() > STANDARD_GRAVITY ? 2 : 1 // remember the real xp gain is from sleeping after working out - user.mind.adjust_experience(/datum/skill/fitness, WORKOUT_XP) + user.mind.adjust_experience(/datum/skill/fitness, WORKOUT_XP * gravity_modifier) user.apply_status_effect(/datum/status_effect/exercised, EXERCISE_STATUS_DURATION) end_workout() @@ -161,8 +162,13 @@ if(!iscarbon(user) || isnull(user.mind)) return TRUE + + var/affected_gravity = user.has_gravity() + if (!affected_gravity) + return TRUE // No weight? I could do this all day + var/gravity_modifier = affected_gravity > STANDARD_GRAVITY ? 0.75 : 1 // the amount of workouts you can do before you hit stamcrit - var/workout_reps = total_workout_reps[user.mind.get_skill_level(/datum/skill/fitness)] + var/workout_reps = total_workout_reps[user.mind.get_skill_level(/datum/skill/fitness)] * gravity_modifier // total stamina drain of 1 workout calculated based on the workout length var/stamina_exhaustion = FLOOR(user.maxHealth / workout_reps / WORKOUT_LENGTH, 0.1) user.adjustStaminaLoss(stamina_exhaustion * seconds_per_tick) diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index b48cafc85d9..0c29d92d53b 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -64,7 +64,7 @@ if(!QDELETED(src)) deconstruct(TRUE) -/obj/structure/headpike/deconstruct(disassembled) +/obj/structure/headpike/atom_deconstruct(disassembled) var/obj/item/bodypart/head/our_head = victim var/obj/item/spear/our_spear = spear victim = null @@ -73,7 +73,6 @@ if(!disassembled) return ..() our_spear?.forceMove(drop_location()) - return ..() /obj/structure/headpike/attack_hand(mob/user, list/modifiers) . = ..() diff --git a/code/game/objects/structures/hivebot.dm b/code/game/objects/structures/hivebot.dm index ba371f8d658..838113cab8c 100644 --- a/code/game/objects/structures/hivebot.dm +++ b/code/game/objects/structures/hivebot.dm @@ -15,7 +15,7 @@ smoke.start() visible_message(span_boldannounce("[src] warps in!")) playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE) - addtimer(CALLBACK(src, PROC_REF(warpbots)), rand(10, 600)) + addtimer(CALLBACK(src, PROC_REF(warpbots)), rand(1 SECONDS, 1 MINUTES)) /obj/structure/hivebot_beacon/proc/warpbots() icon_state = "def_radar" diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index a1a3adf3251..1d7fc470aff 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -215,7 +215,7 @@ var/mob/living/M = user M.electrocute_act(15,"Energy Barrier") shockcd = TRUE - addtimer(CALLBACK(src, PROC_REF(cooldown)), 5) + addtimer(CALLBACK(src, PROC_REF(cooldown)), 0.5 SECONDS) /obj/structure/holosign/barrier/cyborg/hacked/Bumped(atom/movable/AM) if(shockcd) @@ -227,4 +227,4 @@ var/mob/living/M = AM M.electrocute_act(15,"Energy Barrier") shockcd = TRUE - addtimer(CALLBACK(src, PROC_REF(cooldown)), 5) + addtimer(CALLBACK(src, PROC_REF(cooldown)), 0.5 SECONDS) diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 20f14844c12..4401b87d23e 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -40,10 +40,9 @@ GLOBAL_LIST_INIT(ore_probability, list( var/turf/closed/mineral/clearable = potential clearable.ScrapeAway(flags = CHANGETURF_IGNORE_AIR) -/obj/structure/spawner/ice_moon/deconstruct(disassembled) +/obj/structure/spawner/ice_moon/atom_deconstruct(disassembled) destroy_effect() drop_loot() - return ..() /** * Effects and messages created when the spawner is destroyed diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index fd4daaeaa18..039735dc36f 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -159,13 +159,12 @@ buckled_mob.pixel_y = buckled_mob.base_pixel_y + PIXEL_Y_OFFSET_LYING REMOVE_TRAIT(buckled_mob, TRAIT_MOVE_UPSIDE_DOWN, REF(src)) -/obj/structure/kitchenspike/deconstruct(disassembled = TRUE) +/obj/structure/kitchenspike/atom_deconstruct(disassembled = TRUE) if(disassembled) var/obj/structure/meatspike_frame = new /obj/structure/kitchenspike_frame(src.loc) transfer_fingerprints_to(meatspike_frame) else new /obj/item/stack/sheet/iron(src.loc, 4) new /obj/item/stack/rods(loc, MEATSPIKE_IRONROD_REQUIREMENT) - qdel(src) #undef MEATSPIKE_IRONROD_REQUIREMENT diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 72f28ed8251..6d65705586a 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -57,10 +57,8 @@ var/turf/T = get_turf(src) return T.attackby(C, user) //hand this off to the turf instead (for building plating, catwalks, etc) -/obj/structure/lattice/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new build_material(get_turf(src), number_of_mats) - qdel(src) +/obj/structure/lattice/atom_deconstruct(disassembled = TRUE) + new build_material(get_turf(src), number_of_mats) /obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_TURF) @@ -113,11 +111,10 @@ C.deconstruct() ..() -/obj/structure/lattice/catwalk/deconstruct() +/obj/structure/lattice/catwalk/atom_deconstruct(disassembled = TRUE) var/turf/T = loc for(var/obj/structure/cable/C in T) C.deconstruct() - ..() /obj/structure/lattice/catwalk/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 6d6b2e6af37..58308b9b9cf 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -42,9 +42,8 @@ GLOBAL_LIST_INIT(tendrils, list()) AddComponent(/datum/component/gps, "Eerie Signal") GLOB.tendrils += src -/obj/structure/spawner/lavaland/deconstruct(disassembled) +/obj/structure/spawner/lavaland/atom_deconstruct(disassembled) new /obj/effect/collapse(loc) - return ..() /obj/structure/spawner/lavaland/examine(mob/user) var/list/examine_messages = ..() @@ -92,7 +91,7 @@ GLOBAL_LIST_INIT(tendrils, list()) visible_message(span_boldannounce("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!")) balloon_alert_to_viewers("interact to grab loot before collapse!", vision_distance = 7) playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) - addtimer(CALLBACK(src, PROC_REF(collapse)), 50) + addtimer(CALLBACK(src, PROC_REF(collapse)), 5 SECONDS) /obj/effect/collapse/examine(mob/user) var/list/examine_messages = ..() diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 08a4394346a..70ab15427b7 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -21,6 +21,8 @@ var/discovered = FALSE /// Is this type of vent exempt from the map's vent budget/limit? Think the free iron/glass vent or boss vents. This also causes it to not roll for random mineral breakdown. var/unique_vent = FALSE + /// Does this vent spawn a node drone when tapped? Currently unique to boss vents so try not to VV it. + var/spawn_drone_on_tap = TRUE /// What icon_state do we use when the ore vent has been tapped? var/icon_state_tapped = "ore_vent_active" /// A weighted list of what minerals are contained in this vent, with weight determining how likely each mineral is to be picked in produced boulders. @@ -40,9 +42,7 @@ /// What string do we use to warn the player about the excavation event? var/excavation_warning = "Are you ready to excavate this ore vent?" - ///Are we currently spawning mobs? - var/spawning_mobs = FALSE - /// A list of mobs that can be spawned by this vent during a wave defense event. + /// A list of mobs that can be spawned by this vent during a wave defense event. var/list/defending_mobs = list( /mob/living/basic/mining/goliath, /mob/living/basic/mining/legion/spawner_made, @@ -198,6 +198,34 @@ /obj/structure/ore_vent/proc/ore_quantity_function(ore_floor) return SHEET_MATERIAL_AMOUNT * round(boulder_size * (log(rand(1 + ore_floor, 4 + ore_floor)) ** -1)) +/** + * This confirms that the user wants to start the wave defense event, and that they can start it. + */ +/obj/structure/ore_vent/proc/pre_wave_defense(mob/user, spawn_drone = TRUE) + if(tgui_alert(user, excavation_warning, "Begin defending ore vent?", list("Yes", "No")) != "Yes") + return FALSE + if(!can_interact(user)) + return FALSE + if(!COOLDOWN_FINISHED(src, wave_cooldown) || node) + return FALSE + //This is where we start spitting out mobs. + Shake(duration = 3 SECONDS) + if(spawn_drone) + node = new /mob/living/basic/node_drone(loc) + node.arrive(src) + RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion)) + particles = new /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, FALSE) + if(prob(50)) + new /obj/effect/decal/cleanable/rubble(rock) + sleep(0.6 SECONDS) + return TRUE + /** * Starts the wave defense event, which will spawn a number of lavaland mobs based on the size of the ore vent. * Called after the vent has been tapped by a scanning device. @@ -221,7 +249,6 @@ wave_timer = 150 SECONDS COOLDOWN_START(src, wave_cooldown, wave_timer) addtimer(CALLBACK(src, PROC_REF(handle_wave_conclusion)), wave_timer) - spawning_mobs = TRUE icon_state = icon_state_tapped update_appearance(UPDATE_ICON_STATE) @@ -272,7 +299,7 @@ if(tapped) balloon_alert_to_viewers("vent tapped!") return - if(!COOLDOWN_FINISHED(src, wave_cooldown)) + if(!COOLDOWN_FINISHED(src, wave_cooldown) || node) //We're already defending the vent, so don't scan it again. if(!scan_only) balloon_alert_to_viewers("protect the node drone!") return @@ -302,27 +329,9 @@ return if(scan_only) return - if(tgui_alert(user, excavation_warning, "Begin defending ore vent?", list("Yes", "No")) != "Yes") - return - if(!COOLDOWN_FINISHED(src, wave_cooldown)) - return - //This is where we start spitting out mobs. - Shake(duration = 3 SECONDS) - node = new /mob/living/basic/node_drone(loc) - node.arrive(src) - RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion)) - particles = new /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, FALSE) - if(prob(50)) - new /obj/effect/decal/cleanable/rubble(rock) - sleep(0.6 SECONDS) + if(!pre_wave_defense(user, spawn_drone_on_tap)) + return start_wave_defense() /** @@ -416,15 +425,15 @@ if(LARGE_VENT_TYPE) boulder_size = BOULDER_SIZE_LARGE if(mapload) - SSore_generation.ore_vent_sizes["large"] += 1 + GLOB.ore_vent_sizes["large"] += 1 if(MEDIUM_VENT_TYPE) boulder_size = BOULDER_SIZE_MEDIUM if(mapload) - SSore_generation.ore_vent_sizes["medium"] += 1 + GLOB.ore_vent_sizes["medium"] += 1 if(SMALL_VENT_TYPE) boulder_size = BOULDER_SIZE_SMALL if(mapload) - SSore_generation.ore_vent_sizes["small"] += 1 + GLOB.ore_vent_sizes["small"] += 1 else boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value name = initial(name) @@ -437,8 +446,8 @@ defending_mobs = list( /mob/living/basic/mining/lobstrosity, /mob/living/basic/mining/legion/snow/spawner_made, + /mob/living/basic/mining/wolf, /mob/living/simple_animal/hostile/asteroid/polarbear, - /mob/living/simple_animal/hostile/asteroid/wolf, ) ore_vent_options = list( SMALL_VENT_TYPE, @@ -450,8 +459,8 @@ /mob/living/basic/mining/lobstrosity, /mob/living/basic/mining/legion/snow/spawner_made, /mob/living/basic/mining/ice_demon, + /mob/living/basic/mining/wolf, /mob/living/simple_animal/hostile/asteroid/polarbear, - /mob/living/simple_animal/hostile/asteroid/wolf, ) ore_vent_options = list( SMALL_VENT_TYPE = 3, @@ -463,6 +472,7 @@ name = "menacing ore vent" desc = "An ore vent, brimming with underground ore. This one has an evil aura about it. Better be careful." unique_vent = TRUE + spawn_drone_on_tap = FALSE boulder_size = BOULDER_SIZE_LARGE mineral_breakdown = list( // All the riches of the world, eeny meeny boulder room. /datum/material/iron = 1, @@ -481,7 +491,7 @@ /mob/living/simple_animal/hostile/megafauna/dragon, /mob/living/simple_animal/hostile/megafauna/colossus, ) - excavation_warning = "Something big is nearby. Are you ABSOLUTELY ready to excavate this ore vent?" + excavation_warning = "Something big is nearby. Are you ABSOLUTELY ready to excavate this ore vent? A NODE drone will be deployed after threat is neutralized." ///What boss do we want to spawn? var/summoned_boss = null @@ -506,6 +516,8 @@ . += span_notice("[boss_string] is etched onto the side of the vent.") /obj/structure/ore_vent/boss/start_wave_defense() + if(!COOLDOWN_FINISHED(src, wave_cooldown)) + return // Completely override the normal wave defense, and just spawn the boss. var/mob/living/simple_animal/hostile/megafauna/boss = new summoned_boss(loc) RegisterSignal(boss, COMSIG_LIVING_DEATH, PROC_REF(handle_wave_conclusion)) diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index f9ed6d93c1e..ecd6f54d255 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -303,11 +303,9 @@ at the cost of risking a vicious bite.**/ deconstruct() return TRUE -/obj/structure/steam_vent/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 1) - new /obj/item/stock_parts/water_recycler(loc, 1) - qdel(src) +/obj/structure/steam_vent/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, 1) + new /obj/item/stock_parts/water_recycler(loc, 1) /** * Creates "steam" smoke, and determines when the vent needs to block line of sight via reset_opacity. diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 03e37346c57..d794f24dd08 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -204,14 +204,12 @@ /////////////////////// END TOOL OVERRIDES /////////////////////// -/obj/structure/mineral_door/deconstruct(disassembled = TRUE) +/obj/structure/mineral_door/atom_deconstruct(disassembled = TRUE) var/turf/T = get_turf(src) if(disassembled) new sheetType(T, sheetAmount) else new sheetType(T, max(sheetAmount - 2, 1)) - qdel(src) - /obj/structure/mineral_door/iron name = "iron door" diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index bbe56b68c16..21452c0895d 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -260,7 +260,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) /obj/structure/mirror/atom_break(damage_flag, mapload) . = ..() - if(broken || (obj_flags & NO_DECONSTRUCTION)) + if(broken) return icon_state = "mirror_broke" if(!mapload) @@ -269,13 +269,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) desc = "Oh no, seven years of bad luck!" broken = TRUE -/obj/structure/mirror/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(!disassembled) - new /obj/item/shard(loc) - else - new /obj/item/wallframe/mirror(loc) - qdel(src) +/obj/structure/mirror/atom_deconstruct(disassembled = TRUE) + if(!disassembled) + new /obj/item/shard(loc) + else + new /obj/item/wallframe/mirror(loc) /obj/structure/mirror/welder_act(mob/living/user, obj/item/I) ..() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index dca885a598b..de15b16981b 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -104,10 +104,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an return return attack_hand(user) -/obj/structure/bodycontainer/deconstruct(disassembled = TRUE) - if (!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - qdel(src) +/obj/structure/bodycontainer/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, 5) /obj/structure/bodycontainer/container_resist_act(mob/living/user) if(!locked) @@ -451,14 +449,10 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/bodycontainer/crematorium/creamatorium/cremate(mob/user) var/list/icecreams = list() for(var/mob/living/i_scream as anything in get_all_contents_type(/mob/living)) - var/obj/item/food/icecream/IC = new /obj/item/food/icecream( - loc = null, - prefill_flavours = list(ICE_CREAM_MOB = list(null, i_scream.name)) - ) - icecreams += IC + icecreams += new /obj/item/food/icecream(null, list(ICE_CREAM_MOB = list(null, i_scream.name))) . = ..() - for(var/obj/IC in icecreams) - IC.forceMove(src) + for(var/obj/ice_cream as anything in icecreams) + ice_cream.forceMove(src) /* * Generic Tray @@ -482,9 +476,8 @@ GLOBAL_LIST_EMPTY(crematoriums) connected = null return ..() -/obj/structure/tray/deconstruct(disassembled = TRUE) +/obj/structure/tray/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/iron (loc, 2) - qdel(src) /obj/structure/tray/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) diff --git a/code/game/objects/structures/mystery_box.dm b/code/game/objects/structures/mystery_box.dm index 63092cfeac3..1843ef99761 100644 --- a/code/game/objects/structures/mystery_box.dm +++ b/code/game/objects/structures/mystery_box.dm @@ -272,7 +272,7 @@ GLOBAL_LIST_INIT(mystery_box_extended, list( /obj/mystery_box_item/proc/present_item() var/obj/item/selected_item = selected_path - add_filter("ready_outline", 2, list("type" = "outline", "color" = "#FBFF23", "size" = 0.2)) + add_filter("ready_outline", 2, list("type" = "outline", "color" = COLOR_VIVID_YELLOW, "size" = 0.2)) name = initial(selected_item.name) parent_box.present_weapon() claimable = TRUE diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index c737f21e6d9..841da899725 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -110,15 +110,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) notices-- update_appearance(UPDATE_ICON) -/obj/structure/noticeboard/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(!disassembled) - new /obj/item/stack/sheet/mineral/wood(loc) - else - new /obj/item/wallframe/noticeboard(loc) +/obj/structure/noticeboard/atom_deconstruct(disassembled = TRUE) + if(!disassembled) + new /obj/item/stack/sheet/mineral/wood(loc) + else + new /obj/item/wallframe/noticeboard(loc) for(var/obj/item/content in contents) remove_item(content) - qdel(src) /obj/item/wallframe/noticeboard name = "notice board" diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index a752faba40c..5383436d4db 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -73,7 +73,7 @@ petrified_mob.forceMove(loc) return ..() -/obj/structure/statue/petrified/deconstruct(disassembled = TRUE) +/obj/structure/statue/petrified/atom_deconstruct(disassembled = TRUE) var/destruction_message = "[src] shatters!" if(!disassembled) if(petrified_mob) @@ -89,7 +89,6 @@ destruction_message = "[src] shatters, a solid brain tumbling out!" petrified_mob.dust() visible_message(span_danger(destruction_message)) - qdel(src) /obj/structure/statue/petrified/animate_atom_living(mob/living/owner) if(isnull(petrified_mob)) diff --git a/code/game/objects/structures/pinatas.dm b/code/game/objects/structures/pinatas.dm index 116de95c167..63502f12ad5 100644 --- a/code/game/objects/structures/pinatas.dm +++ b/code/game/objects/structures/pinatas.dm @@ -41,9 +41,8 @@ if(BURN) playsound(src, 'sound/items/welder.ogg', 100, TRUE) -/obj/structure/pinata/deconstruct(disassembled) +/obj/structure/pinata/atom_deconstruct(disassembled) new debris(get_turf(src)) - return ..() ///An item that when used inhand spawns an immovable pinata /obj/item/pinata @@ -72,7 +71,7 @@ base_icon_state = "pinata_syndie_placed" destruction_loot = 2 debris = /obj/effect/decal/cleanable/wrapping/pinata/syndie - candy_options = list( + candy_options = list( /obj/item/food/bubblegum, /obj/item/food/candy, /obj/item/food/chocolatebar, diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 8b8047ba464..4a1684434dc 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -169,7 +169,7 @@ return user.visible_message(span_notice("[user] begins engraving [src]."), \ span_notice("You begin engraving [src].")) - if(!do_after(user, 40, target = src)) //This spits out a visible message that somebody is engraving a plaque, then has a delay. + if(!do_after(user, 4 SECONDS, target = src)) //This spits out a visible message that somebody is engraving a plaque, then has a delay. return name = "\improper [namechoice]" //We want improper here so examine doesn't get weird if somebody capitalizes the plaque title. desc = "The plaque reads: '[descriptionchoice]'" diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index f4834ecf48a..71890f72613 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -124,10 +124,8 @@ return FALSE //If you're not laying down, or a small creature, or a ventcrawler, then no pass. -/obj/structure/plasticflaps/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/plastic/five(loc) - qdel(src) +/obj/structure/plasticflaps/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/plastic/five(loc) /obj/structure/plasticflaps/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 3604bd06c63..95cf4fc58e5 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -98,19 +98,14 @@ deconstruct() return TRUE -/obj/structure/railing/deconstruct(disassembled) - if((obj_flags & NO_DECONSTRUCTION)) - return ..() +/obj/structure/railing/atom_deconstruct(disassembled) var/rods_to_make = istype(src,/obj/structure/railing/corner) ? 1 : 2 var/obj/rod = new item_deconstruct(drop_location(), rods_to_make) transfer_fingerprints_to(rod) - return ..() ///Implements behaviour that makes it possible to unanchor the railing. /obj/structure/railing/wrench_act(mob/living/user, obj/item/I) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return to_chat(user, span_notice("You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...")) if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_anchored), anchored))) set_anchored(!anchored) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 9c1a8f1c4f3..bcc9d138695 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -41,6 +41,7 @@ FLOOR SAFES /obj/structure/safe/Initialize(mapload) . = ..() + update_appearance(UPDATE_ICON) // Combination generation for(var/iterating in 1 to number_of_tumblers) tumblers.Add(rand(0, 99)) @@ -57,7 +58,8 @@ FLOOR SAFES inserting_item.forceMove(src) /obj/structure/safe/update_icon_state() - icon_state = "[initial(icon_state)][open ? "-open" : null]" + //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/attackby(obj/item/attacking_item, mob/user, params) @@ -247,5 +249,13 @@ FLOOR SAFES . = ..() AddElement(/datum/element/undertile) +///Special safe for the station's vault. Not explicitly required, but the piggy bank inside it is. +/obj/structure/safe/vault + +/obj/structure/safe/vault/Initialize(mapload) + . = ..() + var/obj/item/piggy_bank/vault/piggy = new(src) + space += piggy.w_class + #undef SOUND_CHANCE #undef BROKEN_THRESHOLD diff --git a/code/game/objects/structures/secure_safe.dm b/code/game/objects/structures/secure_safe.dm index 43027090e5b..76c3ab4575f 100644 --- a/code/game/objects/structures/secure_safe.dm +++ b/code/game/objects/structures/secure_safe.dm @@ -1,3 +1,25 @@ +/obj/item/wallframe/secure_safe + name = "secure safe frame" + desc = "A locked safe. It being unpowered prevents any access until placed back onto a wall." + icon = 'icons/obj/storage/storage.dmi' + icon_state = "wall_safe" + base_icon_state = "wall_safe" + result_path = /obj/structure/secure_safe + pixel_shift = 32 + +/obj/item/wallframe/secure_safe/Initialize(mapload) + . = ..() + create_storage( + max_specific_storage = WEIGHT_CLASS_GIGANTIC, + max_total_storage = 20, + ) + atom_storage.locked = STORAGE_FULLY_LOCKED + +/obj/item/wallframe/secure_safe/after_attach(obj/attached_to) + . = ..() + for(var/obj/item in contents) + item.forceMove(attached_to) + /** * Wall safes * Holds items and uses the lockable storage component @@ -18,8 +40,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe, 32) . = ..() //this will create the storage for us. AddComponent(/datum/component/lockable_storage) - find_and_hang_on_wall() - PopulateContents() + if(!density) + find_and_hang_on_wall() + if(mapload) + PopulateContents() + +/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)) + for(var/obj/item in contents) + item.forceMove(new_safe) /obj/structure/secure_safe/proc/PopulateContents() new /obj/item/paper(src) @@ -42,12 +72,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe, 32) desc = "In case of emergency, do not break glass. All Captains and Acting Captains are provided with codes to access this safe. \ It is made out of the same material as the station's Black Box and is designed to resist all conventional weaponry. \ There appears to be a small amount of surface corrosion. It doesn't look like it could withstand much of an explosion.\ - It remains quite flush against the wall, and there only seems to be enough room to fit something as slim as an ID card." + 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 = "safe" + base_icon_state = "safe" armor_type = /datum/armor/safe_caps_spare max_integrity = 300 - color = "#ffdd33" - -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe/caps_spare, 32) + damage_deflection = 30 // prevents stealing the captain's spare using null rods/lavaland monsters/AP projectiles + density = TRUE + anchored_tabletop_offset = 4 + custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT) + material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR /datum/armor/safe_caps_spare melee = 100 @@ -60,6 +95,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe/caps_spare, 32) /obj/structure/secure_safe/caps_spare/Initialize(mapload) . = ..() + var/matrix/small_safe_transformation = new + small_safe_transformation.Scale(0.6) + transform = small_safe_transformation atom_storage.set_holdable(/obj/item/card/id) AddComponent(/datum/component/lockable_storage, \ lock_code = SSid_access.spare_id_safe_code, \ diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 0441ef25c06..298c6fd2294 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -123,7 +123,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) //SKYRAT EDIT ADDITION /obj/machinery/shower/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) if(do_after(user, 3 SECONDS, src)) - reagents.remove_any(reagents.total_volume) + reagents.remove_all(reagents.total_volume) balloon_alert(user, "reservoir emptied") //SKYRAT EDIT END @@ -191,9 +191,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) /obj/machinery/shower/wrench_act(mob/living/user, obj/item/I) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return - I.play_tool_sound(src) deconstruct() return TRUE @@ -320,7 +317,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) if(!ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash above wash_atom(movable_content) // Reagent exposure is handled in wash_atom - reagents.remove_any(SHOWER_SPRAY_VOLUME) + reagents.remove_all(SHOWER_SPRAY_VOLUME) /obj/machinery/shower/on_deconstruction(disassembled = TRUE) new /obj/item/stack/sheet/iron(drop_location(), 2) diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 169f76a4b57..a26354211dc 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -209,9 +209,8 @@ deconstruct(TRUE) return TRUE -/obj/structure/stairs_frame/deconstruct(disassembled = TRUE) +/obj/structure/stairs_frame/atom_deconstruct(disassembled = TRUE) new frame_stack(get_turf(src), frame_stack_amount) - qdel(src) /obj/structure/stairs_frame/attackby(obj/item/attacked_by, mob/user, params) if(!isstack(attacked_by)) diff --git a/code/game/objects/structures/syndicate_uplink_beacon.dm b/code/game/objects/structures/syndicate_uplink_beacon.dm index f4d4ea6fe64..2106fade55a 100644 --- a/code/game/objects/structures/syndicate_uplink_beacon.dm +++ b/code/game/objects/structures/syndicate_uplink_beacon.dm @@ -43,7 +43,7 @@ return var/datum/looping_sound/typing/typing_sounds = new(src, start_immediately = TRUE) balloon_alert(user, "synchronizing...") - if(!do_after(user = user, delay = 3 SECONDS, target = src, interaction_key = REF(src))) + if(!do_after(user = user, delay = 3 SECONDS, target = src, interaction_key = REF(src), hidden = TRUE)) typing_sounds.stop() return typing_sounds.stop() @@ -52,7 +52,7 @@ /obj/structure/syndicate_uplink_beacon/screwdriver_act_secondary(mob/living/user, obj/item/tool) tool.play_tool_sound(src) balloon_alert(user, "deconstructing...") - if (!do_after(user, 5 SECONDS, target = src)) + if (!do_after(user, 5 SECONDS, target = src, hidden = TRUE)) return FALSE var/turf/beacon_tile = get_turf(src) new /obj/item/stack/sheet/iron/five(beacon_tile) diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index ba654d10b91..cb45eb18e75 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -75,9 +75,8 @@ T.set_custom_materials(custom_materials) qdel(src) -/obj/structure/table_frame/deconstruct(disassembled = TRUE) +/obj/structure/table_frame/atom_deconstruct(disassembled = TRUE) new framestack(get_turf(src), framestackamount) - qdel(src) /obj/structure/table_frame/narsie_act() new /obj/structure/table_frame/wood(src.loc) @@ -110,7 +109,7 @@ to_chat(user, span_warning("You need one [material.name] sheet to do this!")) return to_chat(user, span_notice("You start adding [material] to [src]...")) - if(do_after(user, 20, target = src) && material.use(1)) + if(do_after(user, 2 SECONDS, target = src) && material.use(1)) make_new_table(toConstruct, null, carpet_type) else return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 4c1546be5fd..234abcbeb39 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -73,7 +73,7 @@ context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" . = CONTEXTUAL_SCREENTIP_SET - if(!(obj_flags & NO_DECONSTRUCTION) && deconstruction_ready) + if(deconstruction_ready) if(held_item.tool_behaviour == TOOL_SCREWDRIVER) context[SCREENTIP_CONTEXT_RMB] = "Disassemble" . = CONTEXTUAL_SCREENTIP_SET @@ -207,7 +207,7 @@ pushed_mob.add_mood_event("table", /datum/mood_event/table_limbsmash, banged_limb) /obj/structure/table/screwdriver_act_secondary(mob/living/user, obj/item/tool) - if(obj_flags & NO_DECONSTRUCTION || !deconstruction_ready) + if(!deconstruction_ready) return FALSE to_chat(user, span_notice("You start disassembling [src]...")) if(tool.use_tool(src, user, 2 SECONDS, volume=50)) @@ -215,12 +215,12 @@ return ITEM_INTERACT_SUCCESS /obj/structure/table/wrench_act_secondary(mob/living/user, obj/item/tool) - if(obj_flags & NO_DECONSTRUCTION || !deconstruction_ready) + if(!deconstruction_ready) return FALSE to_chat(user, span_notice("You start deconstructing [src]...")) if(tool.use_tool(src, user, 4 SECONDS, volume=50)) playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - deconstruct(TRUE, 1) + deconstruct(TRUE) return ITEM_INTERACT_SUCCESS /obj/structure/table/attackby(obj/item/I, mob/living/user, params) @@ -297,20 +297,14 @@ /obj/structure/table/proc/AfterPutItemOnTable(obj/item/thing, mob/living/user) return -/obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/turf/T = get_turf(src) - if(buildstack) - new buildstack(T, buildstackamount) - else - for(var/i in custom_materials) - var/datum/material/M = i - new M.sheet_type(T, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1)) - if(!wrench_disassembly) - new frame(T) - else - new framestack(T, framestackamount) - qdel(src) +/obj/structure/table/atom_deconstruct(disassembled = TRUE) + var/turf/target_turf = get_turf(src) + if(buildstack) + new buildstack(target_turf, buildstackamount) + else + for(var/datum/material/mat in custom_materials) + new mat.sheet_type(target_turf, FLOOR(custom_materials[mat] / SHEET_MATERIAL_AMOUNT, 1)) + new framestack(target_turf, framestackamount) /obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) @@ -437,13 +431,12 @@ /obj/structure/table/glass/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER - if(obj_flags & NO_DECONSTRUCTION) - return + if(!isliving(AM)) return // Don't break if they're just flying past if(AM.throwing) - addtimer(CALLBACK(src, PROC_REF(throw_check), AM), 5) + addtimer(CALLBACK(src, PROC_REF(throw_check), AM), 0.5 SECONDS) else check_break(AM) @@ -452,7 +445,7 @@ check_break(M) /obj/structure/table/glass/proc/check_break(mob/living/M) - if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)) + if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) && (!isteshari(M))) //SKYRAT EDIT ADDITION - Allows Teshari to climb on glassies safely. table_shatter(M) /obj/structure/table/glass/proc/table_shatter(mob/living/victim) @@ -469,19 +462,16 @@ victim.Paralyze(100) qdel(src) -/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - ..() - return - else - var/turf/T = get_turf(src) - playsound(T, SFX_SHATTER, 50, TRUE) +/obj/structure/table/glass/atom_deconstruct(disassembled = TRUE) + if(disassembled) + ..() + return + else + var/turf/T = get_turf(src) + playsound(T, SFX_SHATTER, 50, TRUE) - new frame(loc) - new glass_shard_type(loc) - - qdel(src) + new frame(loc) + new glass_shard_type(loc) /obj/structure/table/glass/narsie_act() color = NARSIE_WINDOW_COLOUR @@ -839,6 +829,17 @@ . = ..() AddElement(/datum/element/climbable) AddElement(/datum/element/elevation, pixel_shift = 12) + register_context() + +/obj/structure/rack/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(isnull(held_item)) + return NONE + + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_RMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + + return NONE /obj/structure/rack/examine(mob/user) . = ..() @@ -851,25 +852,17 @@ if(istype(mover) && (mover.pass_flags & PASSTABLE)) return TRUE -/obj/structure/rack/MouseDrop_T(obj/O, mob/user) - . = ..() - if ((!( isitem(O) ) || user.get_active_held_item() != O)) - return - if(!user.dropItemToGround(O)) - return - if(O.loc != src.loc) - step(O, get_dir(O, src)) +/obj/structure/rack/wrench_act_secondary(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS -/obj/structure/rack/attackby(obj/item/W, mob/living/user, params) - var/list/modifiers = params2list(params) - if (W.tool_behaviour == TOOL_WRENCH && !(obj_flags & NO_DECONSTRUCTION) && LAZYACCESS(modifiers, RIGHT_CLICK)) - W.play_tool_sound(src) - deconstruct(TRUE) - return - if(user.combat_mode) - return ..() - if(user.transferItemToLoc(W, drop_location())) - return 1 +/obj/structure/rack/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + . = ..() + if(. || (tool.item_flags & ABSTRACT) || user.combat_mode) + return . + if(user.transferItemToLoc(tool, drop_location(), silent = FALSE)) + return ITEM_INTERACT_SUCCESS /obj/structure/rack/attack_paw(mob/living/user, list/modifiers) attack_hand(user, modifiers) @@ -878,7 +871,7 @@ . = ..() if(.) return - if(user.body_position == LYING_DOWN || user.usable_legs < 2) + if(!user.combat_mode || user.body_position == LYING_DOWN || user.usable_legs < 2) return user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_KICK) @@ -899,12 +892,10 @@ * Rack destruction */ -/obj/structure/rack/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - set_density(FALSE) - var/obj/item/rack_parts/newparts = new(loc) - transfer_fingerprints_to(newparts) - qdel(src) +/obj/structure/rack/atom_deconstruct(disassembled = TRUE) + set_density(FALSE) + var/obj/item/rack_parts/newparts = new(loc) + transfer_fingerprints_to(newparts) /* @@ -921,19 +912,38 @@ custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) var/building = FALSE -/obj/item/rack_parts/attackby(obj/item/W, mob/user, params) - if (W.tool_behaviour == TOOL_WRENCH) - new /obj/item/stack/sheet/iron(user.loc) - qdel(src) - else - . = ..() +/obj/item/rack_parts/Initialize(mapload) + . = ..() + register_context() + +/obj/item/rack_parts/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(isnull(held_item)) + return NONE + + if(held_item == src) + context[SCREENTIP_CONTEXT_LMB] = "Construct Rack" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/obj/item/rack_parts/wrench_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/item/rack_parts/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/iron(drop_location()) /obj/item/rack_parts/attack_self(mob/user) if(building) return building = TRUE to_chat(user, span_notice("You start constructing a rack...")) - if(do_after(user, 50, target = user, progress=TRUE)) + if(do_after(user, 5 SECONDS, target = user, progress=TRUE)) if(!user.temporarilyRemoveItemFromInventory(src)) return var/obj/structure/rack/R = new /obj/structure/rack(get_turf(src)) diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index ec00eb110a7..2c0b3bdc95b 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -103,13 +103,11 @@ return TRUE -/obj/structure/tank_dispenser/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - for(var/X in src) - var/obj/item/I = X - I.forceMove(loc) - new /obj/item/stack/sheet/iron (loc, 2) - qdel(src) +/obj/structure/tank_dispenser/atom_deconstruct(disassembled = TRUE) + for(var/X in src) + var/obj/item/I = X + I.forceMove(loc) + new /obj/item/stack/sheet/iron (loc, 2) /obj/structure/tank_dispenser/proc/dispense(tank_type, mob/receiver) var/existing_tank = locate(tank_type) in src diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm index 9b5b33d8417..34284b1f1dd 100644 --- a/code/game/objects/structures/tank_holder.dm +++ b/code/game/objects/structures/tank_holder.dm @@ -63,12 +63,11 @@ deconstruct(TRUE) return TRUE -/obj/structure/tank_holder/deconstruct(disassembled = TRUE) +/obj/structure/tank_holder/atom_deconstruct(disassembled = TRUE) var/atom/Tsec = drop_location() new /obj/item/stack/rods(Tsec, 2) if(tank) tank.forceMove(Tsec) - qdel(src) /obj/structure/tank_holder/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -142,3 +141,7 @@ /obj/structure/tank_holder/extinguisher/advanced icon_state = "holder_foam_extinguisher" tank = /obj/item/extinguisher/advanced + +/obj/structure/tank_holder/extinguisher/anti + icon_state = "holder_extinguisher" + tank = /obj/item/extinguisher/anti diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index b04d9803569..3eeb81cb8ac 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -73,7 +73,7 @@ return for(var/obj/structure/transit_tube_pod/pod in loc) pod.visible_message(span_warning("[user] starts putting [GM] into the [pod]!")) - if(do_after(user, 15, target = src)) + if(do_after(user, 1.5 SECONDS, target = src)) if(open_status == STATION_TUBE_OPEN && GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.has_buckled_mobs()) GM.Paralyze(100) src.Bumped(GM) @@ -87,7 +87,7 @@ else if(open_status == STATION_TUBE_OPEN) if(pod.contents.len && user.loc != pod) user.visible_message(span_notice("[user] starts emptying [pod]'s contents onto the floor."), span_notice("You start emptying [pod]'s contents onto the floor...")) - if(do_after(user, 10, target = src)) //So it doesn't default to close_animation() on fail + if(do_after(user, 1 SECONDS, target = src)) //So it doesn't default to close_animation() on fail if(pod && pod.loc == loc) for(var/atom/movable/AM in pod) AM.forceMove(get_turf(user)) @@ -153,7 +153,7 @@ /obj/structure/transit_tube/station/pod_stopped(obj/structure/transit_tube_pod/pod, from_dir) pod_moving = TRUE - addtimer(CALLBACK(src, PROC_REF(start_stopped), pod), 5) + addtimer(CALLBACK(src, PROC_REF(start_stopped), pod), 0.5 SECONDS) /obj/structure/transit_tube/station/proc/start_stopped(obj/structure/transit_tube_pod/pod) if(QDELETED(pod)) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 67d3d4c9510..b1168302f68 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -35,22 +35,16 @@ user.visible_message(span_notice("[user] empties \the [src]."), span_notice("You empty \the [src].")) empty_pod() else - deconstruct(TRUE, user) + deconstruct(TRUE) else return ..() -/obj/structure/transit_tube_pod/deconstruct(disassembled = TRUE, mob/user) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/atom/location = get_turf(src) - if(user) - location = user.loc - add_fingerprint(user) - user.visible_message(span_notice("[user] removes [src]."), span_notice("You remove [src].")) - var/obj/structure/c_transit_tube_pod/R = new/obj/structure/c_transit_tube_pod(location) - transfer_fingerprints_to(R) - R.setDir(dir) - empty_pod(location) - qdel(src) +/obj/structure/transit_tube_pod/atom_deconstruct(disassembled = TRUE) + var/atom/location = get_turf(src) + var/obj/structure/c_transit_tube_pod/tube_pod = new/obj/structure/c_transit_tube_pod(location) + transfer_fingerprints_to(tube_pod) + tube_pod.setDir(dir) + empty_pod(location) /obj/structure/transit_tube_pod/ex_act(severity, target) . = ..() diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index 00eeeb55ae2..42ccd625093 100644 --- a/code/game/objects/structures/votingbox.dm +++ b/code/game/objects/structures/votingbox.dm @@ -149,9 +149,8 @@ for(var/atom/movable/AM in contents) AM.forceMove(droppoint) -/obj/structure/votebox/deconstruct(disassembled) +/obj/structure/votebox/atom_deconstruct(disassembled) dump_contents() - . = ..() /obj/structure/votebox/proc/raffle(mob/user) var/list/options = list() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b343cd85f50..559e2dd7808 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -83,17 +83,15 @@ icon_state = "toilet[open][cistern]" return ..() -/obj/structure/toilet/deconstruct() - if(!(obj_flags & NO_DECONSTRUCTION)) - for(var/obj/toilet_item in contents) - toilet_item.forceMove(drop_location()) - if(buildstacktype) - new buildstacktype(loc,buildstackamount) - else - for(var/i in custom_materials) - var/datum/material/M = i - new M.sheet_type(loc, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1)) - ..() +/obj/structure/toilet/atom_deconstruct(dissambled = TRUE) + for(var/obj/toilet_item in contents) + toilet_item.forceMove(drop_location()) + if(buildstacktype) + new buildstacktype(loc,buildstackamount) + else + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(loc, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1)) /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) add_fingerprint(user) @@ -105,7 +103,7 @@ cistern = !cistern update_appearance() return COMPONENT_CANCEL_ATTACK_CHAIN - else if(I.tool_behaviour == TOOL_WRENCH && !(obj_flags & NO_DECONSTRUCTION)) + else if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src) deconstruct() return TRUE @@ -227,10 +225,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) exposed = !exposed return TRUE -/obj/structure/urinal/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/urinal(loc) - qdel(src) +/obj/structure/urinal/atom_deconstruct(disassembled = TRUE) + new /obj/item/wallframe/urinal(loc) /obj/item/wallframe/urinal name = "urinal frame" @@ -256,7 +252,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) /obj/item/food/urinalcake/attack_self(mob/living/user) user.visible_message(span_notice("[user] squishes [src]!"), span_notice("You squish [src]."), "You hear a squish.") icon_state = "urinalcake_squish" - addtimer(VARSET_CALLBACK(src, icon_state, "urinalcake"), 8) + addtimer(VARSET_CALLBACK(src, icon_state, "urinalcake"), 0.8 SECONDS) /obj/item/bikehorn/rubberducky/plasticducky name = "plastic ducky" @@ -357,12 +353,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) span_notice("You start washing your [washing_face ? "face" : "hands"]...")) busy = TRUE - if(!do_after(user, 40, target = src)) + if(!do_after(user, 4 SECONDS, target = src)) busy = FALSE return busy = FALSE - reagents.remove_any(5) + reagents.remove_all(5) reagents.expose(user, TOUCH, 5 / max(reagents.total_volume, 5)) begin_reclamation() if(washing_face) @@ -419,7 +415,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) return - if(O.tool_behaviour == TOOL_WRENCH && !(obj_flags & NO_DECONSTRUCTION)) + if(O.tool_behaviour == TOOL_WRENCH) O.play_tool_sound(src) deconstruct() return @@ -483,7 +479,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) if(!user.combat_mode) to_chat(user, span_notice("You start washing [O]...")) busy = TRUE - if(!do_after(user, 40, target = src)) + if(!do_after(user, 4 SECONDS, target = src)) busy = FALSE return 1 busy = FALSE @@ -495,12 +491,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) else return ..() -/obj/structure/sink/deconstruct() - if(!(obj_flags & NO_DECONSTRUCTION)) - drop_materials() - if(has_water_reclaimer) - new /obj/item/stock_parts/water_recycler(drop_location()) - ..() +/obj/structure/sink/atom_deconstruct(dissambled = TRUE) + drop_materials() + if(has_water_reclaimer) + new /obj/item/stock_parts/water_recycler(drop_location()) /obj/structure/sink/process(seconds_per_tick) // Water reclamation complete? @@ -571,10 +565,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) deconstruct() return TRUE -/obj/structure/sinkframe/deconstruct() - if(!(obj_flags & NO_DECONSTRUCTION)) - drop_materials() - return ..() +/obj/structure/sinkframe/atom_deconstruct(dissambled = TRUE) + drop_materials() /obj/structure/sinkframe/proc/drop_materials() for(var/datum/material/material as anything in custom_materials) @@ -725,9 +717,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) . = ..() icon_state = "puddle" -/obj/structure/water_source/puddle/deconstruct(disassembled = TRUE) - qdel(src) - //End legacy sink @@ -760,11 +749,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) open = !open if(open) layer = SIGN_LAYER - set_density(FALSE) set_opacity(FALSE) else layer = WALL_OBJ_LAYER - set_density(TRUE) if(opaque_closed) set_opacity(TRUE) @@ -806,11 +793,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) playsound(loc, 'sound/effects/curtain.ogg', 50, TRUE) toggle() -/obj/structure/curtain/deconstruct(disassembled = TRUE) +/obj/structure/curtain/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/cloth (loc, 2) new /obj/item/stack/sheet/plastic (loc, 2) new /obj/item/stack/rods (loc, 1) - qdel(src) /obj/structure/curtain/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -842,10 +828,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) alpha = 255 opaque_closed = TRUE -/obj/structure/curtain/cloth/deconstruct(disassembled = TRUE) +/obj/structure/curtain/cloth/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/cloth (loc, 4) new /obj/item/stack/rods (loc, 1) - qdel(src) /obj/structure/curtain/cloth/fancy icon_type = "cur_fancy" diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 46eb13ee2b7..0a56c6add69 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -178,7 +178,7 @@ else if(istype(W, /obj/item/stack/cable_coil) && anchored) user.visible_message(span_notice("[user] wires the windoor assembly."), span_notice("You start to wire the windoor assembly...")) - if(do_after(user, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) if(!src || !anchored || src.state != "01") return var/obj/item/stack/cable_coil/CC = W @@ -220,7 +220,7 @@ 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, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) if(!src || electronics) W.forceMove(drop_location()) return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e96d394bdf6..89d04f46976 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -78,8 +78,6 @@ /obj/structure/window/examine(mob/user) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return switch(state) if(WINDOW_SCREWED_TO_FRAME) @@ -210,8 +208,6 @@ return ITEM_INTERACT_SUCCESS /obj/structure/window/screwdriver_act(mob/living/user, obj/item/tool) - if(obj_flags & NO_DECONSTRUCTION) - return switch(state) if(WINDOW_SCREWED_TO_FRAME) @@ -240,7 +236,7 @@ /obj/structure/window/wrench_act(mob/living/user, obj/item/tool) if(anchored) return FALSE - if((obj_flags & NO_DECONSTRUCTION) || (reinf && state >= RWINDOW_FRAME_BOLTED)) + if(reinf && state >= RWINDOW_FRAME_BOLTED) return FALSE to_chat(user, span_notice("You begin to disassemble [src]...")) @@ -255,7 +251,7 @@ return ITEM_INTERACT_SUCCESS /obj/structure/window/crowbar_act(mob/living/user, obj/item/tool) - if(!anchored || (obj_flags & NO_DECONSTRUCTION)) + if(!anchored) return FALSE switch(state) @@ -330,18 +326,13 @@ playsound(src, 'sound/items/welder.ogg', 100, TRUE) -/obj/structure/window/deconstruct(disassembled = TRUE) - if(QDELETED(src)) - return +/obj/structure/window/atom_deconstruct(disassembled = TRUE) if(!disassembled) playsound(src, break_sound, 70, TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - for(var/obj/item/shard/debris in spawn_debris(drop_location())) - transfer_fingerprints_to(debris) // transfer fingerprints to shards only - qdel(src) + for(var/obj/item/shard/debris in spawn_debris(drop_location())) + transfer_fingerprints_to(debris) // transfer fingerprints to shards only update_nearby_icons() - ///Spawns shard and debris decal based on the glass_material_datum, spawns rods if window is reinforned and number of shards/rods is determined by the window being fulltile or not. /obj/structure/window/proc/spawn_debris(location) var/datum/material/glass_material_ref = GET_MATERIAL_REF(glass_material_datum) @@ -480,9 +471,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) return FALSE /obj/structure/window/reinforced/attackby_secondary(obj/item/tool, mob/user, params) - if(obj_flags & NO_DECONSTRUCTION) - return ..() - switch(state) if(RWINDOW_SECURE) if(tool.tool_behaviour == TOOL_WELDER) @@ -546,7 +534,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) /obj/structure/window/reinforced/crowbar_act(mob/living/user, obj/item/tool) if(!anchored) return FALSE - if((obj_flags & NO_DECONSTRUCTION) || (state != WINDOW_OUT_OF_FRAME)) + if(state != WINDOW_OUT_OF_FRAME) return FALSE to_chat(user, span_notice("You begin to lever the window back into the frame...")) if(tool.use_tool(src, user, 10 SECONDS, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) @@ -561,8 +549,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) /obj/structure/window/reinforced/examine(mob/user) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return + switch(state) if(RWINDOW_SECURE) . += span_notice("It's been screwed in with one way screws, you'd need to heat them to have any chance of backing them out.") @@ -803,9 +790,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw /obj/structure/window/reinforced/shuttle/indestructible name = "hardened shuttle window" - obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION flags_1 = PREVENT_CLICK_UNDER_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /obj/structure/window/reinforced/shuttle/indestructible/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) return FALSE @@ -915,7 +902,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw return ..() if(istype(W, /obj/item/paper) && atom_integrity < max_integrity) user.visible_message(span_notice("[user] starts to patch the holes in \the [src].")) - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, target = src)) atom_integrity = min(atom_integrity+4,max_integrity) qdel(W) user.visible_message(span_notice("[user] patches some of the holes in \the [src].")) diff --git a/code/game/say.dm b/code/game/say.dm index 768fe0374d5..ee54ef4a8f7 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -27,7 +27,36 @@ GLOBAL_LIST_INIT(freqtospan, list( "[FREQ_CTF_YELLOW]" = "yellowteamradio" )) -/atom/movable/proc/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = FALSE, message_range = 7, datum/saymode/saymode = null) +/** + * What makes things... talk. + * + * * message - The message to say. + * * bubble_type - The type of speech bubble to use when talking + * * spans - A list of spans to attach to the message. Includes the atom's speech span by default + * * sanitize - Should we sanitize the message? Only set to FALSE if you have ALREADY sanitized it + * * language - The language to speak in. Defaults to the atom's selected language + * * ignore_spam - Should we ignore spam checks? + * * forced - What was it forced by? null if voluntary. (NOT a boolean!) + * * filterproof - Do we bypass the filter when checking the message? + * * message_range - The range of the message. Defaults to 7 + * * saymode - Saymode passed to the speech + * This is usually set automatically and is only relevant for living mobs. + * * message_mods - A list of message modifiers, i.e. whispering/singing. + * Most of these are set automatically but you can pass in your own pre-say. + */ +/atom/movable/proc/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(), +) if(!try_speak(message, ignore_spam, forced, filterproof)) return if(sanitize) @@ -37,7 +66,6 @@ GLOBAL_LIST_INIT(freqtospan, list( spans |= speech_span if(!language) language = get_selected_language() - var/list/message_mods = list() message_mods[SAY_MOD_VERB] = say_mod(message, message_mods) send_speech(message, message_range, src, bubble_type, spans, language, message_mods, forced = forced) @@ -66,7 +94,7 @@ GLOBAL_LIST_INIT(freqtospan, list( * TRUE of FASE depending on if our movable can speak */ /atom/movable/proc/try_speak(message, ignore_spam = FALSE, forced = null, filterproof = FALSE) - return TRUE + return can_speak() /** * Checks if our movable can currently speak, vocally, in general. @@ -83,7 +111,8 @@ GLOBAL_LIST_INIT(freqtospan, list( * if TRUE, we will check if the movable can speak REGARDLESS of if they have an active mime vow. */ /atom/movable/proc/can_speak(allow_mimes = FALSE) - return TRUE + SHOULD_BE_PURE(TRUE) + return !HAS_TRAIT(src, TRAIT_MUTE) /atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language, list/message_mods = list(), forced = FALSE, tts_message, list/tts_filter) var/found_client = FALSE @@ -180,7 +209,15 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/get_default_say_verb() return verb_say -/atom/movable/proc/say_quote(input, list/spans=list(speech_span), list/message_mods = list()) +/** + * This prock is used to generate a message for chat + * Generates the `says, "meme"` part of the `Grey Tider says, "meme"`. + * + * input - The message to be said + * spans - A list of spans to attach to the message. Includes the atom's speech span by default + * message_mods - A list of message modifiers, i.e. whispering/singing + */ +/atom/movable/proc/say_quote(input, list/spans = list(speech_span), list/message_mods = list()) if(!input) input = "..." diff --git a/code/game/sound.dm b/code/game/sound.dm index 393cf79a345..d98c1aface5 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -425,4 +425,10 @@ 'sound/items/reel4.ogg', 'sound/items/reel5.ogg', ) + if(SFX_RATTLE) + soundin = pick( + 'sound/items/rattle1.ogg', + 'sound/items/rattle2.ogg', + 'sound/items/rattle3.ogg', + ) return soundin diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 0d8f505e623..4966e955849 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -143,15 +143,15 @@ return rand(1,5) if(distance < VENT_PROX_VERY_HIGH) - return 5 + return ORE_WALL_VERY_HIGH if(distance < VENT_PROX_HIGH) - return 4 + return ORE_WALL_HIGH if(distance < VENT_PROX_MEDIUM) - return 3 + return ORE_WALL_MEDIUM if(distance < VENT_PROX_LOW) - return 2 + return ORE_WALL_LOW if(distance < VENT_PROX_FAR) - return 1 + return ORE_WALL_FAR return 0 /turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -245,7 +245,7 @@ /turf/closed/mineral/attack_hulk(mob/living/carbon/human/H) ..() - if(do_after(H, 50, target = src)) + if(do_after(H, 5 SECONDS, target = src)) playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) H.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") gets_drilled(H) @@ -323,7 +323,7 @@ var/turf/closed/mineral/M = T M.turf_type = src.turf_type M.mineralAmt = scale_ore_to_vent() - SSore_generation.post_ore_random["[M.mineralAmt]"] += 1 + GLOB.post_ore_random["[M.mineralAmt]"] += 1 src = M M.levelupdate() else @@ -334,7 +334,7 @@ Change_Ore(path, FALSE) Spread_Vein(path) mineralAmt = scale_ore_to_vent() - SSore_generation.post_ore_manual["[mineralAmt]"] += 1 + GLOB.post_ore_manual["[mineralAmt]"] += 1 /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 4e79d835271..13bc0a43da6 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -140,7 +140,7 @@ for(var/obj/O in src.contents) //Eject contents! if(istype(O, /obj/structure/sign/poster)) var/obj/structure/sign/poster/P = O - P.roll_and_drop(src) + 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 diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 6b308fd89ec..3a81ae8a6e4 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -305,7 +305,7 @@ /turf/open/proc/water_vapor_gas_act() MakeSlippery(TURF_WET_WATER, min_wet_time = 100, wet_time_to_add = 50) - for(var/mob/living/simple_animal/slime/M in src) + for(var/mob/living/basic/slime/M in src) M.apply_water() wash(CLEAN_WASH) diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm index ccfc0022617..afb4274cb57 100644 --- a/code/game/turfs/open/floor/catwalk_plating.dm +++ b/code/game/turfs/open/floor/catwalk_plating.dm @@ -99,6 +99,9 @@ catwalk_type = "smoothiron" //Airless variants of the above +/turf/open/floor/catwalk_floor/airless + initial_gas_mix = AIRLESS_ATMOS + /turf/open/floor/catwalk_floor/iron/airless initial_gas_mix = AIRLESS_ATMOS @@ -108,6 +111,9 @@ /turf/open/floor/catwalk_floor/iron_dark/airless initial_gas_mix = AIRLESS_ATMOS +/turf/open/floor/catwalk_floor/iron_dark/telecomms + initial_gas_mix = TCOMMS_ATMOS + /turf/open/floor/catwalk_floor/flat_white/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/open/floor/glass.dm b/code/game/turfs/open/floor/glass.dm index c28ec9e1d4e..b1579da55f0 100644 --- a/code/game/turfs/open/floor/glass.dm +++ b/code/game/turfs/open/floor/glass.dm @@ -80,6 +80,9 @@ floor_tile = /obj/item/stack/tile/rglass alpha_to_leave = 206 +/turf/open/floor/glass/reinforced/telecomms + initial_gas_mix = TCOMMS_ATMOS + /turf/open/floor/glass/reinforced/icemoon initial_gas_mix = ICEMOON_DEFAULT_ATMOS diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 8634883762f..974042ce7c8 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -62,7 +62,7 @@ return else to_chat(user, span_notice("You begin reinforcing the floor...")) - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) if (R.get_amount() >= 2 && !istype(src, /turf/open/floor/engine)) place_on_top(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, TRUE) @@ -308,6 +308,9 @@ new /obj/effect/decal/cleanable/glass/plastitanium/screws(below_turf) playsound(src, 'sound/effects/structure_stress/pop3.ogg', 100, vary = TRUE) +/turf/open/floor/plating/reinforced/airless + initial_gas_mix = AIRLESS_ATMOS + ///not an actual turf its used just for rcd ui purposes /turf/open/floor/plating/rcd name = "Floor/Wall" diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 8f9e7b44aa6..8165b35a256 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -249,7 +249,7 @@ /turf/open/lava/proc/can_burn_stuff(atom/movable/burn_target) if(QDELETED(burn_target)) return LAVA_BE_IGNORING - if(burn_target.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) //you're flying over it. + if(burn_target.movement_type & MOVETYPES_NOT_TOUCHING_GROUND || !burn_target.has_gravity()) //you're flying over it. return LAVA_BE_IGNORING if(isobj(burn_target)) @@ -268,7 +268,7 @@ var/mob/living/burn_living = burn_target var/atom/movable/burn_buckled = burn_living.buckled if(burn_buckled) - if(burn_buckled.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) + if(burn_buckled.movement_type & MOVETYPES_NOT_TOUCHING_GROUND || !burn_buckled.has_gravity()) return LAVA_BE_PROCESSING if(isobj(burn_buckled)) var/obj/burn_buckled_obj = burn_buckled diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index f6a9dd8b77d..24345611576 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -203,3 +203,6 @@ /turf/open/openspace/icemoon/ruins protect_ruin = FALSE drill_below = FALSE + +/turf/open/openspace/telecomms + initial_gas_mix = TCOMMS_ATMOS diff --git a/code/game/world.dm b/code/game/world.dm index 60690df9678..d456a32b8d5 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -119,7 +119,7 @@ GLOBAL_VAR(restart_counter) // From a really fucking old commit (91d7150) // I wanted to move it but I think this needs to be after /world/New is called but before any sleeps? // - Dominion/Cyberboss - GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 + GLOB.timezoneOffset = world.timezone * 36000 // First possible sleep() InitTgs() @@ -455,7 +455,7 @@ GLOBAL_VAR(restart_counter) /world/proc/incrementMaxZ() maxz++ SSmobs.MaxZChanged() - SSidlenpcpool.MaxZChanged() + SSai_controllers.on_max_z_changed() /world/proc/change_fps(new_value = 20) if(new_value <= 0) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index c39464e3ef0..3b959d449cd 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -102,19 +102,8 @@ GLOBAL_PROTECT(protected_ranks) if(3) can_edit_rights |= flag -/proc/sync_ranks_with_db() - set waitfor = FALSE - - if(IsAdminAdvancedProcCall()) - to_chat(usr, "Admin rank DB Sync blocked: Advanced ProcCall detected.", confidential = TRUE) - return - - var/list/sql_ranks = list() - for(var/datum/admin_rank/R in GLOB.protected_ranks) - sql_ranks += list(list("rank" = R.name, "flags" = R.include_rights, "exclude_flags" = R.exclude_rights, "can_edit_flags" = R.can_edit_rights)) - SSdbcore.MassInsert(format_table_name("admin_ranks"), sql_ranks, duplicate_key = TRUE) - -//load our rank - > rights associations +/// Loads admin ranks. +/// Return a list containing the backup data if they were loaded from the database backup json /proc/load_admin_ranks(dbfail, no_update) if(IsAdminAdvancedProcCall()) to_chat(usr, "Admin Reload blocked: Advanced ProcCall detected.", confidential = TRUE) @@ -137,7 +126,7 @@ GLOBAL_PROTECT(protected_ranks) GLOB.admin_ranks += R GLOB.protected_ranks += R previous_rank = R - if(!CONFIG_GET(flag/admin_legacy_system) || dbfail) + if(!CONFIG_GET(flag/admin_legacy_system) && !dbfail) if(CONFIG_GET(flag/load_legacy_ranks_only)) if(!no_update) sync_ranks_with_db() @@ -146,7 +135,7 @@ GLOBAL_PROTECT(protected_ranks) if(!query_load_admin_ranks.Execute()) message_admins("Error loading admin ranks from database. Loading from backup.") log_sql("Error loading admin ranks from database. Loading from backup.") - dbfail = 1 + dbfail = TRUE else while(query_load_admin_ranks.NextRow()) var/skip @@ -220,12 +209,14 @@ GLOBAL_PROTECT(protected_ranks) return jointext(names, "+") +/// (Re)Loads the admin list. +/// returns TRUE if database admins had to be loaded from the backup json /proc/load_admins(no_update) var/dbfail if(!CONFIG_GET(flag/admin_legacy_system) && !SSdbcore.Connect()) message_admins("Failed to connect to database while loading admins. Loading from backup.") log_sql("Failed to connect to database while loading admins. Loading from backup.") - dbfail = 1 + dbfail = TRUE //clear the datums references GLOB.admin_datums.Cut() for(var/client/C in GLOB.admins) @@ -251,7 +242,7 @@ GLOBAL_PROTECT(protected_ranks) var/admin_rank = admins_regex.group[2] new /datum/admins(ranks_from_rank_name(admin_rank), ckey(admin_key), force_active = FALSE, protected = TRUE) - if(!CONFIG_GET(flag/admin_legacy_system) || dbfail) + if(!CONFIG_GET(flag/admin_legacy_system) && !dbfail) var/datum/db_query/query_load_admins = SSdbcore.NewQuery("SELECT ckey, `rank`, feedback FROM [format_table_name("admin")] ORDER BY `rank`") if(!query_load_admins.Execute()) message_admins("Error loading admins from database. Loading from backup.") @@ -275,6 +266,9 @@ GLOBAL_PROTECT(protected_ranks) var/datum/admins/admin_holder = new(admin_ranks, admin_ckey) admin_holder.cached_feedback_link = admin_feedback || NO_FEEDBACK_LINK qdel(query_load_admins) + if (!no_update) + save_admin_backup() + sync_admins_with_db() //load admins from backup file if(dbfail) if(!backup_file_json) @@ -286,14 +280,15 @@ GLOBAL_PROTECT(protected_ranks) log_world("Unable to locate admins backup file.") return backup_file_json = json_decode(backup_file) - for(var/J in backup_file_json["admins"]) + for(var/backup_admin_ckey in backup_file_json["admins"]) var/skip - for(var/A in GLOB.admin_datums + GLOB.deadmins) - if(A == "[J]") //this admin was already loaded from txt override + for(var/admin_ckey in GLOB.admin_datums + GLOB.deadmins) + if(ckey(admin_ckey) == ckey("[backup_admin_ckey]")) //this admin was already loaded from txt override skip = TRUE + break if(skip) continue - new /datum/admins(ranks_from_rank_name(backup_file_json["admins"]["[J]"]), ckey("[J]")) + new /datum/admins(ranks_from_rank_name(backup_file_json["admins"]["[backup_admin_ckey]"]), ckey("[backup_admin_ckey]")) #ifdef TESTING var/msg = "Admins Built:\n" for(var/ckey in GLOB.admin_datums) @@ -302,3 +297,103 @@ GLOBAL_PROTECT(protected_ranks) testing(msg) #endif return dbfail + + +/proc/sync_ranks_with_db() + set waitfor = FALSE + + if(IsAdminAdvancedProcCall()) + to_chat(usr, "Admin rank DB Sync blocked: Advanced ProcCall detected.", confidential = TRUE) + return + + var/list/sql_ranks = list() + for(var/datum/admin_rank/R as anything in GLOB.protected_ranks) + sql_ranks += list(list("rank" = R.name, "flags" = R.include_rights, "exclude_flags" = R.exclude_rights, "can_edit_flags" = R.can_edit_rights)) + SSdbcore.MassInsert(format_table_name("admin_ranks"), sql_ranks, duplicate_key = TRUE) + update_everything_flag_in_db() + + +/proc/update_everything_flag_in_db() + for(var/datum/admin_rank/R as anything in GLOB.admin_ranks) + var/list/flags = list() + if(R.include_rights == R_EVERYTHING) + flags += "flags" + if(R.exclude_rights == R_EVERYTHING) + flags += "exclude_flags" + if(R.can_edit_rights == R_EVERYTHING) + flags += "can_edit_flags" + if(!flags.len) + continue + var/flags_to_check = flags.Join(" != [R_EVERYTHING] AND ") + " != [R_EVERYTHING]" + var/datum/db_query/query_check_everything_ranks = SSdbcore.NewQuery( + "SELECT flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] WHERE rank = :rank AND ([flags_to_check])", + list("rank" = R.name) + ) + if(!query_check_everything_ranks.Execute()) + qdel(query_check_everything_ranks) + return + if(query_check_everything_ranks.NextRow()) //no row is returned if the rank already has the correct flag value + var/flags_to_update = flags.Join(" = [R_EVERYTHING], ") + " = [R_EVERYTHING]" + var/datum/db_query/query_update_everything_ranks = SSdbcore.NewQuery( + "UPDATE [format_table_name("admin_ranks")] SET [flags_to_update] WHERE rank = :rank", + list("rank" = R.name) + ) + if(!query_update_everything_ranks.Execute()) + qdel(query_update_everything_ranks) + return + qdel(query_update_everything_ranks) + qdel(query_check_everything_ranks) + + +/proc/sync_admins_with_db() + if(IsAdminAdvancedProcCall()) + to_chat(usr, "Admin rank DB Sync blocked: Advanced ProcCall detected.") + return + + if(CONFIG_GET(flag/admin_legacy_system) || !SSdbcore.IsConnected()) //we're already using legacy system so there's nothing to save + return + sync_ranks_with_db() + var/list/sql_admins = list() + for(var/holder_ckey in GLOB.protected_admins) + var/datum/admins/holder = GLOB.protected_admins[holder_ckey] + sql_admins += list(list("ckey" = holder.target, "rank" = holder.rank_names())) + SSdbcore.MassInsert(format_table_name("admin"), sql_admins, duplicate_key = TRUE) + var/datum/db_query/query_admin_rank_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] AS p INNER JOIN [format_table_name("admin")] AS a ON p.ckey = a.ckey SET p.lastadminrank = a.rank") + query_admin_rank_update.Execute() + qdel(query_admin_rank_update) + + +/proc/save_admin_backup() + if(IsAdminAdvancedProcCall()) + to_chat(usr, "Admin rank DB Sync blocked: Advanced ProcCall detected.") + return + + if(CONFIG_GET(flag/admin_legacy_system)) //we're already using legacy system so there's nothing to save + return + + //json format backup file generation stored per server + var/json_file = file("data/admins_backup.json") + var/list/file_data = list( + "ranks" = list(), + "admins" = list() + ) + for(var/datum/admin_rank/R as anything in GLOB.admin_ranks) + file_data["ranks"]["[R.name]"] = list() + file_data["ranks"]["[R.name]"]["include rights"] = R.include_rights + file_data["ranks"]["[R.name]"]["exclude rights"] = R.exclude_rights + file_data["ranks"]["[R.name]"]["can edit rights"] = R.can_edit_rights + + for(var/admin_ckey in GLOB.admin_datums + GLOB.deadmins) + var/datum/admins/admin = GLOB.admin_datums[admin_ckey] + + if(!admin) + admin = GLOB.deadmins[admin_ckey] + if (!admin) + continue + + file_data["admins"][admin_ckey] = admin.rank_names() + + admin.backup_connections() + + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data, JSON_PRETTY_PRINT)) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index de667a84b91..c7ebfeab8f0 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -311,6 +311,10 @@ GLOBAL_PROTECT(admin_verbs_poll) add_verb(src, /client/proc/play_web_sound) if(rights & R_SPAWN) add_verb(src, GLOB.admin_verbs_spawn) +#ifdef MAP_TEST + remove_verb(src, /client/proc/enable_mapping_verbs) + add_verb(src, list(/client/proc/disable_mapping_verbs, GLOB.admin_verbs_debug_mapping)) +#endif /client/proc/remove_admin_verbs() remove_verb(src, list( @@ -1228,4 +1232,3 @@ GLOBAL_PROTECT(admin_verbs_poll) QDEL_NULL(segment.ai_controller) segment.AddComponent(/datum/component/mob_chain, front = previous) previous = segment - diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index b8f6737b155..a54aafde916 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -100,6 +100,7 @@ GLOBAL_VAR(antag_prototypes) out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
" out += "Assigned role: [assigned_role.title]. Edit
" out += "Faction and special role: [special_role]
" + out += "Show Teams

" var/special_statuses = get_special_statuses() if(length(special_statuses)) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 1434284e6be..f7f9911d40e 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -87,14 +87,14 @@ if (!possessable.ckey && possessable.stat == CONSCIOUS) // Only assign ghosts to living, non-occupied mobs! bodies += possessable - var/list/candidates = SSpolling.poll_ghost_candidates_for_mobs( - question = "Would you like to be [group_name]?", + var/list/candidates = SSpolling.poll_ghosts_for_targets( + question = "Would you like to be [span_notice(group_name)]?", role = ROLE_SENTIENCE, check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, - mobs = bodies, + checked_targets = bodies, ignore_category = POLL_IGNORE_SHUTTLE_DENIZENS, - pic_source = src, + alert_pic = src, role_name_text = "sentience fun balloon", ) while(LAZYLEN(candidates) && LAZYLEN(bodies)) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index e98016df74f..df08496ec2a 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -232,7 +232,7 @@ GLOBAL_PROTECT(href_token) return VALID_2FA_CONNECTION if (!SSdbcore.Connect()) - if (verify_backup_data(client)) + if (verify_admin_from_local_cache(client) || (client.ckey in GLOB.protected_admins)) return VALID_2FA_CONNECTION else return list(FALSE, null) @@ -249,7 +249,8 @@ GLOBAL_PROTECT(href_token) )) if (!query.Execute()) - qdel(query) + if (verify_admin_from_local_cache(client) || (client.ckey in GLOB.protected_admins)) + return VALID_2FA_CONNECTION return list(FALSE, null) var/is_valid = FALSE @@ -319,25 +320,30 @@ GLOBAL_PROTECT(href_token) #undef ERROR_2FA_REQUEST_PERMISSIONS -/datum/admins/proc/verify_backup_data(client/client) - var/backup_file = file2text("data/admins_backup.json") +/// Returns true if the admin's cid/ip is verified in the local cache +/datum/admins/proc/verify_admin_from_local_cache(client/client) + var/backup_filename = "data/admin_connections/[ckey(client?.ckey)].json" + if (!fexists(backup_filename)) + return FALSE + var/backup_file = file2text(backup_filename) if (isnull(backup_file)) - log_world("Unable to locate admins backup file.") + log_world("Unable to load admin connection's last_connections.json backup file.") return FALSE - var/list/backup_file_json = json_decode(backup_file) - var/connections = backup_file_json["connections"] + var/list/connections = json_decode(backup_file) - // This can happen for older admins_backup.json files if (isnull(connections)) return FALSE - var/most_recent_valid_connection = connections[client?.ckey] - if (isnull(most_recent_valid_connection)) - return FALSE + for (var/list/connection as anything in connections) + if (!islist(connection) || length(connection) < 2) + stack_trace("Invalid connection in admin connections backup file for `[client]`.") + continue + if (connection["cid"] == client?.computer_id && connection["ip"] == client?.address) + return TRUE + + return FALSE - return most_recent_valid_connection["cid"] == client?.computer_id \ - && most_recent_valid_connection["ip"] == client?.address /datum/admins/proc/alert_2fa_necessary(client/client) var/msg = " is trying to join, but needs to verify their ckey." @@ -358,6 +364,46 @@ GLOBAL_PROTECT(href_token) confidential = TRUE, ) +/datum/admins/proc/backup_connections() + set waitfor = FALSE + if (!length(CONFIG_GET(string/admin_2fa_url))) + return + var/ckey = ckey(target) + if (!ckey) + CRASH("can't backup an admin datum assigned to a blank ckey") + + if (!SSdbcore.Connect()) + return + + var/datum/db_query/query = SSdbcore.NewQuery({" + SELECT cid, INET_NTOA(ip) as ip FROM [format_table_name("admin_connections")] + WHERE + ckey = :ckey AND verification_time IS NOT NULL + "}, list( + "ckey" = ckey, + )) + + if (!query.Execute()) + qdel(query) + return + var/list/admin_connections = list() + while (query.NextRow()) + admin_connections += LIST_VALUE_WRAP_LISTS(list( + "cid" = query.item[1], + "ip" = query.item[2], + )) + + qdel(query) + + if (length(admin_connections) < 1) + return + + + var/backup_file = "data/admin_connections/[ckey].json" + if (fexists(backup_file)) + fdel(backup_file) + WRITE_FILE(file(backup_file), json_encode(admin_connections, JSON_PRETTY_PRINT)) + /// Get the rank name of the admin /datum/admins/proc/rank_names() return join_admin_ranks(ranks) diff --git a/code/modules/admin/smites/imaginary_friend_special.dm b/code/modules/admin/smites/imaginary_friend_special.dm index 5b2bc6ba805..e670e26fd1f 100644 --- a/code/modules/admin/smites/imaginary_friend_special.dm +++ b/code/modules/admin/smites/imaginary_friend_special.dm @@ -58,7 +58,6 @@ return FALSE var/list/volunteers = SSpolling.poll_ghost_candidates( - question = "Do you want to play as an imaginary friend?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_IMAGINARYFRIEND, diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1504fc965d7..5b644902ffe 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -243,7 +243,12 @@ if(posttransformoutfit && istype(newmob)) newmob.equipOutfit(posttransformoutfit) if("monkey") - M.change_mob_type( /mob/living/carbon/human/species/monkey , null, null, delmob ) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.dna.add_mutation(/datum/mutation/human/race, MUT_NORMAL) + H.dna.activate_mutation(/datum/mutation/human/race) + else + M.change_mob_type( /mob/living/carbon/human/species/monkey , null, null, delmob ) if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob ) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 223ccda8086..bd2f6310bd5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -534,7 +534,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) state = AHELP_RESOLVED GLOB.ahelp_tickets.ListInsert(src) - addtimer(CALLBACK(initiator, TYPE_PROC_REF(/client, giveadminhelpverb)), 50) + addtimer(CALLBACK(initiator, TYPE_PROC_REF(/client, giveadminhelpverb)), 5 SECONDS) send2adminchat("Ticket #[id]:", "Marked as resolved by [key_name]") // BUBBER EDIT - LOG ALL AHELPS TO DISCORD AddInteraction("Resolved by [key_name].", player_message = "Ticket resolved!") to_chat(initiator, span_adminhelp("Your ticket has been resolved by an admin. The Adminhelp verb will be returned to you shortly."), confidential = TRUE) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 126d8756762..35b1baa063d 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -680,8 +680,7 @@ names[name] = ruin_landmark - var/ruinname = input("Select ruin", "Jump to Ruin") as null|anything in sort_list(names) - + var/ruinname = tgui_input_list(usr, "Select ruin", "Jump to Ruin", sort_list(names)) var/obj/effect/landmark/ruin/landmark = names[ruinname] @@ -715,7 +714,7 @@ themed_names[name] = list(ruin, theme, list(ruin.default_area)) names += sort_list(themed_names) - var/ruinname = input("Select ruin", "Spawn Ruin") as null|anything in names + var/ruinname = tgui_input_list(usr, "Select ruin", "Spawn Ruin", sort_list(names)) var/data = names[ruinname] if (!data) return diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index dd9abab4278..c99e226d310 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -123,7 +123,7 @@ var/list/spawnpoints = GLOB.emergencyresponseteamspawn var/index = 0 - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for [ertemplate.polldesc]?", check_jobban = "deathsquad", pic_source = /obj/item/card/id/advanced/centcom/ert, role_name_text = "emergency response team") + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for [span_notice(ertemplate.polldesc)]?", check_jobban = "deathsquad", alert_pic = /obj/item/card/id/advanced/centcom/ert, role_name_text = "emergency response team") var/teamSpawned = FALSE // This list will take priority over spawnpoints if not empty diff --git a/code/modules/admin/verbs/highlander_datum.dm b/code/modules/admin/verbs/highlander_datum.dm index ad8f75bca82..de7e4918fc0 100644 --- a/code/modules/admin/verbs/highlander_datum.dm +++ b/code/modules/admin/verbs/highlander_datum.dm @@ -36,7 +36,7 @@ GLOBAL_DATUM(highlander_controller, /datum/highlander_controller) robot.gib() continue robot.make_scottish() - addtimer(CALLBACK(SSshuttle.emergency, TYPE_PROC_REF(/obj/docking_port/mobile/emergency, request), null, 1), 50) + addtimer(CALLBACK(SSshuttle.emergency, TYPE_PROC_REF(/obj/docking_port/mobile/emergency, request), null, 1), 5 SECONDS) /datum/highlander_controller/Destroy(force) . = ..() diff --git a/code/modules/admin/verbs/lua/lua_editor.dm b/code/modules/admin/verbs/lua/lua_editor.dm index 03f6e07cac0..9e1b851824b 100644 --- a/code/modules/admin/verbs/lua/lua_editor.dm +++ b/code/modules/admin/verbs/lua/lua_editor.dm @@ -105,6 +105,11 @@ return if(!check_rights_for(usr.client, R_DEBUG)) return + if(action == "runCodeFile") + params["code"] = file2text(input(usr, "Input File") as null|file) + if(isnull(params["code"])) + return + action = "runCode" switch(action) if("newState") var/state_name = params["name"] diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index d5b2c6de65d..27994d966a7 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -24,6 +24,12 @@ GLOBAL_PROTECT(lua_usr) /// Ckey of the last user who ran a script on this lua state. var/ckey_last_runner = "" + /// Whether the timer.lua script has been included into this lua context state. + var/timer_enabled = FALSE + + /// Callbacks that need to be ran on next tick + var/list/functions_to_execute = list() + /datum/lua_state/vv_edit_var(var_name, var_value) . = ..() if(var_name == NAMEOF(src, internal_id)) @@ -89,19 +95,21 @@ GLOBAL_PROTECT(lua_usr) return result +/datum/lua_state/process(seconds_per_tick) + if(timer_enabled) + var/result = call_function("__Timer_timer_process", seconds_per_tick) + log_result(result, verbose = FALSE) + for(var/function as anything in functions_to_execute) + result = call_function(list("__Timer_callbacks", function)) + log_result(result, verbose = FALSE) + functions_to_execute.Cut() + /datum/lua_state/proc/call_function(function, ...) var/call_args = length(args) > 1 ? args.Copy(2) : list() if(islist(function)) var/list/new_function_path = list() for(var/path_element in function) - if(isweakref(path_element)) - var/datum/weakref/weak_ref = path_element - var/resolved = weak_ref.hard_resolve() - if(!resolved) - return list("status" = "errored", "param" = "Weakref in function path ([weak_ref] [text_ref(weak_ref)]) resolved to null.", "name" = jointext(function, ".")) - new_function_path += resolved - else - new_function_path += path_element + new_function_path += path_element function = new_function_path var/msg = "[key_name(usr)] called the lua function \"[function]\" with arguments: [english_list(call_args)]" log_lua(msg) diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm index 6ead4d3b137..30f198bfba9 100644 --- a/code/modules/admin/verbs/manipulate_organs.dm +++ b/code/modules/admin/verbs/manipulate_organs.dm @@ -70,7 +70,7 @@ organ_holder.Remove(carbon_victim) else implant_holder = organ_to_modify - implant_holder.removed(carbon_victim) + implant_holder.removed(carbon_victim, special = TRUE) organ_to_modify.forceMove(get_turf(carbon_victim)) diff --git a/code/modules/admin/verbs/map_export.dm b/code/modules/admin/verbs/map_export.dm index 8ff2568e79a..8233ce4389d 100644 --- a/code/modules/admin/verbs/map_export.dm +++ b/code/modules/admin/verbs/map_export.dm @@ -86,7 +86,7 @@ ) /obj/get_save_vars() - return ..() + NAMEOF(src, req_access) + return ..() + list(NAMEOF(src, req_access), NAMEOF(src, id_tag)) /obj/item/stack/get_save_vars() return ..() + NAMEOF(src, amount) diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index a772f699992..827bbfb16e8 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -3,8 +3,7 @@ set name = "Map template - Place" var/datum/map_template/template - - var/map = input(src, "Choose a Map Template to place at your CURRENT LOCATION","Place Map Template") as null|anything in sort_list(SSmapping.map_templates) + var/map = tgui_input_list(usr, "Choose a Map Template to place at your CURRENT LOCATION","Place Map Template", sort_list(SSmapping.map_templates)) if(!map) return template = SSmapping.map_templates[map] diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 20a05685bc9..e70138ad8ac 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -377,7 +377,7 @@ GLOBAL_DATUM(everyone_an_antag, /datum/everyone_is_an_antag_controller) "playersonly" = list("desc" = "Only spawn ghost-controlled mobs", "type" = "boolean", "value" = "No"), "ghostpoll" = list("desc" = "Ghost poll question", "type" = "string", "value" = "Do you want to play as %TYPE% portal invader?"), "delay" = list("desc" = "Time between portals, in deciseconds", "type" = "number", "value" = 50), - "color" = list("desc" = "Portal color", "type" = "color", "value" = "#00FF00"), + "color" = list("desc" = "Portal color", "type" = "color", "value" = COLOR_VIBRANT_LIME), "playlightning" = list("desc" = "Play lightning sounds on announcement", "type" = "boolean", "value" = "Yes"), "announce_players" = list("desc" = "Make an announcement", "type" = "boolean", "value" = "Yes"), "announcement" = list("desc" = "Announcement", "type" = "string", "value" = "Massive bluespace anomaly detected en route to %STATION%. Brace for impact."), @@ -405,7 +405,7 @@ GLOBAL_DATUM(everyone_an_antag, /datum/everyone_is_an_antag_controller) var/list/candidates = list() if (prefs["offerghosts"]["value"] == "Yes") - candidates = SSpolling.poll_ghost_candidates(replacetext(prefs["ghostpoll"]["value"], "%TYPE%", initial(pathToSpawn.name)), check_jobban = ROLE_TRAITOR, pic_source = pathToSpawn, role_name_text = "portal storm") + candidates = SSpolling.poll_ghost_candidates(replacetext(prefs["ghostpoll"]["value"], "%TYPE%", initial(pathToSpawn.name)), check_jobban = ROLE_TRAITOR, alert_pic = pathToSpawn, role_name_text = "portal storm") if (prefs["playersonly"]["value"] == "Yes" && length(candidates) < prefs["minplayers"]["value"]) message_admins("Not enough players signed up to create a portal storm, the minimum was [prefs["minplayers"]["value"]] and the number of signups [length(candidates)]") @@ -576,7 +576,7 @@ GLOBAL_DATUM(everyone_an_antag, /datum/everyone_is_an_antag_controller) if(teamsize <= 0) return FALSE - candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a Nanotrasen emergency response drone?", check_jobban = ROLE_DRONE, pic_source = /mob/living/basic/drone/classic, role_name_text = "nanotrasen emergency response drone") + candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a [span_notice("Nanotrasen emergency response drone")]?", check_jobban = ROLE_DRONE, alert_pic = /mob/living/basic/drone/classic, role_name_text = "nanotrasen emergency response drone") if(length(candidates) == 0) return FALSE diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 96500de5070..8a27d342578 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -98,9 +98,7 @@ if(!check_rights(NONE)) return var/mass_remove = href_list[VV_HK_MASS_REMOVECOMPONENT] - var/list/components = list() - for(var/datum/component/component in target.GetComponents(/datum/component)) - components += component.type + var/list/components = target._datum_components.Copy() var/list/names = list() names += "---Components---" if(length(components)) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index d36fb104e2f..f936ae834b4 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -293,13 +293,15 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/replace_banned_player() set waitfor = FALSE - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a [name]?", check_jobban = "[name]", role = job_rank, poll_time = 5 SECONDS, target_mob = owner.current, pic_source = owner.current, role_name_text = name) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(check_jobban = job_rank, role = job_rank, poll_time = 5 SECONDS, checked_target = owner.current, alert_pic = owner.current, role_name_text = name) + if(chosen_one) to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") - message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner)]) to replace a jobbanned player.") + message_admins("[key_name_admin(chosen_one)] has taken control of ([key_name_admin(owner)]) to replace antagonist banned player.") + log_game("[key_name(chosen_one)] has taken control of ([key_name(owner)]) to replace antagonist banned player.") owner.current.ghostize(FALSE) - owner.current.key = C.key + owner.current.key = chosen_one.key + else + log_game("Couldn't find antagonist ban replacement for ([key_name(owner)]).") /** * Called by the remove_antag_datum() and remove_all_antag_datums() mind procs for the antag datum to handle its own removal and deletion. diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 9ef40a9cebf..18dce0501ff 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -55,16 +55,15 @@ /obj/item/antag_spawner/contract/proc/poll_for_student(mob/living/carbon/human/teacher, apprentice_school) balloon_alert(teacher, "contacting apprentice...") polling = TRUE - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a wizard's [apprentice_school] apprentice?", check_jobban = ROLE_WIZARD, role = ROLE_WIZARD, poll_time = 15 SECONDS, target_mob = src, pic_source = teacher, role_name_text = "wizard apprentice") + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_danger("[teacher]'s")] [span_notice("[apprentice_school] apprentice")]?", check_jobban = ROLE_WIZARD, role = ROLE_WIZARD, poll_time = 15 SECONDS, checked_target = src, alert_pic = /obj/item/clothing/head/wizard/red, jump_target = src, role_name_text = "wizard apprentice", chat_text_border_icon = /obj/item/clothing/head/wizard/red) polling = FALSE - if(!LAZYLEN(candidates)) + if(isnull(chosen_one)) to_chat(teacher, span_warning("Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")) return if(QDELETED(src) || used) return used = TRUE - var/mob/dead/observer/student = pick(candidates) - spawn_antag(student.client, get_turf(src), apprentice_school, teacher.mind) + spawn_antag(chosen_one.client, get_turf(src), apprentice_school, teacher.mind) /obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind, datum/mind/user) new /obj/effect/particle_effect/fluid/smoke(T) @@ -99,19 +98,18 @@ desc = "MI13 designed one-use radio for calling immediate backup. Have no regards for safety of whom it summons - they are all inferior clones from Interdyne's genebanks anyway." icon = 'icons/obj/devices/voice.dmi' icon_state = "nukietalkie" - var/borg_to_spawn /// The name of the special role given to the recruit var/special_role_name = ROLE_NUCLEAR_OPERATIVE /// The applied outfit var/datum/outfit/syndicate/outfit = /datum/outfit/syndicate/reinforcement - /// The outfit given to plasmaman operatives - var/datum/outfit/syndicate/plasma_outfit = /datum/outfit/syndicate/reinforcement/plasmaman /// The antag datum applied - var/datum/antagonist/nukeop/antag_datum = /datum/antagonist/nukeop + var/antag_datum = /datum/antagonist/nukeop/reinforcement /// Style used by the droppod var/pod_style = STYLE_SYNDICATE /// Do we use a random subtype of the outfit? var/use_subtypes = TRUE + /// Where do we land our pod? + var/turf/spawn_location /obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user) if(used) @@ -134,13 +132,12 @@ return to_chat(user, span_notice("You activate [src] and wait for confirmation.")) - var/list/nuke_candidates = SSpolling.poll_ghost_candidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", check_jobban = ROLE_OPERATIVE, role = ROLE_OPERATIVE, poll_time = 15 SECONDS, ignore_category = POLL_IGNORE_SYNDICATE, pic_source = src, role_name_text = "syndicate [borg_to_spawn ? "[borg_to_spawn] cyborg":"operative"]") - if(LAZYLEN(nuke_candidates)) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Do you want to play as a reinforcement [special_role_name]?", check_jobban = ROLE_OPERATIVE, role = ROLE_OPERATIVE, poll_time = 15 SECONDS, ignore_category = POLL_IGNORE_SYNDICATE, alert_pic = src, role_name_text = special_role_name, amount_to_pick = 1) + if(chosen_one) if(QDELETED(src) || !check_usability(user)) return used = TRUE - var/mob/dead/observer/G = pick(nuke_candidates) - spawn_antag(G.client, get_turf(src), "nukeop", user.mind) + spawn_antag(chosen_one.client, get_turf(src), "nukeop", user.mind) do_sparks(4, TRUE, src) qdel(src) else @@ -148,7 +145,6 @@ /obj/item/antag_spawner/nuke_ops/spawn_antag(client/our_client, turf/T, kind, datum/mind/user) var/mob/living/carbon/human/nukie = new() - var/obj/structure/closet/supplypod/pod = setup_pod() our_client.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) nukie.ckey = our_client.key var/datum/mind/op_mind = nukie.mind @@ -157,16 +153,33 @@ else nukie.forceMove(locate(1,1,1)) - antag_datum = new() - antag_datum.send_to_spawnpoint = FALSE - - antag_datum.nukeop_outfit = use_subtypes ? pick(subtypesof(outfit)) : outfit + var/new_datum = new antag_datum() var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop, TRUE) - op_mind.add_antag_datum(antag_datum, creator_op ? creator_op.get_team() : null) + op_mind.add_antag_datum(new_datum, creator_op ? creator_op.get_team() : null) op_mind.special_role = special_role_name + + if(outfit) + var/datum/antagonist/nukeop/nukie_datum = op_mind.has_antag_datum(antag_datum) + nukie_datum.nukeop_outfit = use_subtypes ? pick(subtypesof(outfit)) : outfit + + var/obj/structure/closet/supplypod/pod = setup_pod() nukie.forceMove(pod) - new /obj/effect/pod_landingzone(get_turf(src), pod) + new /obj/effect/pod_landingzone(spawn_location ? spawn_location : get_turf(src), pod) + +/obj/item/antag_spawner/nuke_ops/overwatch + name = "overwatch support beacon" + desc = "Assigns an Overwatch Intelligence Agent to your operation. Stationed at their own remote outpost, they can view station cameras, alarms, and even move the Infiltrator shuttle! \ + Also, all members of your operation will recieve body cameras that they can view your progress from." + special_role_name = ROLE_OPERATIVE_OVERWATCH + outfit = /datum/outfit/syndicate/support + use_subtypes = FALSE + antag_datum = /datum/antagonist/nukeop/support + +/obj/item/antag_spawner/nuke_ops/overwatch/Initialize(mapload) + . = ..() + if(length(GLOB.nukeop_overwatch_start)) //Otherwise, it will default to the datum's spawn point anyways + spawn_location = pick(GLOB.nukeop_overwatch_start) //////CLOWN OP /obj/item/antag_spawner/nuke_ops/clown @@ -182,20 +195,20 @@ /obj/item/antag_spawner/nuke_ops/borg_tele name = "syndicate cyborg beacon" desc = "A single-use beacon designed to quickly launch reinforcement cyborgs into the field." - icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-red" + antag_datum = /datum/antagonist/nukeop/reinforcement/cyborg + special_role_name = "Syndicate Cyborg" /obj/item/antag_spawner/nuke_ops/borg_tele/assault name = "syndicate assault cyborg beacon" - borg_to_spawn = "Assault" + special_role_name = ROLE_SYNDICATE_ASSAULTBORG /obj/item/antag_spawner/nuke_ops/borg_tele/medical name = "syndicate medical beacon" - borg_to_spawn = "Medical" + special_role_name = ROLE_SYNDICATE_MEDBORG /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur name = "syndicate saboteur beacon" - borg_to_spawn = "Saboteur" + special_role_name = ROLE_SYNDICATE_SABOBORG /obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user) var/mob/living/silicon/robot/borg @@ -203,13 +216,15 @@ if(!creator_op) return var/obj/structure/closet/supplypod/pod = setup_pod() - switch(borg_to_spawn) - if("Medical") + switch(special_role_name) + if(ROLE_SYNDICATE_MEDBORG) borg = new /mob/living/silicon/robot/model/syndicate/medical() - if("Saboteur") + if(ROLE_SYNDICATE_SABOBORG) borg = new /mob/living/silicon/robot/model/syndicate/saboteur() + if(ROLE_SYNDICATE_ASSAULTBORG) + borg = new /mob/living/silicon/robot/model/syndicate() else - borg = new /mob/living/silicon/robot/model/syndicate() //Assault borg by default + stack_trace("Unknown cyborg type '[special_role_name]' could not be found by [src]!") var/brainfirstname = pick(GLOB.first_names_male) if(prob(50)) @@ -227,10 +242,8 @@ borg.key = C.key - var/datum/antagonist/nukeop/new_borg = new() - new_borg.send_to_spawnpoint = FALSE - borg.mind.add_antag_datum(new_borg,creator_op.nuke_team) - borg.mind.special_role = "Syndicate Cyborg" + borg.mind.add_antag_datum(antag_datum, creator_op ? creator_op.get_team() : null) + borg.mind.special_role = special_role_name borg.forceMove(pod) new /obj/effect/pod_landingzone(get_turf(src), pod) @@ -252,14 +265,13 @@ return if(used) return - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a [initial(demon_type.name)]?", check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, poll_time = 5 SECONDS, target_mob = src, pic_source = src, role_name_text = initial(demon_type.name)) - if(LAZYLEN(candidates)) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, poll_time = 5 SECONDS, checked_target = src, alert_pic = demon_type, jump_target = src, role_name_text = initial(demon_type.name)) + if(chosen_one) if(used || QDELETED(src)) return used = TRUE - var/mob/dead/observer/summoned = pick(candidates) - user.log_message("has summoned forth the [initial(demon_type.name)] (played by [key_name(summoned)]) using a [name].", LOG_GAME) // has to be here before we create antag otherwise we can't get the ckey of the demon - spawn_antag(summoned.client, get_turf(src), initial(demon_type.name), user.mind) + user.log_message("has summoned forth the [initial(demon_type.name)] (played by [key_name(chosen_one)]) using a [name].", LOG_GAME) // has to be here before we create antag otherwise we can't get the ckey of the demon + spawn_antag(chosen_one.client, get_turf(src), initial(demon_type.name), user.mind) to_chat(user, shatter_msg) to_chat(user, veil_msg) playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE) @@ -272,7 +284,6 @@ new /obj/effect/dummy/phased_mob(T, spawned) spawned.key = C.key - spawned.generate_antagonist_status() /obj/item/antag_spawner/slaughter_demon/laughter name = "vial of tickles" @@ -332,23 +343,22 @@ return to_chat(user, span_notice("You activate [src] and wait for confirmation.")) - var/list/baddie_candidates = SSpolling.poll_ghost_candidates( - "Do you want to play as a [role_to_play]?", + var/mob/chosen_one = SSpolling.poll_ghost_candidates( check_jobban = poll_role_check, role = poll_role_check, poll_time = 10 SECONDS, ignore_category = poll_ignore_category, - pic_source = src, + alert_pic = src, role_name_text = role_to_play, + amount_to_pick = 1 ) - if(!LAZYLEN(baddie_candidates)) + if(isnull(chosen_one)) to_chat(user, span_warning(fail_text)) return if(QDELETED(src) || !check_usability(user)) return used = TRUE - var/mob/dead/observer/ghostie = pick(baddie_candidates) - spawn_antag(ghostie.client, get_turf(src), user) + spawn_antag(chosen_one.client, get_turf(src), user) do_sparks(4, TRUE, src) qdel(src) diff --git a/code/modules/antagonists/abductor/abductor_structures.dm b/code/modules/antagonists/abductor/abductor_structures.dm index 7da1d72d06b..da0ad5de9ea 100644 --- a/code/modules/antagonists/abductor/abductor_structures.dm +++ b/code/modules/antagonists/abductor/abductor_structures.dm @@ -31,7 +31,7 @@ to_chat(user, span_warning("You need one alien alloy sheet to do this!")) return to_chat(user, span_notice("You start adding [stacked_sheets] to [src]...")) - if(do_after(user, 50, target = src)) + if(do_after(user, 5 SECONDS, target = src)) stacked_sheets.use(1) new /obj/structure/table/abductor(src.loc) qdel(src) @@ -42,7 +42,7 @@ to_chat(user, span_warning("You need one sheet of silver to do this!")) return to_chat(user, span_notice("You start adding [stacked_sheets] to [src]...")) - if(do_after(user, 50, target = src)) + if(do_after(user, 5 SECONDS, target = src)) stacked_sheets.use(1) new /obj/structure/table/optable/abductor(src.loc) qdel(src) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 14d8d737886..07e8dad2aa6 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -93,7 +93,7 @@ to_chat(user, span_warning("You need to be next to the specimen to prepare it for transport!")) return to_chat(user, span_notice("You begin preparing [target] for transport...")) - if(do_after(user, 100, target = target)) + if(do_after(user, 10 SECONDS, target = target)) marked_target_weakref = WEAKREF(target) to_chat(user, span_notice("You finish preparing [target] for transport.")) @@ -523,7 +523,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} user.visible_message(span_notice("[user] places down [src] and activates it."), span_notice("You place down [src] and activate it.")) user.dropItemToGround(src) playsound(src, 'sound/machines/terminal_alert.ogg', 50) - addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 30) + addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 3 SECONDS) /obj/item/abductor_machine_beacon/proc/try_spawn_machine() var/viable = FALSE diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm index 2938e5f4fd2..3ed57df1dca 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm @@ -17,6 +17,12 @@ return return ..() +/obj/structure/sign/poster/abductor/attackby(obj/item/tool, mob/user, params) + if(tool.toolspeed >= 0.2) + balloon_alert(user, "tool too weak!") + return FALSE + return ..() + /obj/structure/sign/poster/abductor/random name = "random abductor poster" icon_state = "random_abductor" diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index a5ec2cfde21..72b2c1e14ad 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -19,7 +19,7 @@ owner.visible_message(span_danger("[owner]'s skin starts emitting electric arcs!"),\ span_warning("You feel electric energy building up inside you!")) playsound(get_turf(owner), SFX_SPARKS, 100, TRUE, -1, SHORT_RANGE_SOUND_EXTRARANGE) - addtimer(CALLBACK(src, PROC_REF(zap)), rand(30, 100)) + addtimer(CALLBACK(src, PROC_REF(zap)), rand(3 SECONDS, 10 SECONDS)) /obj/item/organ/internal/heart/gland/electric/proc/zap() tesla_zap(source = owner, zap_range = 4, power = 8e3, cutoff = 1e3, zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 683cb33fc9a..7f446237765 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -159,7 +159,7 @@ else to_chat(owner, span_warning("You feel a weird rumble behind your eye sockets...")) - addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(100, 200)) + addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(10 SECONDS, 20 SECONDS)) /obj/item/organ/internal/heart/gland/heal/proc/finish_replace_eyes() var/eye_type = /obj/item/organ/internal/eyes @@ -177,7 +177,7 @@ else to_chat(owner, span_warning("You feel a weird tingle in your [parse_zone(body_zone)]... even if you don't have one.")) - addtimer(CALLBACK(src, PROC_REF(finish_replace_limb), body_zone), rand(150, 300)) + addtimer(CALLBACK(src, PROC_REF(finish_replace_limb), body_zone), rand(15 SECONDS, 30 SECONDS)) /obj/item/organ/internal/heart/gland/heal/proc/finish_replace_limb(body_zone) owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"), @@ -207,7 +207,7 @@ if(owner.reagents.has_reagent(R.type)) keep_going = TRUE if(keep_going) - addtimer(CALLBACK(src, PROC_REF(keep_replacing_blood)), 30) + addtimer(CALLBACK(src, PROC_REF(keep_replacing_blood)), 3 SECONDS) /obj/item/organ/internal/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) if(!IS_ORGANIC_LIMB(chest)) diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm index 0d709579cc8..76cd806bb42 100644 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm @@ -9,8 +9,8 @@ /obj/item/organ/internal/heart/gland/plasma/activate() to_chat(owner, span_warning("You feel bloated.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), owner, span_userdanger("A massive stomachache overcomes you.")), 150) - addtimer(CALLBACK(src, PROC_REF(vomit_plasma)), 200) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), owner, span_userdanger("A massive stomachache overcomes you.")), 15 SECONDS) + addtimer(CALLBACK(src, PROC_REF(vomit_plasma)), 20 SECONDS) /obj/item/organ/internal/heart/gland/plasma/proc/vomit_plasma() if(!owner) diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm index d32304a5987..a2a4a9149e7 100644 --- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm +++ b/code/modules/antagonists/abductor/equipment/glands/quantum.dm @@ -15,7 +15,7 @@ if(!iscarbon(M)) continue entangled_mob = M - addtimer(CALLBACK(src, PROC_REF(quantum_swap)), rand(600, 2400)) + addtimer(CALLBACK(src, PROC_REF(quantum_swap)), rand(1 MINUTES, 4 MINUTES)) return /obj/item/organ/internal/heart/gland/quantum/proc/quantum_swap() diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 853f0bb6473..6d3287ecae6 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -21,6 +21,5 @@ to_chat(owner, span_warning("You feel nauseated!")) owner.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20) - var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), /datum/slime_type/grey) - Slime.set_friends(list(owner)) - Slime.set_leader(owner) + var/mob/living/basic/slime/new_baby_slime = new(get_turf(owner), /datum/slime_type/grey) + new_baby_slime.befriend(owner) diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 36618e62269..bbf6ea2db39 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -1,7 +1,7 @@ /obj/machinery/computer/camera_advanced/abductor name = "Human Observation Console" var/team_number = 0 - networks = list("ss13", "abductor") + networks = list(CAMERANET_NETWORK_SS13, CAMERANET_NETWORK_ABDUCTOR) var/obj/machinery/abductor/console/console /// We can't create our actions until after LateInitialize /// So we instead do it on the first call to GrantActions diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm index 6f2dc48a672..1610d9a6cff 100644 --- a/code/modules/antagonists/abductor/machinery/pad.dm +++ b/code/modules/antagonists/abductor/machinery/pad.dm @@ -38,7 +38,7 @@ /obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target) new /obj/effect/temp_visual/teleport_abductor(place) - addtimer(CALLBACK(src, PROC_REF(doMobToLoc), place, target), 80) + addtimer(CALLBACK(src, PROC_REF(doMobToLoc), place, target), 8 SECONDS) /obj/machinery/abductor/pad/proc/doPadToLoc(place) flick("alien-pad", src) @@ -48,7 +48,7 @@ /obj/machinery/abductor/pad/proc/PadToLoc(place) new /obj/effect/temp_visual/teleport_abductor(place) - addtimer(CALLBACK(src, PROC_REF(doPadToLoc), place), 80) + addtimer(CALLBACK(src, PROC_REF(doPadToLoc), place), 8 SECONDS) /obj/effect/temp_visual/teleport_abductor name = "Huh" diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 9d95d1be8eb..2d7f4c5d34e 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -27,7 +27,7 @@ /datum/reagent/blob name = "Unknown" description = "shouldn't exist and you should adminhelp immediately." - color = "#FFFFFF" + color = COLOR_WHITE taste_description = "bad code and slime" chemical_flags = NONE penetrates_skin = NONE diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index e56426a89ad..929a3b5c4ff 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) SSsecurity_level.set_level(SEC_LEVEL_DELTA) max_blob_points = INFINITY blob_points = INFINITY - addtimer(CALLBACK(src, PROC_REF(victory)), 450) + addtimer(CALLBACK(src, PROC_REF(victory)), 45 SECONDS) else if(!free_strain_rerolls && (last_reroll_time + BLOB_POWER_REROLL_FREE_TIME[round(blob_points)]") -/mob/camera/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/camera/blob/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(), +) if (!message) return diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index b35308d092f..2f3b51741f9 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -193,14 +193,20 @@ /mob/camera/blob/proc/pick_blobbernaut_candidate(obj/structure/blob/special/factory/factory) if(isnull(factory)) return - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(on_poll_concluded), factory) - factory.AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_BLOB, \ - job_bans = ROLE_BLOB, \ - to_call = to_call, \ - title = "Blobbernaut", \ + var/icon/blobbernaut_icon = icon(icon, "blobbernaut") + blobbernaut_icon.Blend(blobstrain.color, ICON_MULTIPLY) + var/image/blobbernaut_image = image(blobbernaut_icon) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + check_jobban = ROLE_BLOB, + poll_time = 20 SECONDS, + checked_target = factory, + ignore_category = POLL_IGNORE_BLOB, + alert_pic = blobbernaut_image, + jump_target = factory, + role_name_text = "blobbernaut", + chat_text_border_icon = blobbernaut_image, ) + on_poll_concluded(factory, chosen_one) /// Called when the ghost poll concludes /mob/camera/blob/proc/on_poll_concluded(obj/structure/blob/special/factory/factory, mob/dead/observer/ghost) diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 38349dce2ac..214825f4c73 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -77,22 +77,23 @@ flashed.balloon_alert(source, "[flashed.p_they()] resist!") return - flashed.mind.add_antag_datum(/datum/antagonist/brother, team) + if (!team.add_brother(flashed, key_name(source))) // Shouldn't happen given the former, more specific checks but just in case + flashed.balloon_alert(source, "failed!") + return + source.log_message("converted [key_name(flashed)] to blood brother", LOG_ATTACK) flashed.log_message("was converted by [key_name(source)] to blood brother", LOG_ATTACK) - log_game("[key_name(flashed)] converted [key_name(source)] to blood brother", list( - "flashed" = flashed, - "victim" = source, + log_game("[key_name(flashed)] was made into a blood brother by [key_name(source)]", list( + "converted" = flashed, + "converted by" = source, )) - - flashed.balloon_alert(source, "converted") - to_chat(source, span_notice("[span_bold("[flashed]")] has been converted to aide you as your Brother!")) flash.burn_out() flashed.mind.add_memory( \ /datum/memory/recruited_by_blood_brother, \ protagonist = flashed, \ antagonist = owner.current, \ ) + flashed.balloon_alert(source, "converted") UnregisterSignal(source, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON) source.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind) @@ -172,6 +173,34 @@ if (prob(10)) brothers_left += 1 +/datum/team/brother_team/add_member(datum/mind/new_member) + . = ..() + if (!new_member.has_antag_datum(/datum/antagonist/brother)) + add_brother(new_member.current) + +/datum/team/brother_team/remove_member(datum/mind/member) + if (!(member in members)) + return + . = ..() + member.remove_antag_datum(/datum/antagonist/brother) + if (isnull(member.current)) + return + for (var/datum/mind/brother_mind as anything in members) + to_chat(brother_mind, span_warning("[span_bold("[member.current.real_name]")] is no longer your brother!")) + update_name() + +/// Adds a new brother to the team +/datum/team/brother_team/proc/add_brother(mob/living/new_brother, source) + if (isnull(new_brother) || isnull(new_brother.mind) || !GET_CLIENT(new_brother) || new_brother.mind.has_antag_datum(/datum/antagonist/brother)) + return FALSE + + for (var/datum/mind/brother_mind as anything in members) + if (brother_mind == new_brother.mind) + continue + to_chat(brother_mind, span_notice("[span_bold("[new_brother.real_name]")] has been converted to aid you as your brother!")) + new_brother.mind.add_antag_datum(/datum/antagonist/brother, src) + return TRUE + /datum/team/brother_team/proc/update_name() var/list/last_names = list() for(var/datum/mind/team_minds as anything in members) diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 5bd0f390cb8..7e13612153b 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -145,7 +145,7 @@ target.take_overall_damage(40) SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("Absorb DNA", "[absorbing_iteration]")) - if(!do_after(owner, 15 SECONDS, target)) + if(!do_after(owner, 15 SECONDS, target, hidden = TRUE)) owner.balloon_alert(owner, "interrupted!") is_absorbing = FALSE return FALSE diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index ef3070356d5..2b1753c2727 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -15,7 +15,7 @@ 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!")) - addtimer(CALLBACK(src, PROC_REF(dissolve_handcuffs), user, O), 30) + addtimer(CALLBACK(src, PROC_REF(dissolve_handcuffs), user, O), 3 SECONDS) log_combat(user, user.handcuffed, "melted handcuffs", addition = "(biodegrade)") ..() return TRUE @@ -27,7 +27,7 @@ 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!")) - addtimer(CALLBACK(src, PROC_REF(dissolve_legcuffs), user, O), 30) + addtimer(CALLBACK(src, PROC_REF(dissolve_legcuffs), user, O), 3 SECONDS) log_combat(user, user.legcuffed, "melted legcuffs", addition = "(biodegrade)") ..() return TRUE @@ -38,7 +38,7 @@ 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), 30) + 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 @@ -49,7 +49,7 @@ return FALSE C.visible_message(span_warning("[C]'s hinges suddenly begin to melt and run!")) to_chat(user, span_warning("We vomit acidic goop onto the interior of [C]!")) - addtimer(CALLBACK(src, PROC_REF(open_closet), user, C), 70) + addtimer(CALLBACK(src, PROC_REF(open_closet), user, C), 7 SECONDS) log_combat(user, user.loc, "melted locker", addition = "(biodegrade)") ..() return TRUE diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 921dde35492..75d4996b8b2 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -19,7 +19,6 @@ ..() if(revive_ready) INVOKE_ASYNC(src, PROC_REF(revive), user) - disable_revive(user) // this should be already called via signal, but just incase something wacky happens return TRUE var/death_duration_mod = 1 @@ -47,18 +46,21 @@ RegisterSignal(changeling, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) return TRUE -/// Sets [revive_ready] to FALSE and updates the button icons. -/// Can be called mid-revival if the process is being cancelled -/datum/action/changeling/fakedeath/proc/disable_revive(mob/living/changeling) - if(revive_ready) - chemical_cost = 15 - revive_ready = FALSE - build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) - +/// Removes the signals for fakedeath and listening for hapless doctors +/// healing a changeling who went into stasis after actually dying, and +/// also removes changeling stasis +/datum/action/changeling/fakedeath/proc/disable_stasis_and_fakedeath(mob/living/changeling) REMOVE_TRAIT(changeling, TRAIT_STASIS, CHANGELING_TRAIT) UnregisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA)) UnregisterSignal(changeling, COMSIG_MOB_STATCHANGE) +/// This proc is called to reset the chemical cost of the revival +/// as well as the revive ready flag and button states. +/datum/action/changeling/fakedeath/proc/reset_chemical_cost() + chemical_cost = 15 + revive_ready = FALSE + build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + /// Sets [revive_ready] to TRUE and updates the button icons. /datum/action/changeling/fakedeath/proc/enable_revive(mob/living/changeling) if(revive_ready) @@ -75,7 +77,7 @@ if(HAS_TRAIT_FROM(source, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) return - disable_revive(source) + disable_stasis_and_fakedeath(source) /// Signal proc to exit fakedeath early if we're revived from being previously dead /datum/action/changeling/fakedeath/proc/on_stat_change(mob/living/source, new_stat, old_stat) @@ -86,6 +88,7 @@ source.cure_fakedeath(CHANGELING_TRAIT) to_chat(source, span_changeling("We exit our stasis early.")) + reset_chemical_cost() /datum/action/changeling/fakedeath/proc/revive(mob/living/carbon/user) if(!istype(user)) @@ -142,6 +145,14 @@ return ..() +/// We wait until after we actually deduct chemical cost (or don't deduct +/// if it's the 0 cost we get for revival) before we reset the chemical cost +/datum/action/changeling/fakedeath/try_to_sting(mob/living/user) + . = ..() + if (!. || !revive_ready) + return + reset_chemical_cost() + /datum/action/changeling/fakedeath/proc/can_enter_stasis(mob/living/user) if(HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) user.balloon_alert(user, "already reviving!") diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 1d82635013b..47264ce7b85 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -177,7 +177,7 @@ target.visible_message(span_warning("A grotesque blade forms around [target.name]\'s arm!"), span_userdanger("Your arm twists and mutates, transforming into a horrific monstrosity!"), span_hear("You hear organic matter ripping and tearing!")) playsound(target, 'sound/effects/blobattack.ogg', 30, TRUE) - addtimer(CALLBACK(src, PROC_REF(remove_fake), target, blade), 600) + addtimer(CALLBACK(src, PROC_REF(remove_fake), target, blade), 1 MINUTES) return TRUE /datum/action/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/melee/arm_blade/false/blade) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index aea06a27e1e..3a2ac3298bd 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -127,8 +127,13 @@ /obj/item/changeling/id/proc/get_cached_flat_icon() if(!cached_flat_icon) cached_flat_icon = getFlatIcon(src) + cached_flat_icon.Crop(ID_ICON_BORDERS) return cached_flat_icon +/obj/item/changeling/id/get_id_examine_strings(mob/user) + . = ..() + . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "bigicon")]") + /obj/item/changeling/id/get_examine_string(mob/user, thats = FALSE) return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 5fd8b5d9ee4..9ba9f747543 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -1,3 +1,10 @@ +/// how many units of blood one charge of blood rites is worth +#define USES_TO_BLOOD 2 +/// blood rites charges gained from sapping blood from a victim +#define BLOOD_DRAIN_GAIN 50 +/// penalty for self healing, 1 point of damage * this # = charges required +#define SELF_HEAL_PENALTY 1.65 + /datum/action/innate/cult/blood_magic //Blood magic handles the creation of blood spells (formerly talismans) name = "Prepare Blood Magic" button_icon_state = "carve" @@ -46,9 +53,9 @@ limit = MAX_BLOODCHARGE if(length(spells) >= limit) if(rune) - to_chat(owner, span_cultitalic("You cannot store more than [MAX_BLOODCHARGE] spells. Pick a spell to remove.")) + to_chat(owner, span_cult_italic("You cannot store more than [MAX_BLOODCHARGE] spells. Pick a spell to remove.")) else - to_chat(owner, span_cultitalic("You cannot store more than [RUNELESS_MAX_BLOODCHARGE] spells without an empowering rune! Pick a spell to remove.")) + to_chat(owner, span_cult_bold_italic("You cannot store more than [RUNELESS_MAX_BLOODCHARGE] spells without an empowering rune! Pick a spell to remove.")) var/nullify_spell = tgui_input_list(owner, "Spell to remove", "Current Spells", spells) if(isnull(nullify_spell)) return @@ -77,7 +84,7 @@ if(!channeling) channeling = TRUE else - to_chat(owner, span_cultitalic("You are already invoking blood magic!")) + to_chat(owner, span_cult_italic("You are already invoking blood magic!")) return if(do_after(owner, 100 - rune*60, target = owner)) if(ishuman(owner)) @@ -103,6 +110,8 @@ var/health_cost = 0 /// Have we already been positioned into our starting location? var/positioned = FALSE + /// If false, the spell will not delete after running out of charges + var/deletes_on_empty = TRUE /datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM) if(health_cost) @@ -121,26 +130,25 @@ ..() /datum/action/innate/cult/blood_spell/IsAvailable(feedback = FALSE) - if(!IS_CULTIST(owner) || owner.incapacitated() || !charges) + if(!IS_CULTIST(owner) || owner.incapacitated() || (!charges && deletes_on_empty)) return FALSE return ..() /datum/action/innate/cult/blood_spell/Activate() - if(magic_path) //If this spell flows from the hand - if(!hand_magic) - hand_magic = new magic_path(owner, src) - if(!owner.put_in_hands(hand_magic)) - qdel(hand_magic) - hand_magic = null - to_chat(owner, span_warning("You have no empty hand for invoking blood magic!")) - return - to_chat(owner, span_notice("Your wounds glow as you invoke the [name].")) - return - if(hand_magic) - qdel(hand_magic) - hand_magic = null - to_chat(owner, span_warning("You snuff out the spell, saving it for later.")) - + if(!magic_path) // only concerned with spells that flow from the hand + return + if(hand_magic) + qdel(hand_magic) + hand_magic = null + to_chat(owner, span_warning("You snuff out the spell, saving it for later.")) + return + hand_magic = new magic_path(owner, src) + if(!owner.put_in_hands(hand_magic)) + qdel(hand_magic) + hand_magic = null + to_chat(owner, span_warning("You have no empty hand for invoking blood magic!")) + return + to_chat(owner, span_notice("Your wounds glow as you invoke the [name].")) //Cult Blood Spells /datum/action/innate/cult/blood_spell/stun @@ -167,9 +175,10 @@ /datum/action/innate/cult/blood_spell/emp/Activate() owner.whisper(invocation, language = /datum/language/common) owner.visible_message(span_warning("[owner]'s hand flashes a bright blue!"), \ - span_cultitalic("You speak the cursed words, emitting an EMP blast from your hand.")) + span_cult_italic("You speak the cursed words, emitting an EMP blast from your hand.")) empulse(owner, 2, 5) charges-- + SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]") if(charges <= 0) qdel(src) @@ -205,15 +214,16 @@ var/turf/owner_turf = get_turf(owner) owner.whisper(invocation, language = /datum/language/common) owner.visible_message(span_warning("[owner]'s hand glows red for a moment."), \ - span_cultitalic("Your plea for aid is answered, and light begins to shimmer and take form within your hand!")) + span_cult_italic("Your plea for aid is answered, and light begins to shimmer and take form within your hand!")) var/obj/item/summoned_blade = new summoned_type(owner_turf) if(owner.put_in_hands(summoned_blade)) to_chat(owner, span_warning("A [summoned_blade] appears in your hand!")) else owner.visible_message(span_warning("A [summoned_blade] appears at [owner]'s feet!"), \ - span_cultitalic("A [summoned_blade] materializes at your feet.")) + span_cult_italic("A [summoned_blade] materializes at your feet.")) SEND_SOUND(owner, sound('sound/effects/magic.ogg', FALSE, 0, 25)) charges-- + SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]") if(charges <= 0) qdel(src) @@ -249,12 +259,13 @@ clicked_on.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", sparkle_image, NONE) addtimer(CALLBACK(clicked_on, TYPE_PROC_REF(/atom/, remove_alt_appearance), "cult_apoc", TRUE), 4 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE) - to_chat(caller, span_cultbold("[clicked_on] has been cursed with living nightmares!")) + to_chat(caller, span_cult_bold("[clicked_on] has been cursed with living nightmares!")) charges-- desc = base_desc desc += "
Has [charges] use\s remaining." build_all_button_icons() + SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]") if(charges <= 0) to_chat(caller, span_cult("You have exhausted the spell's power!")) qdel(src) @@ -272,7 +283,7 @@ /datum/action/innate/cult/blood_spell/veiling/Activate() if(!revealing) owner.visible_message(span_warning("Thin grey dust falls from [owner]'s hand!"), \ - span_cultitalic("You invoke the veiling spell, hiding nearby runes.")) + span_cult_italic("You invoke the veiling spell, hiding nearby runes.")) charges-- SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25)) owner.whisper(invocation, language = /datum/language/common) @@ -291,7 +302,7 @@ button_icon_state = "back" else owner.visible_message(span_warning("A flash of light shines from [owner]'s hand!"), \ - span_cultitalic("You invoke the counterspell, revealing nearby runes.")) + span_cult_italic("You invoke the counterspell, revealing nearby runes.")) charges-- owner.whisper(invocation, language = /datum/language/common) SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25)) @@ -308,6 +319,7 @@ revealing = FALSE name = "Conceal Runes" button_icon_state = "gone" + SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "Conceal Runes") if(charges <= 0) qdel(src) desc = base_desc @@ -321,6 +333,7 @@ button_icon_state = "manip" charges = 5 magic_path = "/obj/item/melee/blood_magic/manipulator" + deletes_on_empty = FALSE // The "magic hand" items /obj/item/melee/blood_magic @@ -350,7 +363,7 @@ /obj/item/melee/blood_magic/Destroy() if(!QDELETED(source)) - if(uses <= 0) + if(uses <= 0 && source.deletes_on_empty) source.hand_magic = null qdel(source) source = null @@ -371,6 +384,7 @@ qdel(src) return log_combat(user, M, "used a cult spell on", source.name, "") + SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]") M.lastattacker = user.real_name M.lastattackerckey = user.ckey @@ -404,8 +418,8 @@ return if(IS_CULTIST(user)) user.visible_message(span_warning("[user] holds up [user.p_their()] hand, which explodes in a flash of red light!"), \ - span_cultitalic("You attempt to stun [target] with the spell!")) - user.mob_light(range = 3, color = LIGHT_COLOR_BLOOD_MAGIC, duration = 0.2 SECONDS) + span_cult_italic("You attempt to stun [target] with the spell!")) + user.mob_light(range = 1.1, power = 2, color = LIGHT_COLOR_BLOOD_MAGIC, duration = 0.2 SECONDS) if(IS_HERETIC(target)) to_chat(user, span_warning("Some force greater than you intervenes! [target] is protected by the Forgotten Gods!")) to_chat(target, span_warning("You are protected by your faith to the Forgotten Gods.")) @@ -425,7 +439,7 @@ else if(target.can_block_magic()) to_chat(user, span_warning("The spell had no effect!")) else - to_chat(user, span_cultitalic("In a brilliant flash of red, [target] falls to the ground!")) + to_chat(user, span_cult_italic("In a brilliant flash of red, [target] falls to the ground!")) target.Paralyze(16 SECONDS) target.flash_act(1, TRUE) if(issilicon(target)) @@ -464,7 +478,7 @@ var/turf/T = get_turf(src) if(is_away_level(T.z)) - to_chat(user, span_cultitalic("You are not in the right dimension!")) + to_chat(user, span_cult_italic("You are not in the right dimension!")) return var/input_rune_key = tgui_input_list(user, "Rune to teleport to", "Teleportation Target", potential_runes) //we know what key they picked @@ -485,7 +499,7 @@ var/mob/living/L = target if(do_teleport(L, dest, channel = TELEPORT_CHANNEL_CULT)) origin.visible_message(span_warning("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!"), \ - span_cultitalic("You speak the words of the talisman and find yourself somewhere else!"), "You hear a sharp crack.") + span_cult_italic("You speak the words of the talisman and find yourself somewhere else!"), "You hear a sharp crack.") dest.visible_message(span_warning("There is a boom of outrushing air as something appears above the rune!"), null, "You hear a boom.") ..() @@ -494,7 +508,7 @@ name = "Shackling Aura" desc = "Will start handcuffing a victim on contact, and mute them if successful." invocation = "In'totum Lig'abis!" - color = "#000000" // black + color = COLOR_BLACK // black /obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity) if(IS_CULTIST(user) && iscarbon(target) && proximity) @@ -502,7 +516,7 @@ if(C.canBeHandcuffed()) CuffAttack(C, user) else - user.visible_message(span_cultitalic("This victim doesn't have enough arms to complete the restraint!")) + user.visible_message(span_cult_italic("This victim doesn't have enough arms to complete the restraint!")) return ..() @@ -511,7 +525,7 @@ playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) C.visible_message(span_danger("[user] begins restraining [C] with dark magic!"), \ span_userdanger("[user] begins shaping dark magic shackles around your wrists!")) - if(do_after(user, 30, C)) + if(do_after(user, 3 SECONDS, C)) if(!C.handcuffed) C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C)) C.update_handcuffed() @@ -544,7 +558,7 @@ name = "Twisting Aura" desc = "Corrupts certain metalic objects on contact." invocation = "Ethra p'ni dedol!" - color = "#000000" // black + color = COLOR_BLACK // black var/channeling = FALSE /obj/item/melee/blood_magic/construction/examine(mob/user) @@ -560,7 +574,7 @@ /obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(proximity_flag && IS_CULTIST(user)) if(channeling) - to_chat(user, span_cultitalic("You are already invoking twisted construction!")) + to_chat(user, span_cult_italic("You are already invoking twisted construction!")) return . |= AFTERATTACK_PROCESSED_ITEM var/turf/T = get_turf(target) @@ -590,7 +604,7 @@ playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, TRUE) var/prev_color = candidate.color candidate.color = "black" - if(do_after(user, 90, target = candidate)) + if(do_after(user, 9 SECONDS, target = candidate)) candidate.undeploy() candidate.emp_act(EMP_HEAVY) var/construct_class = show_radial_menu(user, src, GLOB.construct_radial_images, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) @@ -619,7 +633,7 @@ channeling = TRUE playsound(T, 'sound/machines/airlockforced.ogg', 50, TRUE) do_sparks(5, TRUE, target) - if(do_after(user, 50, target = user)) + if(do_after(user, 5 SECONDS, target = user)) if(QDELETED(target)) channeling = FALSE return @@ -681,167 +695,235 @@ . = ..() . += "Bloody halberd, blood bolt barrage, and blood beam cost [BLOOD_HALBERD_COST], [BLOOD_BARRAGE_COST], and [BLOOD_BEAM_COST] charges respectively." +/** + * handles inhand use of blood rites on constructs, humans, or non-living blood sources + * + * see '/obj/item/melee/blood_magic/manipulator/proc/heal_construct' for construct/shade behavior + * see '/obj/item/melee/blood_magic/manipulator/proc/heal_cultist' for human cultist behavior + * see '/obj/item/melee/blood_magic/manipulator/proc/drain_victim' for human non-cultist behavior + * if any of the above procs return FALSE, '/obj/item/melee/blood_magic/afterattack' will not be called + * + * '/obj/item/melee/blood_magic/manipulator/proc/blood_draw' handles blood pools/trails and does not affect parent proc + */ /obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) - if(proximity) - if(ishuman(target)) - var/mob/living/carbon/human/human_bloodbag = target - if(HAS_TRAIT(human_bloodbag, TRAIT_NOBLOOD)) - to_chat(user,span_warning("Blood rites do not work on people with no blood!")) - return - if(IS_CULTIST(human_bloodbag)) - if(human_bloodbag.stat == DEAD) - to_chat(user,span_warning("Only a revive rune can bring back the dead!")) - return - if(human_bloodbag.blood_volume < BLOOD_VOLUME_SAFE) - var/restore_blood = BLOOD_VOLUME_SAFE - human_bloodbag.blood_volume - if(uses*2 < restore_blood) - human_bloodbag.blood_volume += uses*2 - to_chat(user,span_danger("You use the last of your blood rites to restore what blood you could!")) - uses = 0 - return ..() - else - human_bloodbag.blood_volume = BLOOD_VOLUME_SAFE - uses -= round(restore_blood/2) - to_chat(user,span_warning("Your blood rites have restored [human_bloodbag == user ? "your" : "[human_bloodbag.p_their()]"] blood to safe levels!")) - var/overall_damage = human_bloodbag.getBruteLoss() + human_bloodbag.getFireLoss() + human_bloodbag.getToxLoss() + human_bloodbag.getOxyLoss() - if(overall_damage == 0) - to_chat(user,span_cult("That cultist doesn't require healing!")) - else - var/ratio = uses/overall_damage - if(human_bloodbag == user) - to_chat(user,span_cult("Your blood healing is far less efficient when used on yourself!")) - ratio *= 0.35 // Healing is half as effective if you can't perform a full heal - uses -= round(overall_damage) // Healing is 65% more "expensive" even if you can still perform the full heal - if(ratio>1) - ratio = 1 - uses -= round(overall_damage) - human_bloodbag.visible_message(span_warning("[human_bloodbag] is fully healed by [human_bloodbag == user ? "[human_bloodbag.p_their()]":"[human_bloodbag]'s"] blood magic!")) - else - human_bloodbag.visible_message(span_warning("[human_bloodbag] is partially healed by [human_bloodbag == user ? "[human_bloodbag.p_their()]":"[human_bloodbag]'s"] blood magic.")) - uses = 0 - ratio *= -1 - var/need_mob_update = FALSE - need_mob_update += human_bloodbag.adjustOxyLoss((overall_damage*ratio) * (human_bloodbag.getOxyLoss() / overall_damage), updating_health = FALSE) - need_mob_update += human_bloodbag.adjustToxLoss((overall_damage*ratio) * (human_bloodbag.getToxLoss() / overall_damage), updating_health = FALSE) - need_mob_update += human_bloodbag.adjustFireLoss((overall_damage*ratio) * (human_bloodbag.getFireLoss() / overall_damage), updating_health = FALSE) - need_mob_update += human_bloodbag.adjustBruteLoss((overall_damage*ratio) * (human_bloodbag.getBruteLoss() / overall_damage), updating_health = FALSE) - if(need_mob_update) - human_bloodbag.updatehealth() - playsound(get_turf(human_bloodbag), 'sound/magic/staff_healing.ogg', 25) - new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) - user.Beam(human_bloodbag, icon_state="sendbeam", time = 15) - else - if(human_bloodbag.stat == DEAD) - to_chat(user,span_warning("[human_bloodbag.p_Their()] blood has stopped flowing, you'll have to find another way to extract it.")) - return - if(human_bloodbag.has_status_effect(/datum/status_effect/speech/slurring/cult)) - to_chat(user,span_danger("[human_bloodbag.p_Their()] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!")) - return - if(human_bloodbag.blood_volume > BLOOD_VOLUME_SAFE) - human_bloodbag.blood_volume -= 100 - uses += 50 - user.Beam(human_bloodbag, icon_state="drainbeam", time = 1 SECONDS) - playsound(get_turf(human_bloodbag), 'sound/magic/enter_blood.ogg', 50) - human_bloodbag.visible_message(span_danger("[user] drains some of [human_bloodbag]'s blood!")) - to_chat(user,span_cultitalic("Your blood rite gains 50 charges from draining [human_bloodbag]'s blood.")) - new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) - else - to_chat(user,span_warning("[human_bloodbag.p_Theyre()] missing too much blood - you cannot drain [human_bloodbag.p_them()] further!")) - return - if(isconstruct(target)) - var/mob/living/basic/construct/construct_thing = target - var/missing_health = construct_thing.maxHealth - construct_thing.health - if(missing_health) - if(uses > missing_health) - construct_thing.adjust_health(-missing_health) - construct_thing.visible_message(span_warning("[construct_thing] is fully healed by [user]'s blood magic!")) - uses -= missing_health - else - construct_thing.adjust_health(-uses) - construct_thing.visible_message(span_warning("[construct_thing] is partially healed by [user]'s blood magic!")) - uses = 0 - playsound(get_turf(construct_thing), 'sound/magic/staff_healing.ogg', 25) - user.Beam(construct_thing, icon_state="sendbeam", time = 1 SECONDS) - if(istype(target, /obj/effect/decal/cleanable/blood) || istype(target, /obj/effect/decal/cleanable/trail_holder) || isturf(target)) - blood_draw(target, user) - ..() + if(!proximity) + return + if((isconstruct(target) || isshade(target)) && !heal_construct(target, user)) + return + if(istype(target, /obj/effect/decal/cleanable/blood) || istype(target, /obj/effect/decal/cleanable/trail_holder) || isturf(target)) + blood_draw(target, user) + if(ishuman(target)) + var/mob/living/carbon/human/human_bloodbag = target + if(HAS_TRAIT(human_bloodbag, TRAIT_NOBLOOD)) + human_bloodbag.balloon_alert(user, "no blood!") + return + if(human_bloodbag.stat == DEAD) + human_bloodbag.balloon_alert(user, "dead!") + return + + if(IS_CULTIST(human_bloodbag) && !heal_cultist(human_bloodbag, user)) + return + if(!IS_CULTIST(human_bloodbag) && !drain_victim(human_bloodbag, user)) + return + ..() + +/** + * handles blood rites usage on constructs + * + * will only return TRUE if some amount healing is done + */ +/obj/item/melee/blood_magic/manipulator/proc/heal_construct(atom/target, mob/living/carbon/human/user) + var/mob/living/basic/construct_thing = target + if(!IS_CULTIST(construct_thing)) + return FALSE + var/missing_health = construct_thing.maxHealth - construct_thing.health + if(!missing_health) + to_chat(user,span_cult("That cultist doesn't require healing!")) + return FALSE + if(uses <= 0) + construct_thing.balloon_alert(user, "out of blood!") + return FALSE + if(uses > missing_health) + construct_thing.adjust_health(-missing_health) + construct_thing.visible_message(span_warning("[construct_thing] is fully healed by [user]'s blood magic!")) + uses -= missing_health + else + construct_thing.adjust_health(-uses) + construct_thing.visible_message(span_warning("[construct_thing] is partially healed by [user]'s blood magic!")) + uses = 0 + playsound(get_turf(construct_thing), 'sound/magic/staff_healing.ogg', 25) + user.Beam(construct_thing, icon_state="sendbeam", time = 1 SECONDS) + return TRUE + +/** + * handles blood rites usage on human cultists + * + * first restores blood, then heals damage. healing damage is more expensive, especially if performed on oneself + * returns TRUE if some amount of blood is restored and/or damage is healed + */ +/obj/item/melee/blood_magic/manipulator/proc/heal_cultist(mob/living/carbon/human/human_bloodbag, mob/living/carbon/human/user) + if(uses <= 0) + human_bloodbag.balloon_alert(user, "out of blood!") + return FALSE + + /// 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 + /// 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 + 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 + 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() + if(overall_damage == 0) + if(blood_donor) + return TRUE + to_chat(user,span_cult("That cultist doesn't require healing!")) + return FALSE + /// how much damage we can/will heal + var/damage_healed = -1 * min(uses, overall_damage) + /// how many spell charges will be consumed to heal said damage + var/healing_cost = damage_healed + if(human_bloodbag == user) + to_chat(user,span_cult("Your blood healing is far less efficient when used on yourself!")) + damage_healed = -1 * min(uses * (1 / SELF_HEAL_PENALTY), overall_damage) + healing_cost = damage_healed * SELF_HEAL_PENALTY + uses += round(healing_cost) + 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) + if(need_mob_update) + human_bloodbag.updatehealth() + playsound(get_turf(human_bloodbag), 'sound/magic/staff_healing.ogg', 25) + new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) + user.Beam(human_bloodbag, icon_state="sendbeam", time = 15) + return TRUE + +/** + * handles blood rites use on a non-cultist human + * + * returns TRUE if blood is successfully drained from the victim + */ +/obj/item/melee/blood_magic/manipulator/proc/drain_victim(mob/living/carbon/human/human_bloodbag, mob/living/carbon/human/user) + 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) + 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 + uses += BLOOD_DRAIN_GAIN + user.Beam(human_bloodbag, icon_state="drainbeam", time = 1 SECONDS) + playsound(get_turf(human_bloodbag), 'sound/magic/enter_blood.ogg', 50) + human_bloodbag.visible_message(span_danger("[user] drains some of [human_bloodbag]'s blood!")) + to_chat(user,span_cult_italic("Your blood rite gains 50 charges from draining [human_bloodbag]'s blood.")) + new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) + return TRUE + +/** + * handles blood rites use on turfs, blood pools, and blood trails + */ /obj/item/melee/blood_magic/manipulator/proc/blood_draw(atom/target, mob/living/carbon/human/user) var/blood_to_gain = 0 var/turf/our_turf = get_turf(target) - if(our_turf) - for(var/obj/effect/decal/cleanable/blood/blood_around_us in range(our_turf,2)) - if(blood_around_us.blood_state == BLOOD_STATE_HUMAN) - if(blood_around_us.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam - blood_to_gain += 30 - else - blood_to_gain += max((blood_around_us.bloodiness**2)/800,1) - new /obj/effect/temp_visual/cult/turf/floor(get_turf(blood_around_us)) - qdel(blood_around_us) - for(var/obj/effect/decal/cleanable/trail_holder/trail_around_us in range(our_turf, 2)) - if(trail_around_us.blood_state == BLOOD_STATE_HUMAN) - blood_to_gain += 5 //These don't get bloodiness, so we'll just increase this by a fixed value - new /obj/effect/temp_visual/cult/turf/floor(get_turf(trail_around_us)) - qdel(trail_around_us) - if(blood_to_gain) - user.Beam(our_turf,icon_state="drainbeam", time = 15) - new /obj/effect/temp_visual/cult/sparks(get_turf(user)) - playsound(our_turf, 'sound/magic/enter_blood.ogg', 50) - to_chat(user, span_cultitalic("Your blood rite has gained [round(blood_to_gain)] charge\s from blood sources around you!")) - uses += max(1, round(blood_to_gain)) + if(!our_turf) + return + for(var/obj/effect/decal/cleanable/blood/blood_around_us in range(our_turf,2)) + if(blood_around_us.blood_state != BLOOD_STATE_HUMAN) + break + if(blood_around_us.bloodiness == 100) // Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam + blood_to_gain += 30 + else + blood_to_gain += max((blood_around_us.bloodiness**2)/800,1) + new /obj/effect/temp_visual/cult/turf/floor(get_turf(blood_around_us)) + qdel(blood_around_us) + for(var/obj/effect/decal/cleanable/trail_holder/trail_around_us in range(our_turf, 2)) + if(trail_around_us.blood_state != BLOOD_STATE_HUMAN) + break + blood_to_gain += 5 //These don't get bloodiness, so we'll just increase this by a fixed value + new /obj/effect/temp_visual/cult/turf/floor(get_turf(trail_around_us)) + qdel(trail_around_us) + if(!blood_to_gain) + return + user.Beam(our_turf,icon_state="drainbeam", time = 15) + new /obj/effect/temp_visual/cult/sparks(get_turf(user)) + playsound(our_turf, 'sound/magic/enter_blood.ogg', 50) + to_chat(user, span_cult_italic("Your blood rite has gained [round(blood_to_gain)] charge\s from blood sources around you!")) + uses += max(1, round(blood_to_gain)) + +/** + * handles untargeted use of blood rites + * + * allows user to trade in spell uses for equipment or spells + */ /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) - if(IS_CULTIST(user)) - var/static/list/spells = list( - "Bloody Halberd (150)" = image(icon = 'icons/obj/weapons/spear.dmi', icon_state = "occultpoleaxe0"), - "Blood Bolt Barrage (300)" = image(icon = 'icons/obj/weapons/guns/ballistic.dmi', icon_state = "arcane_barrage"), - "Blood Beam (500)" = image(icon = 'icons/obj/weapons/hand.dmi', icon_state = "disintegrate") - ) - var/choice = show_radial_menu(user, src, spells, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE) - if(!check_menu(user)) - to_chat(user, span_cultitalic("You decide against conducting a greater blood rite.")) - return - switch(choice) - if("Bloody Halberd (150)") - if(uses < BLOOD_HALBERD_COST) - to_chat(user, span_cultitalic("You need [BLOOD_HALBERD_COST] charges to perform this rite.")) - else - uses -= BLOOD_HALBERD_COST - var/turf/current_position = get_turf(user) - qdel(src) - var/datum/action/innate/cult/halberd/halberd_act_granted = new(user) - var/obj/item/melee/cultblade/halberd/rite = new(current_position) - halberd_act_granted.Grant(user, rite) - rite.halberd_act = halberd_act_granted - if(user.put_in_hands(rite)) - to_chat(user, span_cultitalic("A [rite.name] appears in your hand!")) - else - user.visible_message(span_warning("A [rite.name] appears at [user]'s feet!"), \ - span_cultitalic("A [rite.name] materializes at your feet.")) - if("Blood Bolt Barrage (300)") - if(uses < BLOOD_BARRAGE_COST) - to_chat(user, span_cultitalic("You need [BLOOD_BARRAGE_COST] charges to perform this rite.")) - else - var/obj/rite = new /obj/item/gun/magic/wand/arcane_barrage/blood() - uses -= BLOOD_BARRAGE_COST - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, span_cult("Your hands glow with power!")) - else - to_chat(user, span_cultitalic("You need a free hand for this rite!")) - qdel(rite) - if("Blood Beam (500)") - if(uses < BLOOD_BEAM_COST) - to_chat(user, span_cultitalic("You need [BLOOD_BEAM_COST] charges to perform this rite.")) - else - var/obj/rite = new /obj/item/blood_beam() - uses -= BLOOD_BEAM_COST - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, span_cultlarge("Your hands glow with POWER OVERWHELMING!!!")) - else - to_chat(user, span_cultitalic("You need a free hand for this rite!")) - qdel(rite) + var/static/list/spells = list( + "Bloody Halberd (150)" = image(icon = 'icons/obj/weapons/spear.dmi', icon_state = "occultpoleaxe0"), + "Blood Bolt Barrage (300)" = image(icon = 'icons/obj/weapons/guns/ballistic.dmi', icon_state = "arcane_barrage"), + "Blood Beam (500)" = image(icon = 'icons/obj/weapons/hand.dmi', icon_state = "disintegrate") + ) + var/choice = show_radial_menu(user, src, spells, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE) + if(!check_menu(user)) + to_chat(user, span_cult_italic("You decide against conducting a greater blood rite.")) + return + + switch(choice) + if("Bloody Halberd (150)") + if(uses < BLOOD_HALBERD_COST) + to_chat(user, span_cult_italic("You need [BLOOD_HALBERD_COST] charges to perform this rite.")) + return + uses -= BLOOD_HALBERD_COST + var/turf/current_position = get_turf(user) + qdel(src) + var/datum/action/innate/cult/halberd/halberd_act_granted = new(user) + var/obj/item/melee/cultblade/halberd/rite = new(current_position) + halberd_act_granted.Grant(user, rite) + rite.halberd_act = halberd_act_granted + if(user.put_in_hands(rite)) + to_chat(user, span_cult_italic("A [rite.name] appears in your hand!")) + else + user.visible_message(span_warning("A [rite.name] appears at [user]'s feet!"), \ + span_cult_italic("A [rite.name] materializes at your feet.")) + + if("Blood Bolt Barrage (300)") + if(uses < BLOOD_BARRAGE_COST) + to_chat(user, span_cult_italic("You need [BLOOD_BARRAGE_COST] charges to perform this rite.")) + return + var/obj/rite = new /obj/item/gun/magic/wand/arcane_barrage/blood() + uses -= BLOOD_BARRAGE_COST + qdel(src) + if(user.put_in_hands(rite)) + to_chat(user, span_cult("Your hands glow with power!")) + else + to_chat(user, span_cult_italic("You need a free hand for this rite!")) + qdel(rite) + + if("Blood Beam (500)") + if(uses < BLOOD_BEAM_COST) + to_chat(user, span_cult_italic("You need [BLOOD_BEAM_COST] charges to perform this rite.")) + return + var/obj/rite = new /obj/item/blood_beam() + uses -= BLOOD_BEAM_COST + qdel(src) + if(user.put_in_hands(rite)) + to_chat(user, span_cult_large("Your hands glow with POWER OVERWHELMING!!!")) + else + to_chat(user, span_cult_italic("You need a free hand for this rite!")) + qdel(rite) /obj/item/melee/blood_magic/manipulator/proc/check_menu(mob/living/user) if(!istype(user)) @@ -849,3 +931,7 @@ if(user.incapacitated() || !user.Adjacent(src)) return FALSE return TRUE + +#undef USES_TO_BLOOD +#undef BLOOD_DRAIN_GAIN +#undef SELF_HEAL_PENALTY diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index e38c762d700..e6faa911ee4 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -42,13 +42,13 @@ var/datum/action/innate/cult/blood_magic/magic = new(owner) magic.Grant(current) - current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color="#960000") + current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color=COLOR_CULT_RED) /datum/antagonist/cult/on_removal() if(!silent) owner.current.visible_message(span_deconversion_message("[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith!"), ignored_mobs = owner.current) to_chat(owner.current, span_userdanger("An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.")) - owner.current.log_message("has renounced the cult of Nar'Sie!", LOG_ATTACK, color="#960000") + owner.current.log_message("has renounced the cult of Nar'Sie!", LOG_ATTACK, color=COLOR_CULT_RED) if(vote_ability) QDEL_NULL(vote_ability) @@ -202,10 +202,10 @@ for(var/datum/mind/cult_mind as anything in cult_team.members) var/datum/antagonist/cult/cult_datum = cult_mind.has_antag_datum(/datum/antagonist/cult) cult_datum.vote_ability.Remove(cult_mind.current) - to_chat(cult_mind.current, span_cultlarge("[owner.current] has won the cult's support and is now their master. \ + to_chat(cult_mind.current, span_cult_large("[owner.current] has won the cult's support and is now their master. \ Follow [owner.current.p_their()] orders to the best of your ability!")) - to_chat(owner.current, span_cultlarge("You are the cult's Master. \ + to_chat(owner.current, span_cult_large("You are the cult's Master. \ As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \ targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of \ summoning the entire living cult to your location once. Use these abilities to direct the cult \ @@ -238,7 +238,7 @@ var/datum/antagonist/cult/cult_datum = cult_mind.has_antag_datum(/datum/antagonist/cult) cult_datum.vote_ability.Grant(cult_mind.current) - to_chat(owner.current, span_cultlarge("You have been demoted from being the cult's Master, you are now an acolyte once more!")) + to_chat(owner.current, span_cult_large("You have been demoted from being the cult's Master, you are now an acolyte once more!")) return TRUE @@ -256,7 +256,7 @@ var/area/current_area = get_area(owner.current) for(var/datum/mind/cult_mind as anything in cult_team.members) SEND_SOUND(cult_mind, sound('sound/hallucinations/veryfar_noise.ogg')) - to_chat(cult_mind, span_cultlarge("The Cult's Master, [owner.current.name], has fallen in \the [current_area]!")) + to_chat(cult_mind, span_cult_large("The Cult's Master, [owner.current.name], has fallen in \the [current_area]!")) /datum/antagonist/cult/get_preview_icon() var/icon/icon = render_preview_outfit(preview_outfit) diff --git a/code/modules/antagonists/cult/cult_bastard_sword.dm b/code/modules/antagonists/cult/cult_bastard_sword.dm index 784eaedf636..0d70bd503fb 100644 --- a/code/modules/antagonists/cult/cult_bastard_sword.dm +++ b/code/modules/antagonists/cult/cult_bastard_sword.dm @@ -77,7 +77,7 @@ force = 5 return else - to_chat(user, span_cultlarge("\"You cling to the Forgotten Gods, as if you're more than their pawn.\"")) + to_chat(user, span_cult_large("\"You cling to the Forgotten Gods, as if you're more than their pawn.\"")) to_chat(user, span_userdanger("A horrible force yanks at your arm!")) user.emote("scream") user.apply_damage(30, BRUTE, pick(GLOB.arm_zones)) diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index bee8eec306f..1d2e0dc08e4 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -81,7 +81,7 @@ var/my_message if(!message) return - my_message = span_cultboldtalic("The [user.name]: [message]") + my_message = span_cult_bold_italic("The [user.name]: [message]") for(var/mob/player_list as anything in GLOB.player_list) if(IS_CULTIST(player_list)) to_chat(player_list, my_message) @@ -123,7 +123,7 @@ if(team_member.current.incapacitated()) continue SEND_SOUND(team_member.current, 'sound/hallucinations/im_here1.ogg') - to_chat(team_member.current, span_cultlarge("Acolyte [nominee] has asserted that [nominee.p_theyre()] worthy of leading the cult. A vote will be called shortly.")) + to_chat(team_member.current, span_cult_large("Acolyte [nominee] has asserted that [nominee.p_theyre()] worthy of leading the cult. A vote will be called shortly.")) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(poll_cultists_for_leader), nominee, team), 10 SECONDS) @@ -137,7 +137,7 @@ team_member.current.update_mob_action_buttons() if(team_member.current.incapacitated()) continue - to_chat(team_member.current,span_cultlarge("[nominee] has died in the process of attempting to start a vote!")) + to_chat(team_member.current,span_cult_large("[nominee] has died in the process of attempting to start a vote!")) return FALSE var/list/mob/living/asked_cultists = list() for(var/datum/mind/team_member as anything in team.members) @@ -147,17 +147,18 @@ asked_cultists += team_member.current var/list/yes_voters = SSpolling.poll_candidates( - question = "[nominee] seeks to lead your cult, do you support [nominee.p_them()]?", + question = "[span_notice(nominee.name)] seeks to lead your cult, do you support [nominee.p_them()]?", poll_time = 30 SECONDS, group = asked_cultists, - pic_source = nominee, - role_name_text = "cult master", + alert_pic = nominee, + role_name_text = "cult master nomination", custom_response_messages = list( POLL_RESPONSE_SIGNUP = "You have pledged your allegience to [nominee].", POLL_RESPONSE_ALREADY_SIGNED = "You have already pledged your allegience!", POLL_RESPONSE_NOT_SIGNED = "You aren't nominated for this.", POLL_RESPONSE_TOO_LATE_TO_UNREGISTER = "It's too late to unregister yourself, voting has already begun!", POLL_RESPONSE_UNREGISTERED = "You have been removed your pledge to [nominee].", + chat_text_border_icon = mutable_appearance('icons/effects/effects.dmi', "cult_master_logo") ) ) if(QDELETED(nominee) || nominee.incapacitated()) @@ -168,7 +169,7 @@ team_member.current.update_mob_action_buttons() if(team_member.current.incapacitated()) continue - to_chat(team_member.current,span_cultlarge("[nominee] has died in the process of attempting to win the cult's support!")) + to_chat(team_member.current,span_cult_large("[nominee] has died in the process of attempting to win the cult's support!")) return FALSE if(!nominee.mind) team.cult_vote_called = FALSE @@ -178,7 +179,7 @@ team_member.current.update_mob_action_buttons() if(team_member.current.incapacitated()) continue - to_chat(team_member.current,span_cultlarge("[nominee] has gone catatonic in the process of attempting to win the cult's support!")) + to_chat(team_member.current,span_cult_large("[nominee] has gone catatonic in the process of attempting to win the cult's support!")) return FALSE if(LAZYLEN(yes_voters) <= LAZYLEN(asked_cultists) * 0.5) team.cult_vote_called = FALSE @@ -188,7 +189,7 @@ team_member.current.update_mob_action_buttons() if(team_member.current.incapacitated()) continue - to_chat(team_member.current, span_cultlarge("[nominee] could not win the cult's support and shall continue to serve as an acolyte.")) + to_chat(team_member.current, span_cult_large("[nominee] could not win the cult's support and shall continue to serve as an acolyte.")) return FALSE team.cult_vote_called = FALSE @@ -217,7 +218,7 @@ var/place = get_area(owner) var/datum/objective/eldergod/summon_objective = locate() in antag.cult_team.objectives if(place in summon_objective.summon_spots)//cant do final reckoning in the summon area to prevent abuse, you'll need to get everyone to stand on the circle! - to_chat(owner, span_cultlarge("The veil is too weak here! Move to an area where it is strong enough to support this magic.")) + to_chat(owner, span_cult_large("The veil is too weak here! Move to an area where it is strong enough to support this magic.")) return for(var/i in 1 to 4) chant(i) @@ -228,7 +229,7 @@ if(!LAZYLEN(destinations)) to_chat(owner, span_warning("You need more space to summon your cult!")) return - if(do_after(owner, 30, target = owner)) + if(do_after(owner, 3 SECONDS, target = owner)) for(var/datum/mind/B in antag.cult_team.members) if(B.current && B.current.stat != DEAD) var/turf/mobloc = get_turf(B.current) @@ -251,7 +252,7 @@ S.release_shades(owner) B.current.setDir(SOUTH) new /obj/effect/temp_visual/cult/blood(final) - addtimer(CALLBACK(B.current, TYPE_PROC_REF(/mob/, reckon), final), 10) + addtimer(CALLBACK(B.current, TYPE_PROC_REF(/mob/, reckon), final), 1 SECONDS) else return antag.cult_team.reckoning_complete = TRUE @@ -352,14 +353,14 @@ if(cult_team.blood_target) if(!COOLDOWN_FINISHED(src, cult_mark_cooldown)) cult_team.unset_blood_target_and_timer() - to_chat(owner, span_cultbold("You have cleared the cult's blood target!")) + to_chat(owner, span_cult_bold("You have cleared the cult's blood target!")) return TRUE - to_chat(owner, span_cultbold("The cult has already designated a target!")) + to_chat(owner, span_cult_bold("The cult has already designated a target!")) return FALSE if(!COOLDOWN_FINISHED(src, cult_mark_cooldown)) - to_chat(owner, span_cultbold("You aren't ready to place another blood mark yet!")) + to_chat(owner, span_cult_bold("You aren't ready to place another blood mark yet!")) return FALSE var/atom/mark_target = owner.orbiting?.parent || get_turf(owner) @@ -367,7 +368,7 @@ return FALSE if(cult_team.set_blood_target(mark_target, owner, 60 SECONDS)) - to_chat(owner, span_cultbold("You have marked [mark_target] for the cult! It will last for [DisplayTimeText(cult_mark_duration)].")) + to_chat(owner, span_cult_bold("You have marked [mark_target] for the cult! It will last for [DisplayTimeText(cult_mark_duration)].")) COOLDOWN_START(src, cult_mark_cooldown, cult_mark_cooldown_duration) build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) addtimer(CALLBACK(src, PROC_REF(reset_button)), cult_mark_cooldown_duration + 1) @@ -399,7 +400,7 @@ return SEND_SOUND(owner, 'sound/magic/enter_blood.ogg') - to_chat(owner, span_cultbold("Your previous mark is gone - you are now ready to create a new blood mark.")) + to_chat(owner, span_cult_bold("Your previous mark is gone - you are now ready to create a new blood mark.")) build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) //////// ELDRITCH PULSE ///////// @@ -488,12 +489,12 @@ if(!IS_CULTIST(living_clicked)) return FALSE SEND_SOUND(caller, sound('sound/weapons/thudswoosh.ogg')) - to_chat(caller, span_cultbold("You reach through the veil with your mind's eye and seize [clicked_on]! Click anywhere nearby to teleport [clicked_on.p_them()]!")) + to_chat(caller, span_cult_bold("You reach through the veil with your mind's eye and seize [clicked_on]! Click anywhere nearby to teleport [clicked_on.p_them()]!")) throwee_ref = WEAKREF(clicked_on) return TRUE if(istype(clicked_on, /obj/structure/destructible/cult)) - to_chat(caller, span_cultbold("You reach through the veil with your mind's eye and lift [clicked_on]! Click anywhere nearby to teleport it!")) + to_chat(caller, span_cult_bold("You reach through the veil with your mind's eye and lift [clicked_on]! Click anywhere nearby to teleport it!")) throwee_ref = WEAKREF(clicked_on) return TRUE diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 5426b41805a..2c4c495fcd7 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -97,7 +97,7 @@ Striking a noncultist, however, will tear their flesh."} user.Paralyze(100) user.dropItemToGround(src, TRUE) user.visible_message(span_warning("A powerful force shoves [user] away from [target]!"), \ - span_cultlarge("\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")) + span_cult_large("\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")) if(ishuman(user)) var/mob/living/carbon/human/miscreant = user miscreant.apply_damage(rand(force/2, force), BRUTE, pick(GLOB.arm_zones)) @@ -121,7 +121,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/melee/cultblade/pickup(mob/living/user) ..() if(!IS_CULTIST(user)) - to_chat(user, span_cultlarge("\"I wouldn't advise that.\"")) + to_chat(user, span_cult_large("\"I wouldn't advise that.\"")) /datum/action/innate/dash/cult name = "Rend the Veil" @@ -156,7 +156,7 @@ Striking a noncultist, however, will tear their flesh."} return var/mob/living/carbon/carbon_user = user if(user.num_legs < 2 || carbon_user.legcuffed) //if they can't be ensnared, stun for the same time as it takes to breakout of bola - to_chat(user, span_cultlarge("\"I wouldn't advise that.\"")) + to_chat(user, span_cult_large("\"I wouldn't advise that.\"")) user.dropItemToGround(src, TRUE) user.Paralyze(CULT_BOLA_PICKUP_STUN) else @@ -413,7 +413,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot) ..() if(!IS_CULTIST(user)) - to_chat(user, span_cultlarge("\"I wouldn't advise that.\"")) + to_chat(user, span_cult_large("\"I wouldn't advise that.\"")) to_chat(user, span_warning("An overwhelming sense of nausea overpowers you!")) user.dropItemToGround(src, TRUE) user.set_dizzy_if_lower(1 MINUTES) @@ -450,7 +450,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot) ..() if(!IS_CULTIST(user)) - to_chat(user, span_cultlarge("\"I wouldn't advise that.\"")) + to_chat(user, span_cult_large("\"I wouldn't advise that.\"")) to_chat(user, span_warning("An overwhelming sense of nausea overpowers you!")) user.dropItemToGround(src, TRUE) user.set_dizzy_if_lower(1 MINUTES) @@ -467,7 +467,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/living/user, slot) ..() if(user.stat != DEAD && !IS_CULTIST(user) && (slot & ITEM_SLOT_EYES)) - to_chat(user, span_cultlarge("\"You want to be blind, do you?\"")) + to_chat(user, span_cult_large("\"You want to be blind, do you?\"")) user.dropItemToGround(src, TRUE) user.set_dizzy_if_lower(1 MINUTES) user.Paralyze(100) @@ -989,7 +989,7 @@ Striking a noncultist, however, will tear their flesh."} if(.) if(illusions > 0) illusions-- - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/shield/mirror, readd)), 450) + 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) diff --git a/code/modules/antagonists/cult/cult_structure_altar.dm b/code/modules/antagonists/cult/cult_structure_altar.dm index 1f1a9bd71cb..9347acb3321 100644 --- a/code/modules/antagonists/cult/cult_structure_altar.dm +++ b/code/modules/antagonists/cult/cult_structure_altar.dm @@ -30,7 +30,7 @@ options = altar_items /obj/structure/destructible/cult/item_dispenser/altar/succcess_message(mob/living/user, obj/item/spawned_item) - to_chat(user, span_cultitalic("You kneel before [src] and your faith is rewarded with [spawned_item]!")) + to_chat(user, span_cult_italic("You kneel before [src] and your faith is rewarded with [spawned_item]!")) #undef ELDRITCH_WHETSTONE #undef CONSTRUCT_SHELL diff --git a/code/modules/antagonists/cult/cult_structure_archives.dm b/code/modules/antagonists/cult/cult_structure_archives.dm index 933b90dbf4e..a9617396633 100644 --- a/code/modules/antagonists/cult/cult_structure_archives.dm +++ b/code/modules/antagonists/cult/cult_structure_archives.dm @@ -32,7 +32,7 @@ options = archive_items /obj/structure/destructible/cult/item_dispenser/archives/succcess_message(mob/living/user, obj/item/spawned_item) - to_chat(user, span_cultitalic("You summon [spawned_item] from [src]!")) + to_chat(user, span_cult_italic("You summon [spawned_item] from [src]!")) // Preset for the library that doesn't spawn runed metal on destruction. /obj/structure/destructible/cult/item_dispenser/archives/library diff --git a/code/modules/antagonists/cult/cult_structure_forge.dm b/code/modules/antagonists/cult/cult_structure_forge.dm index ceb38398a67..912db7d37e9 100644 --- a/code/modules/antagonists/cult/cult_structure_forge.dm +++ b/code/modules/antagonists/cult/cult_structure_forge.dm @@ -32,7 +32,7 @@ options = forge_items /obj/structure/destructible/cult/item_dispenser/forge/succcess_message(mob/living/user, obj/item/spawned_item) - to_chat(user, span_cultitalic("You work [src] as dark knowledge guides your hands, creating [spawned_item]!")) + to_chat(user, span_cult_italic("You work [src] as dark knowledge guides your hands, creating [spawned_item]!")) /obj/structure/destructible/cult/item_dispenser/forge/engine name = "magma engine" diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index ebf66a7ee15..932c3ac03c1 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -25,7 +25,7 @@ if(cult_examine_tip) . += span_cult(cult_examine_tip) if(!COOLDOWN_FINISHED(src, use_cooldown_duration)) - . += span_cultitalic("The magic in [src] is too weak, it will be ready to use again in [DisplayTimeText(COOLDOWN_TIMELEFT(src, use_cooldown_duration))].") + . += span_cult_italic("The magic in [src] is too weak, it will be ready to use again in [DisplayTimeText(COOLDOWN_TIMELEFT(src, use_cooldown_duration))].") /obj/structure/destructible/cult/set_anchored(anchorvalue) . = ..() @@ -78,10 +78,10 @@ to_chat(user, span_warning("You're pretty sure you know exactly what this is used for and you can't seem to touch it.")) return if(!anchored) - to_chat(user, span_cultitalic("You need to anchor [src] to the floor first.")) + to_chat(user, span_cult_italic("You need to anchor [src] to the floor first.")) return if(!COOLDOWN_FINISHED(src, use_cooldown)) - to_chat(user, span_cultitalic("The magic in [src] is too weak, it will be ready to use again in [DisplayTimeText(COOLDOWN_TIMELEFT(src, use_cooldown))].")) + to_chat(user, span_cult_italic("The magic in [src] is too weak, it will be ready to use again in [DisplayTimeText(COOLDOWN_TIMELEFT(src, use_cooldown))].")) return var/list/spawned_items = get_items_to_spawn(user) @@ -142,7 +142,7 @@ * Override for unique feedback messages on item spawn. */ /obj/structure/destructible/cult/item_dispenser/proc/succcess_message(mob/living/user, obj/item/spawned_item) - to_chat(user, span_cultitalic("[src] produces a [spawned_item.name].")) + to_chat(user, span_cult_italic("[src] produces a [spawned_item.name].")) /* * Simple proc intended for use in callbacks to determine if [user] can continue to use a radial menu. diff --git a/code/modules/antagonists/cult/cult_team.dm b/code/modules/antagonists/cult/cult_team.dm index 1d199a113f5..c47cc2145b5 100644 --- a/code/modules/antagonists/cult/cult_team.dm +++ b/code/modules/antagonists/cult/cult_team.dm @@ -49,7 +49,7 @@ for(var/datum/mind/mind as anything in members) if(mind.current) SEND_SOUND(mind.current, 'sound/ambience/antag/bloodcult/bloodcult_eyes.ogg') - to_chat(mind.current, span_cultlarge(span_warning("The veil weakens as your cult grows, your eyes begin to glow..."))) + 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) cult_risen = TRUE log_game("The blood cult has risen with [cultplayers] players.") @@ -58,7 +58,7 @@ for(var/datum/mind/mind as anything in members) if(mind.current) SEND_SOUND(mind.current, 'sound/ambience/antag/bloodcult/bloodcult_halos.ogg') - to_chat(mind.current, span_cultlarge(span_warning("Your cult is ascendent and the red harvest approaches - you cannot hide your true nature for much longer!!"))) + to_chat(mind.current, span_cult_large(span_warning("Your cult is ascendent and the red harvest approaches - you cannot hide your true nature for much longer!!"))) mind.current.AddElement(/datum/element/cult_halo) cult_ascendent = TRUE log_game("The blood cult has ascended with [cultplayers] players.") @@ -156,7 +156,7 @@ if(cultist.current.stat == DEAD || !cultist.current.client) continue - to_chat(cultist.current, span_bold(span_cultlarge("[marker] has marked [blood_target] in the [target_area.name] as the cult's top priority, get there immediately!"))) + to_chat(cultist.current, span_bold(span_cult_large("[marker] has marked [blood_target] in the [target_area.name] as the cult's top priority, get there immediately!"))) SEND_SOUND(cultist.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'), 0, 1, 75)) cultist.current.client.images += blood_target_image @@ -175,9 +175,9 @@ continue if(QDELETED(blood_target)) - to_chat(cultist.current, span_bold(span_cultlarge("The blood mark's target is lost!"))) + to_chat(cultist.current, span_bold(span_cult_large("The blood mark's target is lost!"))) else - to_chat(cultist.current, span_bold(span_cultlarge("The blood mark has expired!"))) + to_chat(cultist.current, span_bold(span_cult_large("The blood mark has expired!"))) cultist.current.client.images -= blood_target_image UnregisterSignal(blood_target, COMSIG_QDELETING) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 8d7d66979f4..aa979ff7814 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1,6 +1,4 @@ -/// list of weakrefs to mobs OR minds that have been sacrificed -GLOBAL_LIST(sacrificed) /// List of all teleport runes GLOBAL_LIST(teleport_runes) /// Assoc list of every rune that can be drawn by ritual daggers. [rune_name] = [typepath] @@ -100,25 +98,27 @@ Runes can either be invoked by one's self or with many different cultists. Each . = ..() if(.) return - if(!IS_CULTIST(user)) + if(!IS_CULTIST_OR_CULTIST_MOB(user)) to_chat(user, span_warning("You aren't able to understand the words of [src].")) return var/list/invokers = can_invoke(user) if(length(invokers) >= req_cultists) invoke(invokers) + SSblackbox.record_feedback("tally", "cult_rune_invoke", 1, "[name]") else to_chat(user, span_danger("You need [req_cultists - length(invokers)] more adjacent cultists to use this rune in such a manner.")) fail_invoke() -/obj/effect/rune/attack_animal(mob/living/simple_animal/user, list/modifiers) - if(isshade(user) || isconstruct(user)) - if(HAS_TRAIT(user, TRAIT_ANGELIC)) - to_chat(user, span_warning("You purge the rune!")) - qdel(src) - else if(construct_invoke || !IS_CULTIST(user)) //if you're not a cult construct we want the normal fail message - attack_hand(user) - else - to_chat(user, span_warning("You are unable to invoke the rune!")) +/obj/effect/rune/attack_animal(mob/living/user, list/modifiers) + if(!isshade(user) && !isconstruct(user)) + return + if(HAS_TRAIT(user, TRAIT_ANGELIC)) + to_chat(user, span_warning("You purge the rune!")) + qdel(src) + else if(construct_invoke || !IS_CULTIST(user)) //if you're not a cult construct we want the normal fail message + attack_hand(user) + else + to_chat(user, span_warning("You are unable to invoke the rune!")) /obj/effect/rune/proc/conceal() //for talisman of revealing/hiding visible_message(span_danger("[src] fades away.")) @@ -161,17 +161,19 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/proc/invoke(list/invokers) //This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here. - for(var/M in invokers) - if(isliving(M)) - var/mob/living/L = M - if(invocation) - L.say(invocation, language = /datum/language/common, ignore_spam = TRUE, forced = "cult invocation") - if(invoke_damage) - L.apply_damage(invoke_damage, BRUTE) - to_chat(L, "[src] saps your strength!") - else if(istype(M, /obj/item/toy/plush/narplush)) - var/obj/item/toy/plush/narplush/P = M - P.visible_message("[P] squeaks loudly!") + for(var/atom/invoker in invokers) + if(istype(invoker, /obj/item/toy/plush/narplush)) + invoker.visible_message(span_cult_italic("[src] squeaks_loudly!")) + continue + if(!isliving(invoker)) + continue + var/mob/living/living_invoker = invoker + if(invocation) + living_invoker.say(invocation, language = /datum/language/common, ignore_spam = TRUE, forced = "cult invocation") + if(invoke_damage) + living_invoker.apply_damage(invoke_damage, BRUTE) + to_chat(living_invoker, span_cult_italic("[src] saps your strength!")) + do_invoke_glow() /obj/effect/rune/proc/do_invoke_glow() @@ -186,7 +188,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/oldcolor = color color = rgb(255, 0, 0) animate(src, color = oldcolor, time = 5) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 5) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 0.5 SECONDS) //Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user. /obj/effect/rune/malformed @@ -234,7 +236,6 @@ structure_check() searches for nearby cultist structures required for the invoca rune_in_use = TRUE visible_message(span_warning("[src] pulses blood red!")) - var/oldcolor = color color = RUNE_COLOR_DARKRED if(length(myriad_targets)) @@ -259,9 +260,10 @@ structure_check() searches for nearby cultist structures required for the invoca else do_invoke_glow() - animate(src, color = oldcolor, time = 0.5 SECONDS) + animate(src, color = initial(color), time = 0.5 SECONDS) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 0.5 SECONDS) rune_in_use = FALSE + return ..() /obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers, datum/team/cult/cult_team) ASSERT(convertee.mind) @@ -286,7 +288,7 @@ structure_check() searches for nearby cultist structures required for the invoca span_warning("[convertee] writhes in pain [(brutedamage || burndamage) \ ? "even as [convertee.p_their()] wounds heal and close" \ : "as the markings below [convertee.p_them()] glow a bloody red"]!"), - span_cultlarge("AAAAAAAAAAAAAA-"), + span_cult_large("AAAAAAAAAAAAAA-"), ) // We're not guaranteed to be a human but we'll cast here since we use it in a few branches @@ -305,11 +307,11 @@ structure_check() searches for nearby cultist structures required for the invoca convertee.mind.special_role = ROLE_CULTIST convertee.mind.add_antag_datum(/datum/antagonist/cult, cult_team) - to_chat(convertee, span_cultitalic("Your blood pulses. Your head throbs. The world goes red. \ + to_chat(convertee, span_cult_bold_italic("Your blood pulses. Your head throbs. The world goes red. \ All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ - and something evil takes root.")) - to_chat(convertee, span_cultitalic("Assist your new compatriots in their dark dealings. \ - Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.")) + and something evil takes root.")) + to_chat(convertee, span_cult_bold_italic("Assist your new compatriots in their dark dealings. \ + Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.")) if(istype(human_convertee)) human_convertee.uncuff() @@ -324,10 +326,10 @@ structure_check() searches for nearby cultist structures required for the invoca var/big_sac = FALSE if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || cult_team.is_sacrifice_target(sacrificial.mind)) && length(invokers) < 3) for(var/invoker in invokers) - to_chat(invoker, span_cultitalic("[sacrificial] is too greatly linked to the world! You need three acolytes!")) + to_chat(invoker, span_cult_italic("[sacrificial] is too greatly linked to the world! You need three acolytes!")) return FALSE - var/signal_result = SEND_SIGNAL(sacrificial, COMSIG_LIVING_CULT_SACRIFICED, invokers) + var/signal_result = SEND_SIGNAL(sacrificial, COMSIG_LIVING_CULT_SACRIFICED, invokers, cult_team) if(signal_result & STOP_SACRIFICE) return FALSE @@ -347,12 +349,12 @@ structure_check() searches for nearby cultist structures required for the invoca if(!(signal_result & SILENCE_SACRIFICE_MESSAGE)) for(var/invoker in invokers) if(big_sac) - to_chat(invoker, span_cultlarge("\"Yes! This is the one I desire! You have done well.\"")) + to_chat(invoker, span_cult_large("\"Yes! This is the one I desire! You have done well.\"")) continue if(ishuman(sacrificial) || iscyborg(sacrificial)) - to_chat(invoker, span_cultlarge("\"I accept this sacrifice.\"")) + to_chat(invoker, span_cult_large("\"I accept this sacrifice.\"")) else - to_chat(invoker, span_cultlarge("\"I accept this meager sacrifice.\"")) + to_chat(invoker, span_cult_large("\"I accept this meager sacrifice.\"")) if(iscyborg(sacrificial)) var/construct_class = show_radial_menu(invokers[1], sacrificial, GLOB.construct_radial_images, require_near = TRUE, tooltips = TRUE) @@ -389,7 +391,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(GET_ATOM_BLOOD_DNA_LENGTH(rod)) displayed_message += " The blood of [num_slain] fallen cultist[num_slain == 1 ? "":"s"] is absorbed into [rod]!" - rod.visible_message(span_cultitalic(displayed_message)) + rod.visible_message(span_cult_italic(displayed_message)) switch(num_slain) if(0, 1) animate_spawn_sword(rod, /obj/item/melee/cultblade/dagger) @@ -653,7 +655,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives var/area/place = get_area(src) if(!(place in summon_objective.summon_spots)) - to_chat(user, span_cultlarge("The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!")) + to_chat(user, span_cult_large("The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!")) return if(locate(/obj/narsie) in SSpoints_of_interest.narsies) for(var/invoker in invokers) @@ -689,80 +691,79 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below icon_state = "1" color = RUNE_COLOR_MEDIUMRED - var/static/sacrifices_used = -SOULS_TO_REVIVE // Cultists get one "free" revive /obj/effect/rune/raise_dead/examine(mob/user) . = ..() if(IS_CULTIST(user) || user.stat == DEAD) - . += "Sacrifices unrewarded: [LAZYLEN(GLOB.sacrificed) - sacrifices_used]" + . += "Sacrifices unrewarded: [LAZYLEN(GLOB.sacrificed) - GLOB.sacrifices_used]" /obj/effect/rune/raise_dead/invoke(list/invokers) - var/turf/T = get_turf(src) - var/mob/living/mob_to_revive - var/list/potential_revive_mobs = list() - var/mob/living/user = invokers[1] if(rune_in_use) return rune_in_use = TRUE - for(var/mob/living/M in T.contents) - if(IS_CULTIST(M) && (M.stat == DEAD || !M.client || M.client.is_afk())) - potential_revive_mobs |= M + var/mob/living/mob_to_revive + var/list/potential_revive_mobs = list() + var/mob/living/user = invokers[1] + + for(var/mob/living/target in loc) + if(IS_CULTIST(target) && (target.stat == DEAD || isnull(target.client) || target.client.is_afk())) + potential_revive_mobs += target + if(!length(potential_revive_mobs)) - to_chat(user, "There are no dead cultists on the rune!") + to_chat(user, span_cult_italic("There are no dead cultists on the rune!")) log_game("Raise Dead rune activated by [user] at [COORD(src)] failed - no cultists to revive.") fail_invoke() return - if(length(potential_revive_mobs) > 1) + + if(length(potential_revive_mobs) > 1 && user.mind) mob_to_revive = tgui_input_list(user, "Cultist to revive", "Revive Cultist", potential_revive_mobs) if(isnull(mob_to_revive)) return else mob_to_revive = potential_revive_mobs[1] + if(QDELETED(src) || !validness_checks(mob_to_revive, user)) fail_invoke() return - if(user.name == "Herbert West") - invocation = "To life, to life, I bring them!" - else - invocation = initial(invocation) - ..() + + invocation = (user.name == "Herbert West") ? "To life, to life, I bring them!" : initial(invocation) + if(mob_to_revive.stat == DEAD) - var/diff = LAZYLEN(GLOB.sacrificed) - SOULS_TO_REVIVE - sacrifices_used + var/diff = LAZYLEN(GLOB.sacrificed) - SOULS_TO_REVIVE - GLOB.sacrifices_used if(diff < 0) to_chat(user, span_warning("Your cult must carry out [abs(diff)] more sacrifice\s before it can revive another cultist!")) fail_invoke() return - sacrifices_used += SOULS_TO_REVIVE + GLOB.sacrifices_used += SOULS_TO_REVIVE mob_to_revive.revive(ADMIN_HEAL_ALL) //This does remove traits and such, but the rune might actually see some use because of it! //Why did you think this was a good idea if(!mob_to_revive.client || mob_to_revive.client.is_afk()) set waitfor = FALSE - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a [mob_to_revive.real_name], an inactive blood cultist?", check_jobban = ROLE_CULTIST, role = ROLE_CULTIST, poll_time = 5 SECONDS, target_mob = mob_to_revive, pic_source = mob_to_revive) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_danger(mob_to_revive.real_name)], an [span_notice("inactive blood cultist")]?", check_jobban = ROLE_CULTIST, role = ROLE_CULTIST, poll_time = 5 SECONDS, checked_target = mob_to_revive, alert_pic = mob_to_revive, role_name_text = "inactive cultist") + if(chosen_one) to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.") - message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.") + message_admins("[key_name_admin(chosen_one)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.") mob_to_revive.ghostize(FALSE) - mob_to_revive.key = C.key + mob_to_revive.key = chosen_one.key else fail_invoke() return SEND_SOUND(mob_to_revive, 'sound/ambience/antag/bloodcult/bloodcult_gain.ogg') - to_chat(mob_to_revive, span_cultlarge("\"PASNAR SAVRAE YAM'TOTH. Arise.\"")) + to_chat(mob_to_revive, span_cult_large("\"PASNAR SAVRAE YAM'TOTH. Arise.\"")) mob_to_revive.visible_message(span_warning("[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes."), \ - span_cultlarge("You awaken suddenly from the void. You're alive!")) + span_cult_large("You awaken suddenly from the void. You're alive!")) rune_in_use = FALSE + return ..() /obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user) - var/turf/T = get_turf(src) if(QDELETED(user)) return FALSE if(!Adjacent(user) || user.incapacitated()) return FALSE if(QDELETED(target_mob)) return FALSE - if(!(target_mob in T.contents)) - to_chat(user, "The cultist to revive has been moved!") + if(!(target_mob in loc)) + to_chat(user, span_cult_italic("The cultist to revive has been moved!")) log_game("Raise Dead rune activated by [user] at [COORD(src)] failed - revival target moved.") return FALSE return TRUE @@ -770,9 +771,9 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) /obj/effect/rune/raise_dead/fail_invoke() ..() rune_in_use = FALSE - for(var/mob/living/M in range(1,src)) - if(IS_CULTIST(M) && M.stat == DEAD) - M.visible_message(span_warning("[M] twitches.")) + for(var/mob/living/cultist in loc) + if(IS_CULTIST(cultist) && cultist.stat == DEAD) + cultist.visible_message(span_warning("[cultist] twitches.")) //Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo. /obj/effect/rune/wall @@ -896,7 +897,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) if(!IS_CULTIST(target) && target.blood_volume) if(target.can_block_magic(charge_cost = 0)) continue - to_chat(target, span_cultlarge("Your blood boils in your veins!")) + to_chat(target, span_cult_large("Your blood boils in your veins!")) animate(src, color = "#FCB56D", time = 4) sleep(0.4 SECONDS) if(QDELETED(src)) @@ -960,10 +961,10 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) var/choice = tgui_alert(user, "You tear open a connection to the spirit realm...", "Spirit Realm", list("Summon a Cult Ghost", "Ascend as a Dark Spirit")) if(choice == "Summon a Cult Ghost") if(!is_station_level(T.z)) - to_chat(user, span_cultitalic("The veil is not weak enough here to manifest spirits, you must be on station!")) + to_chat(user, span_cult_italic("The veil is not weak enough here to manifest spirits, you must be on station!")) return if(ghosts >= ghost_limit) - to_chat(user, span_cultitalic("You are sustaining too many ghosts to summon more!")) + to_chat(user, span_cult_italic("You are sustaining too many ghosts to summon more!")) fail_invoke() log_game("Manifest rune failed - too many summoned ghosts") return list() @@ -978,7 +979,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) if(O.client && !is_banned_from(O.ckey, ROLE_CULTIST) && !QDELETED(src) && !(isAdminObserver(O) && (O.client.prefs.toggles & ADMIN_IGNORE_CULT_GHOST)) && !QDELETED(O)) ghosts_on_rune += O if(!length(ghosts_on_rune)) - to_chat(user, span_cultitalic("There are no spirits near [src]!")) + to_chat(user, span_cult_italic("There are no spirits near [src]!")) fail_invoke() log_game("Manifest rune failed - no nearby ghosts") return list() @@ -996,7 +997,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) ghosts++ playsound(src, 'sound/magic/exit_blood.ogg', 50, TRUE) visible_message(span_warning("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.")) - to_chat(user, span_cultitalic("Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...")) + to_chat(user, span_cult_italic("Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...")) var/obj/structure/emergency_shield/cult/weak/N = new(T) if(ghost_to_spawn.mind && ghost_to_spawn.mind.current) new_human.AddComponent( \ @@ -1007,7 +1008,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) new_human.key = ghost_to_spawn.key var/datum/antagonist/cult/created_cultist = new_human.mind?.add_antag_datum(/datum/antagonist/cult) created_cultist?.silent = TRUE - to_chat(new_human, span_cultitalic("You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar'Sie, and you are to serve them at all costs.")) + to_chat(new_human, span_cult_italic("You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar'Sie, and you are to serve them at all costs.")) while(!QDELETED(src) && !QDELETED(user) && !QDELETED(new_human) && (user in T)) if(user.stat != CONSCIOUS || HAS_TRAIT(new_human, TRAIT_CRITICAL_CONDITION)) @@ -1019,7 +1020,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) ghosts-- if(new_human) new_human.visible_message(span_warning("[new_human] suddenly dissolves into bones and ashes."), \ - span_cultlarge("Your link to the world fades. Your form breaks apart.")) + span_cult_large("Your link to the world fades. Your form breaks apart.")) for(var/obj/I in new_human) new_human.dropItemToGround(I, TRUE) new_human.mind?.remove_antag_datum(/datum/antagonist/cult) @@ -1048,7 +1049,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) affecting.Paralyze(40) break if(affecting.health <= 10) - to_chat(G, span_cultitalic("Your body can no longer sustain the connection!")) + to_chat(G, span_cult_italic("Your body can no longer sustain the connection!")) break sleep(0.5 SECONDS) CM.Remove(G) @@ -1091,10 +1092,10 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives if(length(summon_objective.summon_spots) <= 1) - to_chat(user, span_cultlarge("Only one ritual site remains - it must be reserved for the final summoning!")) + to_chat(user, span_cult_large("Only one ritual site remains - it must be reserved for the final summoning!")) return if(!(place in summon_objective.summon_spots)) - to_chat(user, span_cultlarge("The Apocalypse rune will remove a ritual site, where Nar'Sie can be summoned, it can only be scribed in [english_list(summon_objective.summon_spots)]!")) + to_chat(user, span_cult_large("The Apocalypse rune will remove a ritual site, where Nar'Sie can be summoned, it can only be scribed in [english_list(summon_objective.summon_spots)]!")) return summon_objective.summon_spots -= place @@ -1145,7 +1146,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"cult_apoc",TRUE), duration) images += C else - to_chat(M, span_cultlarge("An Apocalypse Rune was invoked in the [place.name], it is no longer available as a summoning site!")) + to_chat(M, span_cult_large("An Apocalypse Rune was invoked in the [place.name], it is no longer available as a summoning site!")) SEND_SOUND(M, 'sound/effects/pope_entry.ogg') image_handler(images, duration) if(intensity >= 285) // Based on the prior formula, this means the cult makes up <15% of current players diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index 18c957c28fd..acefd0e3717 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -113,7 +113,19 @@ the new instance inside the host to be updated to the template's stats. for(var/datum/disease_ability/ability in purchased_abilities) . += span_notice("[ability.name]") -/mob/camera/disease/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/camera/disease/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(), +) if(!message) return if(sanitize) diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm index 3efab657101..ed256acae03 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -36,14 +36,14 @@ if(visualsOnly) return equipped_on.fully_replace_character_name(null, "Waldo") - equipped_on.eye_color_left = "#000000" - equipped_on.eye_color_right = "#000000" + equipped_on.eye_color_left = COLOR_BLACK + equipped_on.eye_color_right = COLOR_BLACK equipped_on.gender = MALE equipped_on.skin_tone = "caucasian3" equipped_on.hairstyle = "Business Hair 3" equipped_on.facial_hairstyle = "Shaved" - equipped_on.hair_color = "#000000" - equipped_on.facial_hair_color = "#000000" + equipped_on.hair_color = COLOR_BLACK + equipped_on.facial_hair_color = COLOR_BLACK equipped_on.update_body(is_creating = TRUE) var/list/no_drops = list() diff --git a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm index 7ba0401829a..31f312ae540 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm @@ -23,7 +23,7 @@ if(!fug_antag) to_chat(fugitive_hunter, span_warning("This is not a wanted fugitive!")) return - if(do_after(fugitive_hunter, 50, target = fugitive)) + if(do_after(fugitive_hunter, 5 SECONDS, target = fugitive)) add_prisoner(fugitive, fug_antag) /obj/machinery/fugitive_capture/proc/add_prisoner(mob/living/carbon/human/fugitive, datum/antagonist/fugitive/antag) @@ -31,7 +31,7 @@ antag.is_captured = TRUE to_chat(fugitive, span_userdanger("You are thrown into a vast void of bluespace, and as you fall further into oblivion the comparatively small entrance to reality gets smaller and smaller until you cannot see it anymore. You have failed to avoid capture.")) fugitive.ghostize(TRUE) //so they cannot suicide, round end stuff. - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/computer/shuttle/hunter name = "shuttle console" diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 6dee633061a..edb2d9c8136 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -350,7 +350,7 @@ else drawing_effect = new(target_turf, rune_colour) - if(!do_after(user, drawing_time, target_turf, extra_checks = additional_checks)) + if(!do_after(user, drawing_time, target_turf, extra_checks = additional_checks, hidden = TRUE)) target_turf.balloon_alert(user, "interrupted!") new /obj/effect/temp_visual/drawing_heretic_rune/fail(target_turf, rune_colour) qdel(drawing_effect) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index f2cf7b00047..bb59076a6bb 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -537,23 +537,22 @@ animate(summoned, 10 SECONDS, alpha = 155) message_admins("A [summoned.name] is being summoned by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(summoned)].") - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a [summoned.name]?", check_jobban = ROLE_HERETIC, poll_time = 10 SECONDS, target_mob = summoned, ignore_category = poll_ignore_define, pic_source = summoned, role_name_text = summoned.name) - if(!LAZYLEN(candidates)) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(check_jobban = ROLE_HERETIC, poll_time = 10 SECONDS, checked_target = summoned, ignore_category = poll_ignore_define, alert_pic = summoned, role_name_text = summoned.name) + if(isnull(chosen_one)) loc.balloon_alert(user, "ritual failed, no ghosts!") animate(summoned, 0.5 SECONDS, alpha = 0) QDEL_IN(summoned, 0.6 SECONDS) return FALSE - var/mob/dead/observer/picked_candidate = pick(candidates) // Ok let's make them an interactable mob now, since we got a ghost summoned.alpha = 255 REMOVE_TRAIT(summoned, TRAIT_NO_TRANSFORM, REF(src)) summoned.move_resist = initial(summoned.move_resist) summoned.ghostize(FALSE) - summoned.key = picked_candidate.key + summoned.key = chosen_one.key - user.log_message("created a [summoned.name], controlled by [key_name(picked_candidate)].", LOG_GAME) + user.log_message("created a [summoned.name], controlled by [key_name(chosen_one)].", LOG_GAME) message_admins("[ADMIN_LOOKUPFLW(user)] created a [summoned.name], [ADMIN_LOOKUPFLW(summoned)].") var/datum/antagonist/heretic_monster/heretic_monster = summoned.mind.add_antag_datum(/datum/antagonist/heretic_monster) diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index f4501802b45..26855d2d02a 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -224,6 +224,11 @@ on_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND RegisterSignal(on_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf)) + AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(verify_user_can_see))) + +/obj/effect/heretic_influence/proc/verify_user_can_see(mob/user) + return (user?.mind in minds) + /obj/effect/heretic_influence/proc/replace_our_turf(datum/source, path, new_baseturfs, flags, post_change_callbacks) SIGNAL_HANDLER post_change_callbacks += CALLBACK(src, PROC_REF(replace_our_turf_two)) @@ -260,13 +265,16 @@ return // Using a codex will give you two knowledge points for draining. - if(!being_drained && istype(weapon, /obj/item/codex_cicatrix)) - var/obj/item/codex_cicatrix/codex = weapon - if(!codex.book_open) - codex.attack_self(user) // open booke - INVOKE_ASYNC(src, PROC_REF(drain_influence), user, 2) + if(drain_influence_with_codex(user, weapon)) return TRUE +/obj/effect/heretic_influence/proc/drain_influence_with_codex(mob/user, obj/item/codex_cicatrix/codex) + if(!istype(codex) || being_drained) + return FALSE + if(!codex.book_open) + codex.attack_self(user) // open booke + INVOKE_ASYNC(src, PROC_REF(drain_influence), user, 2) + return TRUE /** * Begin to drain the influence, setting being_drained, @@ -279,7 +287,7 @@ being_drained = TRUE balloon_alert(user, "draining influence...") - if(!do_after(user, 10 SECONDS, src)) + if(!do_after(user, 10 SECONDS, src, hidden = TRUE)) being_drained = FALSE balloon_alert(user, "interrupted!") return diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm index 5aa63407dc6..5302fc1c9c1 100644 --- a/code/modules/antagonists/heretic/items/eldritch_painting.dm +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -92,7 +92,7 @@ if(!IS_HERETIC(examiner)) to_chat(examiner, span_hypnophrase("Respite, for now....")) examiner.mob_mood.mood_events.Remove("eldritch_weeping") - examiner.add_mood_event("weeping_withdrawl", /datum/mood_event/eldritch_painting/weeping_withdrawl) + examiner.add_mood_event("weeping_withdrawal", /datum/mood_event/eldritch_painting/weeping_withdrawal) return to_chat(examiner, span_notice("Oh, what arts! Just gazing upon it clears your mind.")) diff --git a/code/modules/antagonists/heretic/items/forbidden_book.dm b/code/modules/antagonists/heretic/items/forbidden_book.dm index ff570801c5f..ad6bc388800 100644 --- a/code/modules/antagonists/heretic/items/forbidden_book.dm +++ b/code/modules/antagonists/heretic/items/forbidden_book.dm @@ -55,7 +55,9 @@ return if(isopenturf(target)) - heretic_datum.try_draw_rune(user, target, drawing_time = 8 SECONDS) + var/obj/effect/heretic_influence/influence = locate(/obj/effect/heretic_influence) in target + if(!influence?.drain_influence_with_codex(user, src)) + heretic_datum.try_draw_rune(user, target, drawing_time = 8 SECONDS) return TRUE /// Plays a little animation that shows the book opening and closing. diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm index 4fa86427d27..716b0927f54 100644 --- a/code/modules/antagonists/heretic/items/unfathomable_curio.dm +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -44,9 +44,29 @@ if(!(slot & slot_flags)) return + RegisterSignal(user, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(shield_reaction)) + if(!IS_HERETIC(user)) to_chat(user, span_warning("The curio wraps around you, and you feel the beating of something dark inside it...")) +/obj/item/storage/belt/unfathomable_curio/dropped(mob/user) + . = ..() + UnregisterSignal(user, COMSIG_LIVING_CHECK_BLOCK) + +// Here we make sure our curio is only able to block while worn on the belt slot +/obj/item/storage/belt/unfathomable_curio/proc/shield_reaction(mob/living/carbon/human/owner, + atom/movable/hitby, + damage = 0, + attack_text = "the attack", + attack_type = MELEE_ATTACK, + armour_penetration = 0, + damage_type = BRUTE, +) + SIGNAL_HANDLER + + if(hit_reaction(owner, hitby, attack_text, 0, damage, attack_type) && (owner.belt == src)) + return SUCCESSFUL_BLOCK + return NONE // Our on hit effect /obj/item/storage/belt/unfathomable_curio/proc/shield_damaged(mob/living/carbon/wearer, attack_text, new_current_charges) diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index ff150f0ac0f..1124d9a4440 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -42,7 +42,7 @@ /datum/heretic_knowledge/ashen_grasp name = "Grasp of Ash" - desc = "Your Mansus Grasp will burn the eyes of the victim, causing damage and blindness." + 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." next_knowledge = list(/datum/heretic_knowledge/spell/ash_passage) @@ -70,7 +70,7 @@ /datum/heretic_knowledge/spell/ash_passage name = "Ashen Passage" - desc = "Grants you Ashen Passage, a silent but short range jaunt." + 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." next_knowledge = list( /datum/heretic_knowledge/mark/ash_mark, @@ -181,6 +181,7 @@ When completed, you become a harbinger of flames, gaining two abilites. \ Cascade, which causes a massive, growing ring of fire around you, \ and Oath of Flame, causing you to passively create a ring of flames as you walk. \ + Some ashen spells you already knew will be empowered as well. \ You will also become immune to flames, space, and similar environmental hazards." gain_text = "The Watch is dead, the Nightwatcher burned with it. Yet his fire burns evermore, \ for the Nightwatcher brought forth the rite to mankind! His gaze continues, as now I am one with the flames, \ diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 1a16f2e9f93..09efb5c2eb8 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -42,7 +42,8 @@ /datum/heretic_knowledge/cosmic_grasp name = "Grasp of Cosmos" - desc = "Your Mansus Grasp will give people a star mark (cosmic ring) and create a cosmic field where you stand." + 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." next_knowledge = list(/datum/heretic_knowledge/spell/cosmic_runes) @@ -82,7 +83,8 @@ /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. \ + 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." @@ -98,8 +100,7 @@ name = "Star Touch" desc = "Grants you Star Touch, a spell which places a star mark upon your target \ and creates a cosmic field at your feet and to the turfs next to you. Targets which already have a star mark \ - will be forced to sleep for 4 seconds. When the victim is hit it also creates a beam that \ - deals a bit of fire damage and damages the cells. \ + will be forced to sleep for 4 seconds. When the victim is hit it also creates a beam that burns them. \ The beam lasts a minute, until the beam is obstructed or until a new target has been found." 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." @@ -110,7 +111,7 @@ /datum/heretic_knowledge/spell/star_blast name = "Star Blast" - desc = "Fires a projectile that moves very slowly and creates cosmic fields on impact. \ + 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." next_knowledge = list( @@ -243,7 +244,8 @@ You can also give it commands through speech. \ The Star Gazer is a strong ally who can even break down reinforced walls. \ The Star Gazer has an aura that will heal you and damage opponents. \ - Star Touch can now teleport you to the Star Gazer when activated in your hand." + Star Touch can now teleport you to the Star Gazer when activated in your hand. \ + Your cosmic expansion spell and your blades also become greatly empowered." gain_text = "The Beast held out its hand, I grabbed hold and they pulled me to them. Their body was towering, but it seemed so small and feeble after all their tales compiled in my head. \ I clung on to them, they would protect me, and I would protect it. \ I closed my eyes with my head laid against their form. I was safe. \ diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index d6fcb2f43a2..97f84782c59 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -122,6 +122,7 @@ /datum/heretic_knowledge/limited_amount/flesh_ghoul name = "Imperfect Ritual" desc = "Allows you to transmute a corpse and a poppy to create a Voiceless Dead. \ + The corpse does not need to have a soul. \ Voiceless Dead are mute ghouls and only have 50 health, but can use Bloody Blades effectively. \ You can only create two at a time." gain_text = "I found notes of a dark ritual, unfinished... yet still, I pushed forward." @@ -167,15 +168,13 @@ if(!soon_to_be_ghoul.mind || !soon_to_be_ghoul.client) message_admins("[ADMIN_LOOKUPFLW(user)] is creating a voiceless dead of a body with no player.") - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a [soon_to_be_ghoul.real_name], a voiceless dead?", check_jobban = ROLE_HERETIC, role = ROLE_HERETIC, poll_time = 5 SECONDS, target_mob = soon_to_be_ghoul, pic_source = soon_to_be_ghoul, role_name_text = "voiceless dead") - if(!LAZYLEN(candidates)) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_danger(soon_to_be_ghoul.real_name)], a [span_notice("voiceless dead")]?", check_jobban = ROLE_HERETIC, role = ROLE_HERETIC, poll_time = 5 SECONDS, checked_target = soon_to_be_ghoul, alert_pic = mutable_appearance('icons/mob/human/human.dmi', "husk"), jump_target = soon_to_be_ghoul, role_name_text = "voiceless dead") + if(isnull(chosen_one)) loc.balloon_alert(user, "ritual failed, no ghosts!") return FALSE - - var/mob/dead/observer/chosen_candidate = pick(candidates) - message_admins("[key_name_admin(chosen_candidate)] has taken control of ([key_name_admin(soon_to_be_ghoul)]) to replace an AFK player.") + message_admins("[key_name_admin(chosen_one)] has taken control of ([key_name_admin(soon_to_be_ghoul)]) to replace an AFK player.") soon_to_be_ghoul.ghostize(FALSE) - soon_to_be_ghoul.key = chosen_candidate.key + soon_to_be_ghoul.key = chosen_one.key selected_atoms -= soon_to_be_ghoul make_ghoul(user, soon_to_be_ghoul) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 9f80f47b0ae..0727b86bb66 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -92,9 +92,12 @@ /datum/heretic_knowledge/key_ring name = "Key Keeper’s Burden" desc = "Allows you to transmute a wallet, an iron rod, and an ID card to create an Eldritch Card. \ - It functions the same as an ID Card, but attacking it with an ID card fuses it and gains its access. \ - You can use it in-hand to change its form to a card you fused. \ - Does not preserve the card used in the ritual." + Hit a pair of airlocks with it to create a pair of portals, which will teleport you between them, but teleport non-heretics randomly. \ + You can ctrl-click the card to invert this behavior for created portals. \ + Each card may only sustain a single pair of portals at the same time. \ + It also functions and appears the same as a regular ID Card. \ + Attacking it with a normal ID card consumes it and gains its access, and you can use it in-hand to change its appearance to a card you fused. \ + Does not preserve the card originally used in the ritual." gain_text = "The Keeper sneered. \"These plastic rectangles are a mockery of keys, and I curse every door that desires them.\"" required_atoms = list( /obj/item/storage/wallet = 1, @@ -186,7 +189,8 @@ desc = "The ascension ritual of the Path of Knock. \ Bring 3 corpses without organs in their torso to a transmutation rune to complete the ritual. \ When completed, you gain the ability to transform into empowered eldritch creatures \ - and in addition, create a tear to the Labyrinth's heart; \ + and your keyblades will become even deadlier. \ + In addition, you will create a tear to the Labyrinth's heart; \ a tear in reality located at the site of this ritual. \ Eldritch creatures will endlessly pour from this rift \ who are bound to obey your instructions." diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index d7d1bd3bf22..723599ad262 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -45,8 +45,8 @@ /datum/heretic_knowledge/moon_grasp name = "Grasp of Lunacy" - desc = "Your Mansus Grasp will cause them to hallucinate everyone as lunar mass, \ - and hides your identity for a short dur ation." + 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." next_knowledge = list(/datum/heretic_knowledge/spell/moon_smile) cost = 1 @@ -85,9 +85,8 @@ /datum/heretic_knowledge/mark/moon_mark name = "Mark of Moon" - desc = "Your Mansus Grasp now applies the Mark of Moon. The mark is triggered from an attack with your Moon Blade. \ - When triggered, the victim is confused, and when the mark is applied they are pacified \ - until attacked." + 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." @@ -112,9 +111,9 @@ /datum/heretic_knowledge/moon_amulette name = "Moonlight Amulette" - desc = "Allows you to transmute 2 sheets of glass, a heart and a tie \ - if the item is used on someone with low sanity they go berserk attacking everyone \ - , if their sanity isnt low enough it decreases their mood." + desc = "Allows you to transmute 2 sheets of glass, a heart and a tie to create a Moonlight Amulette. \ + 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." gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/moon, @@ -153,9 +152,9 @@ /datum/heretic_knowledge/spell/moon_ringleader name = "Ringleaders Rise" - desc = "Grants you Ringleaders Rise, an aoe spell that deals more brain damage the lower the sanity of everyone in the AoE,\ - causes hallucinations with those who have less sanity getting more. \ - If their sanity is low enough turns them insane, the spell then halves their sanity." + desc = "Grants you Ringleaders Rise, an AoE spell that deals more brain damage the lower the sanity of everyone in the AoE \ + and causes hallucinations, with those who have less sanity getting more. \ + If their sanity is low enough this turns them insane, the spell then halves their sanity." gain_text = "I grabbed his hand and we rose, those who saw the truth rose with us. \ The ringleader pointed up and the dim light of truth illuminated us further." next_knowledge = list( @@ -170,8 +169,8 @@ 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. \ + 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. \ 1/5th of the crew will turn into acolytes and follow your command, they will all recieve moonlight amulettes." 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 \ diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm index 4ce8f9de9c9..a4810c706c1 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm @@ -21,7 +21,7 @@ name = "Curse of Paralysis" desc = "Allows you to transmute a hatchet and both a left and right leg to cast a curse of immobility on a crew member. \ While cursed, the victim will be unable to walk. You can additionally supply an item that a victim has touched \ - or is covered in the victim's blood to empower the curse." + or is covered in the victim's blood to make the curse last longer." gain_text = "The flesh of humanity is weak. Make them bleed. Show them their fragility." next_knowledge = list( /datum/heretic_knowledge/mad_mask, @@ -58,8 +58,8 @@ /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 Man. \ - Ash Men have a short range jaunt and the ability to cause bleeding in foes at range. \ + 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." next_knowledge = list( diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm index 470d98e178b..14a003ce11c 100644 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm @@ -36,8 +36,9 @@ /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 bolt or unbolt nearby doors \ - when landing on tails. If the coin gets inserted into an airlock it emags the door destroying the 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." next_knowledge = list( /datum/heretic_knowledge/spell/cosmic_expansion, diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm index e2825c6db28..74013f2b0bd 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm @@ -2,7 +2,8 @@ /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." + 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." next_knowledge = list( /datum/heretic_knowledge/summon/raw_prophet, diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm index 737e0f08f40..f1dd564310b 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm @@ -16,10 +16,10 @@ /datum/heretic_knowledge/unfathomable_curio name = "Unfathomable Curio" - desc = "Allows you to transmute 3 rods, a brain and a belt into an Unfathomable Curio\ - , a belt that can hold blades and items for rituals. Whilst worn will also \ + 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. When examined the examiner will suffer brain damage and blindness." + outside of combat." gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." next_knowledge = list( /datum/heretic_knowledge/spell/burglar_finesse, @@ -38,12 +38,12 @@ name = "Unsealed Arts" desc = "Allows you to transmute a canvas and an additional item to create a piece of art, these paintings \ have different effects depending on the additional item added. Possible paintings: \ - The sister and He Who Wept: Eyes. When a non-heretic looks at the painting they will begin to hallucinate everyone as heretics. \ - The First Desire: Any bodypart. Increases the hunger of non-heretics, when examined drops an organ or body part at your feet. \ - Great chaparral over rolling hills: Any grown food. Spreads kudzu when placed, when examined grants a flower. \ - Lady out of gates: Gloves. Causes non-heretics to scratch themselves, when examined removes all your mutations. \ - Climb over the rusted mountain: Trash. Causes non-heretics to rust the floor they walk on. \ - These effects are mitigated for a few minutes when a non-heretic suffering an effect examines the painting that caused the effect." + The sister and He Who Wept: Eyes. Clears your own mind, but curses non-heretics with hallucinations. \ + The First Desire: Any bodypart. Supplies you with random organs, but curses non-heretics with a hunger for flesh. \ + Great chaparral over rolling hills: Any grown food. Spreads kudzu when placed and examined by non-heretics. Also supplies you with poppies and harebells. \ + Lady out of gates: Gloves. Clears your mutations, but mutates non-heretics and curses them with scratching. \ + Climb over the rusted mountain: Trash. Curses non-heretics to rust the floor they walk on. \ + Non-heretics can counter most of these effects by examining one of these paintings." gain_text = "A wind of inspiration blows through me, past the walls and past the gate inspirations lie, yet to be depicted. \ They yearn for mortal eyes again, and I shall grant that wish." next_knowledge = list( diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 2dbb44ea4eb..3d326b4a9af 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -44,7 +44,7 @@ name = "Curse of Corrosion" desc = "Allows you to transmute wirecutters, a pool of vomit, and a heart to cast a curse of sickness on a crew member. \ While cursed, the victim will repeatedly vomit while their organs will take constant damage. You can additionally supply an item \ - that a victim has touched or is covered in the victim's blood to empower the curse." + that a victim has touched or is covered in the victim's blood to make the curse last longer." gain_text = "The body of humanity is temporary. Their weaknesses cannot be stopped, like iron falling to rust. Show them all." next_knowledge = list( /datum/heretic_knowledge/spell/area_conversion, diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index 643fd434af7..e044eee8619 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -144,7 +144,8 @@ 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." + 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." next_knowledge = list( diff --git a/code/modules/antagonists/heretic/magic/apetravulnera.dm b/code/modules/antagonists/heretic/magic/apetravulnera.dm index 801104dddf9..e80d0891184 100644 --- a/code/modules/antagonists/heretic/magic/apetravulnera.dm +++ b/code/modules/antagonists/heretic/magic/apetravulnera.dm @@ -5,7 +5,7 @@ background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' - button_icon_state = "cleave" + button_icon_state = "apetra_vulnera" school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS @@ -23,7 +23,7 @@ /datum/action/cooldown/spell/pointed/apetra_vulnera/cast(mob/living/carbon/human/cast_on) . = ..() - + if(IS_HERETIC_OR_MONSTER(cast_on)) return FALSE @@ -44,7 +44,7 @@ a_limb_got_damaged = TRUE var/datum/wound/slash/crit_wound = new wound_type() crit_wound.apply_wound(bodypart) - + if(!a_limb_got_damaged) var/datum/wound/slash/crit_wound = new wound_type() crit_wound.apply_wound(pick(cast_on.bodyparts)) @@ -53,7 +53,7 @@ span_danger("[cast_on]'s scratches and bruises are torn open by an unholy force!"), span_danger("Your scratches and bruises are torn open by some horrible unholy force!") ) - + new /obj/effect/temp_visual/cleave(get_turf(cast_on)) return TRUE diff --git a/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm index 18e8d26fecc..e792dc116da 100644 --- a/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm +++ b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm @@ -6,6 +6,8 @@ cooldown_time = 20 SECONDS convert_damage = FALSE die_with_shapeshifted_form = FALSE + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "lock_ascension" possible_shapes = list( /mob/living/basic/heretic_summon/ash_spirit, /mob/living/basic/heretic_summon/raw_prophet/ascended, diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm index 29fcecf076f..86ff2850019 100644 --- a/code/modules/antagonists/heretic/magic/caretaker.dm +++ b/code/modules/antagonists/heretic/magic/caretaker.dm @@ -6,8 +6,8 @@ and you can be removed from it upon contact with antimagical artifacts." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "ninja_cloak" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "caretaker" sound = 'sound/effects/curse2.ogg' school = SCHOOL_FORBIDDEN diff --git a/code/modules/antagonists/heretic/magic/cosmic_runes.dm b/code/modules/antagonists/heretic/magic/cosmic_runes.dm index 5115a2181fa..207b60ae939 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_runes.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_runes.dm @@ -1,6 +1,7 @@ /datum/action/cooldown/spell/cosmic_rune name = "Cosmic Rune" - desc = "Creates a cosmic rune at your position, only two can exist at a time. Invoking one rune transports you to the other." + desc = "Creates a cosmic rune at your position, only two can exist at a time. Invoking one rune transports you to the other. \ + Anyone with a star mark gets transported along with you." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -112,7 +113,7 @@ var/oldcolor = rgb(255, 255, 255) color = rgb(150, 50, 200) animate(src, color = oldcolor, time = 5) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 5) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 0.5 SECONDS) /// For linking a new rune /obj/effect/cosmic_rune/proc/link_rune(datum/weakref/new_rune) diff --git a/code/modules/antagonists/heretic/magic/fire_blast.dm b/code/modules/antagonists/heretic/magic/fire_blast.dm index 1d2d7daaceb..f76a1f18d17 100644 --- a/code/modules/antagonists/heretic/magic/fire_blast.dm +++ b/code/modules/antagonists/heretic/magic/fire_blast.dm @@ -31,7 +31,7 @@ /datum/action/cooldown/spell/charged/beam/fire_blast/send_beam(atom/origin, mob/living/carbon/to_beam, bounces = 4) // 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/fire) + origin.Beam(to_beam, icon_state = "solar_beam", time = beam_duration, beam_type = /obj/effect/ebeam/reacting/fire) // If they block the magic, the chain wont necessarily stop, // but likely will (due to them not catching on fire) @@ -141,25 +141,11 @@ owner.adjustStaminaLoss(2 * tick_damage * seconds_between_ticks) // The beam fireblast spits out, causes people to walk through it to be on fire -/obj/effect/ebeam/fire +/obj/effect/ebeam/reacting/fire name = "fire beam" -/obj/effect/ebeam/fire/Initialize(mapload) +/obj/effect/ebeam/reacting/fire/beam_entered(atom/movable/entered) . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - - if(!isturf(loc) || mapload) // idk if this would ever be maploaded but you never know - return - - for(var/mob/living/living_mob in loc) - on_entered(entered = living_mob) - -/obj/effect/ebeam/fire/proc/on_entered(datum/source, atom/movable/entered) - SIGNAL_HANDLER - if(!isliving(entered)) return var/mob/living/living_entered = entered diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index 12b3fcfbcaf..898b1a63fa6 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -211,7 +211,7 @@ carbon_victim.emote("scream") // We need to wait for the spell to actually finish casting to put the organ in their hands, hence, 1 ms timer. - addtimer(CALLBACK(caster, TYPE_PROC_REF(/mob, put_in_hands), picked_organ), 1) + addtimer(CALLBACK(caster, TYPE_PROC_REF(/mob, put_in_hands), picked_organ), 0.1 SECONDS) return TRUE /// Extra checks ran while we're extracting an organ to make sure we can continue to do. diff --git a/code/modules/antagonists/heretic/magic/manse_link.dm b/code/modules/antagonists/heretic/magic/manse_link.dm index 565e7e683eb..06fd4dd9863 100644 --- a/code/modules/antagonists/heretic/magic/manse_link.dm +++ b/code/modules/antagonists/heretic/magic/manse_link.dm @@ -55,7 +55,7 @@ to_chat(owner, span_notice("You begin linking [linkee]'s mind to yours...")) to_chat(linkee, span_warning("You feel your mind being pulled somewhere... connected... intertwined with the very fabric of reality...")) - if(!do_after(owner, link_time, linkee)) + if(!do_after(owner, link_time, linkee, hidden = TRUE)) to_chat(owner, span_warning("You fail to link to [linkee]'s mind.")) to_chat(linkee, span_warning("The foreign presence leaves your mind.")) return FALSE diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm index eaf9e08b969..c5a6e74452a 100644 --- a/code/modules/antagonists/heretic/magic/mind_gate.dm +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -24,7 +24,7 @@ /datum/action/cooldown/spell/pointed/mind_gate/is_valid_target(atom/cast_on) return ..() && ishuman(cast_on) -/datum/action/cooldown/spell/pointed/mind_gate/cast(mob/living/carbon/human/cast_on, mob/living/carbon/human/owner) +/datum/action/cooldown/spell/pointed/mind_gate/cast(mob/living/carbon/human/cast_on) . = ..() if(cast_on.can_block_magic(antimagic_flags)) to_chat(cast_on, span_notice("Your mind feels closed.")) @@ -36,4 +36,6 @@ 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) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 140) + + var/mob/living/living_owner = owner + living_owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 140) diff --git a/code/modules/antagonists/heretic/magic/mirror_walk.dm b/code/modules/antagonists/heretic/magic/mirror_walk.dm index 0bc9b059020..b9029e1ab07 100644 --- a/code/modules/antagonists/heretic/magic/mirror_walk.dm +++ b/code/modules/antagonists/heretic/magic/mirror_walk.dm @@ -64,7 +64,7 @@ jaunter.Beam(nearby_reflection, icon_state = "light_beam", time = phase_out_time) nearby_reflection.visible_message(span_warning("[nearby_reflection] begins to shimmer and shake slightly!")) - if(!do_after(jaunter, phase_out_time, nearby_reflection, IGNORE_USER_LOC_CHANGE|IGNORE_INCAPACITATED)) + if(!do_after(jaunter, phase_out_time, nearby_reflection, IGNORE_USER_LOC_CHANGE|IGNORE_INCAPACITATED, hidden = TRUE)) return playsound(jaunter, 'sound/magic/ethereal_enter.ogg', 50, TRUE, -1) @@ -96,7 +96,7 @@ nearby_reflection.Beam(phase_turf, icon_state = "light_beam", time = phase_in_time) nearby_reflection.visible_message(span_warning("[nearby_reflection] begins to shimmer and shake slightly!")) - if(!do_after(unjaunter, phase_in_time, nearby_reflection)) + if(!do_after(unjaunter, phase_in_time, nearby_reflection, hidden = TRUE)) return FALSE // We can move around while phasing in, but we'll always end up where we started it. diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm index 409e55bf926..3b7f1d007cd 100644 --- a/code/modules/antagonists/heretic/magic/moon_parade.dm +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/spell/pointed/projectile/moon_parade name = "Lunar parade" - desc = "This unleashes the parade towards a target." + desc = "This unleashes the parade, making everyone in its way join it and suffer hallucinations." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index 45d3285a876..3c0b1d2aedb 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -1,7 +1,8 @@ /datum/action/cooldown/spell/aoe/moon_ringleader name = "Ringleaders Rise" - desc = "Big AoE spell that deals more brain damage the lower the sanity of everyone in the AoE and it also causes hallucinations with those who have less sanity getting more. \ - If their sanity is low enough they snap and go insane, the spell then halves their sanity." + 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." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 893059721c4..90a392691e9 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -28,7 +28,8 @@ /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/moon_smile_duration = (150 - cast_on.mob_mood.sanity) / 10 + 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.")) @@ -40,7 +41,8 @@ cast_on.set_eye_blur_if_lower(moon_smile_duration + 7 SECONDS) var/obj/item/organ/internal/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) - ears?.adjustEarDamage(0, moon_smile_duration + 2 SECONDS) + //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 + 2 SECONDS) / (2 SECONDS)) cast_on.adjust_silence(moon_smile_duration + 5 SECONDS) cast_on.AdjustKnockdown(2 SECONDS) diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm index 64638d7103b..4e37f5db17f 100644 --- a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/spell/aoe/fiery_rebirth name = "Nightwatcher's Rebirth" - desc = "A spell that extinguishes you drains nearby heathens engulfed in flames of their life force, \ + desc = "A spell that extinguishes you and drains nearby heathens engulfed in flames of their life force, \ healing you for each victim drained. Those in critical condition \ will have the last of their vitality drained, killing them." background_icon_state = "bg_heretic" diff --git a/code/modules/antagonists/heretic/magic/rust_charge.dm b/code/modules/antagonists/heretic/magic/rust_charge.dm index d5427cf3762..56054bd56fd 100644 --- a/code/modules/antagonists/heretic/magic/rust_charge.dm +++ b/code/modules/antagonists/heretic/magic/rust_charge.dm @@ -1,7 +1,9 @@ // Rust charge, a charge action that can only be started on rust (and only destroys rust tiles) /datum/action/cooldown/mob_cooldown/charge/rust name = "Rust Charge" - desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge. As it is the rust that empoweres you for this ability, no focus is needed" + desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, \ + will deal high damage to others and rust around you during the charge. \ + As it is the rust that empowers you with this ability, no focus is needed." charge_distance = 10 charge_damage = 50 cooldown_time = 45 SECONDS diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 212e90535d6..48fdf2f2693 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/spell/pointed/projectile/star_blast name = "Star Blast" - desc = "This spell fires a disk with cosmic energies at a target." + desc = "This spell fires a disk with cosmic energies at a target, spreading the star mark." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index 9037d07295a..89c5d02e7d4 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -1,7 +1,8 @@ /datum/action/cooldown/spell/touch/star_touch name = "Star Touch" - desc = "Marks someone with a star mark or puts someone with a star mark to sleep for 4 seconds, removing the star mark. \ - You and your target are linked with a cosmic ray, burning them for up to a minute, or \ + 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." background_icon_state = "bg_heretic" diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 607f485ff64..1ec0df389fc 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -192,7 +192,7 @@ qdel(to_remove) - addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_BEING_BLADE_SHIELDED, type), 1) + addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_BEING_BLADE_SHIELDED, type), 0.1 SECONDS) return SUCCESSFUL_BLOCK diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 08839fa8f10..7037d1cc377 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -280,7 +280,7 @@ /datum/status_effect/moon_converted/on_remove() // Span warning and unconscious so they realize they aren't evil anymore - to_chat(owner, span_warning("Your mind is cleared from the effect of the manus, your alligiences are as they were before")) + to_chat(owner, span_warning("Your mind is cleared from the effect of the mansus, your alligiences are as they were before")) REMOVE_TRAIT(owner, TRAIT_MUTE, REF(src)) owner.AdjustUnconscious(5 SECONDS, ignore_canstun = FALSE) owner.log_message("[owner] is no longer insane.", LOG_GAME) diff --git a/code/modules/antagonists/heretic/structures/lock_final.dm b/code/modules/antagonists/heretic/structures/lock_final.dm index 8cb6c06f3cb..759bc8aa55e 100644 --- a/code/modules/antagonists/heretic/structures/lock_final.dm +++ b/code/modules/antagonists/heretic/structures/lock_final.dm @@ -37,7 +37,7 @@ /// Ask ghosts if they want to make some noise /obj/structure/lock_tear/proc/poll_ghosts() - var/list/candidates = SSpolling.poll_ghost_candidates("Would you like to be a random eldritch monster attacking the crew?", check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_HERETIC_MONSTER, pic_source = src, role_name_text = "eldritch monster") + var/list/candidates = SSpolling.poll_ghost_candidates("Would you like to be a random [span_notice("eldritch monster")] attacking the crew?", check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_HERETIC_MONSTER, alert_pic = src, role_name_text = "eldritch monster") while(LAZYLEN(candidates)) var/mob/dead/observer/candidate = pick_n_take(candidates) ghost_to_monster(candidate, should_ask = FALSE) diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index 7c1208b1e44..8e5410f0f67 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -21,8 +21,7 @@ . = ..() break_message = span_warning("[src] falls apart with a thud!") -/obj/structure/destructible/eldritch_crucible/deconstruct(disassembled = TRUE) - +/obj/structure/destructible/eldritch_crucible/atom_deconstruct(disassembled = TRUE) // Create a spillage if we were destroyed with leftover mass if(current_mass) break_message = span_warning("[src] falls apart with a thud, spilling shining extract everywhere!") diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index fc17b6924df..099ed86044e 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -166,7 +166,8 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/nuke_station name = "Doomsday Device" desc = "Activates the doomsday device. This is not reversible." - button_icon_state = "doomsday_device" + button_icon = 'icons/obj/machines/nuke_terminal.dmi' + button_icon_state = "nuclearbomb_timing" auto_use_uses = FALSE /datum/action/innate/ai/nuke_station/Activate() @@ -598,6 +599,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/honk name = "Percussive Intercomm Interference" desc = "Rock the station's intercom system with an obnoxious HONK!" + button_icon = 'icons/obj/machines/wallmounts.dmi' button_icon_state = "intercom" uses = 2 @@ -686,7 +688,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) I.loc = T client.images += I I.icon_state = "[success ? "green" : "red"]Overlay" //greenOverlay and redOverlay for success and failure respectively - addtimer(CALLBACK(src, PROC_REF(remove_transformer_image), client, I, T), 30) + addtimer(CALLBACK(src, PROC_REF(remove_transformer_image), client, I, T), 3 SECONDS) if(!success) to_chat(src, span_warning("[alert_msg]")) return success @@ -705,7 +707,8 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/break_air_alarms name = "Override Air Alarm Safeties" desc = "Enables extremely dangerous settings on all air alarms." - button_icon_state = "break_air_alarms" + button_icon = 'icons/obj/machines/wallmounts.dmi' + button_icon_state = "alarmx" uses = 1 /datum/action/innate/ai/break_air_alarms/Activate() @@ -761,7 +764,8 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/emergency_lights name = "Disable Emergency Lights" desc = "Disables all emergency lighting. Note that emergency lights can be restored through reboot at an APC." - button_icon_state = "emergency_lights" + button_icon = 'icons/obj/lighting.dmi' + button_icon_state = "floor_emergency" uses = 1 /datum/action/innate/ai/emergency_lights/Activate() @@ -801,7 +805,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) if(!uses) break - if(!C.status || C.view_range != initial(C.view_range)) + if(!C.camera_enabled || C.view_range != initial(C.view_range)) C.toggle_cam(owner_AI, 0) //Reactivates the camera based on status. Badly named proc. C.view_range = initial(C.view_range) fixed_cameras++ @@ -831,10 +835,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) var/upgraded_cameras = 0 for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) - var/obj/structure/camera_assembly/assembly = camera.assembly_ref?.resolve() - if(!assembly) - continue - var/upgraded = FALSE if(!camera.isXRay()) @@ -867,7 +867,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/ai_module/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_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) + turret.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) 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_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index fd80b3ea3ef..ec07639cb44 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -73,7 +73,7 @@ if(has_crit) return has_crit = TRUE - add_filter("crit_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5)) + add_filter("crit_glow", 3, list("type" = "outline", "color" = COLOR_CARP_RIFT_RED, "size" = 5)) if(ismob(loc)) loc.balloon_alert(loc, "critical strike ready") diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index c06f1e322a2..576b911652f 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -68,7 +68,7 @@ icon_state = "demon_heart-on" base_icon_state = "demon_heart" visual = TRUE - color = "#1C1C1C" + color = COLOR_CRAYON_BLACK decay_factor = 0 /// How many life ticks in the dark the owner has been dead for. Used for nightmare respawns. var/respawn_progress = 0 diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 068bb2b6c5c..38db2dfae86 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -39,7 +39,6 @@ . = ..() C.fully_replace_character_name(null, pick(GLOB.nightmare_names)) - C.set_safe_hunger_level() /datum/species/shadow/nightmare/check_roundstart_eligible() return FALSE diff --git a/code/modules/antagonists/ninja/ninjaDrainAct.dm b/code/modules/antagonists/ninja/ninjaDrainAct.dm index ac5b960e3f0..c50df819e0d 100644 --- a/code/modules/antagonists/ninja/ninjaDrainAct.dm +++ b/code/modules/antagonists/ninja/ninjaDrainAct.dm @@ -32,7 +32,7 @@ if(hacking_module.mod.get_charge() + drain > hacking_module.mod.get_max_charge()) drain = hacking_module.mod.get_max_charge() - hacking_module.mod.get_charge() maxcapacity = TRUE//Reached maximum battery capacity. - if (do_after(ninja, 1 SECONDS, target = src)) + if (do_after(ninja, 1 SECONDS, target = src, hidden = TRUE)) spark_system.start() playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) cell.use(drain) @@ -68,7 +68,7 @@ if(hacking_module.mod.get_charge() + drain > hacking_module.mod.get_max_charge()) drain = hacking_module.mod.get_max_charge() - hacking_module.mod.get_charge() maxcapacity = TRUE - if (do_after(ninja, 1 SECONDS, target = src)) + if (do_after(ninja, 1 SECONDS, target = src, hidden = TRUE)) spark_system.start() playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) charge -= drain @@ -88,7 +88,7 @@ /obj/item/stock_parts/cell/proc/ninjadrain_charge(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) var/drain_total = 0 - if(charge && !do_after(ninja, 3 SECONDS, target = src)) + if(charge && !do_after(ninja, 3 SECONDS, target = src, hidden = TRUE)) drain_total = charge if(hacking_module.mod.get_charge() + charge > hacking_module.mod.get_max_charge()) drain_total = hacking_module.mod.get_max_charge() - hacking_module.mod.get_charge() @@ -112,7 +112,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN /obj/machinery/rnd/server/master/ninjadrain_charge(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) - if(!do_after(ninja, 30 SECONDS, target = src)) + if(!do_after(ninja, 30 SECONDS, target = src, hidden = TRUE)) return overload_source_code_hdd() to_chat(ninja, span_notice("Sabotage complete. Storage device overloaded.")) @@ -131,7 +131,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN /obj/machinery/rnd/server/proc/ninjadrain_charge(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) - if(!do_after(ninja, 30 SECONDS, target = src)) + if(!do_after(ninja, 30 SECONDS, target = src, hidden = TRUE)) return stored_research.modify_points_all(0) to_chat(ninja, span_notice("Sabotage complete. Research notes corrupted.")) @@ -154,7 +154,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN /obj/machinery/computer/records/security/proc/ninjadrain_charge(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) - if(!do_after(ninja, 20 SECONDS, src, extra_checks = CALLBACK(src, PROC_REF(can_hack), ninja))) + if(!do_after(ninja, 20 SECONDS, src, extra_checks = CALLBACK(src, PROC_REF(can_hack), ninja), hidden = TRUE)) return for(var/datum/record/crew/target in GLOB.manifest.general) target.wanted_status = WANTED_ARREST @@ -230,7 +230,7 @@ while(!maxcapacity && src) drain = (round((rand(hacking_module.mindrain, hacking_module.maxdrain))/2)) var/drained = 0 - if(wire_powernet && do_after(ninja, 1 SECONDS, target = src)) + if(wire_powernet && do_after(ninja, 1 SECONDS, target = src, hidden = TRUE)) drained = min(drain, delayed_surplus()) add_delayedload(drained) if(drained < drain)//if no power on net, drain apcs @@ -270,7 +270,7 @@ if(hacking_module.mod.get_charge() + drain > hacking_module.mod.get_max_charge()) drain = hacking_module.mod.get_max_charge() - hacking_module.mod.get_charge() maxcapacity = TRUE - if (do_after(ninja, 1 SECONDS, target = src)) + if (do_after(ninja, 1 SECONDS, target = src, hidden = TRUE)) spark_system.start() playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) cell.use(drain) @@ -296,7 +296,7 @@ modelselected["Medical"] = "/obj/item/robot_model/ninja/ninja_medical" modelselected["Saboteur"] = "/obj/item/robot_model/ninja_saboteur" //SKYRAT EDIT: ADDITION END - if(!do_after(ninja, 6 SECONDS, target = src)) + if(!do_after(ninja, 6 SECONDS, target = src, hidden = TRUE)) return spark_system.start() playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) @@ -324,7 +324,7 @@ /mob/living/carbon/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) if(!ninja || !hacking_module) return NONE - //Default cell = 10,000 charge, 10,000/1000 = 10 uses without charging/upgrading + //20 uses for a standard cell. 200 for high capacity cells. if(hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN*10)) //Got that electric touch var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() @@ -353,7 +353,7 @@ //BOTS// /mob/living/simple_animal/bot/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) to_chat(src, span_boldwarning("Your circutry suddenly begins heating up!")) - if(!do_after(ninja, 1.5 SECONDS, target = src)) + if(!do_after(ninja, 1.5 SECONDS, target = src, hidden = TRUE)) return COMPONENT_CANCEL_ATTACK_CHAIN if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 7)) @@ -379,7 +379,7 @@ balloon_alert(ninja, "no energy!") return COMPONENT_CANCEL_ATTACK_CHAIN - if(!do_after(ninja, 1.5 SECONDS, target = src)) + if(!do_after(ninja, 1.5 SECONDS, target = src, hidden = TRUE)) return COMPONENT_CANCEL_ATTACK_CHAIN hacking_module.mod.add_charge(cell.charge) @@ -396,7 +396,7 @@ balloon_alert(ninja, "already hacked!") return COMPONENT_CANCEL_ATTACK_CHAIN - if(!do_after(ninja, 2 SECONDS, target = src)) + if(!do_after(ninja, 2 SECONDS, target = src, hidden = TRUE)) return COMPONENT_CANCEL_ATTACK_CHAIN if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) @@ -414,7 +414,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN AI_notify_hack() - if(!do_after(ninja, 30 SECONDS, target = src)) + if(!do_after(ninja, 30 SECONDS, target = src, hidden = TRUE)) return COMPONENT_CANCEL_ATTACK_CHAIN do_sparks(3, cardinal_only = FALSE, source = src) @@ -428,7 +428,7 @@ balloon_alert(ninja, "already hacked!") return COMPONENT_CANCEL_ATTACK_CHAIN - if(!do_after(ninja, 2 SECONDS, target = src)) + if(!do_after(ninja, 2 SECONDS, target = src, hidden = TRUE)) return COMPONENT_CANCEL_ATTACK_CHAIN do_sparks(3, cardinal_only = FALSE, source = src) @@ -449,7 +449,7 @@ AI_notify_hack() - if(!do_after(ninja, 20 SECONDS, target = src)) //Shorter due to how incredibly easy it is for someone to (even accidentally) interrupt. + if(!do_after(ninja, 20 SECONDS, target = src, hidden = TRUE)) //Shorter due to how incredibly easy it is for someone to (even accidentally) interrupt. return COMPONENT_CANCEL_ATTACK_CHAIN force_event(/datum/round_event_control/tram_malfunction, "ninja interference") diff --git a/code/modules/antagonists/nukeop/datums/operative.dm b/code/modules/antagonists/nukeop/datums/operative.dm new file mode 100644 index 00000000000..3b4c9fa4da7 --- /dev/null +++ b/code/modules/antagonists/nukeop/datums/operative.dm @@ -0,0 +1,212 @@ +/datum/antagonist/nukeop + name = ROLE_NUCLEAR_OPERATIVE + roundend_category = "syndicate operatives" //just in case + antagpanel_category = ANTAG_GROUP_SYNDICATE + job_rank = ROLE_OPERATIVE + antag_hud_name = "synd" + antag_moodlet = /datum/mood_event/focused + show_to_ghosts = TRUE + hijack_speed = 2 //If you can't take out the station, take the shuttle instead. + suicide_cry = "FOR THE SYNDICATE!!" + /// Which nukie team are we on? + var/datum/team/nuclear/nuke_team + /// If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. + var/always_new_team = FALSE + /// Should the user be moved to default spawnpoint after being granted this datum. + var/send_to_spawnpoint = TRUE + /// The DEFAULT outfit we will give to players granted this datum + var/nukeop_outfit = /datum/outfit/syndicate + + preview_outfit = /datum/outfit/nuclear_operative_elite + + /// In the preview icon, the nukies who are behind the leader + var/preview_outfit_behind = /datum/outfit/nuclear_operative + /// In the preview icon, a nuclear fission explosive device, only appearing if there's an icon state for it. + var/nuke_icon_state = "nuclearbomb_base" + + /// The amount of discounts that the team get + var/discount_team_amount = 5 + /// The amount of limited discounts that the team get + var/discount_limited_amount = 10 + +/datum/antagonist/nukeop/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) + to_chat(owner, span_big("You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!")) + owner.announce_objectives() + +/datum/antagonist/nukeop/on_gain() + give_alias() + forge_objectives() + . = ..() + equip_op() + if(send_to_spawnpoint) + move_to_spawnpoint() + // grant extra TC for the people who start in the nukie base ie. not the lone op + var/extra_tc = CEILING(GLOB.joined_player_list.len/5, 5) + var/datum/component/uplink/uplink = owner.find_syndicate_uplink() + if (uplink) + uplink.uplink_handler.add_telecrystals(extra_tc) + var/datum/component/uplink/uplink = owner.find_syndicate_uplink() + if(uplink) + var/datum/team/nuclear/nuke_team = get_team() + if(!nuke_team.team_discounts) + var/list/uplink_items = list() + for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) + if(item.item && !item.cant_discount && (item.purchasable_from & uplink.uplink_handler.uplink_flag) && item.cost > 1) + uplink_items += item + nuke_team.team_discounts = list() + nuke_team.team_discounts += create_uplink_sales(discount_team_amount, /datum/uplink_category/discount_team_gear, -1, uplink_items) + nuke_team.team_discounts += create_uplink_sales(discount_limited_amount, /datum/uplink_category/limited_discount_team_gear, 1, uplink_items) + uplink.uplink_handler.extra_purchasable += nuke_team.team_discounts + + memorize_code() + +/datum/antagonist/nukeop/get_team() + return nuke_team + +/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override) + add_team_hud(mob_override || owner.current, /datum/antagonist/nukeop) + +/datum/antagonist/nukeop/forge_objectives() + if(nuke_team) + objectives |= nuke_team.objectives + +/datum/antagonist/nukeop/leader/get_spawnpoint() + return pick(GLOB.nukeop_leader_start) + +/datum/antagonist/nukeop/create_team(datum/team/nuclear/new_team) + if(!new_team) + if(!always_new_team) + for(var/datum/antagonist/nukeop/N in GLOB.antagonists) + if(!N.owner) + stack_trace("Antagonist datum without owner in GLOB.antagonists: [N]") + continue + if(N.nuke_team) + nuke_team = N.nuke_team + return + nuke_team = new /datum/team/nuclear + nuke_team.update_objectives() + assign_nuke() //This is bit ugly + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + nuke_team = new_team + +/datum/antagonist/nukeop/admin_add(datum/mind/new_owner,mob/admin) + new_owner.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) + new_owner.add_antag_datum(src) + message_admins("[key_name_admin(admin)] has nuke op'ed [key_name_admin(new_owner)].") + log_admin("[key_name(admin)] has nuke op'ed [key_name(new_owner)].") + +/datum/antagonist/nukeop/get_admin_commands() + . = ..() + .["Send to base"] = CALLBACK(src, PROC_REF(admin_send_to_base)) + .["Tell code"] = CALLBACK(src, PROC_REF(admin_tell_code)) + +/datum/antagonist/nukeop/get_preview_icon() + if (!preview_outfit) + return null + + var/icon/final_icon = render_preview_outfit(preview_outfit) + + if (!isnull(preview_outfit_behind)) + var/icon/teammate = render_preview_outfit(preview_outfit_behind) + teammate.Blend(rgb(128, 128, 128, 128), ICON_MULTIPLY) + + final_icon.Blend(teammate, ICON_UNDERLAY, -world.icon_size / 4, 0) + final_icon.Blend(teammate, ICON_UNDERLAY, world.icon_size / 4, 0) + + if (!isnull(nuke_icon_state)) + var/icon/nuke = icon('icons/obj/machines/nuke.dmi', nuke_icon_state) + nuke.Shift(SOUTH, 6) + final_icon.Blend(nuke, ICON_OVERLAY) + + return finish_preview_icon(final_icon) + +/datum/antagonist/nukeop/proc/equip_op() + if(!ishuman(owner.current)) + return + + var/mob/living/carbon/human/operative = owner.current + ADD_TRAIT(operative, TRAIT_NOFEAR_HOLDUPS, 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 + + // If our nuke_ops_species pref is set to TRUE, (or we have no client) make us a human + if(isnull(operative.client) || operative.client.prefs.read_preference(/datum/preference/toggle/nuke_ops_species)) + operative.set_species(/datum/species/human) + + operative.equip_species_outfit(nukeop_outfit) + + return TRUE + +/datum/antagonist/nukeop/proc/admin_send_to_base(mob/admin) + owner.current.forceMove(pick(GLOB.nukeop_start)) + +/datum/antagonist/nukeop/proc/admin_tell_code(mob/admin) + var/code + for (var/obj/machinery/nuclearbomb/bombue as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) + if (length(bombue.r_code) <= 5 && bombue.r_code != initial(bombue.r_code)) + code = bombue.r_code + break + if (code) + antag_memory += "Syndicate Nuclear Bomb Code: [code]
" + to_chat(owner.current, "The nuclear authorization code is: [code]") + else + to_chat(admin, span_danger("No valid nuke found!")) + +/datum/antagonist/nukeop/proc/assign_nuke() + if(!nuke_team || nuke_team.tracked_nuke) + return + nuke_team.memorized_code = random_nukecode() + var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/syndicate) + if(!nuke) + stack_trace("Syndicate nuke not found during nuke team creation.") + nuke_team.memorized_code = null + return + nuke_team.tracked_nuke = nuke + if(nuke.r_code == NUKE_CODE_UNSET) + nuke.r_code = nuke_team.memorized_code + else //Already set by admins/something else? + nuke_team.memorized_code = nuke.r_code + for(var/obj/machinery/nuclearbomb/beer/beernuke as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/beer)) + beernuke.r_code = nuke_team.memorized_code + +/datum/antagonist/nukeop/proc/give_alias() + if(nuke_team?.syndicate_name) + var/mob/living/carbon/human/human_to_rename = owner.current + if(istype(human_to_rename)) // Reinforcements get a real name + var/first_name = owner.current.client?.prefs?.read_preference(/datum/preference/name/operative_alias) || pick(GLOB.operative_aliases) + var/chosen_name = "[first_name] [nuke_team.syndicate_name]" + human_to_rename.fully_replace_character_name(human_to_rename.real_name, chosen_name) + else + var/number = 1 + number = nuke_team.members.Find(owner) + owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" + +/datum/antagonist/nukeop/proc/memorize_code() + if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) + antag_memory += "[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]
" + owner.add_memory(/datum/memory/key/nuke_code, nuclear_code = nuke_team.memorized_code) + to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") + else + to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") + +/// Actually moves our nukie to where they should be +/datum/antagonist/nukeop/proc/move_to_spawnpoint() + // Ensure that the nukiebase is loaded, and wait for it if required + SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_NUKIEBASE) + var/turf/destination = get_spawnpoint() + owner.current.forceMove(destination) + if(!owner.current.onSyndieBase()) + message_admins("[ADMIN_LOOKUPFLW(owner.current)] is a NUKE OP and move_to_spawnpoint put them somewhere that isn't the syndie base, help please.") + stack_trace("Nuke op move_to_spawnpoint resulted in a location not on the syndicate base. (Was moved to: [destination])") + +/// Gets the position we spawn at +/datum/antagonist/nukeop/proc/get_spawnpoint() + var/team_number = 1 + if(nuke_team) + team_number = nuke_team.members.Find(owner) + + return GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1] diff --git a/code/modules/antagonists/nukeop/datums/operative_leader.dm b/code/modules/antagonists/nukeop/datums/operative_leader.dm new file mode 100644 index 00000000000..0c583bfe794 --- /dev/null +++ b/code/modules/antagonists/nukeop/datums/operative_leader.dm @@ -0,0 +1,55 @@ +/datum/antagonist/nukeop/leader + name = "Nuclear Operative Leader" + nukeop_outfit = /datum/outfit/syndicate/leader + always_new_team = TRUE + /// Randomly chosen honorific, for distinction + var/title + /// The nuclear challenge remote we will spawn this player with. + var/challengeitem = /obj/item/nuclear_challenge + +/datum/antagonist/nukeop/leader/memorize_code() + ..() + if(nuke_team?.memorized_code) + var/obj/item/paper/nuke_code_paper = new + nuke_code_paper.add_raw_text("The nuclear authorization code is: [nuke_team.memorized_code]") + nuke_code_paper.name = "nuclear bomb code" + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + nuke_code_paper.forceMove(get_turf(H)) + else + H.put_in_hands(nuke_code_paper, TRUE) + H.update_icons() + +/datum/antagonist/nukeop/leader/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) + to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for guiding the team and your ID is the only one who can open the launch bay doors.") + to_chat(owner, "If you feel you are not up to this task, give your ID and radio to another operative.") + if(!CONFIG_GET(flag/disable_warops)) + to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + owner.announce_objectives() + +/datum/antagonist/nukeop/leader/on_gain() + . = ..() + if(!CONFIG_GET(flag/disable_warops)) + var/mob/living/carbon/human/leader = owner.current + var/obj/item/war_declaration = new challengeitem(leader.drop_location()) + leader.put_in_hands(war_declaration) + nuke_team.war_button_ref = WEAKREF(war_declaration) + addtimer(CALLBACK(src, PROC_REF(nuketeam_name_assign)), 0.1 SECONDS) + +/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() + if(!nuke_team) + return + nuke_team.rename_team(ask_name()) + +/datum/antagonist/nukeop/leader/proc/ask_name() + var/randomname = pick(GLOB.last_names) + var/newname = tgui_input_text(owner.current, "You are the nuclear operative [title]. Please choose a last name for your family.", "Name change", randomname, MAX_NAME_LEN) + if (!newname) + newname = randomname + else + newname = reject_bad_name(newname) + if(!newname) + newname = randomname + + return capitalize(newname) diff --git a/code/modules/antagonists/nukeop/datums/operative_lone.dm b/code/modules/antagonists/nukeop/datums/operative_lone.dm new file mode 100644 index 00000000000..d0bc718a781 --- /dev/null +++ b/code/modules/antagonists/nukeop/datums/operative_lone.dm @@ -0,0 +1,22 @@ +/datum/antagonist/nukeop/lone + name = "Lone Operative" + always_new_team = TRUE + send_to_spawnpoint = FALSE //Handled by event + nukeop_outfit = /datum/outfit/syndicate/full + preview_outfit = /datum/outfit/nuclear_operative + preview_outfit_behind = null + nuke_icon_state = null + +/datum/antagonist/nukeop/lone/assign_nuke() + if(nuke_team && !nuke_team.tracked_nuke) + nuke_team.memorized_code = random_nukecode() + var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/selfdestruct) + if(nuke) + nuke_team.tracked_nuke = nuke + if(nuke.r_code == NUKE_CODE_UNSET) + nuke.r_code = nuke_team.memorized_code + else //Already set by admins/something else? + nuke_team.memorized_code = nuke.r_code + else + stack_trace("Station self-destruct not found during lone op team creation.") + nuke_team.memorized_code = null diff --git a/code/modules/antagonists/nukeop/datums/operative_reinforcement.dm b/code/modules/antagonists/nukeop/datums/operative_reinforcement.dm new file mode 100644 index 00000000000..eb386342c09 --- /dev/null +++ b/code/modules/antagonists/nukeop/datums/operative_reinforcement.dm @@ -0,0 +1,8 @@ +/datum/antagonist/nukeop/reinforcement + name = "Nuclear Operative Reinforcement" + show_in_antagpanel = FALSE + send_to_spawnpoint = FALSE + nukeop_outfit = /datum/outfit/syndicate/reinforcement + +/datum/antagonist/nukeop/reinforcement/cyborg + name = "Nuclear Operative Support Cyborg" diff --git a/code/modules/antagonists/nukeop/datums/operative_support.dm b/code/modules/antagonists/nukeop/datums/operative_support.dm new file mode 100644 index 00000000000..c9ea12b63c5 --- /dev/null +++ b/code/modules/antagonists/nukeop/datums/operative_support.dm @@ -0,0 +1,54 @@ +/datum/antagonist/nukeop/support + name = ROLE_OPERATIVE_OVERWATCH + show_to_ghosts = TRUE + send_to_spawnpoint = TRUE + nukeop_outfit = /datum/outfit/syndicate/support + +/datum/antagonist/nukeop/support/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/machines/printer.ogg', 100, 0, use_reverb = FALSE) + to_chat(owner, span_big("You are a [name]! You've been temporarily assigned to provide camera overwatch and manage communications for a nuclear operative team!")) + to_chat(owner, span_red("Use your tools to set up your equipment however you like, but do NOT attempt to leave your outpost.")) + owner.announce_objectives() + +/datum/antagonist/nukeop/support/on_gain() + ..() + for(var/datum/mind/teammate_mind in nuke_team.members) + var/mob/living/our_teammate = teammate_mind.current + our_teammate.AddComponent( \ + /datum/component/simple_bodycam, \ + camera_name = "operative bodycam", \ + c_tag = "[our_teammate.real_name]", \ + network = OPERATIVE_CAMERA_NET, \ + emp_proof = FALSE, \ + ) + our_teammate.playsound_local(get_turf(owner.current), 'sound/weapons/egloves.ogg', 100, 0) + to_chat(our_teammate, span_notice("A Syndicate Overwatch Intelligence Agent has been assigned to your team. Smile, you're on camera!")) + + RegisterSignal(nuke_team, COMSIG_NUKE_TEAM_ADDITION, PROC_REF(late_bodycam)) + + owner.current.grant_language(/datum/language/codespeak) + +/datum/antagonist/nukeop/support/get_spawnpoint() + return pick(GLOB.nukeop_overwatch_start) + +/datum/antagonist/nukeop/support/forge_objectives() + var/datum/objective/overwatch/objective = new + objective.owner = owner + objectives += objective + +/datum/antagonist/nukeop/support/proc/late_bodycam(datum/source, mob/living/new_teammate) + SIGNAL_HANDLER + new_teammate.AddComponent( \ + /datum/component/simple_bodycam, \ + camera_name = "operative bodycam", \ + c_tag = "[new_teammate.real_name]", \ + network = OPERATIVE_CAMERA_NET, \ + emp_proof = FALSE, \ + ) + to_chat(new_teammate, span_notice("You have been equipped with a bodycam, viewable by your Overwatch Intelligence Agent. Make sure to show them a good performance!")) + +/datum/objective/overwatch + explanation_text = "Provide intelligence support and overwatch to your operative team!" + +/datum/objective/overwatch/check_completion() + return GLOB.station_was_nuked diff --git a/code/modules/antagonists/nukeop/datums/operative_team.dm b/code/modules/antagonists/nukeop/datums/operative_team.dm new file mode 100644 index 00000000000..3345f3cf4d2 --- /dev/null +++ b/code/modules/antagonists/nukeop/datums/operative_team.dm @@ -0,0 +1,321 @@ +#define SPAWN_AT_BASE "Nuke base" +#define SPAWN_AT_INFILTRATOR "Infiltrator" + +/datum/team/nuclear + var/syndicate_name + var/obj/machinery/nuclearbomb/tracked_nuke + var/core_objective = /datum/objective/nuclear + var/memorized_code + var/list/team_discounts + var/datum/weakref/war_button_ref + +/datum/team/nuclear/New() + ..() + syndicate_name = syndicate_name() + +/datum/team/nuclear/roundend_report() + var/list/parts = list() + parts += "[syndicate_name] Operatives:" + + switch(get_result()) + if(NUKE_RESULT_FLUKE) + parts += "Humiliating Syndicate Defeat" + parts += "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!" + if(NUKE_RESULT_NUKE_WIN) + parts += "Syndicate Major Victory!" + parts += "[syndicate_name] operatives have destroyed [station_name()]!" + if(NUKE_RESULT_NOSURVIVORS) + parts += "Total Annihilation!" + parts += "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!" + if(NUKE_RESULT_WRONG_STATION) + parts += "Crew Minor Victory!" + parts += "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!" + if(NUKE_RESULT_WRONG_STATION_DEAD) + parts += "[syndicate_name] operatives have earned Darwin Award!" + parts += "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!" + if(NUKE_RESULT_HIJACK_DISK) + parts += "Syndicate Miniscule Victory!" + parts += "[syndicate_name] operatives failed to destroy [station_name()], but they managed to secure the disk and hijack the emergency shuttle, causing it to land on the syndicate base. Good job?" + if(NUKE_RESULT_HIJACK_NO_DISK) + parts += "Syndicate Insignificant Victory!" + parts += "[syndicate_name] operatives failed to destroy [station_name()] or secure the disk, but they managed to hijack the emergency shuttle, causing it to land on the syndicate base. Good job?" + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + parts += "Crew Major Victory!" + parts += "The Research Staff has saved the disk and killed the [syndicate_name] Operatives" + if(NUKE_RESULT_CREW_WIN) + parts += "Crew Major Victory!" + parts += "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!" + if(NUKE_RESULT_DISK_LOST) + parts += "Neutral Victory!" + parts += "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!" + if(NUKE_RESULT_DISK_STOLEN) + parts += "Syndicate Minor Victory!" + parts += "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!" + else + parts += "Neutral Victory" + parts += "Mission aborted!" + + var/text = "
The syndicate operatives were:" + var/purchases = "" + var/TC_uses = 0 + LAZYINITLIST(GLOB.uplink_purchase_logs_by_key) + for(var/I in members) + var/datum/mind/syndicate = I + var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[syndicate.key] + if(H) + TC_uses += H.total_spent + purchases += H.generate_render(show_key = FALSE) + text += printplayerlist(members) + text += "
" + text += "(Syndicates used [TC_uses] TC) [purchases]" + if(TC_uses == 0 && GLOB.station_was_nuked && !are_all_operatives_dead()) + text += "[icon2html('icons/ui_icons/antags/badass.dmi', world, "badass")]" + + parts += text + + return "
[parts.Join("
")]
" + +/datum/team/nuclear/antag_listing_name() + if(syndicate_name) + return "[syndicate_name] Syndicates" + else + return "Syndicates" + +/datum/team/nuclear/antag_listing_entry() + var/disk_report = "Nuclear Disk(s)
" + disk_report += "" + for(var/obj/item/disk/nuclear/N in SSpoints_of_interest.real_nuclear_disks) + disk_report += "" + disk_report += "
[N.name], " + var/atom/disk_loc = N.loc + while(!isturf(disk_loc)) + if(ismob(disk_loc)) + var/mob/M = disk_loc + disk_report += "carried by [M.real_name] " + if(isobj(disk_loc)) + var/obj/O = disk_loc + disk_report += "in \a [O.name] " + disk_loc = disk_loc.loc + disk_report += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])FLW
" + + var/post_report + + var/war_declared = FALSE + for(var/obj/item/circuitboard/computer/syndicate_shuttle/board as anything in GLOB.syndicate_shuttle_boards) + if(board.challenge) + war_declared = TRUE + + var/force_war_button = "" + + if(war_declared) + post_report += "War declared." + force_war_button = "\[Force war\]" + else + post_report += "War not declared." + var/obj/item/nuclear_challenge/war_button = war_button_ref?.resolve() + if(war_button) + force_war_button = "\[Force war\]" + else + force_war_button = "\[Cannot declare war, challenge button missing!\]" + + post_report += "\n[force_war_button]" + post_report += "\n\[Send Reinforcement\]" + + var/final_report = ..() + final_report += disk_report + final_report += post_report + return final_report + +/datum/team/nuclear/proc/rename_team(new_name) + syndicate_name = new_name + name = "[syndicate_name] Team" + for(var/I in members) + var/datum/mind/synd_mind = I + var/mob/living/carbon/human/human_to_rename = synd_mind.current + if(!istype(human_to_rename)) + continue + var/first_name = human_to_rename.client?.prefs?.read_preference(/datum/preference/name/operative_alias) || pick(GLOB.operative_aliases) + var/chosen_name = "[first_name] [syndicate_name]" + human_to_rename.fully_replace_character_name(human_to_rename.real_name, chosen_name) + +/datum/team/nuclear/proc/admin_spawn_reinforcement(mob/admin) + if(!check_rights_for(admin.client, R_ADMIN)) + return + + var/infil_or_nukebase = tgui_alert( + admin, + "Spawn them at the nuke base, or in the Infiltrator?", + "Where to reinforce?", + list(SPAWN_AT_BASE, SPAWN_AT_INFILTRATOR, "Cancel"), + ) + + if(!infil_or_nukebase || infil_or_nukebase == "Cancel") + return + + var/tc_to_spawn = tgui_input_number(admin, "How much TC to spawn with?", "TC", 0, 100) + + var/mob/chosen_one = SSpolling.poll_ghost_candidates( + check_jobban = ROLE_OPERATIVE, + role = ROLE_OPERATIVE, + poll_time = 30 SECONDS, + ignore_category = POLL_IGNORE_SYNDICATE, + alert_pic = /obj/structure/sign/poster/contraband/gorlex_recruitment, + role_name_text = "emergency syndicate reinforcement", + amount_to_pick = 1, + ) + + if(isnull(chosen_one)) + tgui_alert(admin, "No candidates found.", "Recruitment Shortage", list("OK")) + return + + + var/turf/spawn_loc + if(infil_or_nukebase == SPAWN_AT_INFILTRATOR) + var/area/spawn_in + // Prioritize EVA then hallway, if neither can be found default to the first area we can find + for(var/area_type in list(/area/shuttle/syndicate/eva, /area/shuttle/syndicate/hallway, /area/shuttle/syndicate)) + spawn_in = locate(area_type) in GLOB.areas // I'd love to use areas_by_type but the Infiltrator is a unique area + if(spawn_in) + break + + var/list/turf/options = list() + for(var/turf/open/open_turf in spawn_in?.get_turfs_from_all_zlevels()) + if(open_turf.is_blocked_turf()) + continue + options += open_turf + + if(length(options)) + spawn_loc = pick(options) + else + infil_or_nukebase = SPAWN_AT_BASE + + if(infil_or_nukebase == SPAWN_AT_BASE) + spawn_loc = pick(GLOB.nukeop_start) + + var/mob/living/carbon/human/nukie = new(spawn_loc) + chosen_one.client.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) + nukie.key = chosen_one.key + + var/datum/antagonist/nukeop/antag_datum = new() + antag_datum.send_to_spawnpoint = FALSE + antag_datum.nukeop_outfit = /datum/outfit/syndicate/reinforcement + + nukie.mind.add_antag_datum(antag_datum, src) + + var/datum/component/uplink/uplink = nukie.mind.find_syndicate_uplink() + uplink?.uplink_handler.set_telecrystals(tc_to_spawn) + + // add some pizzazz + do_sparks(4, FALSE, spawn_loc) + new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(spawn_loc) + playsound(spawn_loc, SFX_SPARKS, 50, TRUE) + playsound(spawn_loc, 'sound/effects/phasein.ogg', 50, TRUE) + + tgui_alert(admin, "Reinforcement spawned at [infil_or_nukebase] with [tc_to_spawn].", "Reinforcements have arrived", list("God speed")) + +/datum/team/nuclear/proc/update_objectives() + if(core_objective) + var/datum/objective/O = new core_objective + O.team = src + objectives += O + +/datum/team/nuclear/proc/is_disk_rescued() + for(var/obj/item/disk/nuclear/nuke_disk in SSpoints_of_interest.real_nuclear_disks) + //If emergency shuttle is in transit disk is only safe on it + if(SSshuttle.emergency.mode == SHUTTLE_ESCAPE) + if(!SSshuttle.emergency.is_in_shuttle_bounds(nuke_disk)) + return FALSE + //If shuttle escaped check if it's on centcom side + else if(SSshuttle.emergency.mode == SHUTTLE_ENDGAME) + if(!nuke_disk.onCentCom()) + return FALSE + else //Otherwise disk is safe when on station + var/turf/disk_turf = get_turf(nuke_disk) + if(!disk_turf || !is_station_level(disk_turf.z)) + return FALSE + return TRUE + +/datum/team/nuclear/proc/are_all_operatives_dead() + for(var/datum/mind/operative_mind as anything in members) + if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) + return FALSE + return TRUE + +/datum/team/nuclear/proc/get_result() + var/shuttle_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED + var/shuttle_landed_base = SSshuttle.emergency.is_hijacked() + var/disk_rescued = is_disk_rescued() + var/syndies_didnt_escape = !is_infiltrator_docked_at_syndiebase() + var/team_is_dead = are_all_operatives_dead() + var/station_was_nuked = GLOB.station_was_nuked + var/station_nuke_source = GLOB.station_nuke_source + + // The nuke detonated on the syndicate base + if(station_nuke_source == DETONATION_HIT_SYNDIE_BASE) + return NUKE_RESULT_FLUKE + + // The station was nuked + if(station_was_nuked) + // The station was nuked and the infiltrator failed to escape + if(syndies_didnt_escape) + return NUKE_RESULT_NOSURVIVORS + // The station was nuked and the infiltrator escaped, and the nuke ops won + else + return NUKE_RESULT_NUKE_WIN + + // The station was not nuked, but something was + else if(station_nuke_source && !disk_rescued) + // The station was not nuked, but something was, and the syndicates didn't escape it + if(syndies_didnt_escape) + return NUKE_RESULT_WRONG_STATION_DEAD + // The station was not nuked, but something was, and the syndicates returned to their base + else + return NUKE_RESULT_WRONG_STATION + + // Nuke didn't blow, but nukies somehow hijacked the emergency shuttle to land at the base anyways. + else if(shuttle_landed_base) + if(disk_rescued) + return NUKE_RESULT_HIJACK_DISK + else + return NUKE_RESULT_HIJACK_NO_DISK + + // No nuke went off, the station rescued the disk + else if(disk_rescued) + // No nuke went off, the shuttle left, and the team is dead + if(shuttle_evacuated && team_is_dead) + return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD + // No nuke went off, but the nuke ops survived + else + return NUKE_RESULT_CREW_WIN + + // No nuke went off, but the disk was left behind + else + // No nuke went off, the disk was left, but all the ops are dead + if(team_is_dead) + return NUKE_RESULT_DISK_LOST + // No nuke went off, the disk was left, there are living ops, but the shuttle left successfully + else if(shuttle_evacuated) + return NUKE_RESULT_DISK_STOLEN + + CRASH("[type] - got an undefined / unexpected result.") + +/// Returns whether or not syndicate operatives escaped. +/proc/is_infiltrator_docked_at_syndiebase() + var/obj/docking_port/mobile/infiltrator/infiltrator_port = SSshuttle.getShuttle("syndicate") + + var/datum/lazy_template/nukie_base/nukie_template = GLOB.lazy_templates[LAZY_TEMPLATE_KEY_NUKIEBASE] + if(!nukie_template) + return FALSE // if its not even loaded, cant be docked + + for(var/datum/turf_reservation/loaded_area as anything in nukie_template.reservations) + var/infiltrator_turf = get_turf(infiltrator_port) + if(infiltrator_turf in loaded_area.reserved_turfs) + return TRUE + return FALSE + +/datum/team/nuclear/add_member(datum/mind/new_member) + ..() + SEND_SIGNAL(src, COMSIG_NUKE_TEAM_ADDITION, new_member.current) + +#undef SPAWN_AT_BASE +#undef SPAWN_AT_INFILTRATOR diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm index 27909606643..a2a072f02e2 100644 --- a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm +++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm @@ -1,3 +1,6 @@ +#define ACTIVATION_COST (300 KILO JOULES) +#define ACTIVATION_UP_KEEP (25 KILO WATTS) + /obj/item/borg_chameleon name = "cyborg chameleon projector" icon = 'icons/obj/devices/syndie_gadget.dmi' @@ -11,8 +14,6 @@ var/friendlyName var/savedName var/active = FALSE - var/activationCost = 300 - var/activationUpkeep = 50 var/disguise = "engineer" var/mob/listeningTo var/static/list/signalCache = list( // list here all signals that should break the camouflage @@ -44,13 +45,13 @@ disrupt(user) /obj/item/borg_chameleon/attack_self(mob/living/silicon/robot/user) - if (user && user.cell && user.cell.charge > activationCost) + if (user && user.cell && user.cell.charge > ACTIVATION_COST) if (isturf(user.loc)) toggle(user) else to_chat(user, span_warning("You can't use [src] while inside something!")) else - to_chat(user, span_warning("You need at least [activationCost] charge in your cell to use [src]!")) + to_chat(user, span_warning("You need at least [display_energy(ACTIVATION_COST)] of charge in your cell to use [src]!")) /obj/item/borg_chameleon/proc/toggle(mob/living/silicon/robot/user) if(active) @@ -65,7 +66,7 @@ to_chat(user, span_notice("You activate \the [src].")) playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6) apply_wibbly_filters(user) - if (do_after(user, 50, target=user) && user.cell.use(activationCost)) + if (do_after(user, 5 SECONDS, target = user, hidden = TRUE) && user.cell.use(ACTIVATION_COST)) playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6) to_chat(user, span_notice("You are now disguised as the Nanotrasen engineering borg \"[friendlyName]\".")) activate(user) @@ -75,9 +76,9 @@ remove_wibbly_filters(user) animation_playing = FALSE -/obj/item/borg_chameleon/process() +/obj/item/borg_chameleon/process(seconds_per_tick) if (user) - if (!user.cell || !user.cell.use(activationUpkeep)) + if (!user.cell || !user.cell.use(ACTIVATION_UP_KEEP * seconds_per_tick)) disrupt(user) else return PROCESS_KILL @@ -119,3 +120,6 @@ if(active) to_chat(user, span_danger("Your chameleon field deactivates.")) deactivate(user) + +#undef ACTIVATION_COST +#undef ACTIVATION_UP_KEEP diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm index 72c51f14b2b..7e06dd0d6e0 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm @@ -26,7 +26,7 @@ /obj/item/disk/nuclear/Initialize(mapload) . = ..() - AddElement(/datum/element/bed_tuckable, 6, -6, 0) + AddElement(/datum/element/bed_tuckable, mapload, 6, -6, 0) AddComponent(/datum/component/stationloving, !fake) if(!fake) @@ -104,7 +104,7 @@ user.visible_message(span_suicide("[user] is going delta! It looks like [user.p_theyre()] trying to commit suicide!")) playsound(src, 'sound/machines/alarm.ogg', 50, -1, TRUE) for(var/i in 1 to 100) - addtimer(CALLBACK(user, TYPE_PROC_REF(/atom, add_atom_colour), (i % 2)? "#00FF00" : "#FF0000", ADMIN_COLOUR_PRIORITY), i) + addtimer(CALLBACK(user, TYPE_PROC_REF(/atom, add_atom_colour), (i % 2)? COLOR_VIBRANT_LIME : COLOR_RED, ADMIN_COLOUR_PRIORITY), i) addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), 101) return MANUAL_SUICIDE diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm index 190b9bcfe34..a52a026abe0 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm @@ -124,7 +124,7 @@ GLOBAL_VAR(station_nuke_source) if(istype(weapon, /obj/item/nuke_core_container)) var/obj/item/nuke_core_container/core_box = weapon to_chat(user, span_notice("You start loading the plutonium core into [core_box]...")) - if(do_after(user, 5 SECONDS, target=src)) + if(do_after(user, 5 SECONDS, target = src, hidden = TRUE)) if(core_box.load(core, user)) to_chat(user, span_notice("You load the plutonium core into [core_box].")) deconstruction_state = NUKESTATE_CORE_REMOVED diff --git a/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm b/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm new file mode 100644 index 00000000000..852c0d7d32f --- /dev/null +++ b/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm @@ -0,0 +1,46 @@ +///One of the special items that spawns in the overwatch agent's room. +/obj/item/paper/fluff/overwatch + name = "OVERWATCH NOTES #1" + color = COLOR_RED + desc = "A note from Syndicate leadership regarding your new job. You should read this!" + default_raw_text = @{" +Congratulations! You have been picked to be the Sole Survivor of an anti-Nanotrasen suicide mission! +We're kidding of course, these types of missions tend to have abnormally high survival rates. I guess that says a lot about who your team will be going up against. +
+You've been assigned to provide intelligence support to the ground-pounders carrying out the operation. +Each operative has been equipped with a bodycam that can be accessed via your Overwatch Camera Console. +Additionally, you have been given the boards to access station alerts, cameras, and remotely control the infiltrator shuttle. +
+Feel free to set up your workplace however you like. We've provided the tools and boards in your backroom. +
+Happy hunting! + "} + +/obj/machinery/computer/security/overwatch + name = "overwatch camera console" + desc = "Allows you to view members of your operative team via their bodycam feeds. We call them 'bodycams', but they're actually a swarm of tiny, near-imperceptible camera drones that follow each target. \ + It is believed that adversaries either don't notice the drones, or avoid attacking them in hopes that they'll capture footage of their combat prowess against our operatives." + icon_screen = "commsyndie" + icon_keyboard = "syndie_key" + network = list(OPERATIVE_CAMERA_NET) + circuit = /obj/item/circuitboard/computer/overwatch + +/obj/item/circuitboard/computer/overwatch + name = "Overwatch Body Cameras" + build_path = /obj/machinery/computer/security/overwatch + greyscale_colors = CIRCUIT_COLOR_SECURITY + +/obj/item/circuitboard/computer/syndicate_shuttle_docker + name = "Shuttle Controller" + build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate + greyscale_colors = CIRCUIT_COLOR_SECURITY + +/obj/item/clothing/glasses/overwatch + name = "intelligence glasses" + desc = "A set of incredibly advanced sunglasses, providing you with an array of different sensor scans and visual readouts for pretty much anything you look at. \ + It's kind of overwhelming, actually. Wearing this for a few hours will probably give you a migrane." + icon_state = "sunhudmed" + flags_cover = GLASSESCOVERSEYES + flash_protect = FLASH_PROTECTION_WELDER + clothing_traits = list(TRAIT_REAGENT_SCANNER) + var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm deleted file mode 100644 index b01d48d757e..00000000000 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ /dev/null @@ -1,650 +0,0 @@ -/datum/antagonist/nukeop - name = ROLE_NUCLEAR_OPERATIVE - roundend_category = "syndicate operatives" //just in case - antagpanel_category = ANTAG_GROUP_SYNDICATE - job_rank = ROLE_OPERATIVE - antag_hud_name = "synd" - antag_moodlet = /datum/mood_event/focused - show_to_ghosts = TRUE - hijack_speed = 2 //If you can't take out the station, take the shuttle instead. - suicide_cry = "FOR THE SYNDICATE!!" - /// Which nukie team are we on? - var/datum/team/nuclear/nuke_team - /// If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. - var/always_new_team = FALSE - /// Should the user be moved to default spawnpoint after being granted this datum. - var/send_to_spawnpoint = TRUE - /// The DEFAULT outfit we will give to players granted this datum - var/nukeop_outfit = /datum/outfit/syndicate - - preview_outfit = /datum/outfit/nuclear_operative_elite - - /// In the preview icon, the nukies who are behind the leader - var/preview_outfit_behind = /datum/outfit/nuclear_operative - /// In the preview icon, a nuclear fission explosive device, only appearing if there's an icon state for it. - var/nuke_icon_state = "nuclearbomb_base" - - /// The amount of discounts that the team get - var/discount_team_amount = 5 - /// The amount of limited discounts that the team get - var/discount_limited_amount = 10 - -/datum/antagonist/nukeop/New() - if(send_to_spawnpoint) // lets get the loading started now, but don't block waiting for it - INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, lazy_load_template), LAZY_TEMPLATE_KEY_NUKIEBASE) - return ..() - -/datum/antagonist/nukeop/proc/equip_op() - if(!ishuman(owner.current)) - return - - var/mob/living/carbon/human/operative = owner.current - ADD_TRAIT(operative, TRAIT_NOFEAR_HOLDUPS, 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 - - // If our nuke_ops_species pref is set to TRUE, (or we have no client) make us a human - if(isnull(operative.client) || operative.client.prefs.read_preference(/datum/preference/toggle/nuke_ops_species)) - operative.set_species(/datum/species/human) - - operative.equip_species_outfit(nukeop_outfit) - - return TRUE - -/datum/antagonist/nukeop/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) - to_chat(owner, span_big("You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!")) - owner.announce_objectives() - -/datum/antagonist/nukeop/on_gain() - give_alias() - forge_objectives() - . = ..() - equip_op() - if(send_to_spawnpoint) - move_to_spawnpoint() - // grant extra TC for the people who start in the nukie base ie. not the lone op - var/extra_tc = CEILING(GLOB.joined_player_list.len/5, 5) - var/datum/component/uplink/uplink = owner.find_syndicate_uplink() - if (uplink) - uplink.uplink_handler.add_telecrystals(extra_tc) - - var/datum/component/uplink/uplink = owner.find_syndicate_uplink() - if(uplink) - var/datum/team/nuclear/nuke_team = get_team() - if(!nuke_team.team_discounts) - var/list/uplink_items = list() - for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) - if(item.item && !item.cant_discount && (item.purchasable_from & uplink.uplink_handler.uplink_flag) && item.cost > 1) - uplink_items += item - nuke_team.team_discounts = list() - nuke_team.team_discounts += create_uplink_sales(discount_team_amount, /datum/uplink_category/discount_team_gear, -1, uplink_items) - nuke_team.team_discounts += create_uplink_sales(discount_limited_amount, /datum/uplink_category/limited_discount_team_gear, 1, uplink_items) - uplink.uplink_handler.extra_purchasable += nuke_team.team_discounts - - memorize_code() - -/datum/antagonist/nukeop/get_team() - return nuke_team - -/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override) - add_team_hud(mob_override || owner.current, /datum/antagonist/nukeop) - -/datum/antagonist/nukeop/proc/assign_nuke() - if(!nuke_team || nuke_team.tracked_nuke) - return - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/syndicate) - if(!nuke) - stack_trace("Syndicate nuke not found during nuke team creation.") - nuke_team.memorized_code = null - return - nuke_team.tracked_nuke = nuke - if(nuke.r_code == NUKE_CODE_UNSET) - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - for(var/obj/machinery/nuclearbomb/beer/beernuke as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/beer)) - beernuke.r_code = nuke_team.memorized_code - -/datum/antagonist/nukeop/proc/give_alias() - if(nuke_team?.syndicate_name) - var/mob/living/carbon/human/human_to_rename = owner.current - if(istype(human_to_rename)) // Reinforcements get a real name - var/first_name = owner.current.client?.prefs?.read_preference(/datum/preference/name/operative_alias) || pick(GLOB.operative_aliases) - var/chosen_name = "[first_name] [nuke_team.syndicate_name]" - human_to_rename.fully_replace_character_name(human_to_rename.real_name, chosen_name) - else - var/number = 1 - number = nuke_team.members.Find(owner) - owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" - -/datum/antagonist/nukeop/proc/memorize_code() - if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) - antag_memory += "[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]
" - owner.add_memory(/datum/memory/key/nuke_code, nuclear_code = nuke_team.memorized_code) - to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") - else - to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") - -/datum/antagonist/nukeop/forge_objectives() - if(nuke_team) - objectives |= nuke_team.objectives - -/// Actually moves our nukie to where they should be -/datum/antagonist/nukeop/proc/move_to_spawnpoint() - // Ensure that the nukiebase is loaded, and wait for it if required - SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_NUKIEBASE) - var/turf/destination = get_spawnpoint() - owner.current.forceMove(destination) - if(!owner.current.onSyndieBase()) - message_admins("[ADMIN_LOOKUPFLW(owner.current)] is a NUKE OP and move_to_spawnpoint put them somewhere that isn't the syndie base, help please.") - stack_trace("Nuke op move_to_spawnpoint resulted in a location not on the syndicate base. (Was moved to: [destination])") - -/// Gets the position we spawn at -/datum/antagonist/nukeop/proc/get_spawnpoint() - var/team_number = 1 - if(nuke_team) - team_number = nuke_team.members.Find(owner) - - return GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1] - -/datum/antagonist/nukeop/leader/get_spawnpoint() - return pick(GLOB.nukeop_leader_start) - -/datum/antagonist/nukeop/create_team(datum/team/nuclear/new_team) - if(!new_team) - if(!always_new_team) - for(var/datum/antagonist/nukeop/N in GLOB.antagonists) - if(!N.owner) - stack_trace("Antagonist datum without owner in GLOB.antagonists: [N]") - continue - if(N.nuke_team) - nuke_team = N.nuke_team - return - nuke_team = new /datum/team/nuclear - nuke_team.update_objectives() - assign_nuke() //This is bit ugly - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - nuke_team = new_team - -/datum/antagonist/nukeop/admin_add(datum/mind/new_owner,mob/admin) - new_owner.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has nuke op'ed [key_name_admin(new_owner)].") - log_admin("[key_name(admin)] has nuke op'ed [key_name(new_owner)].") - -/datum/antagonist/nukeop/get_admin_commands() - . = ..() - .["Send to base"] = CALLBACK(src, PROC_REF(admin_send_to_base)) - .["Tell code"] = CALLBACK(src, PROC_REF(admin_tell_code)) - -/datum/antagonist/nukeop/proc/admin_send_to_base(mob/admin) - owner.current.forceMove(pick(GLOB.nukeop_start)) - -/datum/antagonist/nukeop/proc/admin_tell_code(mob/admin) - var/code - for (var/obj/machinery/nuclearbomb/bombue as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) - if (length(bombue.r_code) <= 5 && bombue.r_code != initial(bombue.r_code)) - code = bombue.r_code - break - if (code) - antag_memory += "Syndicate Nuclear Bomb Code: [code]
" - to_chat(owner.current, "The nuclear authorization code is: [code]") - else - to_chat(admin, span_danger("No valid nuke found!")) - -/datum/antagonist/nukeop/get_preview_icon() - if (!preview_outfit) - return null - - var/icon/final_icon = render_preview_outfit(preview_outfit) - - if (!isnull(preview_outfit_behind)) - var/icon/teammate = render_preview_outfit(preview_outfit_behind) - teammate.Blend(rgb(128, 128, 128, 128), ICON_MULTIPLY) - - final_icon.Blend(teammate, ICON_UNDERLAY, -world.icon_size / 4, 0) - final_icon.Blend(teammate, ICON_UNDERLAY, world.icon_size / 4, 0) - - if (!isnull(nuke_icon_state)) - var/icon/nuke = icon('icons/obj/machines/nuke.dmi', nuke_icon_state) - nuke.Shift(SOUTH, 6) - final_icon.Blend(nuke, ICON_OVERLAY) - - return finish_preview_icon(final_icon) - -/datum/outfit/nuclear_operative - name = "Nuclear Operative (Preview only)" - - back = /obj/item/mod/control/pre_equipped/empty/syndicate - uniform = /obj/item/clothing/under/syndicate - -/datum/outfit/nuclear_operative/post_equip(mob/living/carbon/human/H, visualsOnly) - var/obj/item/mod/module/armor_booster/booster = locate() in H.back - booster.active = TRUE - H.update_worn_back() - -/datum/outfit/nuclear_operative_elite - name = "Nuclear Operative (Elite, Preview only)" - - back = /obj/item/mod/control/pre_equipped/empty/elite - uniform = /obj/item/clothing/under/syndicate - l_hand = /obj/item/modular_computer/pda/nukeops - r_hand = /obj/item/shield/energy - -/datum/outfit/nuclear_operative_elite/post_equip(mob/living/carbon/human/H, visualsOnly) - var/obj/item/mod/module/armor_booster/booster = locate() in H.back - booster.active = TRUE - H.update_worn_back() - var/obj/item/shield/energy/shield = locate() in H.held_items - shield.icon_state = "[shield.base_icon_state]1" - H.update_held_items() - -/datum/antagonist/nukeop/leader - name = "Nuclear Operative Leader" - nukeop_outfit = /datum/outfit/syndicate/leader - always_new_team = TRUE - /// Randomly chosen honorific, for distinction - var/title - /// The nuclear challenge remote we will spawn this player with. - var/challengeitem = /obj/item/nuclear_challenge - -/datum/antagonist/nukeop/leader/memorize_code() - ..() - if(nuke_team?.memorized_code) - var/obj/item/paper/nuke_code_paper = new - nuke_code_paper.add_raw_text("The nuclear authorization code is: [nuke_team.memorized_code]") - nuke_code_paper.name = "nuclear bomb code" - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - nuke_code_paper.forceMove(get_turf(H)) - else - H.put_in_hands(nuke_code_paper, TRUE) - H.update_icons() - -/datum/antagonist/nukeop/leader/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) - to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for guiding the team and your ID is the only one who can open the launch bay doors.") - to_chat(owner, "If you feel you are not up to this task, give your ID and radio to another operative.") - if(!CONFIG_GET(flag/disable_warops)) - to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") - owner.announce_objectives() - -/datum/antagonist/nukeop/leader/on_gain() - . = ..() - if(!CONFIG_GET(flag/disable_warops)) - var/mob/living/carbon/human/leader = owner.current - var/obj/item/war_declaration = new challengeitem(leader.drop_location()) - leader.put_in_hands(war_declaration) - nuke_team.war_button_ref = WEAKREF(war_declaration) - addtimer(CALLBACK(src, PROC_REF(nuketeam_name_assign)), 1) - -/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() - if(!nuke_team) - return - nuke_team.rename_team(ask_name()) - -/datum/team/nuclear/proc/rename_team(new_name) - syndicate_name = new_name - name = "[syndicate_name] Team" - for(var/I in members) - var/datum/mind/synd_mind = I - var/mob/living/carbon/human/human_to_rename = synd_mind.current - if(!istype(human_to_rename)) - continue - var/first_name = human_to_rename.client?.prefs?.read_preference(/datum/preference/name/operative_alias) || pick(GLOB.operative_aliases) - var/chosen_name = "[first_name] [syndicate_name]" - human_to_rename.fully_replace_character_name(human_to_rename.real_name, chosen_name) - -/datum/antagonist/nukeop/leader/proc/ask_name() - var/randomname = pick(GLOB.last_names) - var/newname = tgui_input_text(owner.current, "You are the nuclear operative [title]. Please choose a last name for your family.", "Name change", randomname, MAX_NAME_LEN) - if (!newname) - newname = randomname - else - newname = reject_bad_name(newname) - if(!newname) - newname = randomname - - return capitalize(newname) - -/datum/antagonist/nukeop/lone - name = "Lone Operative" - always_new_team = TRUE - send_to_spawnpoint = FALSE //Handled by event - nukeop_outfit = /datum/outfit/syndicate/full - preview_outfit = /datum/outfit/nuclear_operative - preview_outfit_behind = null - nuke_icon_state = null - -/datum/antagonist/nukeop/lone/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/selfdestruct) - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == NUKE_CODE_UNSET) - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - else - stack_trace("Station self-destruct not found during lone op team creation.") - nuke_team.memorized_code = null - -/datum/antagonist/nukeop/reinforcement - show_in_antagpanel = FALSE - send_to_spawnpoint = FALSE - nukeop_outfit = /datum/outfit/syndicate/reinforcement - -/datum/team/nuclear - var/syndicate_name - var/obj/machinery/nuclearbomb/tracked_nuke - var/core_objective = /datum/objective/nuclear - var/memorized_code - var/list/team_discounts - var/datum/weakref/war_button_ref - -/datum/team/nuclear/New() - ..() - syndicate_name = syndicate_name() - -/datum/team/nuclear/proc/update_objectives() - if(core_objective) - var/datum/objective/O = new core_objective - O.team = src - objectives += O - -/datum/team/nuclear/proc/is_disk_rescued() - for(var/obj/item/disk/nuclear/nuke_disk in SSpoints_of_interest.real_nuclear_disks) - //If emergency shuttle is in transit disk is only safe on it - if(SSshuttle.emergency.mode == SHUTTLE_ESCAPE) - if(!SSshuttle.emergency.is_in_shuttle_bounds(nuke_disk)) - return FALSE - //If shuttle escaped check if it's on centcom side - else if(SSshuttle.emergency.mode == SHUTTLE_ENDGAME) - if(!nuke_disk.onCentCom()) - return FALSE - else //Otherwise disk is safe when on station - var/turf/disk_turf = get_turf(nuke_disk) - if(!disk_turf || !is_station_level(disk_turf.z)) - return FALSE - return TRUE - -/datum/team/nuclear/proc/are_all_operatives_dead() - for(var/datum/mind/operative_mind as anything in members) - if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) - return FALSE - return TRUE - -/datum/team/nuclear/proc/get_result() - var/shuttle_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED - var/shuttle_landed_base = SSshuttle.emergency.is_hijacked() - var/disk_rescued = is_disk_rescued() - var/syndies_didnt_escape = !is_infiltrator_docked_at_syndiebase() - var/team_is_dead = are_all_operatives_dead() - var/station_was_nuked = GLOB.station_was_nuked - var/station_nuke_source = GLOB.station_nuke_source - - // The nuke detonated on the syndicate base - if(station_nuke_source == DETONATION_HIT_SYNDIE_BASE) - return NUKE_RESULT_FLUKE - - // The station was nuked - if(station_was_nuked) - // The station was nuked and the infiltrator failed to escape - if(syndies_didnt_escape) - return NUKE_RESULT_NOSURVIVORS - // The station was nuked and the infiltrator escaped, and the nuke ops won - else - return NUKE_RESULT_NUKE_WIN - - // The station was not nuked, but something was - else if(station_nuke_source && !disk_rescued) - // The station was not nuked, but something was, and the syndicates didn't escape it - if(syndies_didnt_escape) - return NUKE_RESULT_WRONG_STATION_DEAD - // The station was not nuked, but something was, and the syndicates returned to their base - else - return NUKE_RESULT_WRONG_STATION - - // Nuke didn't blow, but nukies somehow hijacked the emergency shuttle to land at the base anyways. - else if(shuttle_landed_base) - if(disk_rescued) - return NUKE_RESULT_HIJACK_DISK - else - return NUKE_RESULT_HIJACK_NO_DISK - - // No nuke went off, the station rescued the disk - else if(disk_rescued) - // No nuke went off, the shuttle left, and the team is dead - if(shuttle_evacuated && team_is_dead) - return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD - // No nuke went off, but the nuke ops survived - else - return NUKE_RESULT_CREW_WIN - - // No nuke went off, but the disk was left behind - else - // No nuke went off, the disk was left, but all the ops are dead - if(team_is_dead) - return NUKE_RESULT_DISK_LOST - // No nuke went off, the disk was left, there are living ops, but the shuttle left successfully - else if(shuttle_evacuated) - return NUKE_RESULT_DISK_STOLEN - - CRASH("[type] - got an undefined / unexpected result.") - -/datum/team/nuclear/roundend_report() - var/list/parts = list() - parts += "[syndicate_name] Operatives:" - - switch(get_result()) - if(NUKE_RESULT_FLUKE) - parts += "Humiliating Syndicate Defeat" - parts += "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!" - if(NUKE_RESULT_NUKE_WIN) - parts += "Syndicate Major Victory!" - parts += "[syndicate_name] operatives have destroyed [station_name()]!" - if(NUKE_RESULT_NOSURVIVORS) - parts += "Total Annihilation!" - parts += "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!" - if(NUKE_RESULT_WRONG_STATION) - parts += "Crew Minor Victory!" - parts += "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!" - if(NUKE_RESULT_WRONG_STATION_DEAD) - parts += "[syndicate_name] operatives have earned Darwin Award!" - parts += "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!" - if(NUKE_RESULT_HIJACK_DISK) - parts += "Syndicate Miniscule Victory!" - parts += "[syndicate_name] operatives failed to destroy [station_name()], but they managed to secure the disk and hijack the emergency shuttle, causing it to land on the syndicate base. Good job?" - if(NUKE_RESULT_HIJACK_NO_DISK) - parts += "Syndicate Insignificant Victory!" - parts += "[syndicate_name] operatives failed to destroy [station_name()] or secure the disk, but they managed to hijack the emergency shuttle, causing it to land on the syndicate base. Good job?" - if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) - parts += "Crew Major Victory!" - parts += "The Research Staff has saved the disk and killed the [syndicate_name] Operatives" - if(NUKE_RESULT_CREW_WIN) - parts += "Crew Major Victory!" - parts += "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_LOST) - parts += "Neutral Victory!" - parts += "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_STOLEN) - parts += "Syndicate Minor Victory!" - parts += "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!" - else - parts += "Neutral Victory" - parts += "Mission aborted!" - - var/text = "
The syndicate operatives were:" - var/purchases = "" - var/TC_uses = 0 - LAZYINITLIST(GLOB.uplink_purchase_logs_by_key) - for(var/I in members) - var/datum/mind/syndicate = I - var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[syndicate.key] - if(H) - TC_uses += H.total_spent - purchases += H.generate_render(show_key = FALSE) - text += printplayerlist(members) - text += "
" - text += "(Syndicates used [TC_uses] TC) [purchases]" - if(TC_uses == 0 && GLOB.station_was_nuked && !are_all_operatives_dead()) - text += "[icon2html('icons/ui_icons/antags/badass.dmi', world, "badass")]" - - parts += text - - return "
[parts.Join("
")]
" - -/datum/team/nuclear/antag_listing_name() - if(syndicate_name) - return "[syndicate_name] Syndicates" - else - return "Syndicates" - -/datum/team/nuclear/antag_listing_entry() - var/disk_report = "Nuclear Disk(s)
" - disk_report += "" - for(var/obj/item/disk/nuclear/N in SSpoints_of_interest.real_nuclear_disks) - disk_report += "" - disk_report += "
[N.name], " - var/atom/disk_loc = N.loc - while(!isturf(disk_loc)) - if(ismob(disk_loc)) - var/mob/M = disk_loc - disk_report += "carried by [M.real_name] " - if(isobj(disk_loc)) - var/obj/O = disk_loc - disk_report += "in \a [O.name] " - disk_loc = disk_loc.loc - disk_report += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])FLW
" - - var/post_report - - var/war_declared = FALSE - for(var/obj/item/circuitboard/computer/syndicate_shuttle/board as anything in GLOB.syndicate_shuttle_boards) - if(board.challenge) - war_declared = TRUE - - var/force_war_button = "" - - if(war_declared) - post_report += "War declared." - force_war_button = "\[Force war\]" - else - post_report += "War not declared." - var/obj/item/nuclear_challenge/war_button = war_button_ref?.resolve() - if(war_button) - force_war_button = "\[Force war\]" - else - force_war_button = "\[Cannot declare war, challenge button missing!\]" - - post_report += "\n[force_war_button]" - post_report += "\n\[Send Reinforcement\]" - - var/final_report = ..() - final_report += disk_report - final_report += post_report - return final_report - -#define SPAWN_AT_BASE "Nuke base" -#define SPAWN_AT_INFILTRATOR "Infiltrator" - -/datum/team/nuclear/proc/admin_spawn_reinforcement(mob/admin) - if(!check_rights_for(admin.client, R_ADMIN)) - return - - var/infil_or_nukebase = tgui_alert( - admin, - "Spawn them at the nuke base, or in the Infiltrator?", - "Where to reinforce?", - list(SPAWN_AT_BASE, SPAWN_AT_INFILTRATOR, "Cancel"), - ) - - if(!infil_or_nukebase || infil_or_nukebase == "Cancel") - return - - var/tc_to_spawn = tgui_input_number(admin, "How much TC to spawn with?", "TC", 0, 100) - - var/list/nuke_candidates = SSpolling.poll_ghost_candidates( - "Do you want to play as an emergency syndicate reinforcement?", - check_jobban = ROLE_OPERATIVE, - role = ROLE_OPERATIVE, - poll_time = 30 SECONDS, - ignore_category = POLL_IGNORE_SYNDICATE, - pic_source = /obj/structure/sign/poster/contraband/gorlex_recruitment, - role_name_text = "syndicate reinforcement", - ) - - nuke_candidates -= admin // may be easy to fat-finger say yes. so just don't - - if(!length(nuke_candidates)) - tgui_alert(admin, "No candidates found.", "Recruitment Shortage", list("OK")) - return - - - var/turf/spawn_loc - if(infil_or_nukebase == SPAWN_AT_INFILTRATOR) - var/area/spawn_in - // Prioritize EVA then hallway, if neither can be found default to the first area we can find - for(var/area_type in list(/area/shuttle/syndicate/eva, /area/shuttle/syndicate/hallway, /area/shuttle/syndicate)) - spawn_in = locate(area_type) in GLOB.areas // I'd love to use areas_by_type but the Infiltrator is a unique area - if(spawn_in) - break - - var/list/turf/options = list() - for(var/turf/open/open_turf in spawn_in?.get_turfs_from_all_zlevels()) - if(open_turf.is_blocked_turf()) - continue - options += open_turf - - if(length(options)) - spawn_loc = pick(options) - else - infil_or_nukebase = SPAWN_AT_BASE - - if(infil_or_nukebase == SPAWN_AT_BASE) - spawn_loc = pick(GLOB.nukeop_start) - - var/mob/dead/observer/picked = pick(nuke_candidates) - var/mob/living/carbon/human/nukie = new(spawn_loc) - picked.client.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) - nukie.key = picked.key - - var/datum/antagonist/nukeop/antag_datum = new() - antag_datum.send_to_spawnpoint = FALSE - antag_datum.nukeop_outfit = /datum/outfit/syndicate/reinforcement - - nukie.mind.add_antag_datum(antag_datum, src) - - var/datum/component/uplink/uplink = nukie.mind.find_syndicate_uplink() - uplink?.uplink_handler.set_telecrystals(tc_to_spawn) - - // add some pizzazz - do_sparks(4, FALSE, spawn_loc) - new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(spawn_loc) - playsound(spawn_loc, SFX_SPARKS, 50, TRUE) - playsound(spawn_loc, 'sound/effects/phasein.ogg', 50, TRUE) - - tgui_alert(admin, "Reinforcement spawned at [infil_or_nukebase] with [tc_to_spawn].", "Reinforcements have arrived", list("God speed")) - -#undef SPAWN_AT_BASE -#undef SPAWN_AT_INFILTRATOR - -/// Returns whether or not syndicate operatives escaped. -/proc/is_infiltrator_docked_at_syndiebase() - var/obj/docking_port/mobile/infiltrator/infiltrator_port = SSshuttle.getShuttle("syndicate") - - var/datum/lazy_template/nukie_base/nukie_template = GLOB.lazy_templates[LAZY_TEMPLATE_KEY_NUKIEBASE] - if(!nukie_template) - return FALSE // if its not even loaded, cant be docked - - for(var/datum/turf_reservation/loaded_area as anything in nukie_template.reservations) - var/infiltrator_turf = get_turf(infiltrator_port) - if(infiltrator_turf in loaded_area.reserved_turfs) - return TRUE - return FALSE diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm index a3c97a76468..eb251bcc363 100644 --- a/code/modules/antagonists/nukeop/outfits.dm +++ b/code/modules/antagonists/nukeop/outfits.dm @@ -77,6 +77,7 @@ backpack_contents = list( /obj/item/gun/ballistic/automatic/pistol/clandestine = 1, /obj/item/pen/edagger = 1, + /obj/item/ammo_box/magazine/m12g = 3, ) /datum/outfit/syndicate/full/plasmaman @@ -113,6 +114,17 @@ r_hand = /obj/item/tank/internals/plasmaman/belt/full tc = 0 +/datum/outfit/syndicate/support/plasmaman + name = "Nuclear Operative Overwatch Agent (Plasmaman)" + back = /obj/item/storage/backpack/satchel + head = /obj/item/clothing/head/helmet/space/plasmaman/syndie + uniform = /obj/item/clothing/under/plasmaman/syndicate + glasses = /obj/item/clothing/glasses/overwatch + suit = /obj/item/clothing/suit/jacket/letterman_syndie + r_hand = /obj/item/tank/internals/plasmaman/belt/full + command_radio = TRUE + tc = 0 + /datum/outfit/syndicate/reinforcement/gorlex name = "Syndicate Operative - Gorlex Reinforcement" suit = /obj/item/clothing/suit/armor/vest/alt @@ -163,3 +175,40 @@ shoes = /obj/item/clothing/shoes/laceup glasses = /obj/item/clothing/glasses/sunglasses/big faction = "MI13" + +/datum/outfit/nuclear_operative + name = "Nuclear Operative (Preview only)" + + back = /obj/item/mod/control/pre_equipped/empty/syndicate + uniform = /obj/item/clothing/under/syndicate + +/datum/outfit/nuclear_operative/post_equip(mob/living/carbon/human/H, visualsOnly) + var/obj/item/mod/module/armor_booster/booster = locate() in H.back + booster.active = TRUE + H.update_worn_back() + +/datum/outfit/nuclear_operative_elite + name = "Nuclear Operative (Elite, Preview only)" + + back = /obj/item/mod/control/pre_equipped/empty/elite + uniform = /obj/item/clothing/under/syndicate + l_hand = /obj/item/modular_computer/pda/nukeops + r_hand = /obj/item/shield/energy + +/datum/outfit/nuclear_operative_elite/post_equip(mob/living/carbon/human/H, visualsOnly) + var/obj/item/mod/module/armor_booster/booster = locate() in H.back + booster.active = TRUE + H.update_worn_back() + var/obj/item/shield/energy/shield = locate() in H.held_items + shield.icon_state = "[shield.base_icon_state]1" + H.update_held_items() + +/datum/outfit/syndicate/support + name = "Nuclear Operative Overwatch Agent" + back = /obj/item/storage/backpack/satchel + uniform = /obj/item/clothing/under/syndicate/tacticool + glasses = /obj/item/clothing/glasses/overwatch + suit = /obj/item/clothing/suit/jacket/letterman_syndie + shoes = /obj/item/clothing/shoes/sandal + command_radio = TRUE + tc = 0 diff --git a/code/modules/antagonists/pirate/pirate_event.dm b/code/modules/antagonists/pirate/pirate_event.dm index f3c6655a275..e4a14182d0e 100644 --- a/code/modules/antagonists/pirate/pirate_event.dm +++ b/code/modules/antagonists/pirate/pirate_event.dm @@ -66,7 +66,7 @@ if(chosen_gang.paid_off) return - var/list/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a pirate crew of [chosen_gang.name]?", check_jobban = ROLE_TRAITOR, pic_source = /obj/item/claymore/cutlass, role_name_text = "pirate crew") + var/list/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a [span_notice("pirate crew of [chosen_gang.name]?")]", check_jobban = ROLE_TRAITOR, alert_pic = /obj/item/claymore/cutlass, role_name_text = "pirate crew") shuffle_inplace(candidates) var/template_key = "pirate_[chosen_gang.ship_template_id]" diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 84f3a151dd2..2b323d51162 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -271,6 +271,10 @@ . = TRUE if("send") start_sending() + //We ensure that the holding facility is loaded in time in case we're selling mobs. + //This isn't the prettiest place to put it, but 'start_sending()' is also used by civilian bounty computers + //And we don't need them to also load the holding facility. + SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_NINJA_HOLDING_FACILITY) . = TRUE if("stop") stop_sending() @@ -283,12 +287,9 @@ status_report = "Predicted value: " var/value = 0 - var/datum/export_report/report = new + var/obj/machinery/piratepad/pad = pad_ref?.resolve() - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - export_item_and_contents(AM, apply_elastic = FALSE, dry_run = TRUE, external_report = report, ignore_typecache = nosell_typecache) + var/datum/export_report/report = pirate_export_loop(pad) for(var/datum/export/exported_datum in report.total_amount) status_report += exported_datum.total_printout(report,notes = FALSE) @@ -303,13 +304,8 @@ if(!sending) return - var/datum/export_report/report = new var/obj/machinery/piratepad/pad = pad_ref?.resolve() - - for(var/atom/movable/item_on_pad in get_turf(pad)) - if(item_on_pad == pad) - continue - export_item_and_contents(item_on_pad, apply_elastic = FALSE, delete_unsold = FALSE, external_report = report, ignore_typecache = nosell_typecache) + var/datum/export_report/report = pirate_export_loop(pad, dry_run = FALSE) status_report = "Sold: " var/value = 0 @@ -341,6 +337,33 @@ pad.icon_state = pad.idle_state sending = FALSE +///The loop that calculates the value of stuff on a pirate pad, or plain sell them if dry_run is FALSE. +/obj/machinery/computer/piratepad_control/proc/pirate_export_loop(obj/machinery/piratepad/pad, dry_run = TRUE) + var/datum/export_report/report = new + for(var/atom/movable/item_on_pad as anything in get_turf(pad)) + if(item_on_pad == pad) + continue + var/list/hidden_mobs = list() + var/skip_movable = FALSE + var/list/item_contents = item_on_pad.get_all_contents() + for(var/atom/movable/thing in reverse_range(item_contents)) + ///Don't destroy/sell stuff like the captain's laser gun, or borgs. + if(thing.resistance_flags & INDESTRUCTIBLE || is_type_in_typecache(thing, nosell_typecache)) + skip_movable = TRUE + break + if(isliving(thing)) + hidden_mobs += thing + if(skip_movable) + continue + for(var/mob/living/hidden as anything in hidden_mobs) + ///Sell mobs, but leave their contents intact. + export_single_item(hidden, apply_elastic = FALSE, dry_run = dry_run, external_report = report) + ///there are still licing mobs inside that item. Stop, don't sell it ffs. + if(locate(/mob/living) in item_on_pad.get_all_contents()) + continue + export_item_and_contents(item_on_pad, apply_elastic = FALSE, dry_run = dry_run, delete_unsold = FALSE, external_report = report, ignore_typecache = nosell_typecache) + return report + /// Prepares to sell the items on the pad /obj/machinery/computer/piratepad_control/proc/start_sending() var/obj/machinery/piratepad/pad = pad_ref?.resolve() @@ -391,7 +414,7 @@ /datum/export/pirate/ransom/get_cost(atom/movable/exported_item) var/mob/living/carbon/human/ransomee = exported_item - if(ransomee.stat != CONSCIOUS || !ransomee.mind) //mint condition only + 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! return 0 @@ -400,6 +423,33 @@ else return 1000 +/datum/export/pirate/ransom/sell_object(mob/living/carbon/human/sold_item, datum/export_report/report, dry_run = TRUE, apply_elastic = TRUE) + . = ..() + if(. == EXPORT_NOT_SOLD) + return + var/turf/picked_turf = pick(GLOB.holdingfacility) + sold_item.forceMove(picked_turf) + var/mob_cost = get_cost(sold_item) + sold_item.process_capture(mob_cost, mob_cost * 1.2) + do_sparks(8, FALSE, sold_item) + playsound(picked_turf, 'sound/weapons/emitter2.ogg', 25, TRUE) + sold_item.flash_act() + sold_item.adjust_confusion(10 SECONDS) + sold_item.adjust_dizzy(10 SECONDS) + addtimer(src, CALLBACK(src, PROC_REF(send_back_to_station), sold_item), COME_BACK_FROM_CAPTURE_TIME) + to_chat(sold_item, span_hypnophrase("A million voices echo in your head... \"Yaarrr, thanks for the booty, landlubber. \ + You will be ransomed back to your station, so it's only a matter of time before we ship you back...")) + + return EXPORT_SOLD_DONT_DELETE + +///Send them back to the station after a while. +/datum/export/pirate/ransom/proc/send_back_to_station(mob/living/prisoner) + ///Deleted or already bailed out of the place. + if(QDELETED(prisoner) || !istype(get_area(prisoner), /area/centcom/central_command_areas/holding)) + return + var/obj/structure/closet/supplypod/back_to_station/return_pod = new() + return_pod.return_from_capture(prisoner) + /datum/export/pirate/parrot cost = 2000 unit_name = "alive parrot" diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 708f94c3fc3..e34907d64ae 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -334,7 +334,7 @@ /// Handles rev removal via IC methods such as borging, mindshielding, blunt force trauma to the head or revs losing. /datum/antagonist/rev/proc/remove_revolutionary(deconverter) - owner.current.log_message("has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!", LOG_ATTACK, color="#960000") + owner.current.log_message("has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!", LOG_ATTACK, color=COLOR_CULT_RED) if(deconverter == DECONVERTER_BORGED) message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") owner.special_role = null diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm index 25543fbc8fe..17650faf937 100644 --- a/code/modules/antagonists/space_dragon/space_dragon.dm +++ b/code/modules/antagonists/space_dragon/space_dragon.dm @@ -196,7 +196,7 @@ */ /datum/antagonist/space_dragon/proc/permanant_empower() owner.current.fully_heal() - owner.current.add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5)) + owner.current.add_filter("anger_glow", 3, list("type" = "outline", "color" = COLOR_CARP_RIFT_RED, "size" = 5)) owner.current.add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage) /** @@ -207,7 +207,7 @@ */ /datum/antagonist/space_dragon/proc/rift_empower() owner.current.fully_heal() - owner.current.add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5)) + owner.current.add_filter("anger_glow", 3, list("type" = "outline", "color" = COLOR_CARP_RIFT_RED, "size" = 5)) owner.current.add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage) addtimer(CALLBACK(src, PROC_REF(rift_depower)), 30 SECONDS) diff --git a/code/modules/antagonists/spy/spy.dm b/code/modules/antagonists/spy/spy.dm new file mode 100644 index 00000000000..e0ea7e40754 --- /dev/null +++ b/code/modules/antagonists/spy/spy.dm @@ -0,0 +1,212 @@ +/datum/antagonist/spy + name = "\improper Spy" + roundend_category = "spies" + antagpanel_category = "Spy" + antag_hud_name = "spy" + job_rank = ROLE_SPY + antag_moodlet = /datum/mood_event/focused + hijack_speed = 1 + ui_name = "AntagInfoSpy" + preview_outfit = /datum/outfit/spy + /// Whether an uplink has been created (successfully or at all) + var/uplink_created = FALSE + /// String displayed in the antag panel pointing the spy to where their uplink is. + var/uplink_location + /// Whether we give them some random objetives to aim for. + var/spawn_with_objectives = TRUE + /// Tracks number of bounties claimed, for roundend + var/bounties_claimed = 0 + /// Tracks all loot items the spy has claimed, for roundend + var/list/all_loot = list() + /// Weakref to our spy uplink + /// Only exists for the sole purpose of letting admins see it + var/datum/weakref/uplink_weakref + +/datum/antagonist/spy/on_gain() + if(!uplink_created) + auto_create_spy_uplink(owner.current) + if(spawn_with_objectives) + give_random_objectives() + . = ..() + SEND_SOUND(owner.current, sound('sound/ambience/antag/spy.ogg')) + +/datum/antagonist/spy/ui_static_data(mob/user) + var/list/data = ..() + data["uplink_location"] = uplink_location + return data + +/datum/antagonist/spy/get_admin_commands() + . = ..() + // I wanted to put this in check-antagonists but it's less conducive to that + .["See All Bounties (For all spies)"] = CALLBACK(src, PROC_REF(see_bounties)) + .["Refresh Bounties (For all spies)"] = CALLBACK(src, PROC_REF(refresh_bounties)) + .["Give Spy Uplink"] = CALLBACK(src, PROC_REF(admin_create_spy_uplink)) + .["Bounty Handler VV"] = CALLBACK(src, PROC_REF(bounty_handler_vv)) + +/datum/antagonist/spy/proc/see_bounties() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/datum/component/spy_uplink/uplink = uplink_weakref?.resolve() + if(isnull(uplink)) + tgui_alert(usr, "No spy uplink!", "Mission Failed") + return + + uplink.ui_interact(usr) + +/datum/antagonist/spy/proc/refresh_bounties() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/datum/component/spy_uplink/uplink = uplink_weakref?.resolve() + if(isnull(uplink)) + tgui_alert(usr, "No spy uplink!", "Mission Failed") + return + + uplink.handler.force_refresh() + tgui_alert(usr, "Bounties refreshed.", "Mission Success") + +/datum/antagonist/spy/proc/admin_create_spy_uplink() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + if(!auto_create_spy_uplink(owner.current, give_backup = FALSE)) + tgui_alert(usr, "Failed to give [owner.current] a spy uplink - likely don't have a valid item to host it.", "Mission Failed") + +/datum/antagonist/spy/proc/bounty_handler_vv() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/datum/component/spy_uplink/uplink = uplink_weakref?.resolve() + if(isnull(uplink)) + tgui_alert(usr, "No spy uplink!", "Mission Failed") + return + + usr.client?.debug_variables(uplink.handler) + +/datum/antagonist/spy/proc/auto_create_spy_uplink(mob/living/carbon/spy, give_backup = TRUE) + if(!iscarbon(spy)) + return FALSE + + var/spy_uplink_loc = spy.client?.prefs?.read_preference(/datum/preference/choiced/uplink_location) + if(isnull(spy_uplink_loc) || spy_uplink_loc == UPLINK_IMPLANT) + spy_uplink_loc = pick(UPLINK_PEN, UPLINK_PDA) + + var/obj/item/spy_uplink = spy.get_uplink_location(spy_uplink_loc) + if(isnull(spy_uplink) || !create_spy_uplink(spy, spy_uplink)) + if(give_backup) + var/datum/action/backup_uplink/backup = new(src) + backup.Grant(spy) + to_chat(spy, span_boldnotice("You were unable to be supplied with an uplink, so you have been given the ability to create one yourself.")) + return FALSE + + return TRUE + +/datum/antagonist/spy/proc/create_spy_uplink(mob/living/carbon/spy, obj/item/spy_uplink) + var/datum/component/spy_uplink/uplink = spy_uplink.AddComponent(/datum/component/spy_uplink, src) + if(!uplink) + return FALSE + + uplink_weakref = WEAKREF(uplink) + uplink_created = TRUE + + if(istype(spy_uplink, /obj/item/modular_computer/pda)) + uplink_location = "your PDA" + + else if(istype(spy_uplink, /obj/item/pen)) + if(istype(spy_uplink.loc, /obj/item/modular_computer/pda)) + uplink_location = "your PDA's pen" + else + uplink_location = "a pen" + + else if(istype(spy_uplink, /obj/item/radio)) + uplink_location = "your radio headset" + + return TRUE + +/datum/antagonist/spy/proc/give_random_objectives() + for(var/i in 1 to rand(1, 3)) + var/datum/objective/custom/your_mission = new() + your_mission.owner = owner + your_mission.explanation_text = pick_list_replacements(SPY_OBJECTIVE_FILE, "objective_body") + objectives += your_mission + + if(prob(10)) + var/datum/objective/martyr/leave_no_trace = new() + leave_no_trace.owner = owner + objectives += leave_no_trace + + else if(prob(3)) //3% chance on 90% chance + var/datum/objective/hijack/steal_the_shuttle = new() + steal_the_shuttle.owner = owner + objectives += steal_the_shuttle + + else + var/datum/objective/escape/gtfo = new() + gtfo.owner = owner + objectives += gtfo + +/datum/antagonist/spy/antag_panel_data() + return "Bounties Claimed: [bounties_claimed]" + +/datum/antagonist/spy/roundend_report() + var/list/report = list() + report += printplayer(owner) + report += " - They completed [bounties_claimed] bounties." + if(bounties_claimed > 0) + report += " - They received the following rewards: [english_list(all_loot)]" + report += printobjectives(objectives) + return report.Join("
") + +/datum/antagonist/spy/get_preview_icon() + var/mob/living/carbon/human/dummy/consistent/dummy = new() + dummy.set_haircolor(COLOR_SILVER, update = FALSE) + dummy.set_hairstyle("CIA", update = FALSE) + return finish_preview_icon(render_preview_outfit(preview_outfit, dummy)) + +/datum/outfit/spy + name = "Spy (Preview only)" + // Balaclava sprite is ass, otherwise I would use it for this + uniform = /obj/item/clothing/under/suit/black + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/jackboots + head = /obj/item/clothing/head/fedora + suit = /obj/item/clothing/suit/jacket/trenchcoat + glasses = /obj/item/clothing/glasses/osi + ears = /obj/item/radio/headset + +/datum/action/backup_uplink + name = "Create Uplink" + desc = "Fashion a PDA, Pen or Radio Headset into a swanky Spy Uplink." + var/list/valid_types = list( + /obj/item/modular_computer/pda, + /obj/item/pen, + /obj/item/radio, + ) + +/datum/action/backup_uplink/New(Target) + . = ..() + if(!istype(Target, /datum/antagonist/spy)) + stack_trace("[type] created on invalid target [Target || "null"]") + qdel(src) + +/datum/action/backup_uplink/Trigger(trigger_flags) + . = ..() + if(!.) + return + + var/mob/living/spy = usr + var/obj/item/held_thing = spy.get_active_held_item() + if(isnull(held_thing)) + spy.balloon_alert(spy, "you need to hold something!") + return + + if(!is_type_in_list(held_thing, valid_types)) + held_thing.balloon_alert(spy, "invalid item!") + return + + var/datum/antagonist/spy/spy_datum = target + spy_datum.create_spy_uplink(spy, held_thing) + held_thing.balloon_alert(spy, "uplink created") + + qdel(src) diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm new file mode 100644 index 00000000000..0a9422e07b8 --- /dev/null +++ b/code/modules/antagonists/spy/spy_bounty.dm @@ -0,0 +1,703 @@ +/** + * ## Spy Bounty + * + * A datum used to track a single spy bounty. + * Not a singleton - whenever bounties are re-rolled, the entire list is deleted and new bounty datums are instantiated. + * + * When bounties are completed, they are also not deleted, but instead marked as claimed. + */ +/datum/spy_bounty + /// The name of the bounty. + /// Should be a short description without punctuation. + /// IE: "Steal the captain's ID" + var/name + /// Help text for the bounty. + /// Should include additional information about the bounty to assist the spy in figuring out what to do. + /// Should be punctuated. + /// IE: "Steal the captain's ID. It was last seen in the captain's office." + var/help + /// Difficult of the bounty, one of [SPY_DIFFICULTY_EASY], [SPY_DIFFICULTY_MEDIUM], [SPY_DIFFICULTY_HARD]. + /// Must be set to one of the possible bounties to be picked. + var/difficulty = "unset" + /// How long of a do-after must be completed by the Spy to turn in the bounty. + var/theft_time = 2 SECONDS + /// Probability that the stolen item will be sent to the black market instead of destroyed. + /// Guaranteed if the item is indestructible. + var/black_market_prob = 50 + /// Weight that the bounty will be selected. + var/weight = 1 + + /// Whether the bounty's been fully initialized. If this is not set, the bounty will be rerolled. + VAR_FINAL/initalized = FALSE + /// Whether the bounty has been completed. + VAR_FINAL/claimed = FALSE + /// What uplink item the bounty will reward on completion. + VAR_FINAL/datum/uplink_item/reward_item + +/datum/spy_bounty/New(datum/spy_bounty_handler/handler) + if(!init_bounty(handler)) + return + + initalized = TRUE + select_reward(handler) + +/// Helper that translates the bounty into UI data for TGUI +/datum/spy_bounty/proc/to_ui_data(mob/user) + SHOULD_CALL_PARENT(TRUE) + return list( + "name" = name, + "help" = help, + "difficulty" = difficulty, + "reward" = reward_item.name, + "claimed" = claimed, + "can_claim" = can_claim(user), + ) + +/// Check if the passed mob can claim this bounty. +/datum/spy_bounty/proc/can_claim(mob/user) + SHOULD_BE_PURE(TRUE) + return TRUE + +/** + * Initializes the bounty, setting up targets and etc. + * + * * handler - The bounty handler that is creating this bounty. + * + * Returning FALSE will cancel initialization and force it to reroll the bounty. + */ +/datum/spy_bounty/proc/init_bounty(datum/spy_bounty_handler/handler) + return FALSE + +/// 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] + + if(!length(loot_pool)) + reward_item = /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) + if(prob(80)) + loot_pool -= reward_item + +/** + * Checks if the passed movable is a valid target for this bounty. + * + * * stealing - The movable to check. + * + * Returning FALSE simply means that the passed movable is not valid for this bounty. + */ +/datum/spy_bounty/proc/is_stealable(atom/movable/stealing) + // SHOULD_BE_PURE(TRUE) + return FALSE + +/** + * What is this bounty's "dupe protection key"? + * This is used to determine if a duplicate of this bounty has been rolled before / in the last refresh. + * You can check if a bounty has been duped by accessing the handler's claimed_bounties_from_last_pool or all_claimed_bounty_types list. + * + * * stealing - The item that was stolen. + * * handler - The handler that is handling the bounty. + * + * Return a string key, what this uses for dupe protection. + */ +/datum/spy_bounty/proc/get_dupe_protection_key(atom/movable/stealing) + return stealing.type + +/** + * Checks if the passed dupe key is a duplicate of an previously claimed bounty. + * + * * handler - The handler that is handling the bounty. + * * dupe_key - The key to check for dupes + * * dupe_prob - The probability of a dupe being allowed when checking all_claimed_bounty_types. + * This allows you to have a chance that distant dupes allowed depending on how many times they've been done. + * + * Returns TRUE if the bounty is a dupe, FALSE if it is not. + */ +/datum/spy_bounty/proc/check_dupe(datum/spy_bounty_handler/handler, dupe_key, dupe_prob = 0) + if(handler.claimed_bounties_from_last_pool[dupe_key]) + return TRUE + if(prob(dupe_prob * handler.all_claimed_bounty_types[dupe_key])) + return TRUE + return FALSE + +/** + * Called when the bounty is completed, to handle how the stolen item is "stolen". + * + * By default, stolen items are simply deleted. + * + * * stealing - The item that was stolen. + * * spy - The spy that stole the item. + */ +/datum/spy_bounty/proc/clean_up_stolen_item(atom/movable/stealing, mob/living/spy) + do_sparks(3, FALSE, stealing) + + // Don't mess with it while it's going away + var/had_attack_hand_interaction = stealing.interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND + stealing.interaction_flags_atom &= ~INTERACT_ATOM_ATTACK_HAND + var/was_anchored = stealing.anchored + stealing.anchored = TRUE + // Add some pizzazz + animate(stealing, time = 0.5 SECONDS, transform = stealing.transform.Scale(0.01), easing = CUBIC_EASING) + + if(isitem(stealing) && ((stealing.resistance_flags & INDESTRUCTIBLE) || prob(black_market_prob))) + addtimer(CALLBACK(src, PROC_REF(send_to_black_market), stealing, had_attack_hand_interaction, was_anchored), 0.5 SECONDS) + else + addtimer(CALLBACK(src, PROC_REF(finish_cleanup), stealing), 0.5 SECONDS) + +/** + * Called when cleaning up a stolen atom that was NOT sent to the black market. + * + * * stealing - The item that was stolen. + */ +/datum/spy_bounty/proc/finish_cleanup(atom/movable/stealing) + qdel(stealing) + +/** + * Handles putting the passed movable up on the black market. + * + * By the end of this proc, the item should either be deleted (if failure) or in nullspace (on the black market). + * + * * thing - The item to put up on the black market. + */ +/datum/spy_bounty/proc/send_to_black_market(atom/movable/thing, had_attack_hand_interaction, was_anchored) + if(QDELETED(thing)) // Just in case anything does anything weird + return FALSE + + ///reset the appearance and all. + if(had_attack_hand_interaction) + thing.interaction_flags_atom |= INTERACT_ATOM_ATTACK_HAND + thing.anchored = was_anchored + thing.transform = thing.transform.Scale(10) + thing.moveToNullspace() + + var/item_price + switch(difficulty) + if(SPY_DIFFICULTY_EASY) + item_price = PAYCHECK_COMMAND * 2.5 + if(SPY_DIFFICULTY_MEDIUM) + item_price = PAYCHECK_COMMAND * 5 + if(SPY_DIFFICULTY_HARD) + item_price = PAYCHECK_COMMAND * 10 + + item_price += rand(0, PAYCHECK_COMMAND * 5) + if(thing.resistance_flags & INDESTRUCTIBLE) + item_price *= 2 + + var/datum/market_item/stolen_good/new_item = new(thing, item_price) + + return SSblackmarket.markets[/datum/market/blackmarket].add_item(new_item) + +/// Steal an item +/datum/spy_bounty/objective_item + /// Reference to an objective item datum that we want stolen. + VAR_FINAL/datum/objective_item/desired_item + /// Typecache of objective items that should not be selected. + var/static/list/blacklisted_item_types = typecacheof(list( + /datum/objective_item/steal/functionalai, + /datum/objective_item/steal/nukedisc, + )) + +/datum/spy_bounty/objective_item/can_claim(mob/user) + return !(user.mind?.assigned_role.title in desired_item.excludefromjob) + +/datum/spy_bounty/objective_item/get_dupe_protection_key(atom/movable/stealing) + return desired_item.targetitem + +/// Determines if the passed objective item is a reasonable, valid theft target. +/datum/spy_bounty/objective_item/proc/is_valid_objective_item(datum/objective_item/item) + if(length(item.special_equipment) || item.difficulty <= 0 || item.difficulty >= 6) + return FALSE + if(is_type_in_typecache(item, blacklisted_item_types)) + return FALSE + if(!item.exists_on_map) + return TRUE + var/list/all_valid_existing_things = list() + for(var/obj/item/existing_thing as anything in GLOB.steal_item_handler.objectives_by_path[item.targetitem]) + var/turf/thing_turf = get_turf(existing_thing) + if(isnull(thing_turf)) // nullspaced likely means it was stolen and is in the black market. + continue + if(!is_station_level(thing_turf.z) && !is_mining_level(thing_turf.z)) + continue + all_valid_existing_things += existing_thing + + if(!length(all_valid_existing_things)) + return FALSE + return TRUE + +/datum/spy_bounty/objective_item/init_bounty(datum/spy_bounty_handler/handler) + var/list/valid_possible_items = list() + for(var/datum/objective_item/item as anything in GLOB.possible_items) + if(check_dupe(handler, item.targetitem, 33)) + continue + if(!is_valid_objective_item(item)) + continue + // Determine difficulty. Has some overlap between the categories, which is OK + switch(difficulty) + if(SPY_DIFFICULTY_EASY) + if(item.difficulty >= 3) + continue + if(SPY_DIFFICULTY_MEDIUM) + if(item.difficulty <= 2 || item.difficulty >= 5) + continue + if(SPY_DIFFICULTY_HARD) + if(item.difficulty <= 3) + continue + + valid_possible_items += item + + for(var/datum/spy_bounty/objective_item/existing_bounty in handler.get_all_bounties()) + valid_possible_items -= existing_bounty.desired_item + + if(!length(valid_possible_items)) + return FALSE + + desired_item = pick(valid_possible_items) + // We need to do some snowflake for items that do exist vs generic items + var/list/obj/item/existing_items = GLOB.steal_item_handler.objectives_by_path[desired_item.targetitem] + var/obj/item/the_item = length(existing_items) ? pick(existing_items) : desired_item.targetitem + var/the_item_name = istype(the_item) ? the_item.name : initial(the_item.name) + name = "[the_item_name] [difficulty == SPY_DIFFICULTY_HARD ? "Grand ":""]Theft" + help = "Steal any [the_item_name][desired_item.steal_hint ? ": [desired_item.steal_hint]" : "."]" + return TRUE + +/datum/spy_bounty/objective_item/is_stealable(atom/movable/stealing) + return istype(stealing, desired_item.targetitem) && desired_item.check_special_completion(stealing) + +/datum/spy_bounty/objective_item/random_easy + difficulty = SPY_DIFFICULTY_EASY + weight = 4 // Increased due to there being many easy options + +/datum/spy_bounty/objective_item/random_medium + difficulty = SPY_DIFFICULTY_MEDIUM + weight = 2 // Increased due to there being many medium options + +/datum/spy_bounty/objective_item/random_hard + difficulty = SPY_DIFFICULTY_HARD + +/datum/spy_bounty/machine + theft_time = 10 SECONDS + + /// What machine (typepath) we want to steal. + var/obj/machinery/target_type + /// What area (typepath) the desired machine is in. + /// Can be pre-set for subtypes. If set, requires the machine to be in the location_type. + /// If not set, picks a random machine from all areas it can currently be found in. + var/area/location_type + /// List of weakrefs to all machines of the target type when the bounty was initialized. + var/list/original_options_weakrefs = list() + +/datum/spy_bounty/machine/Destroy() + original_options_weakrefs.Cut() // Just in case + return ..() + +/datum/spy_bounty/machine/get_dupe_protection_key(atom/movable/stealing) + return target_type + +/datum/spy_bounty/machine/send_to_black_market(obj/machinery/thing) + if(!istype(thing.circuit, /obj/item/circuitboard)) + qdel(thing) + return FALSE + + var/obj/item/circuitboard/selling = thing.circuit + var/turf/machine_turf = get_turf(thing) + + // Sell the circuitboard, take the rest apart + // This (should) handle any mobs inside as well + thing.deconstruct(FALSE) + if(!..(selling)) + return FALSE + + // Clean up leftover parts from deconstruction + for(var/obj/structure/frame/leftover in machine_turf) + qdel(leftover) + break + for(var/obj/item/stock_parts/part in machine_turf) + if(prob(part.rating * 20)) + continue + qdel(part) + + return TRUE + +/datum/spy_bounty/machine/finish_cleanup(obj/machinery/stealing) + stealing.dump_inventory_contents() + return ..() + +/datum/spy_bounty/machine/init_bounty(datum/spy_bounty_handler/handler) + if(isnull(target_type)) + return FALSE + + // Blacklisting maintenance in general, as well as any areas that already have a bounty in them. + var/list/blacklisted_areas = typecacheof(/area/station/maintenance) + for(var/datum/spy_bounty/machine/existing_bounty in handler.get_all_bounties()) + blacklisted_areas[existing_bounty.location_type] = TRUE + + var/list/obj/machinery/all_possible = list() + for(var/obj/machinery/found_machine as anything in SSmachines.get_machines_by_type_and_subtypes(target_type)) + if(!is_station_level(found_machine.z) && !is_mining_level(found_machine.z)) + continue + var/area/found_machine_area = get_area(found_machine) + if(is_type_in_typecache(found_machine_area, blacklisted_areas)) + continue + if(!isnull(location_type) && !istype(found_machine_area, location_type)) + continue + if(!(found_machine_area.area_flags & VALID_TERRITORY)) // only steal from valid station areas + continue + all_possible += found_machine + + if(!length(all_possible)) + return FALSE + + var/obj/machinery/machine = pick_n_take(all_possible) + var/area/machine_area = get_area(machine) + // Tracks the picked machine, as well as any other machines in the same area + // (So they can be removed from the room but still count, for clever Spies) + original_options_weakrefs += WEAKREF(machine) + for(var/obj/machinery/other_machine as anything in all_possible) + if(get_area(other_machine) == machine_area) + original_options_weakrefs += WEAKREF(other_machine) + + location_type = machine_area.type + name ||= "[machine.name] Burglary" + help ||= "Steal \a [machine] found in [machine_area]." + return TRUE + +/datum/spy_bounty/machine/is_stealable(atom/movable/stealing) + if(!istype(stealing, target_type)) + return FALSE + if(WEAKREF(stealing) in original_options_weakrefs) + return TRUE + if(istype(get_area(stealing), location_type)) + return TRUE + return FALSE + +/datum/spy_bounty/machine/random + /// List of all machines we can randomly draw from + var/list/random_options = list() + +/datum/spy_bounty/machine/random/init_bounty(datum/spy_bounty_handler/handler) + var/list/options = random_options.Copy() + for(var/datum/spy_bounty/machine/existing_bounty in handler.get_all_bounties()) + options -= existing_bounty.target_type + + for(var/remaining_option in options) + if(check_dupe(handler, remaining_option, 33)) + options -= remaining_option + + if(!length(options)) + return FALSE + + target_type = pick(options) + return ..() + +/datum/spy_bounty/machine/random/easy + difficulty = SPY_DIFFICULTY_EASY + weight = 4 // Increased due to there being many easy options + random_options = list( + /obj/machinery/computer/operating, + /obj/machinery/computer/order_console/mining, + /obj/machinery/computer/records/medical, + /obj/machinery/cryo_cell, + /obj/machinery/fax, // Completely random, wild card + /obj/machinery/hydroponics/constructable, + /obj/machinery/medical_kiosk, + /obj/machinery/microwave, + /obj/machinery/oven, + /obj/machinery/recharge_station, + /obj/machinery/vending/boozeomat, + /obj/machinery/vending/medical, + /obj/machinery/vending/wardrobe, + ) + +/datum/spy_bounty/machine/random/medium + difficulty = SPY_DIFFICULTY_MEDIUM + weight = 4 // Increased due to there being many medium options + random_options = list( + /obj/machinery/chem_dispenser, + /obj/machinery/computer/bank_machine, + /obj/machinery/computer/camera_advanced/xenobio, + /obj/machinery/computer/cargo, // This includes request-only ones in the public lobby + /obj/machinery/computer/crew, + /obj/machinery/computer/prisoner/management, + /obj/machinery/computer/rdconsole, + /obj/machinery/computer/records/security, + /obj/machinery/computer/scan_consolenew, + /obj/machinery/computer/security, // Requires breaking into a sec checkpoint, but not too hard, many are never visited + /obj/machinery/dna_scannernew, + /obj/machinery/mecha_part_fabricator, + ) + +/datum/spy_bounty/machine/engineering_emitter + difficulty = SPY_DIFFICULTY_MEDIUM + target_type = /obj/machinery/power/emitter + location_type = /area/station/engineering/supermatter/ + +/datum/spy_bounty/machine/engineering_emitter/can_claim(mob/user) + return !(user.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_ENGINEERING) + +/datum/spy_bounty/machine/random/hard + difficulty = SPY_DIFFICULTY_HARD + random_options = list( + /obj/machinery/computer/accounting, + /obj/machinery/computer/communications, + /obj/machinery/computer/upload, + /obj/machinery/modular_computer/preset/id, + ) + +/datum/spy_bounty/machine/random/hard/can_claim(mob/user) // These would all be too easy with command level access + return !(user.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + +/datum/spy_bounty/machine/random/hard/ai_sat_teleporter + random_options = list( + /obj/machinery/teleport, + /obj/machinery/computer/teleporter, + ) + location_type = /area/station/ai_monitored/aisat + +/// Subtype for a bounty that targets a specific crew member +/datum/spy_bounty/targets_person + difficulty = SPY_DIFFICULTY_HARD + theft_time = 12 SECONDS + /// Weakref to the mob target of the bounty + VAR_FINAL/datum/weakref/target_ref + +/datum/spy_bounty/targets_person/get_dupe_protection_key(atom/movable/stealing) + // Prevents the same player from being selected twice, but if they're straight up gone, whatever + return REF(target_ref.resolve() || stealing) + +/datum/spy_bounty/targets_person/can_claim(mob/user) + return !IS_WEAKREF_OF(user, target_ref) + +/datum/spy_bounty/targets_person/init_bounty(datum/spy_bounty_handler/handler) + var/list/mob/possible_targets = list() + for(var/datum/mind/crew_mind as anything in get_crewmember_minds()) + var/mob/living/real_target = crew_mind.current + // Ideally we want it to be a player, but we don't care if they DC after being selected + if(!istype(real_target) || isnull(GET_CLIENT(real_target))) + continue + if(check_dupe(handler, REF(real_target), 50)) + continue + if(!is_valid_crewmember(real_target)) + continue + possible_targets += real_target + + for(var/datum/spy_bounty/targets_person/existing_bounty in handler.get_all_bounties()) + possible_targets -= existing_bounty.target_ref.resolve() + + if(!length(possible_targets)) + return FALSE + + var/mob/picked = pick(possible_targets) + if(target_found(picked)) + target_ref = WEAKREF(picked) + return TRUE + + return FALSE + +/** + * Ran on every single member of the crew to determine if they are a valid target. + * + * * crewmember - The person to check. + * + * Returning FALSE will exclude them from the list of possible targets. + */ +/datum/spy_bounty/targets_person/proc/is_valid_crewmember(mob/crewmember) + return FALSE + +/** + * Ran when a valid target is selected for the bounty. + * + * * crewmember - The person that was selected as the target. + * + * Returning FALSE will stop the bounty from being finalized, this can be used for last minute checks. + */ +/datum/spy_bounty/targets_person/proc/target_found(mob/crewmember) + return FALSE + +/// Subtype for a bounty that targets a specific crew member and a specific item on them +/datum/spy_bounty/targets_person/some_item + /// Typepath of the item we want from the target + var/obj/item/desired_type + /// Weakref to the item that matches our desired type within the target at the time of bounty creation + VAR_FINAL/datum/weakref/target_original_desired_ref + +/datum/spy_bounty/targets_person/some_item/is_valid_crewmember(mob/living/carbon/human/crewmember) + return istype(crewmember) && find_desired_thing(crewmember) + +/datum/spy_bounty/targets_person/some_item/is_stealable(atom/movable/stealing) + if(IS_WEAKREF_OF(stealing, target_original_desired_ref)) + return TRUE + if(IS_WEAKREF_OF(stealing, target_ref)) + var/mob/living/carbon/human/target = stealing + if(!target.incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) + return FALSE + if(find_desired_thing(target)) + return TRUE + return FALSE + +/datum/spy_bounty/targets_person/some_item/clean_up_stolen_item(atom/movable/stealing, mob/living/spy) + if(IS_WEAKREF_OF(stealing, target_original_desired_ref)) + return ..() + + ASSERT(ishuman(stealing), "[type] called clean_up_stolen_item with something that isn't a human and isn't the original item.") + + do_sparks(2, FALSE, stealing) + var/mob/living/carbon/human/stolen_from = stealing + var/obj/item/real_stolen_item = find_desired_thing(stealing) + stolen_from.Unconscious(10 SECONDS) + to_chat(stolen_from, span_warning("You feel something missing where your [real_stolen_item.name] once was.")) + return ..(real_stolen_item, spy) + +/datum/spy_bounty/targets_person/some_item/target_found(mob/crewmember) + var/obj/item/desired_thing = find_desired_thing(crewmember) + target_original_desired_ref = WEAKREF(desired_thing) + name = "[crewmember.real_name]'s [desired_thing.name]" + help = "Steal [desired_thing] from [crewmember.real_name]. \ + You can accomplish this via brute force, or by scanning them with your uplink while they are incapacitated." + return TRUE + +/// Finds the desired item type in the target crewmember. +/datum/spy_bounty/targets_person/some_item/proc/find_desired_thing(mob/living/carbon/human/crewmember) + return locate(desired_type) in crewmember.get_all_gear() + +// Steal someone's ID card +/datum/spy_bounty/targets_person/some_item/id + desired_type = /obj/item/card/id/advanced + +/datum/spy_bounty/targets_person/some_item/id/find_desired_thing(mob/living/carbon/human/crewmember) + for(var/obj/item/card/id/advanced/id in crewmember.get_all_gear()) + if(id.registered_account?.account_id == crewmember.account_id) + return id + + return null + +/datum/spy_bounty/targets_person/some_item/id/target_found(mob/crewmember) + . = ..() + name = "[crewmember.real_name]'s ID Card" + +// Steal someone's PDA +/datum/spy_bounty/targets_person/some_item/pda + desired_type = /obj/item/modular_computer/pda + +/datum/spy_bounty/targets_person/some_item/pda/find_desired_thing(mob/living/carbon/human/crewmember) + for(var/obj/item/modular_computer/pda/pda in crewmember.get_all_gear()) + if(pda.saved_identification == crewmember.real_name) + return pda + + return null + +/datum/spy_bounty/targets_person/some_item/pda/target_found(mob/crewmember) + . = ..() + name = "[crewmember.real_name]'s PDA" + +// Steal someone's heirloom +/datum/spy_bounty/targets_person/some_item/heirloom + desired_type = /obj/item + black_market_prob = 100 + +/datum/spy_bounty/targets_person/some_item/heirloom/find_desired_thing(mob/living/crewmember) + var/datum/quirk/item_quirk/family_heirloom/quirk = crewmember.get_quirk(/datum/quirk/item_quirk/family_heirloom) + return quirk?.heirloom?.resolve() + +/datum/spy_bounty/targets_person/some_item/heirloom/target_found(mob/crewmember) + . = ..() + name = "[crewmember.real_name]'s heirloom" + +// Steal a limb or organ off someone +/datum/spy_bounty/targets_person/some_item/limb_or_organ + weight = 4 // lots to pick from here + +/datum/spy_bounty/targets_person/some_item/limb_or_organ/init_bounty(datum/spy_bounty_handler/handler) + desired_type = pick( + /obj/item/bodypart/arm/left, + /obj/item/bodypart/arm/right, + /obj/item/bodypart/leg/left, + /obj/item/bodypart/leg/right, + /obj/item/organ/internal/stomach, + /obj/item/organ/internal/appendix, + /obj/item/organ/internal/liver, + /obj/item/organ/internal/eyes, + ) + return ..() + +/datum/spy_bounty/targets_person/some_item/limb_or_organ/find_desired_thing(mob/living/carbon/human/crewmember) + if(ispath(desired_type, /obj/item/bodypart)) + return locate(desired_type) in crewmember.bodyparts + if(ispath(desired_type, /obj/item/organ)) + return locate(desired_type) in crewmember.organs + return null + +/datum/spy_bounty/some_bot + theft_time = 10 SECONDS + black_market_prob = 0 + /// What typepath of bot we want to steal. + var/mob/living/simple_animal/bot/bot_type + /// Weakref to the bot we want to steal. + VAR_FINAL/datum/weakref/target_bot_ref + +/datum/spy_bounty/some_bot/get_dupe_protection_key(atom/movable/stealing) + return bot_type + +/datum/spy_bounty/some_bot/finish_cleanup(mob/living/simple_animal/bot/stealing) + if(stealing.client) + to_chat(stealing, span_deadsay("You've been stolen! You are shipped off to the black market and taken apart for spare parts...")) + stealing.investigate_log("stole by a spy (and deleted)", INVESTIGATE_DEATHS) + stealing.ghostize() + return ..() + +/datum/spy_bounty/some_bot/init_bounty(datum/spy_bounty_handler/handler) + for(var/datum/spy_bounty/some_bot/existing_bounty in handler.get_all_bounties()) + var/mob/living/simple_animal/bot/existing_bot_type = existing_bounty.bot_type + // ensures we don't get two similar bounties. + // may occasionally cast a wider net than we'd desire, but it's not that bad. + if(ispath(bot_type, initial(existing_bot_type.parent_type))) + return FALSE + + var/list/mob/living/possible_bots = list() + for(var/mob/living/bot as anything in GLOB.bots_list) + if(!is_station_level(bot.z) && !is_mining_level(bot.z)) + continue + if(!istype(bot, bot_type)) + continue + possible_bots += bot + + if(!length(possible_bots)) + return FALSE + + var/mob/living/picked = pick(possible_bots) + target_bot_ref = WEAKREF(picked) + name ||= "[picked.name] Abduction" + help ||= "Abduct the station's robot assistant [picked.name]." + return TRUE + +/datum/spy_bounty/some_bot/is_stealable(atom/movable/stealing) + return IS_WEAKREF_OF(stealing, target_bot_ref) + +/datum/spy_bounty/some_bot/beepsky + difficulty = SPY_DIFFICULTY_MEDIUM // gotta get him to stand still + bot_type = /mob/living/simple_animal/bot/secbot/beepsky/officer + help = "Abduct Officer Beepsky - commonly found patrolling the station. \ + Watch out, they may not take kindly to being scanned." + +/datum/spy_bounty/some_bot/ofitser + difficulty = SPY_DIFFICULTY_EASY + bot_type = /mob/living/simple_animal/bot/secbot/beepsky/ofitser + help = "Abduct Prison Ofitser - commonly found guarding the Gulag." + +/datum/spy_bounty/some_bot/armsky + difficulty = SPY_DIFFICULTY_HARD + bot_type = /mob/living/simple_animal/bot/secbot/beepsky/armsky + help = "Abduct Sergeant-At-Armsky - commonly found guarding the station's Armory." + +/datum/spy_bounty/some_bot/pingsky + difficulty = SPY_DIFFICULTY_HARD + 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 + difficulty = SPY_DIFFICULTY_EASY + bot_type = /mob/living/basic/bot/cleanbot/medbay + help = "Abduct Scrubbs, MD - commonly found mopping up blood in Medbay." + +/datum/spy_bounty/some_bot/scrubbs/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 new file mode 100644 index 00000000000..798719cb8a0 --- /dev/null +++ b/code/modules/antagonists/spy/spy_bounty_handler.dm @@ -0,0 +1,123 @@ +/** + * ## Spy bounty handler + * + * Singleton datum that handles determining active bounties for spies. + */ +/datum/spy_bounty_handler + /// Timer between when all bounties are refreshed. + var/refresh_time = 12 MINUTES + /// timerID of the active refresh timer. + var/refresh_timer + /// Number of times we have refreshed bounties + var/num_refreshes = 0 + /// Assoc list of items stolen in the past to how many times they have been stolen + /// Sometimes item typepaths, sometimes REFs, in general just strings that represent stolen items + var/list/all_claimed_bounty_types = list() + /// List of all items stolen in the last pool of bounties. + /// Same as above - strings that represent stolen items. + var/list/claimed_bounties_from_last_pool = list() + /// Override for the number of attempts to make a bounty. + var/num_attempts_override = 0 + + /// Assoc list that dictates how much of each bounty difficulty to give out at once. + /// Modified by the number of times we have refreshed bounties. + VAR_PRIVATE/list/base_bounties_to_give = list( + SPY_DIFFICULTY_EASY = 4, + SPY_DIFFICULTY_MEDIUM = 2, + SPY_DIFFICULTY_HARD = 2, + ) + + /// Assoc list of all active bounties. + VAR_PRIVATE/list/list/bounties = list( + SPY_DIFFICULTY_EASY = list(), + SPY_DIFFICULTY_MEDIUM = list(), + SPY_DIFFICULTY_HARD = list(), + ) + + /// Assoc list of all possible bounties for each difficulty, weighted. + /// This is static, no bounty types are removed from this list. + VAR_PRIVATE/list/list/bounty_types = list( + SPY_DIFFICULTY_EASY = list(), + SPY_DIFFICULTY_MEDIUM = list(), + SPY_DIFFICULTY_HARD = list(), + ) + + /// Assoc list of all uplink items possible to be given as bounties for each difficulty. + /// This is not static, as bounties are complete uplink items will be removed from this list. + var/list/list/possible_uplink_items = list( + SPY_DIFFICULTY_EASY = list(), + SPY_DIFFICULTY_MEDIUM = list(), + SPY_DIFFICULTY_HARD = list(), + ) + +/datum/spy_bounty_handler/New() + for(var/datum/spy_bounty/bounty as anything in subtypesof(/datum/spy_bounty)) + var/weight = initial(bounty.weight) + var/difficulty = initial(bounty.difficulty) + if(weight <= 0 || !islist(bounty_types[difficulty])) + continue + bounty_types[difficulty][bounty] = weight + + for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) + if(isnull(item.item) || item.item == ABSTRACT_UPLINK_ITEM) + continue + if(!(item.purchasable_from & UPLINK_SPY)) + 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 <= SPY_LOWER_COST_THRESHOLD) + possible_uplink_items[SPY_DIFFICULTY_EASY] += item + if(item.cost >= SPY_LOWER_COST_THRESHOLD && item.cost <= SPY_UPPER_COST_THRESHOLD) + possible_uplink_items[SPY_DIFFICULTY_MEDIUM] += item + if(item.cost >= SPY_UPPER_COST_THRESHOLD) + possible_uplink_items[SPY_DIFFICULTY_HARD] += item + + refresh_bounty_list() + +/// 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() + for(var/difficulty in bounties) + all_bounties += bounties[difficulty] + + return all_bounties + +/// Refreshes all active bounties for each difficulty, no matter if they were complete or not. +/// Then recursively calls itself via a timer. +/datum/spy_bounty_handler/proc/refresh_bounty_list() + PRIVATE_PROC(TRUE) + + var/list/bounties_to_give = base_bounties_to_give.Copy() + + if(num_refreshes < base_bounties_to_give[SPY_DIFFICULTY_HARD]) + bounties_to_give[SPY_DIFFICULTY_HARD] = num_refreshes + bounties_to_give[SPY_DIFFICULTY_MEDIUM] += (base_bounties_to_give[SPY_DIFFICULTY_HARD] - num_refreshes) + + for(var/difficulty in bounties) + QDEL_LIST(bounties[difficulty]) + + var/list/pool = bounty_types[difficulty] + var/amount_to_give = bounties_to_give[difficulty] + var/failed_attempts = num_attempts_override || clamp(amount_to_give * 4, 10, 25) // more potential bounties = more attempts to make one + while(amount_to_give > 0 && failed_attempts > 0) + var/picked_bounty = pick_weight(pool) + var/datum/spy_bounty/bounty = new picked_bounty(src) + if(bounty.initalized) + amount_to_give -= 1 + bounties[difficulty] += bounty + + else + failed_attempts -= 1 + qdel(bounty) + + claimed_bounties_from_last_pool.Cut() + num_refreshes += 1 + refresh_timer = addtimer(CALLBACK(src, PROC_REF(refresh_bounty_list)), refresh_time, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + +/// Forces a refresh of the bounty list. +/// Counts towards [num_refreshes]. +/datum/spy_bounty_handler/proc/force_refresh() + if(refresh_timer) + deltimer(refresh_timer) + + refresh_bounty_list() diff --git a/code/modules/antagonists/spy/spy_uplink.dm b/code/modules/antagonists/spy/spy_uplink.dm new file mode 100644 index 00000000000..88e091310ca --- /dev/null +++ b/code/modules/antagonists/spy/spy_uplink.dm @@ -0,0 +1,208 @@ +/** + * ## Spy uplink + * + * Applied to items similar to traitor uplinks. + * + * Used for spies to complete bounties. + */ +/datum/component/spy_uplink + /// Weakref to the spy antag datum which owns this uplink + var/datum/weakref/spy_ref + /// The handler which manages all bounties across all spies. + var/static/datum/spy_bounty_handler/handler + +/datum/component/spy_uplink/Initialize(datum/antagonist/spy/spy) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + spy_ref = WEAKREF(spy) + + if(isnull(handler)) + handler = new() + +/datum/component/spy_uplink/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK_SECONDARY, PROC_REF(on_pre_attack_secondary)) + RegisterSignal(parent, COMSIG_TABLET_CHECK_DETONATE, PROC_REF(block_pda_bombs)) + +/datum/component/spy_uplink/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_EXAMINE, + COMSIG_ITEM_ATTACK_SELF, + COMSIG_ITEM_PRE_ATTACK_SECONDARY, + COMSIG_TABLET_CHECK_DETONATE, + )) + +/// Checks that the passed mob is the owner of this uplink. +/datum/component/spy_uplink/proc/is_our_spy(mob/whoever) + var/datum/antagonist/spy/spy_datum = spy_ref?.resolve() + return spy_datum?.owner.current == whoever + +/datum/component/spy_uplink/proc/on_examine(obj/item/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!is_our_spy(user)) + return + examine_list += span_notice("You recognize this as your spy uplink.") + examine_list += span_notice("- [EXAMINE_HINT("Use it in hand")] to view your bounty list.") + examine_list += span_notice("- [EXAMINE_HINT("Right click")] with it on a bounty target to claim it.") + +/datum/component/spy_uplink/proc/block_pda_bombs(obj/item/source) + SIGNAL_HANDLER + + return COMPONENT_TABLET_NO_DETONATE + +/datum/component/spy_uplink/proc/on_attack_self(obj/item/source, mob/user) + SIGNAL_HANDLER + + if(is_our_spy(user)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/datum, ui_interact), user) + return NONE + +/datum/component/spy_uplink/proc/on_pre_attack_secondary(obj/item/source, atom/target, mob/living/user, params) + SIGNAL_HANDLER + + if(!ismovable(target)) + return NONE + if(!is_our_spy(user)) + return NONE + if(!try_steal(target, user)) + return NONE + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Checks if the passed atom is something that can be stolen according to one of the active bounties. +/// If so, starts the stealing process. +/datum/component/spy_uplink/proc/try_steal(atom/movable/stealing, mob/living/spy) + for(var/datum/spy_bounty/bounty as anything in handler.get_all_bounties()) + if(!bounty.can_claim(spy)) + continue + if(!bounty.is_stealable(stealing)) + continue + if(bounty.claimed) + stealing.balloon_alert(spy, "bounty already claimed!") + return TRUE + if(DOING_INTERACTION(spy, REF(src))) + spy.balloon_alert(spy, "already scanning!") // Only shown if they're trying to scan two valid targets + return TRUE + SEND_SIGNAL(stealing, COMSIG_MOVABLE_SPY_STEALING, spy, bounty) + INVOKE_ASYNC(src, PROC_REF(start_stealing), stealing, spy, bounty) + return TRUE + + return FALSE + +/// Wraps the stealing process in a scanning effect. +/datum/component/spy_uplink/proc/start_stealing(atom/movable/stealing, mob/living/spy, datum/spy_bounty/bounty) + if(!isturf(stealing.loc) && stealing.loc != spy) + to_chat(spy, span_warning("Your uplinks blinks red: [stealing] cannot be extracted from there.")) + return FALSE + + log_combat(spy, stealing, "started stealing", parent, "(spy bounty)") + playsound(stealing, 'sound/items/pshoom.ogg', 33, vary = TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 0.33, ignore_walls = FALSE) + + var/obj/effect/scan_effect/active_scan_effect = new(stealing.loc) + active_scan_effect.appearance = stealing.appearance + active_scan_effect.dir = stealing.dir + active_scan_effect.makeHologram() + SET_PLANE_EXPLICIT(active_scan_effect, stealing.plane, stealing) + active_scan_effect.layer = stealing.layer + 0.1 + + var/obj/effect/scan_effect/cone/active_scan_cone + if(isturf(stealing.loc) && isturf(spy.loc)) // Cone doesn't make sense if its being held or something + active_scan_cone = new(spy.loc) + var/angle = round(get_angle(spy, stealing), 10) + if(angle > 180 && angle < 360) + active_scan_cone.pixel_x -= 16 + else if(angle < 180 && angle > 0) + active_scan_cone.pixel_x += 16 + if(angle > 90 && angle < 270) + active_scan_cone.pixel_y -= 16 + else if(angle < 90 || angle > 270) + active_scan_cone.pixel_y += 16 + active_scan_cone.transform = active_scan_cone.transform.Turn(angle) + active_scan_cone.alpha = 0 + animate(active_scan_cone, time = 0.5 SECONDS, alpha = initial(active_scan_cone.alpha)) + + . = steal_process(stealing, spy, bounty) + qdel(active_scan_effect) + qdel(active_scan_cone) + return . + +/// Attempts to steal the passed atom in accordance with the passed bounty. +/// If successful, proceeds to complete the bounty. +/datum/component/spy_uplink/proc/steal_process(atom/movable/stealing, mob/living/spy, datum/spy_bounty/bounty) + spy.visible_message( + span_warning("[spy] starts scanning [stealing] with a strange device..."), + span_notice("You start scanning [stealing], preparing it for extraction."), + ) + + if(!do_after(spy, bounty.theft_time, stealing, interaction_key = REF(src), hidden = TRUE)) + return FALSE + if(bounty.claimed) + to_chat(spy, span_warning("Your uplinks blinks red: The bounty for [stealing] has been claimed by another spy!")) + return FALSE + if(spy.is_holding(stealing) && !spy.dropItemToGround(stealing)) + to_chat(spy, span_warning("Your uplinks blinks red: [stealing] seems stuck to your hand!")) + return FALSE + + var/bounty_key = bounty.get_dupe_protection_key(stealing) + handler.all_claimed_bounty_types[bounty_key] += 1 + handler.claimed_bounties_from_last_pool[bounty_key] = TRUE + + bounty.clean_up_stolen_item(stealing, spy, handler) + bounty.claimed = TRUE + + var/atom/movable/reward = bounty.reward_item.spawn_item_for_generic_use(spy) + if(isitem(reward)) + spy.put_in_hands(reward) + + to_chat(spy, span_notice("Bounty complete! You have been rewarded with \a [reward].\ + [reward.loc == spy ? "" : " Find it at your feet."]")) + + playsound(parent, 'sound/machines/wewewew.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + + log_combat(spy, stealing, "stole", parent, "(spy bounty)") + log_spy("[key_name(spy)] completed the bounty [bounty.name] of difficulty [bounty.difficulty] by stealing [stealing] for \a [reward].") + SSblackbox.record_feedback("nested tally", "spy_bounty", 1, list("[stealing.type]", "[bounty.type]", "[bounty.difficulty]", "[bounty.reward_item.type]")) + + var/datum/antagonist/spy/spy_datum = spy_ref?.resolve() + if(!isnull(spy_datum)) + // "When" TGUI roundend is finished, a list of all bounties complete and their rewards should be put in a collapsible, + // otherwise it's just too much information to display cleanly. (That's why we're only displaying number and rewards) + spy_datum.bounties_claimed += 1 + spy_datum.all_loot += bounty.reward_item.name + + return TRUE + +/datum/component/spy_uplink/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SpyUplink") + ui.open() + +/datum/component/spy_uplink/ui_data(mob/user) + var/list/data = list() + + data["bounties"] = list() + for(var/datum/spy_bounty/bounty as anything in handler.get_all_bounties()) + UNTYPED_LIST_ADD(data["bounties"], bounty.to_ui_data(user)) + data["time_left"] = timeleft(handler.refresh_timer) + + return data + +/datum/component/spy_uplink/ui_status(mob/user, datum/ui_state/state) + if(isobserver(user) && user.client?.holder) + return UI_UPDATE + return ..() + +/obj/effect/scan_effect + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + layer = ABOVE_ALL_MOB_LAYER + +/obj/effect/scan_effect/cone + name = "holoray" + icon = 'icons/effects/effects.dmi' + icon_state = "scan_beam" + color = "#3ba0ff" + alpha = 200 diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 2480b186600..b801076747f 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -3,7 +3,10 @@ show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE suicide_cry = "FOR MYSELF!!" + /// What do we display when you gain the antag datum? var/greet_message = "" + /// Should we immediately print the objectives? + var/announce_objectives = TRUE /datum/antagonist/survivalist/forge_objectives() var/datum/objective/survive/survive = new @@ -18,7 +21,8 @@ /datum/antagonist/survivalist/greet() . = ..() to_chat(owner, "[greet_message]") - owner.announce_objectives() + if (announce_objectives) + owner.announce_objectives() /datum/antagonist/survivalist/guns greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way." @@ -52,3 +56,52 @@ /datum/antagonist/survivalist/magic/on_removal() REMOVE_TRAIT(owner, TRAIT_MAGICALLY_GIFTED, REF(src)) return..() + +/// Applied by the battle royale objective +/datum/antagonist/survivalist/battle_royale + name = "Battle Royale Contestant" + greet_message = "There has to be some way you can make it out of this alive..." + announce_objectives = FALSE + +/datum/antagonist/survivalist/battle_royale/on_gain() + . = ..() + if (isnull(owner.current)) + return + RegisterSignals(owner.current, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING), PROC_REF(on_died)) + +/datum/antagonist/survivalist/battle_royale/greet() + to_chat(owner, span_warning("[span_bold("You hear a tinny voice in your ear: ")] \ + Welcome contestant to Rumble Royale, the galaxy's greatest show! \n\ + You may have already heard our announcement, but we're glad to tell you that you are on live TV! \n\ + Your objective in this contest is simple: Within ten minutes be the last contestant left alive, to win a fabulous prize! \n\ + Your fellow contestants will be hearing this too, so you should grab a GPS quick and get hunting! \n\ + Noncompliance and removal of this implant is not recommended, and remember to smile for the cameras!")) + + return ..() + +/datum/antagonist/survivalist/battle_royale/on_removal() + if (isnull(owner.current)) + return ..() + UnregisterSignal(owner.current, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING)) + if (owner.current.stat == DEAD) + return ..() + to_chat(owner, span_notice("Your body is flooded with relief. Against all the odds, you've made it out alive.")) + owner.current?.mob_mood.add_mood_event("battle_royale", /datum/mood_event/royale_survivor) + return ..() + +/// Add an objective to go to a specific place. +/datum/antagonist/survivalist/battle_royale/proc/set_target_area(target_area_name) + var/datum/objective/custom/travel = new + travel.owner = owner + travel.explanation_text = "Reach the [target_area_name] before time runs out." + objectives.Insert(1, travel) + owner.announce_objectives() + +/// Called if you fail to survive. +/datum/antagonist/survivalist/battle_royale/proc/on_died() + SIGNAL_HANDLER + owner.remove_antag_datum(type) + +/datum/mood_event/royale_survivor + description = "I made it out of Rumble Royale with my life." + mood_change = 4 diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm index f2868bdce30..2c9d45e382d 100644 --- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm @@ -15,6 +15,8 @@ var/wanted_message ///List of everything found on the victim at the time of contracting, used to return their stuff afterwards. var/list/victim_belongings = list() + ///timerid for stuff that handles victim chat messages, effects and returnal + var/victim_timerid /datum/syndicate_contract/New(contract_owner, blacklist, type=CONTRACT_PAYOUT_SMALL) contract = new(src) @@ -122,20 +124,8 @@ //we'll start the effects in a few seconds since it takes a moment for the pod to leave. addtimer(CALLBACK(src, PROC_REF(handle_victim_experience), person_sent), 3 SECONDS) - // This is slightly delayed because of the sleep calls above to handle the narrative. - // We don't want to tell the station instantly. - var/points_to_check - var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(cargo_account) - points_to_check = cargo_account.account_balance - if(points_to_check >= ransom) - cargo_account.adjust_money(-ransom) - else - cargo_account.adjust_money(-points_to_check) - priority_announce( - text = "One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. \ - As is policy we've taken a portion of the station's funds to offset the overall cost.", - sender_override = "Nanotrasen Asset Protection") + var/datum/market_item/hostage/market_item = person_sent.process_capture(ransom * (rand(11, 13)/10)) + RegisterSignal(market_item, COMSIG_MARKET_ITEM_SPAWNED, PROC_REF(on_victim_shipped)) addtimer(CALLBACK(src, PROC_REF(finish_enter)), 3 SECONDS) @@ -166,10 +156,10 @@ * level - The current stage of harassement they are facing. This increases by itself, looping until finished. */ /datum/syndicate_contract/proc/handle_victim_experience(mob/living/victim, level = VICTIM_EXPERIENCE_START) - // Ship 'em back - dead or alive, 4 minutes wait. + // Ship 'em back - dead or alive // Even if they weren't the target, we're still treating them the same. if(!level) - addtimer(CALLBACK(src, PROC_REF(return_victim), victim), (60 * 10) * 4) + victim_timerid = addtimer(CALLBACK(src, PROC_REF(return_victim), victim), COME_BACK_FROM_CAPTURE_TIME, TIMER_STOPPABLE) if(victim.stat == DEAD) return @@ -209,7 +199,7 @@ level++ //move onto the next level. if(time_until_next) - addtimer(CALLBACK(src, PROC_REF(handle_victim_experience), victim, level), time_until_next) + victim_timerid = addtimer(CALLBACK(src, PROC_REF(handle_victim_experience), victim, level), time_until_next, TIMER_STOPPABLE) #undef VICTIM_EXPERIENCE_START #undef VICTIM_EXPERIENCE_FIRST_HIT @@ -217,34 +207,30 @@ #undef VICTIM_EXPERIENCE_THIRD_HIT #undef VICTIM_EXPERIENCE_LAST_HIT -// We're returning the victim +/// We're returning the victim to the station /datum/syndicate_contract/proc/return_victim(mob/living/victim) var/list/possible_drop_loc = list() - - for(var/turf/possible_drop in contract.dropoff.contents) + for(var/turf/possible_drop in shuffle(contract.dropoff.contents)) if(!isspaceturf(possible_drop) && !isclosedturf(possible_drop)) if(!possible_drop.is_blocked_turf()) possible_drop_loc.Add(possible_drop) - if(!possible_drop_loc.len) - to_chat(victim, span_hypnophrase("A million voices echo in your head... \"Seems where you got sent here from won't \ - be able to handle our pod... if we wanted the occupant to survive. Brace yourself, corporate dog.\"")) - for(var/turf/possible_drop in contract.dropoff.contents) - possible_drop_loc.Add(possible_drop) - if(iscarbon(victim)) - var/mob/living/carbon/carbon_victim = victim - if(carbon_victim.can_heartattack()) - carbon_victim.set_heartattack(TRUE) + var/turf/destination + if(length(possible_drop_loc)) + destination = pick(possible_drop_loc) - var/pod_rand_loc = rand(1, possible_drop_loc.len) - var/obj/structure/closet/supplypod/return_pod = new() - return_pod.bluespace = TRUE - return_pod.explosionSize = list(0,0,0,0) - return_pod.style = STYLE_SYNDICATE + var/obj/structure/closet/supplypod/back_to_station/return_pod = new() + return_pod.return_from_capture(victim, destination) + returnal_side_effects(return_pod, victim) - do_sparks(8, FALSE, victim) - victim.visible_message(span_notice("[victim] vanishes...")) +///Called if the victim is being returned to the station early, when from the black market. +/datum/syndicate_contract/proc/on_victim_shipped(datum/market_item/source, obj/item/market_uplink/uplink, shipping_method, turf/shipping_loc) + SIGNAL_HANDLER + deltimer(victim_timerid) + returnal_side_effects(shipping_loc, source.item) +///The annoying negative effects applied to the victim when returned to the station. +/datum/syndicate_contract/proc/returnal_side_effects(atom/dropoff_location, mob/living/victim) for(var/datum/weakref/belonging_ref in victim_belongings) var/obj/item/belonging = belonging_ref.resolve() if(!belonging) @@ -256,16 +242,12 @@ continue if(belonging == human_victim.shoes) continue - belonging.forceMove(return_pod) + belonging.forceMove(dropoff_location) - for(var/obj/item/W in victim_belongings) - W.forceMove(return_pod) - - victim.forceMove(return_pod) + for(var/obj/item/item in victim_belongings) + item.forceMove(dropoff_location) victim.flash_act() victim.adjust_eye_blur(3 SECONDS) victim.adjust_dizzy(3.5 SECONDS) victim.adjust_confusion(2 SECONDS) - - new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) diff --git a/code/modules/antagonists/traitor/objectives/final_objective/battle_royale.dm b/code/modules/antagonists/traitor/objectives/final_objective/battle_royale.dm new file mode 100644 index 00000000000..9b8f519da95 --- /dev/null +++ b/code/modules/antagonists/traitor/objectives/final_objective/battle_royale.dm @@ -0,0 +1,43 @@ +/datum/traitor_objective/ultimate/battle_royale + name = "Implant crewmembers with a subtle implant, then make them fight to the death on pay-per-view TV." + description = "Go to %AREA%, and receive the Royale Broadcast Kit. \ + Use the contained implant on station personnel to subtly implant them with a micro-explosive. \ + Once you have at least six contestants, use the contained remote to start a timer and begin broadcasting live. \ + If more than one contestant remains alive after ten minutes, all of the implants will detonate." + + ///Area type the objective owner must be in to receive the tools. + var/area/kit_spawn_area + ///Whether the kit was sent already. + var/equipped = FALSE + +/datum/traitor_objective/ultimate/battle_royale/generate_objective(datum/mind/generating_for, list/possible_duplicates) + var/list/possible_areas = GLOB.the_station_areas.Copy() + for(var/area/possible_area as anything in possible_areas) + if(ispath(possible_area, /area/station/hallway) || ispath(possible_area, /area/station/security)) + possible_areas -= possible_area + if(length(possible_areas) == 0) + return FALSE + kit_spawn_area = pick(possible_areas) + replace_in_name("%AREA%", initial(kit_spawn_area.name)) + return TRUE + +/datum/traitor_objective/ultimate/battle_royale/generate_ui_buttons(mob/user) + var/list/buttons = list() + if(!equipped) + buttons += add_ui_button("", "Pressing this will call down a pod with the Royale Broadcast kit.", "biohazard", "deliver_kit") + return buttons + +/datum/traitor_objective/ultimate/battle_royale/ui_perform_action(mob/living/user, action) + . = ..() + if(action != "deliver_kit" || equipped) + return + var/area/delivery_area = get_area(user) + if(delivery_area.type != kit_spawn_area) + to_chat(user, span_warning("You must be in [initial(kit_spawn_area.name)] to receive the Royale Broadcast kit.")) + return + equipped = TRUE + podspawn(list( + "target" = get_turf(user), + "style" = STYLE_SYNDICATE, + "spawn" = /obj/item/storage/box/syndie_kit/battle_royale, + )) diff --git a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm index 47b9b3b0167..cb9f4ac73aa 100644 --- a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm +++ b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm @@ -1,12 +1,12 @@ /datum/traitor_objective_category/final_objective name = "Final Objective" objectives = list( - /datum/traitor_objective/ultimate/romerol = 1, /datum/traitor_objective/ultimate/battlecruiser = 1, - /datum/traitor_objective/ultimate/space_dragon = 1, - /datum/traitor_objective/ultimate/supermatter_cascade = 1, - /datum/traitor_objective/ultimate/infect_ai = 1, + /datum/traitor_objective/ultimate/battle_royale = 1, /datum/traitor_objective/ultimate/dark_matteor = 1, + /datum/traitor_objective/ultimate/infect_ai = 1, + /datum/traitor_objective/ultimate/romerol = 1, + /datum/traitor_objective/ultimate/supermatter_cascade = 1, ) weight = 100 diff --git a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm b/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm deleted file mode 100644 index dd4f4955a2a..00000000000 --- a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/traitor_objective/ultimate/space_dragon - name = "Find a Space Carp and mutate their DNA with your own using a DNA harvester we will drop pod at %AREA%" - description = "Go to %AREA%, and receive the Carp DNA scanner. Use it on any Space Carp to harvest its DNA. \ - From there, use it on yourself, to mutate your own DNA with it and become a Space Dragon. \ - Don't worry about finding one, I'm sure there'll have a wave of carp right when you need it." - - ///Area type the objective owner must be in to receive the DNA extractor. - var/area/dna_scanner_spawnarea_type - ///Whether the DNA extraction kit was sent already. - var/received_dna_scanner = FALSE - -/datum/traitor_objective/ultimate/space_dragon/on_objective_taken(mob/user) - . = ..() - force_event(/datum/round_event_control/carp_migration, "[handler.owner]'s final objective") - -/datum/traitor_objective/ultimate/space_dragon/generate_objective(datum/mind/generating_for, list/possible_duplicates) - var/list/possible_areas = GLOB.the_station_areas.Copy() - for(var/area/possible_area as anything in possible_areas) - //remove areas too close to the destination, too obvious for our poor shmuck, or just unfair - if(ispath(possible_area, /area/station/hallway) || ispath(possible_area, /area/station/security)) - possible_areas -= possible_area - if(length(possible_areas) == 0) - return FALSE - dna_scanner_spawnarea_type = pick(possible_areas) - replace_in_name("%AREA%", initial(dna_scanner_spawnarea_type.name)) - return TRUE - -/datum/traitor_objective/ultimate/space_dragon/generate_ui_buttons(mob/user) - var/list/buttons = list() - if(!received_dna_scanner) - buttons += add_ui_button("", "Pressing this will call down a pod with the DNA extraction kit.", "biohazard", "carp_dna") - return buttons - -/datum/traitor_objective/ultimate/space_dragon/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if("carp_dna") - if(received_dna_scanner) - return - var/area/delivery_area = get_area(user) - if(delivery_area.type != dna_scanner_spawnarea_type) - to_chat(user, span_warning("You must be in [initial(dna_scanner_spawnarea_type.name)] to receive the DNA extraction kit.")) - return - received_dna_scanner = TRUE - podspawn(list( - "target" = get_turf(user), - "style" = STYLE_SYNDICATE, - "spawn" = /obj/item/storage/box/syndie_kit/space_dragon, - )) diff --git a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm index 93323e4e15f..1874b79d8a1 100644 --- a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm +++ b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm @@ -15,6 +15,8 @@ var/progression_objectives_minimum = 20 MINUTES /datum/traitor_objective/hack_comm_console/can_generate_objective(datum/mind/generating_for, list/possible_duplicates) + if(length(possible_duplicates) > 0) + return FALSE if(SStraitor.get_taken_count(/datum/traitor_objective/hack_comm_console) > 0) return FALSE if(handler.get_completion_progression(/datum/traitor_objective) < progression_objectives_minimum) diff --git a/code/modules/antagonists/traitor/objectives/infect.dm b/code/modules/antagonists/traitor/objectives/infect.dm index 5f761a273fc..459e8f54a0d 100644 --- a/code/modules/antagonists/traitor/objectives/infect.dm +++ b/code/modules/antagonists/traitor/objectives/infect.dm @@ -166,7 +166,7 @@ to_chat(affected_mob, span_warning("You feel someone try to inject you with something.")) balloon_alert(user, "injecting...") log_combat(user, affected_mob, "attempted to inject", src) - if(!do_after(user, 1.5 SECONDS)) + if(!do_after(user, 1.5 SECONDS, hidden = TRUE)) balloon_alert(user, "interrupted!") return var/datum/disease/chronic_illness/hms = new /datum/disease/chronic_illness() diff --git a/code/modules/antagonists/traitor/objectives/kidnapping.dm b/code/modules/antagonists/traitor/objectives/kidnapping.dm index 73a3fc3b3f0..d6aec912fdb 100644 --- a/code/modules/antagonists/traitor/objectives/kidnapping.dm +++ b/code/modules/antagonists/traitor/objectives/kidnapping.dm @@ -15,6 +15,8 @@ var/alive_bonus = 0 /// All stripped targets belongings (weakrefs) var/list/target_belongings = list() + /// The ID of the stoppable timer for returning the captured crew + var/list/victim_timerid duplicate_type = /datum/traitor_objective/target_player @@ -216,6 +218,7 @@ new /obj/effect/pod_landingzone(get_turf(user), new_pod) /datum/traitor_objective/target_player/kidnapping/proc/enter_check(obj/structure/closet/supplypod/extractionpod/source, entered_atom) + SIGNAL_HANDLER if(!istype(source)) CRASH("Kidnapping objective's enter_check called with source being not an extraction pod: [source ? source.type : "N/A"]") @@ -224,9 +227,6 @@ var/mob/living/carbon/human/sent_mob = entered_atom - if(sent_mob.mind) - ADD_TRAIT(sent_mob.mind, TRAIT_HAS_BEEN_KIDNAPPED, TRAIT_GENERIC) - for(var/obj/item/belonging in sent_mob.gather_belongings()) if(belonging == sent_mob.get_item_by_slot(ITEM_SLOT_ICLOTHING) || belonging == sent_mob.get_item_by_slot(ITEM_SLOT_FEET)) continue @@ -236,12 +236,8 @@ continue target_belongings.Add(WEAKREF(belonging)) - var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) - - if(cargo_account) //Just in case - cargo_account.adjust_money(-min(rand(1000, 3000), cargo_account.account_balance)) //Not so much, especially for competent cargo. Plus this can't be mass-triggered like it has been done with contractors - - priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. As is policy we've taken a portion of the station's funds to offset the overall cost.", "Nanotrasen Asset Protection", has_important_message = TRUE) + var/datum/market_item/hostage/market_item = sent_mob.process_capture(rand(1000, 3000)) + RegisterSignal(market_item, COMSIG_MARKET_ITEM_SPAWNED, PROC_REF(on_victim_shipped)) addtimer(CALLBACK(src, PROC_REF(handle_target), sent_mob), 1.5 SECONDS) @@ -257,7 +253,7 @@ source.startExitSequence(source) /datum/traitor_objective/target_player/kidnapping/proc/handle_target(mob/living/carbon/human/sent_mob) - addtimer(CALLBACK(src, PROC_REF(return_target), sent_mob), 3 MINUTES) + victim_timerid = addtimer(CALLBACK(src, PROC_REF(return_target), sent_mob), COME_BACK_FROM_CAPTURE_TIME, TIMER_STOPPABLE) if(sent_mob.stat == DEAD) return @@ -266,29 +262,24 @@ sent_mob.adjust_dizzy(10 SECONDS) sent_mob.set_eye_blur_if_lower(100 SECONDS) sent_mob.dna.species.give_important_for_life(sent_mob) // so plasmamen do not get left for dead - to_chat(sent_mob, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Your mind held many valuable secrets - \ + to_chat(sent_mob, span_hypnophrase("A million voices echo in your head... \"Your mind held many valuable secrets - \ we thank you for providing them. Your value is expended, and you will be ransomed back to your station. We always get paid, \ - so it's only a matter of time before we ship you back...\""))) + so it's only a matter of time before we ship you back...\"")) /datum/traitor_objective/target_player/kidnapping/proc/return_target(mob/living/carbon/human/sent_mob) if(!sent_mob || QDELETED(sent_mob)) //suicided and qdeleted themselves return - var/turf/return_turf = get_safe_random_station_turf() - if(!return_turf) //SOMEHOW - to_chat(sent_mob, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Seems where you got sent here from won't \ - be able to handle our pod... You will die here instead.\"
"))) - if (sent_mob.can_heartattack()) - sent_mob.set_heartattack(TRUE) - return + var/obj/structure/closet/supplypod/back_to_station/return_pod = new() + return_pod.return_from_capture(sent_mob) + returnal_side_effects(return_pod, sent_mob) - var/obj/structure/closet/supplypod/return_pod = new() - return_pod.bluespace = TRUE - return_pod.explosionSize = list(0,0,0,0) - return_pod.style = STYLE_SYNDICATE +/datum/traitor_objective/target_player/kidnapping/proc/on_victim_shipped(datum/market_item/source, obj/item/market_uplink/uplink, shipping_method, turf/shipping_loc) + SIGNAL_HANDLER + deltimer(victim_timerid) + returnal_side_effects(shipping_loc, source.item) - do_sparks(8, FALSE, sent_mob) - sent_mob.visible_message(span_notice("[sent_mob] vanishes!")) +/datum/traitor_objective/target_player/kidnapping/proc/returnal_side_effects(atom/dropoff_location, mob/living/carbon/human/sent_mob) for(var/obj/item/belonging in sent_mob.gather_belongings()) if(belonging == sent_mob.get_item_by_slot(ITEM_SLOT_ICLOTHING) || belonging == sent_mob.get_item_by_slot(ITEM_SLOT_FEET)) continue @@ -298,13 +289,10 @@ var/obj/item/belonging = belonging_ref.resolve() if(!belonging) continue - belonging.forceMove(return_pod) + belonging.forceMove(dropoff_location) - sent_mob.forceMove(return_pod) sent_mob.flash_act() sent_mob.adjust_confusion(10 SECONDS) sent_mob.adjust_dizzy(10 SECONDS) sent_mob.set_eye_blur_if_lower(100 SECONDS) sent_mob.dna.species.give_important_for_life(sent_mob) // so plasmamen do not get left for dead - - new /obj/effect/pod_landingzone(return_turf, return_pod) diff --git a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm index 52813fcdf57..1976fd38fc8 100644 --- a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm +++ b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm @@ -27,6 +27,8 @@ var/area/weakpoint_area /datum/traitor_objective/locate_weakpoint/can_generate_objective(datum/mind/generating_for, list/possible_duplicates) + if(length(possible_duplicates) > 0) + return FALSE if(handler.get_completion_progression(/datum/traitor_objective) < progression_objectives_minimum) return FALSE if(SStraitor.get_taken_count(/datum/traitor_objective/locate_weakpoint) > 0) @@ -190,7 +192,7 @@ for(var/mob/living/silicon/ai/ai_player in GLOB.player_list) to_chat(ai_player, alertstr) - if(!do_after(user, 30 SECONDS, src, IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM | IGNORE_INCAPACITATED | IGNORE_SLOWDOWNS, extra_checks = CALLBACK(src, PROC_REF(scan_checks), user, user_area, objective))) + if(!do_after(user, 30 SECONDS, src, IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM | IGNORE_INCAPACITATED | IGNORE_SLOWDOWNS, extra_checks = CALLBACK(src, PROC_REF(scan_checks), user, user_area, objective), hidden = TRUE)) playsound(user, 'sound/machines/buzz-sigh.ogg', 30, TRUE) return diff --git a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm index 48a29598981..9723d2b653e 100644 --- a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm +++ b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm @@ -165,7 +165,7 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han if (. || !istype(target, target_machine_path)) return balloon_alert(user, "planting device...") - if(!do_after(user, delay = deploy_time, target = src, interaction_key = DOAFTER_SOURCE_PLANTING_DEVICE)) + if(!do_after(user, delay = deploy_time, target = src, interaction_key = DOAFTER_SOURCE_PLANTING_DEVICE, hidden = TRUE)) return TRUE target.AddComponent(\ /datum/component/interaction_booby_trap,\ diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index 61d4796d66f..22d8ed7d39c 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -285,7 +285,7 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) if(result & COMPONENT_FORCE_FAIL_PLACEMENT || !istype(target, target_object_type)) balloon_alert(user, "you can't attach this onto here!") return - if(!do_after(user, deploy_time, src)) + if(!do_after(user, deploy_time, src, hidden = TRUE)) return if(planted_on) return diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 5f3cdae2026..aeea43fbf34 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -180,7 +180,7 @@ if(M == user) return if(IS_CULTIST(M) && IS_CULTIST(user)) - to_chat(user, span_cultlarge("\"Come now, do not capture your bretheren's soul.\"")) + to_chat(user, span_cult_large("\"Come now, do not capture your bretheren's soul.\"")) return if(theme == THEME_HOLY && IS_CULTIST(user)) hot_potato(user) @@ -317,15 +317,17 @@ return TRUE to_chat(user, "[span_userdanger("Capture failed!")]: The soul has already fled its mortal frame. You attempt to bring it back...") - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(on_poll_concluded), user, victim) - AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_SHADE, \ - job_bans = ROLE_CULTIST, \ - to_call = to_call, \ - title = "A shade" \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + check_jobban = ROLE_CULTIST, + poll_time = 20 SECONDS, + checked_target = src, + ignore_category = POLL_IGNORE_SHADE, + alert_pic = /mob/living/basic/shade, + jump_target = src, + role_name_text = "a shade", + chat_text_border_icon = /mob/living/basic/shade, ) - + on_poll_concluded(user, victim, chosen_one) return TRUE //it'll probably get someone ;) ///captures a shade that was previously released from a soulstone. @@ -397,6 +399,7 @@ soulstone_spirit.faction |= "[REF(user)]" //Add the master as a faction, allowing inter-mob cooperation if(IS_CULTIST(user)) soulstone_spirit.mind.add_antag_datum(/datum/antagonist/cult) + SSblackbox.record_feedback("tally", "cult_shade_created", 1) soulstone_spirit.cancel_camera() update_appearance() @@ -457,6 +460,7 @@ if(CONSTRUCT_JUGGERNAUT) if(IS_CULTIST(creator)) make_new_construct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the make_new_construct proc + SSblackbox.record_feedback("tally", "cult_shade_to_jugger", 1) return switch(theme) if(THEME_WIZARD) @@ -468,6 +472,7 @@ if(CONSTRUCT_WRAITH) if(IS_CULTIST(creator)) make_new_construct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the make_new_construct proc + SSblackbox.record_feedback("tally", "cult_shade_to_wraith", 1) return switch(theme) if(THEME_WIZARD) @@ -479,6 +484,7 @@ if(CONSTRUCT_ARTIFICER) if(IS_CULTIST(creator)) make_new_construct(/mob/living/basic/construct/artificer, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the make_new_construct proc + SSblackbox.record_feedback("tally", "cult_shade_to_arti", 1) return switch(theme) if(THEME_WIZARD) @@ -506,7 +512,7 @@ if(newstruct.mind && !IS_CULTIST(newstruct) && ((stoner && IS_CULTIST(stoner)) || cultoverride) && SSticker.HasRoundStarted()) newstruct.mind.add_antag_datum(/datum/antagonist/cult/construct) if(IS_CULTIST(stoner) || cultoverride) - to_chat(newstruct, span_cultbold("You are still bound to serve the cult[stoner ? " and [stoner]" : ""], follow [stoner?.p_their() || "their"] orders and help [stoner?.p_them() || "them"] complete [stoner?.p_their() || "their"] goals at all costs.")) + to_chat(newstruct, span_cult_bold("You are still bound to serve the cult[stoner ? " and [stoner]" : ""], follow [stoner?.p_their() || "their"] orders and help [stoner?.p_them() || "them"] complete [stoner?.p_their() || "their"] goals at all costs.")) else if(stoner) to_chat(newstruct, span_boldwarning("You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")) newstruct.clear_alert("bloodsense") diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm index 92489145fda..85267c0333c 100644 --- a/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm +++ b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm @@ -148,6 +148,7 @@ color = COLOR_PALE_GREEN light_range = 2 light_color = COLOR_PALE_GREEN + resistance_flags = parent_type::resistance_flags | SHUTTLE_CRUSH_PROOF /// Who are we reviving? var/mob/living/corpse /// Who if anyone is playing as them? diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm index f75da5f8557..79364a80a19 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm @@ -187,7 +187,7 @@ tear_reality() SEND_SIGNAL(src, COMSIG_GRAND_RUNE_COMPLETE, cheese_sacrificed) flick("[icon_state]_activate", src) - addtimer(CALLBACK(src, PROC_REF(remove_rune)), 6) + addtimer(CALLBACK(src, PROC_REF(remove_rune)), 0.6 SECONDS) SSblackbox.record_feedback("amount", "grand_runes_invoked", 1) /obj/effect/grand_rune/proc/remove_rune() diff --git a/code/modules/antagonists/wizard/slaughter_antag.dm b/code/modules/antagonists/wizard/slaughter_antag.dm index c9aea4478c3..484db3d14c8 100644 --- a/code/modules/antagonists/wizard/slaughter_antag.dm +++ b/code/modules/antagonists/wizard/slaughter_antag.dm @@ -1,5 +1,6 @@ /datum/antagonist/slaughter name = "\improper Slaughter Demon" + roundend_category = "demons" show_name_in_check_antagonists = TRUE ui_name = "AntagInfoDemon" job_rank = ROLE_ALIEN @@ -38,6 +39,30 @@ data["explain_attack"] = TRUE return data +/datum/antagonist/slaughter/roundend_report() + var/list/report = list() + + if(!owner) + CRASH("Antagonist datum without owner") + + report += printplayer(owner) + + if(objectives.len) + report += printobjectives(objectives) + + var/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/consume_ability = locate() in owner.current?.actions + if(consume_ability?.consume_count > 0) + report += span_greentext("The [name] consumed a total of [consume_ability.consume_count] bodies!") + else + report += span_redtext("The [name] did not consume anyone! Shame!!") + + if(owner.current?.stat != DEAD) + report += "The [name] survived!" + else + report += "The [name] was vanquished!" + + return report.Join("
") + /datum/antagonist/slaughter/laughter name = "Laughter demon" objective_verb = "Hug and Tickle" diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm index c0e5383048f..115e40ca595 100644 --- a/code/modules/antagonists/xeno/xeno.dm +++ b/code/modules/antagonists/xeno/xeno.dm @@ -111,7 +111,7 @@ parts += "The [name] were:
" - if(check_captivity(progenitor)) + if(check_captivity(progenitor.current) == CAPTIVE_XENO_PASS) parts += span_greentext("The progenitor of this hive was [progenitor.key], as [progenitor], who successfully escaped captivity!") + "
" else parts += span_redtext("The progenitor of this hive was [progenitor.key], as [progenitor], who failed to escape captivity") + "
" diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 8c85d4fc7b4..dd370f480f4 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -256,7 +256,7 @@ if(!id_card) to_chat(user, span_warning("You don't even have a id and you want to be an art patron?")) return - if(!id_card.registered_account || !id_card.registered_account.account_job) + if(!id_card.can_be_used_in_payment(user)) to_chat(user, span_warning("No valid non-departmental account found.")) return var/datum/bank_account/account = id_card.registered_account @@ -276,14 +276,15 @@ var/datum/bank_account/service_account = SSeconomy.get_dep_account(ACCOUNT_SRV) service_account.adjust_money(offer_amount * SERVICE_PERCENTILE_CUT) ///We give the curator(s) a cut (unless they're themselves the patron), as it's their job to curate and promote art among other things. - var/list/curator_accounts = SSeconomy.bank_accounts_by_job[/datum/job/curator] - account - var/curators_length = length(curator_accounts) - if(curators_length) - var/curator_cut = round(offer_amount * CURATOR_PERCENTILE_CUT / curators_length) - 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.") + if(SSeconomy.bank_accounts_by_job[/datum/job/curator]) + var/list/curator_accounts = SSeconomy.bank_accounts_by_job[/datum/job/curator] - account + var/curators_length = length(curator_accounts) + if(curators_length) + var/curator_cut = round(offer_amount * CURATOR_PERCENTILE_CUT / curators_length) + 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.") painting_metadata.patron_ckey = user.ckey painting_metadata.patron_name = user.real_name @@ -829,7 +830,7 @@ righthand_file = 'icons/mob/inhands/equipment/palette_righthand.dmi' w_class = WEIGHT_CLASS_TINY ///Chosen paint color - var/current_color = "#000000" + var/current_color = COLOR_BLACK /obj/item/paint_palette/Initialize(mapload) . = ..() diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index caebda50766..428bb5d8e06 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -30,35 +30,30 @@ /obj/structure/statue/wrench_act(mob/living/user, obj/item/tool) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return FALSE default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=1)) - return FALSE - user.balloon_alert(user, "slicing apart...") - if(W.use_tool(src, user, 40, volume=50)) - deconstruct(TRUE) - return + if(W.tool_behaviour == TOOL_WELDER) + if(!W.tool_start_check(user, amount=1)) + return FALSE + user.balloon_alert(user, "slicing apart...") + if(W.use_tool(src, user, 40, volume=50)) + deconstruct(TRUE) + return return ..() /obj/structure/statue/AltClick(mob/user) return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation -/obj/structure/statue/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/amount_mod = disassembled ? 0 : -2 - for(var/mat in custom_materials) - var/datum/material/custom_material = GET_MATERIAL_REF(mat) - var/amount = max(0,round(custom_materials[mat]/SHEET_MATERIAL_AMOUNT) + amount_mod) - if(amount > 0) - new custom_material.sheet_type(drop_location(), amount) - qdel(src) +/obj/structure/statue/atom_deconstruct(disassembled = TRUE) + var/amount_mod = disassembled ? 0 : -2 + for(var/mat in custom_materials) + var/datum/material/custom_material = GET_MATERIAL_REF(mat) + var/amount = max(0,round(custom_materials[mat]/SHEET_MATERIAL_AMOUNT) + amount_mod) + if(amount > 0) + new custom_material.sheet_type(drop_location(), amount) //////////////////////////////////////STATUES///////////////////////////////////////////////////////////// ////////////////////////uranium/////////////////////////////////// diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index f5f33afa83c..31584976ced 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -32,7 +32,7 @@ if(openclose == null || !sync_doors) openclose = M.density INVOKE_ASYNC(M, openclose ? TYPE_PROC_REF(/obj/machinery/door/poddoor, open) : TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 1 SECONDS) /obj/item/assembly/control/curtain name = "curtain controller" @@ -53,7 +53,7 @@ if(openclose == null || !sync_doors) openclose = M.density INVOKE_ASYNC(M, openclose ? TYPE_PROC_REF(/obj/structure/curtain/cloth/fancy/mechanical, open) : TYPE_PROC_REF(/obj/structure/curtain/cloth/fancy/mechanical, close)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 5) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 0.5 SECONDS) /obj/item/assembly/control/airlock @@ -101,7 +101,7 @@ for(var/D in open_or_close) INVOKE_ASYNC(D, doors_need_closing ? TYPE_PROC_REF(/obj/machinery/door/airlock, close) : TYPE_PROC_REF(/obj/machinery/door/airlock, open)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 1 SECONDS) /obj/item/assembly/control/massdriver @@ -130,7 +130,7 @@ if (M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 1 SECONDS) /obj/item/assembly/control/igniter @@ -149,7 +149,7 @@ if(M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/igniter, toggle)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 30) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 3 SECONDS) /obj/item/assembly/control/flasher name = "flasher controller" @@ -163,7 +163,7 @@ if(M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/flasher, flash)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 5 SECONDS) /obj/item/assembly/control/crematorium @@ -178,4 +178,4 @@ if (C.id == id) C.cremate(usr) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 5 SECONDS) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 5319d4465e2..b81eb26e7fa 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -43,7 +43,7 @@ flashing = flash . = ..() if(flash) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_icon)), 5) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_icon)), 0.5 SECONDS) holder?.update_icon(updates) /obj/item/assembly/flash/update_overlays() @@ -171,7 +171,7 @@ visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!")) //easy way to make sure that you can only long stun someone who is facing in your direction flashed.adjustStaminaLoss(rand(80, 120) * (1 - (deviation * 0.5))) - flashed.Paralyze(rand(25, 50) * (1 - (deviation * 0.5))) + flashed.Knockdown(rand(25, 50) * (1 - (deviation * 0.5))) SEND_SIGNAL(user, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, flashed, src, deviation) else if(user) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 478d5000721..b5c847a78ab 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -2,189 +2,298 @@ name = "infrared emitter" desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." icon_state = "infrared" - custom_materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass=SMALL_MATERIAL_AMOUNT*5) + base_icon_state = "infrared" + custom_materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, + ) is_position_sensitive = TRUE drop_sound = 'sound/items/handling/component_drop.ogg' pickup_sound = 'sound/items/handling/component_pickup.ogg' + set_dir_on_move = FALSE + /// Whether the beam is beaming var/on = FALSE + /// Whether the beam is visible var/visible = FALSE - var/maxlength = 8 - var/list/obj/effect/beam/i_beam/beams - var/olddir = 0 - var/turf/listeningTo + /// The length the beam can go + var/max_beam_length = 8 + /// The radius of which people can hear triggers var/hearing_range = 3 + /// Pass flags the beam uses to determine what it can pass through + var/beam_pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE + /// The current active beam datum + VAR_FINAL/datum/beam/active_beam + /// A reference to the turf at the END of our active beam + VAR_FINAL/turf/buffer_turf /obj/item/assembly/infra/Initialize(mapload) . = ..() - beams = list() - START_PROCESSING(SSobj, src) - AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) + AddComponent(/datum/component/simple_rotation) -/obj/item/assembly/infra/proc/post_rotation(mob/user, degrees) - refreshBeam() +/obj/item/assembly/infra/Destroy() + QDEL_NULL(active_beam) + buffer_turf = null + return ..() /obj/item/assembly/infra/AltClick(mob/user) return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation -/obj/item/assembly/infra/Destroy() - STOP_PROCESSING(SSobj, src) - listeningTo = null - QDEL_LIST(beams) - . = ..() - /obj/item/assembly/infra/examine(mob/user) . = ..() - . += span_notice("The infrared trigger is [on?"on":"off"].") + . += span_notice("The infrared trigger is [on ? "on" : "off"].") + +/// Checks if the passed movable can block the beam. +/obj/item/assembly/infra/proc/atom_blocks_beam(atom/movable/beam_atom) + if(isnull(beam_atom)) + return FALSE + if(beam_atom == src || beam_atom == holder) + return FALSE + // Blocks beams from triggering themselves, important to avoid infinite loops + if(istype(beam_atom, /obj/effect/ebeam)) + return FALSE + // Anti-revenant / anti-ghost guard + if(beam_atom.invisibility) + return FALSE + // In general non-dense items should not block beams, but make special cases for things being thrown + if(!beam_atom.density && !beam_atom.throwing) + return FALSE + // The actually important check. Ensures stuff like mobs trip it but stuff like laser projectiles don't + if(beam_atom.pass_flags_self & beam_pass_flags) + return FALSE + if(isitem(beam_atom)) + var/obj/item/beam_item = beam_atom + if(beam_item.item_flags & ABSTRACT) + return FALSE -/obj/item/assembly/infra/activate() - if(!..()) - return FALSE //Cooldown check - on = !on - refreshBeam() - update_appearance() return TRUE -/obj/item/assembly/infra/toggle_secure() - secured = !secured - if(secured) - START_PROCESSING(SSobj, src) - refreshBeam() - else - QDEL_LIST(beams) - STOP_PROCESSING(SSobj, src) - update_appearance() - return secured +/// Checks if the passed turf (or something on it) can block the beam. +/obj/item/assembly/infra/proc/turf_blocks_beam(turf/beam_turf) + if(beam_turf.density) + return TRUE + for(var/atom/movable/blocker as anything in beam_turf) + if(atom_blocks_beam(blocker)) + return TRUE + return FALSE -/obj/item/assembly/infra/update_appearance(updates=ALL) +/// Used to refresh the beam in whatever context. +/obj/item/assembly/infra/proc/make_beam() + SHOULD_NOT_SLEEP(TRUE) + + if(!isnull(buffer_turf)) + UnregisterSignal(buffer_turf, list(COMSIG_ATOM_EXITED, COMSIG_TURF_CHANGE)) + buffer_turf = null + + QDEL_NULL(active_beam) + if(!on || !secured) + return + + var/atom/start_loc = holder || src + var/turf/start_turf = start_loc.loc + if(!istype(start_turf)) + return + // One extra turf is added to max length to get an extra buffer + var/list/turf/potential_turfs = get_line(start_turf, get_ranged_target_turf(start_turf, dir, max_beam_length + 1)) + if(!length(potential_turfs)) + return + + var/list/turf/final_turfs = list() + for(var/turf/target_turf as anything in potential_turfs) + if(target_turf != start_turf && turf_blocks_beam(target_turf)) + break + final_turfs += target_turf + + if(!length(final_turfs)) + return + + var/turf/last_turf = final_turfs[length(final_turfs)] + buffer_turf = get_step(last_turf, dir) + + var/beam_target_x = pixel_x + var/beam_target_y = pixel_y + // The beam by default will go to middle of turf (because items are in the middle of turfs) + // So we need to offset it + if(dir & NORTH) + beam_target_y += 16 + else if(dir & SOUTH) + beam_target_y -= 16 + if(dir & WEST) + beam_target_x -= 16 + else if(dir & EAST) + beam_target_x += 16 + + active_beam = start_loc.Beam( + BeamTarget = last_turf, + beam_type = /obj/effect/ebeam/reacting/infrared, + icon = 'icons/effects/beam.dmi', + icon_state = "1-full", + beam_color = COLOR_RED, + emissive = TRUE, + override_target_pixel_x = beam_target_x, + override_target_pixel_y = beam_target_y, + ) + RegisterSignal(active_beam, COMSIG_BEAM_ENTERED, PROC_REF(beam_entered)) + RegisterSignal(active_beam, COMSIG_BEAM_TURFS_CHANGED, PROC_REF(beam_turfs_changed)) + update_visible() + // Buffer can be null (if we're at map edge for an example) but this fine + if(!isnull(buffer_turf)) + // We need to check the state of the turf at the end of the beam, to determine when we need to re-grow (if blocked) + RegisterSignal(buffer_turf, COMSIG_ATOM_EXITED, PROC_REF(buffer_exited)) + RegisterSignal(buffer_turf, COMSIG_TURF_CHANGE, PROC_REF(buffer_changed)) + +/obj/item/assembly/infra/proc/beam_entered(datum/beam/source, obj/effect/ebeam/hit, atom/movable/entered) + SIGNAL_HANDLER + + // First doesn't count + if(hit == active_beam.elements[1]) + return + if(!atom_blocks_beam(entered)) + return + + beam_trigger(hit, entered) + +/obj/item/assembly/infra/proc/beam_turfs_changed(datum/beam/source, list/datum/callback/post_change_callbacks) + SIGNAL_HANDLER + // If the turfs changed it's possible something is now blocking it, remake when done + post_change_callbacks += CALLBACK(src, PROC_REF(make_beam)) + +/obj/item/assembly/infra/proc/buffer_exited(turf/source, atom/movable/exited, ...) + SIGNAL_HANDLER + + if(!atom_blocks_beam(exited)) + return + + make_beam() + +/obj/item/assembly/infra/proc/buffer_changed(turf/source, path, list/new_baseturfs, flags, list/datum/callback/post_change_callbacks) + SIGNAL_HANDLER + + post_change_callbacks += CALLBACK(src, PROC_REF(make_beam)) + +/obj/item/assembly/infra/proc/beam_trigger(obj/effect/ebeam/hit, atom/movable/entered) + make_beam() + if(!COOLDOWN_FINISHED(src, next_activate)) + return + + pulse() + audible_message( + message = span_infoplain("[icon2html(src, hearers(holder || src))] *beep* *beep* *beep*"), + hearing_distance = hearing_range, + ) + playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE, extrarange = hearing_range - SOUND_RANGE + 1, falloff_distance = hearing_range) + COOLDOWN_START(src, next_activate, 3 SECONDS) + +/obj/item/assembly/infra/activate() + . = ..() + if(!.) + return + + toggle_on() + +/obj/item/assembly/infra/toggle_secure() + . = ..() + make_beam() + +/// Toggles the beam on or off. +/obj/item/assembly/infra/proc/toggle_on() + on = !on + make_beam() + update_appearance() + +/// Toggles the visibility of the beam. +/obj/item/assembly/infra/proc/toggle_visible() + visible = !visible + update_visible() + update_appearance() + +/// Updates the visibility of the beam (if active). +/obj/item/assembly/infra/proc/update_visible() + if(visible) + for(var/obj/effect/ebeam/beam as anything in active_beam?.elements) + beam.RemoveInvisibility(REF(src)) + else + for(var/obj/effect/ebeam/beam as anything in active_beam?.elements) + beam.SetInvisibility(INVISIBILITY_ABSTRACT, REF(src)) + +/obj/item/assembly/infra/vv_edit_var(var_name, var_value) + . = ..() + if(!.) + return + switch(var_name) + if(NAMEOF(src, visible)) + update_visible() + update_appearance() + + if(NAMEOF(src, on), NAMEOF(src, max_beam_length), NAMEOF(src, beam_pass_flags)) + make_beam() + update_appearance() + +/obj/item/assembly/infra/update_appearance(updates) . = ..() holder?.update_appearance(updates) /obj/item/assembly/infra/update_overlays() . = ..() attached_overlays = list() - if(!on) - return - . += "infrared_on" - attached_overlays += "infrared_on" - if(visible && secured) - . += "infrared_visible" - attached_overlays += "infrared_visible" + if(on) + attached_overlays += "[base_icon_state]_on" + + . += attached_overlays /obj/item/assembly/infra/dropped() . = ..() if(holder) holder_movement() //sync the dir of the device as well if it's contained in a TTV or an assembly holder else - INVOKE_ASYNC(src, PROC_REF(refreshBeam)) + make_beam() -/obj/item/assembly/infra/process() - if(!on || !secured) - refreshBeam() - return - -/obj/item/assembly/infra/proc/refreshBeam() - QDEL_LIST(beams) - if(throwing || !on || !secured) - return - if(holder) - if(holder.master) //incase the sensor is part of an assembly that's contained in another item, such as a single tank bomb - if(!holder.master.IsSpecialAssembly() || !isturf(holder.master.loc)) - return - else if(!isturf(holder.loc)) //else just check where the holder is - return - else if(!isturf(loc)) //or just where the fuck we are in general - return - var/turf/T = get_turf(src) - var/_dir = dir - var/turf/_T = get_step(T, _dir) - if(_T) - for(var/i in 1 to maxlength) - var/obj/effect/beam/i_beam/I = new(T) - if(istype(holder, /obj/item/assembly_holder)) - I.icon_state = "[initial(I.icon_state)]_l" //Sync the offset of the beam with the position of the sensor. - else if(istype(holder, /obj/item/transfer_valve)) - I.icon_state = "[initial(I.icon_state)]_ttv" - I.set_density(TRUE) - if(!I.Move(_T)) - qdel(I) - switchListener(_T) - break - I.set_density(FALSE) - beams += I - I.master = src - I.setDir(_dir) - if(!visible) - I.SetInvisibility(INVISIBILITY_ABSTRACT) - T = _T - _T = get_step(_T, _dir) - CHECK_TICK +/obj/item/assembly/infra/on_attach() + . = ..() + make_beam() + holder.set_dir_on_move = set_dir_on_move /obj/item/assembly/infra/on_detach() + holder.set_dir_on_move = initial(holder.set_dir_on_move) . = ..() if(!.) return - refreshBeam() + make_beam() -/obj/item/assembly/infra/attack_hand(mob/user, list/modifiers) +/obj/item/assembly/infra/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) . = ..() - refreshBeam() - -/obj/item/assembly/infra/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - var/t = dir - . = ..() - setDir(t) - -/obj/item/assembly/infra/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) - . = ..() - olddir = dir - -/obj/item/assembly/infra/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - . = ..() - if(!olddir) + if(loc == old_loc) return - setDir(olddir) - olddir = null - -/obj/item/assembly/infra/proc/trigger_beam(atom/movable/AM, turf/location) - refreshBeam() - switchListener(location) - if(!secured || !on || next_activate > world.time) - return FALSE - pulse() - audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) - for(var/mob/hearing_mob in get_hearers_in_view(hearing_range, src)) - hearing_mob.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) - next_activate = world.time + 30 - -/obj/item/assembly/infra/proc/switchListener(turf/newloc) - if(listeningTo == newloc) + make_beam() + if(!visible || forced || !movement_dir || !Adjacent(old_loc)) return - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_ATOM_EXITED) - RegisterSignal(newloc, COMSIG_ATOM_EXITED, PROC_REF(check_exit)) - listeningTo = newloc + // Because the new beam is made in the new loc, it "jumps" from one turf to another + // We can do an animate to pretend we're gliding between turfs rather than making a whole new beam + var/x_move = 0 + var/y_move = 0 + if(movement_dir & NORTH) + y_move = -32 + else if(movement_dir & SOUTH) + y_move = 32 + if(movement_dir & WEST) + x_move = 32 + else if(movement_dir & EAST) + x_move = -32 -/obj/item/assembly/infra/proc/check_exit(datum/source, atom/movable/gone, direction) - SIGNAL_HANDLER + var/fake_glide_time = round(world.icon_size / glide_size * world.tick_lag, world.tick_lag) + for(var/obj/effect/ebeam/beam as anything in active_beam?.elements) + var/matrix/base_transform = matrix(beam.transform) + beam.transform = beam.transform.Translate(x_move, y_move) + animate(beam, transform = base_transform, time = fake_glide_time) - if(QDELETED(src)) - return - if(src == gone || istype(gone, /obj/effect/beam/i_beam)) - return - if(isitem(gone)) - var/obj/item/I = gone - if (I.item_flags & ABSTRACT) - return - INVOKE_ASYNC(src, PROC_REF(refreshBeam)) - -/obj/item/assembly/infra/setDir() +/obj/item/assembly/infra/setDir(newdir) + var/prev_dir = dir . = ..() - refreshBeam() + if(dir == prev_dir) + return + make_beam() /obj/item/assembly/infra/ui_status(mob/user, datum/ui_state/state) - if(is_secured(user)) - return ..() - return UI_CLOSE + return is_secured(user) ? ..() : UI_CLOSE /obj/item/assembly/infra/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -201,44 +310,17 @@ /obj/item/assembly/infra/ui_act(action, params) . = ..() if(.) - return + return . switch(action) if("power") - on = !on - . = TRUE + toggle_on() + return TRUE if("visibility") - visible = !visible - . = TRUE + toggle_visible() + return TRUE - update_appearance() - refreshBeam() - -/***************************IBeam*********************************/ - -/obj/effect/beam/i_beam +// Beam subtype for the infrared emitter +/obj/effect/ebeam/reacting/infrared name = "infrared beam" - icon = 'icons/obj/weapons/guns/projectiles.dmi' - icon_state = "ibeam" - anchored = TRUE - density = FALSE - pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE - pass_flags_self = LETPASSTHROW - var/obj/item/assembly/infra/master - -/obj/effect/beam/i_beam/Initialize(mapload) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/beam/i_beam/proc/on_entered(datum/source, atom/movable/AM as mob|obj) - SIGNAL_HANDLER - if(istype(AM, /obj/effect/beam)) - return - if (isitem(AM)) - var/obj/item/I = AM - if (I.item_flags & ABSTRACT) - return - INVOKE_ASYNC(master, TYPE_PROC_REF(/obj/item/assembly/infra, trigger_beam), AM, get_turf(src)) + alpha = 175 diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 52ef29f38e5..de0954c960e 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -35,7 +35,7 @@ /obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) . = ..() - if(message_mods[WHISPER_MODE]) //Too quiet lad + if(message_mods[WHISPER_MODE] || message_mods[MODE_RELAY]) //Too quiet lad return FALSE if(speaker == src) return FALSE diff --git a/code/modules/asset_cache/assets/tcomms.dm b/code/modules/asset_cache/assets/tcomms.dm index ecfdb4a498c..fdbab5f4c9b 100644 --- a/code/modules/asset_cache/assets/tcomms.dm +++ b/code/modules/asset_cache/assets/tcomms.dm @@ -1,5 +1,5 @@ /datum/asset/spritesheet/telecomms - name="tcomms" + name = "tcomms" /datum/asset/spritesheet/telecomms/create_spritesheets() var/list/inserted_states = list() // No need to send entire `telecomms.dmi`. diff --git a/code/modules/asset_cache/assets/vending.dm b/code/modules/asset_cache/assets/vending.dm index e7d2fb9bc37..4d99eeefdc9 100644 --- a/code/modules/asset_cache/assets/vending.dm +++ b/code/modules/asset_cache/assets/vending.dm @@ -38,7 +38,7 @@ var/icon/I = icon(icon_file, icon_state, SOUTH) var/c = initial(item.color) - if (!isnull(c) && c != "#FFFFFF") + if (!isnull(c) && c != COLOR_WHITE) I.Blend(c, ICON_MULTIPLY) var/imgid = replacetext(replacetext("[item]", "/obj/item/", ""), "/", "-") diff --git a/code/modules/atmospherics/Atmospherics.md b/code/modules/atmospherics/Atmospherics.md index 6d61a8cf16b..1203ed232e1 100644 --- a/code/modules/atmospherics/Atmospherics.md +++ b/code/modules/atmospherics/Atmospherics.md @@ -3,7 +3,7 @@ This file will be written in the first person in the interest of having a laid back style, as some of the concepts here would be ass to read as technical writing. Understand that this isn't the work of one person, but the combined efforts of several contributors. It is a living document, and one you should strive to keep up to date. -I have ~~stolen~~ adapted this document from the work of duncathan, an off and on maintainer who is responsible for the majority of the quality of the current atmos system. He pushed through several code cleanliness and sanity refactors to the system, and wrote the rundown of gas mixtures you'll find in this document. See the [original](https://gist.github.com/duncathan/77d918748d153b4f31a8f76f6085b91a) for his draft. +I have ~~stolen~~ adapted this document from the work of duncathan, an off and on maintainer who is responsible for the majority of the quality of the current atmos system. Hii pushed through several code cleanliness and sanity refactors to the system, and wrote the rundown of gas mixtures you'll find in this document. See the [original](https://gist.github.com/duncathan/77d918748d153b4f31a8f76f6085b91a) for his draft. Now, the purpose of this bit of documentation. diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 87523034f3e..cfb87ce7cb3 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -184,7 +184,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) if(amount <= 0) return null var/ratio = amount / sum - var/datum/gas_mixture/removed = new type + var/datum/gas_mixture/removed = new type(volume) var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars removed.temperature = temperature @@ -206,7 +206,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) ratio = min(ratio, 1) var/list/cached_gases = gases - var/datum/gas_mixture/removed = new type + var/datum/gas_mixture/removed = new type(volume) var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars removed.temperature = temperature diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 060b5a12ae9..32acadb3bee 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -97,7 +97,7 @@ purchaseable = TRUE base_value = 0.2 desc = "What the fuck is carbon dioxide?" - primary_color = "#808080" + primary_color = COLOR_GRAY /datum/gas/plasma id = GAS_PLASMA @@ -134,7 +134,7 @@ rarity = 50 base_value = 2.5 desc = "The most noble gas of them all. High quantities of hyper-noblium actively prevents reactions from occuring." - primary_color = "#008080" + primary_color = COLOR_TEAL /datum/gas/nitrous_oxide id = GAS_N2O @@ -208,7 +208,7 @@ rarity = 250 base_value = 1 desc = "Not necessarily a gas, miasma refers to biological pollutants found in the atmosphere." - primary_color = "#808000" + primary_color = COLOR_OLIVE /datum/gas/freon id = GAS_FREON @@ -280,7 +280,7 @@ rarity = 300 base_value = 4 desc = "A potent fire supressant. Removes oxygen from high temperature fires and cools down the area" - primary_color = "#800080" + primary_color = COLOR_PURPLE /datum/gas/helium id = GAS_HELIUM @@ -303,7 +303,7 @@ rarity = 1 base_value = 10 desc = "We still don't know what it does, but it sells for a lot." - primary_color = "#800000" + primary_color = COLOR_MAROON /obj/effect/overlay/gas icon = 'icons/effects/atmospherics.dmi' diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 66734bc31c5..56da306a6d5 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -448,18 +448,18 @@ /datum/gas_reaction/nitrousformation/react(datum/gas_mixture/air) var/list/cached_gases = air.gases - var/heat_efficency = min(cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(0.5), cached_gases[/datum/gas/nitrogen][MOLES]) - if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency * 0.5 < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency < 0)) + var/heat_efficiency = min(cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(0.5), cached_gases[/datum/gas/nitrogen][MOLES]) + if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficiency * 0.5 < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficiency < 0)) return NO_REACTION // Shouldn't produce gas from nothing. var/old_heat_capacity = air.heat_capacity() - cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency * 0.5 - cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency + cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficiency * 0.5 + cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficiency ASSERT_GAS(/datum/gas/nitrous_oxide, air) - cached_gases[/datum/gas/nitrous_oxide][MOLES] += heat_efficency + cached_gases[/datum/gas/nitrous_oxide][MOLES] += heat_efficiency - SET_REACTION_RESULTS(heat_efficency) - var/energy_released = heat_efficency * N2O_FORMATION_ENERGY + SET_REACTION_RESULTS(heat_efficiency) + var/energy_released = heat_efficiency * N2O_FORMATION_ENERGY var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) // The air cools down when reacting. @@ -642,20 +642,20 @@ /datum/gas_reaction/nitrium_formation/react(datum/gas_mixture/air) var/list/cached_gases = air.gases var/temperature = air.temperature - var/heat_efficency = min(temperature / NITRIUM_FORMATION_TEMP_DIVISOR, cached_gases[/datum/gas/tritium][MOLES], cached_gases[/datum/gas/nitrogen][MOLES], cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.05)) + var/heat_efficiency = min(temperature / NITRIUM_FORMATION_TEMP_DIVISOR, cached_gases[/datum/gas/tritium][MOLES], cached_gases[/datum/gas/nitrogen][MOLES], cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.05)) - if( heat_efficency <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency < 0) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.05 < 0)) //Shouldn't produce gas from nothing. + if( heat_efficiency <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - heat_efficiency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficiency < 0) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficiency * 0.05 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION var/old_heat_capacity = air.heat_capacity() ASSERT_GAS(/datum/gas/nitrium, air) - cached_gases[/datum/gas/tritium][MOLES] -= heat_efficency - cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency - cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.05 //bz gets consumed to balance the nitrium production and not make it too common and/or easy - cached_gases[/datum/gas/nitrium][MOLES] += heat_efficency + cached_gases[/datum/gas/tritium][MOLES] -= heat_efficiency + cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficiency + cached_gases[/datum/gas/bz][MOLES] -= heat_efficiency * 0.05 //bz gets consumed to balance the nitrium production and not make it too common and/or easy + cached_gases[/datum/gas/nitrium][MOLES] += heat_efficiency - SET_REACTION_RESULTS(heat_efficency) - var/energy_used = heat_efficency * NITRIUM_FORMATION_ENERGY + SET_REACTION_RESULTS(heat_efficiency) + var/energy_used = heat_efficiency * NITRIUM_FORMATION_ENERGY var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) //the air cools down when reacting @@ -687,19 +687,19 @@ var/temperature = air.temperature //This reaction is agressively slow. like, a tenth of a mole per fire slow. Keep that in mind - var/heat_efficency = min(temperature / NITRIUM_DECOMPOSITION_TEMP_DIVISOR, cached_gases[/datum/gas/nitrium][MOLES]) + var/heat_efficiency = min(temperature / NITRIUM_DECOMPOSITION_TEMP_DIVISOR, cached_gases[/datum/gas/nitrium][MOLES]) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficency < 0)) //Shouldn't produce gas from nothing. + if (heat_efficiency <= 0 || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficiency < 0)) //Shouldn't produce gas from nothing. return NO_REACTION var/old_heat_capacity = air.heat_capacity() air.assert_gases(/datum/gas/nitrogen, /datum/gas/hydrogen) - cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficency - cached_gases[/datum/gas/hydrogen][MOLES] += heat_efficency - cached_gases[/datum/gas/nitrogen][MOLES] += heat_efficency + cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficiency + cached_gases[/datum/gas/hydrogen][MOLES] += heat_efficiency + cached_gases[/datum/gas/nitrogen][MOLES] += heat_efficiency - SET_REACTION_RESULTS(heat_efficency) - var/energy_released = heat_efficency * NITRIUM_DECOMPOSITION_ENERGY + SET_REACTION_RESULTS(heat_efficiency) + var/energy_released = heat_efficiency * NITRIUM_DECOMPOSITION_ENERGY var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) //the air heats up when reacting @@ -821,28 +821,38 @@ requirements = list( /datum/gas/halon = MINIMUM_MOLE_COUNT, /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, + "MIN_TEMP" = HALON_COMBUSTION_MIN_TEMPERATURE, ) /datum/gas_reaction/halon_o2removal/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases var/temperature = air.temperature - var/heat_efficency = min(temperature / ( FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 10), cached_gases[/datum/gas/halon][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(20)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/halon][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency * 20 < 0)) //Shouldn't produce gas from nothing. + var/heat_efficiency = min(temperature / HALON_COMBUSTION_TEMPERATURE_SCALE, cached_gases[/datum/gas/halon][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(20)) + if (heat_efficiency <= 0 || (cached_gases[/datum/gas/halon][MOLES] - heat_efficiency < 0 ) || (cached_gases[/datum/gas/oxygen][MOLES] - heat_efficiency * 20 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION var/old_heat_capacity = air.heat_capacity() - ASSERT_GAS(/datum/gas/carbon_dioxide, air) - cached_gases[/datum/gas/halon][MOLES] -= heat_efficency - cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency * 20 - cached_gases[/datum/gas/carbon_dioxide][MOLES] += heat_efficency * 5 + ASSERT_GAS(/datum/gas/pluoxium, air) + cached_gases[/datum/gas/halon][MOLES] -= heat_efficiency + cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficiency * 20 + cached_gases[/datum/gas/pluoxium][MOLES] += heat_efficiency * 2.5 - SET_REACTION_RESULTS(heat_efficency * 5) - var/energy_used = heat_efficency * HALON_COMBUSTION_ENERGY + SET_REACTION_RESULTS(heat_efficiency * 5) + var/energy_used = heat_efficiency * HALON_COMBUSTION_ENERGY var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) + + // Resin foam effects. + var/turf/open/location = holder + var/obj/effect/particle_effect/fluid/foam/foam = locate() in location + var/obj/structure/foamedmetal/resin = locate() in location + if(heat_efficiency > HALON_COMBUSTION_MINIMUM_RESIN_MOLES && isopenturf(location) && !foam && !resin) // Don't resin if there is aleady resin or we are not in an open turf. + var/datum/effect_system/fluid_spread/foam/metal/resin/halon/foaming = new + foaming.set_up(amount = HALON_COMBUSTION_RESIN_VOLUME, holder = holder, location = location) + foaming.start() + return REACTING @@ -870,18 +880,18 @@ /datum/gas_reaction/healium_formation/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases var/temperature = air.temperature - var/heat_efficency = min(temperature * 0.3, cached_gases[/datum/gas/freon][MOLES] * INVERSE(2.75), cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.25)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/freon][MOLES] - heat_efficency * 2.75 < 0 ) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.25 < 0)) //Shouldn't produce gas from nothing. + var/heat_efficiency = min(temperature * 0.3, cached_gases[/datum/gas/freon][MOLES] * INVERSE(2.75), cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.25)) + if (heat_efficiency <= 0 || (cached_gases[/datum/gas/freon][MOLES] - heat_efficiency * 2.75 < 0 ) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficiency * 0.25 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION var/old_heat_capacity = air.heat_capacity() ASSERT_GAS(/datum/gas/healium, air) - cached_gases[/datum/gas/freon][MOLES] -= heat_efficency * 2.75 - cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.25 - cached_gases[/datum/gas/healium][MOLES] += heat_efficency * 3 + cached_gases[/datum/gas/freon][MOLES] -= heat_efficiency * 2.75 + cached_gases[/datum/gas/bz][MOLES] -= heat_efficiency * 0.25 + cached_gases[/datum/gas/healium][MOLES] += heat_efficiency * 3 - SET_REACTION_RESULTS(heat_efficency * 3) - var/energy_released = heat_efficency * HEALIUM_FORMATION_ENERGY + SET_REACTION_RESULTS(heat_efficiency * 3) + var/energy_released = heat_efficiency * HEALIUM_FORMATION_ENERGY var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) @@ -911,18 +921,18 @@ var/list/cached_gases = air.gases var/temperature = air.temperature - var/heat_efficency = min(temperature * ZAUKER_FORMATION_TEMPERATURE_SCALE, cached_gases[/datum/gas/hypernoblium][MOLES] * INVERSE(0.01), cached_gases[/datum/gas/nitrium][MOLES] * INVERSE(0.5)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/hypernoblium][MOLES] - heat_efficency * 0.01 < 0 ) || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficency * 0.5 < 0)) //Shouldn't produce gas from nothing. + var/heat_efficiency = min(temperature * ZAUKER_FORMATION_TEMPERATURE_SCALE, cached_gases[/datum/gas/hypernoblium][MOLES] * INVERSE(0.01), cached_gases[/datum/gas/nitrium][MOLES] * INVERSE(0.5)) + if (heat_efficiency <= 0 || (cached_gases[/datum/gas/hypernoblium][MOLES] - heat_efficiency * 0.01 < 0 ) || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficiency * 0.5 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION var/old_heat_capacity = air.heat_capacity() ASSERT_GAS(/datum/gas/zauker, air) - cached_gases[/datum/gas/hypernoblium][MOLES] -= heat_efficency * 0.01 - cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficency * 0.5 - cached_gases[/datum/gas/zauker][MOLES] += heat_efficency * 0.5 + cached_gases[/datum/gas/hypernoblium][MOLES] -= heat_efficiency * 0.01 + cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficiency * 0.5 + cached_gases[/datum/gas/zauker][MOLES] += heat_efficiency * 0.5 - SET_REACTION_RESULTS(heat_efficency * 0.5) - var/energy_used = heat_efficency * ZAUKER_FORMATION_ENERGY + SET_REACTION_RESULTS(heat_efficiency * 0.5) + var/energy_used = heat_efficiency * ZAUKER_FORMATION_ENERGY var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) @@ -993,18 +1003,18 @@ var/list/cached_gases = air.gases var/temperature = air.temperature - var/heat_efficency = min(temperature * 0.005, cached_gases[/datum/gas/pluoxium][MOLES] * INVERSE(0.2), cached_gases[/datum/gas/hydrogen][MOLES] * INVERSE(2)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/pluoxium][MOLES] - heat_efficency * 0.2 < 0 ) || (cached_gases[/datum/gas/hydrogen][MOLES] - heat_efficency * 2 < 0)) //Shouldn't produce gas from nothing. + var/heat_efficiency = min(temperature * 0.005, cached_gases[/datum/gas/pluoxium][MOLES] * INVERSE(0.2), cached_gases[/datum/gas/hydrogen][MOLES] * INVERSE(2)) + if (heat_efficiency <= 0 || (cached_gases[/datum/gas/pluoxium][MOLES] - heat_efficiency * 0.2 < 0 ) || (cached_gases[/datum/gas/hydrogen][MOLES] - heat_efficiency * 2 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION var/old_heat_capacity = air.heat_capacity() ASSERT_GAS(/datum/gas/proto_nitrate, air) - cached_gases[/datum/gas/hydrogen][MOLES] -= heat_efficency * 2 - cached_gases[/datum/gas/pluoxium][MOLES] -= heat_efficency * 0.2 - cached_gases[/datum/gas/proto_nitrate][MOLES] += heat_efficency * 2.2 + cached_gases[/datum/gas/hydrogen][MOLES] -= heat_efficiency * 2 + cached_gases[/datum/gas/pluoxium][MOLES] -= heat_efficiency * 0.2 + cached_gases[/datum/gas/proto_nitrate][MOLES] += heat_efficiency * 2.2 - SET_REACTION_RESULTS(heat_efficency * 2.2) - var/energy_released = heat_efficency * PN_FORMATION_ENERGY + SET_REACTION_RESULTS(heat_efficiency * 2.2) + var/energy_released = heat_efficiency * PN_FORMATION_ENERGY var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 0656159ee5a..f8440fa0918 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -125,6 +125,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) GLOB.air_alarms += src update_appearance() find_and_hang_on_wall() + register_context() /obj/machinery/airalarm/process() if(!COOLDOWN_FINISHED(src, warning_cooldown)) @@ -186,7 +187,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) . += span_notice("Right-click to [locked ? "unlock" : "lock"] the interface.") /obj/machinery/airalarm/ui_status(mob/user, datum/ui_state/state) - if(user.has_unlimited_silicon_privilege && aidisabled) + if(HAS_SILICON_ACCESS(user) && aidisabled) to_chat(user, "AI control has been disabled.") else if(!shorted) return ..() @@ -227,7 +228,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) var/data = list() data["locked"] = locked - data["siliconUser"] = user.has_unlimited_silicon_privilege + data["siliconUser"] = HAS_SILICON_ACCESS(user) data["emagged"] = (obj_flags & EMAGGED ? 1 : 0) data["dangerLevel"] = danger_level data["atmosAlarm"] = !!my_area.active_alarms[ALARM_ATMOS] @@ -288,7 +289,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) singular_tlv["hazard_max"] = tlv.hazard_max data["tlvSettings"] += list(singular_tlv) - if(!locked || user.has_unlimited_silicon_privilege) + if(!locked || HAS_SILICON_ACCESS(user)) data["vents"] = list() for(var/obj/machinery/atmospherics/components/unary/vent_pump/vent as anything in my_area.air_vents) data["vents"] += list(list( @@ -345,7 +346,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) if(. || buildstage != AIR_ALARM_BUILD_COMPLETE) return - if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled)) + if((locked && !HAS_SILICON_ACCESS(usr)) || (HAS_SILICON_ACCESS(usr) && aidisabled)) return var/mob/user = usr diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_contextual_tips.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_contextual_tips.dm new file mode 100644 index 00000000000..0486251c200 --- /dev/null +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_contextual_tips.dm @@ -0,0 +1,20 @@ +/obj/machinery/airalarm/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + return + + if(held_item.tool_behaviour == TOOL_CROWBAR) + if(buildstage == AIR_ALARM_BUILD_NO_WIRES) + context[SCREENTIP_CONTEXT_LMB] = "Pry out Electronics" + + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER && buildstage == AIR_ALARM_BUILD_COMPLETE) + context[SCREENTIP_CONTEXT_LMB] = panel_open ? "Expose wires" : "Unexpose wires" + + else if(held_item.tool_behaviour == TOOL_WIRECUTTER) + if (panel_open) + context[SCREENTIP_CONTEXT_LMB] = "Manipulate wires" + + else if(held_item.tool_behaviour == TOOL_WRENCH) + if(buildstage == AIR_ALARM_BUILD_NO_CIRCUIT) + context[SCREENTIP_CONTEXT_LMB] = "Detatch Alarm" + return CONTEXTUAL_SCREENTIP_SET 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 f39b2a780d1..bb45d1f8c1f 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -116,7 +116,7 @@ return user.visible_message(span_notice("[user.name] wires the air alarm."), \ span_notice("You start wiring the air alarm...")) - if (do_after(user, 20, target = src)) + if (do_after(user, 2 SECONDS, target = src)) if (cable.get_amount() >= 5 && buildstage == AIR_ALARM_BUILD_NO_WIRES) cable.use(5) to_chat(user, span_notice("You wire the air alarm.")) @@ -140,7 +140,7 @@ if(istype(W, /obj/item/electroadaptive_pseudocircuit)) var/obj/item/electroadaptive_pseudocircuit/P = W - if(!P.adapt_circuit(user, 25)) + if(!P.adapt_circuit(user, circuit_cost = 25 KILO JOULES)) return user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ span_notice("You adapt an air alarm circuit and slot it into the assembly.")) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index be455ea6d47..d42618e9ee9 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -54,6 +54,10 @@ ///Whether it can be painted var/paintable = TRUE + ///Whether it will generate cap sprites when hidden + var/has_cap_visuals = FALSE + ///Cap overlay that is being added to turf's `vis_contents`, `null` if pipe was never hidden or has no valid connections + var/obj/effect/overlay/cap_visual/cap_overlay ///Is the thing being rebuilt by SSair or not. Prevents list bloat var/rebuilding = FALSE @@ -106,6 +110,10 @@ if(isturf(loc)) turf_loc = loc turf_loc.add_blueprints_preround(src) + + if(hide) + RegisterSignal(src, COMSIG_OBJ_HIDE, PROC_REF(on_hide)) + SSspatial_grid.add_grid_awareness(src, SPATIAL_GRID_CONTENTS_TYPE_ATMOS) SSspatial_grid.add_grid_membership(src, turf_loc, SPATIAL_GRID_CONTENTS_TYPE_ATMOS) if(init_processing) @@ -119,11 +127,22 @@ SSair.stop_processing_machine(src) SSair.rebuild_queue -= src - if(pipe_vision_img) - qdel(pipe_vision_img) + QDEL_NULL(pipe_vision_img) + QDEL_NULL(cap_overlay) return ..() - //return QDEL_HINT_FINDREFERENCE + +/** + * Handler for `COMSIG_OBJ_HIDE`, connects only if `hide` is set to `TRUE`. Calls `update_cap_visuals` on pipe and its connected nodes + */ +/obj/machinery/atmospherics/proc/on_hide(datum/source, underfloor_accessibility) + SHOULD_CALL_PARENT(TRUE) + SIGNAL_HANDLER + + for(var/obj/machinery/atmospherics/node in nodes) + node.update_cap_visuals() + + update_cap_visuals() /** * Run when you update the conditions in which an /atom might want to start reacting to its turf's air @@ -205,8 +224,9 @@ update_appearance() /obj/machinery/atmospherics/update_icon() - . = ..() update_layer() + update_cap_visuals() + return ..() /** * Find a connecting /obj/machinery/atmospherics in specified direction, called by relaymove() @@ -616,6 +636,52 @@ /obj/machinery/atmospherics/proc/update_layer() return +/** + * Handles cap overlay addition and removal, won't do anything if `has_cap_visuals` is set to `FALSE` + */ +/obj/machinery/atmospherics/proc/update_cap_visuals() + if(!has_cap_visuals) + return + + cap_overlay?.moveToNullspace() + + if(!HAS_TRAIT(src, TRAIT_UNDERFLOOR)) + return + + var/connections = NONE + for(var/obj/machinery/atmospherics/node in nodes) + if(HAS_TRAIT(node, TRAIT_UNDERFLOOR)) + continue + + if(isplatingturf(get_turf(node))) + continue + + var/connected_dir = get_dir(src, node) + connections |= connected_dir + + if(connections == NONE) + return + + var/bitfield = CARDINAL_TO_PIPECAPS(connections) | (~connections) & ALL_CARDINALS + var/turf/our_turf = get_turf(src) + + if(isnull(cap_overlay)) + cap_overlay = new + + SET_PLANE_EXPLICIT(cap_overlay, initial(plane), our_turf) + + cap_overlay.color = pipe_color + cap_overlay.layer = layer + cap_overlay.icon_state = "[bitfield]_[piping_layer]" + + cap_overlay.forceMove(our_turf) + +/obj/effect/overlay/cap_visual + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon = 'icons/obj/pipes_n_cables/!pipes_bitmask.dmi' + vis_flags = NONE + anchored = TRUE + /** * Called by the RPD.dm pre_attack() * Arguments: diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm index eca182b9bf4..bbe788bac53 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm @@ -140,3 +140,13 @@ else to_chat(user, span_notice("You set the [src]'s sensors to the default settings.")) return TRUE + +//mapping + +/obj/machinery/atmospherics/components/binary/temperature_gate/layer2 + piping_layer = 2 + icon_state = "tgate_map-2" + +/obj/machinery/atmospherics/components/binary/temperature_gate/layer4 + piping_layer = 4 + icon_state = "tgate_map-4" diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm index b33f8845d46..0fdb5aca6a3 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -70,7 +70,7 @@ air_output.merge(remove_output) if(power_usage) - use_power(power_usage) + use_energy(power_usage) /obj/machinery/atmospherics/components/binary/temperature_pump/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -106,3 +106,25 @@ heat_transfer_rate = clamp(rate, 0, max_heat_transfer_rate) investigate_log("was set to [heat_transfer_rate]% by [key_name(usr)]", INVESTIGATE_ATMOS) update_appearance() + +//mapping + +/obj/machinery/atmospherics/components/binary/temperature_pump/layer2 + icon_state = "tpump_map-2" + piping_layer = 2 + +/obj/machinery/atmospherics/components/binary/temperature_pump/layer4 + icon_state = "tpump_map-4" + piping_layer = 4 + +/obj/machinery/atmospherics/components/binary/temperature_pump/on + on = TRUE + icon_state = "tpump_on_map-3" + +/obj/machinery/atmospherics/components/binary/temperature_pump/on/layer2 + icon_state = "tpump_on_map-2" + piping_layer = 2 + +/obj/machinery/atmospherics/components/binary/temperature_pump/on/layer4 + icon_state = "tpump_on_map-4" + piping_layer = 4 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 94013ccadc7..139cbe71b36 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -174,11 +174,11 @@ /obj/machinery/atmospherics/components/binary/volume_pump/on/layer2 piping_layer = 2 - icon_state = "volpump_map-2" + icon_state = "volpump_on_map-2" /obj/machinery/atmospherics/components/binary/volume_pump/on/layer4 piping_layer = 4 - icon_state = "volpump_map-4" + icon_state = "volpump_on_map-4" /obj/item/circuit_component/atmos_volume_pump display_name = "Atmospheric Volume Pump" diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index e72d72b3d59..b4e5d88d62c 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -32,12 +32,6 @@ component_mixture.volume = 200 airs[i] = component_mixture -/obj/machinery/atmospherics/components/Initialize(mapload) - . = ..() - - if(hide) - RegisterSignal(src, COMSIG_OBJ_HIDE, PROC_REF(hide_pipe)) - // Iconnery /** @@ -46,11 +40,14 @@ /obj/machinery/atmospherics/components/proc/update_icon_nopipes() return +/obj/machinery/atmospherics/components/on_hide(datum/source, underfloor_accessibility) + hide_pipe(underfloor_accessibility) + return ..() + /** - * Called in Initialize(), set the showpipe var to true or false depending on the situation, calls update_icon() + * Called in on_hide(), set the showpipe var to true or false depending on the situation, calls update_icon() */ -/obj/machinery/atmospherics/components/proc/hide_pipe(datum/source, underfloor_accessibility) - SIGNAL_HANDLER +/obj/machinery/atmospherics/components/proc/hide_pipe(underfloor_accessibility) showpipe = !!underfloor_accessibility if(showpipe) REMOVE_TRAIT(src, TRAIT_UNDERFLOOR, REF(src)) diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index 7cee01e0cf7..0ab8427c0ae 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -125,9 +125,9 @@ var/power_to_use = (5 * (3 * working_power) * working_power) / (efficiency + working_power) if(anchored) - use_power(power_to_use) + use_energy(power_to_use) else - cell.use(power_to_use) + cell.use(power_to_use KILO JOULES) /obj/machinery/electrolyzer/proc/call_reactions(datum/gas_mixture/env) for(var/reaction in GLOB.electrolyzer_reactions) diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm index c393436d5a7..35dbf7cdbb3 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm @@ -89,30 +89,26 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list()) /datum/electrolyzer_reaction/halon_generation name = "Halon generation" id = "halon_generation" - desc = "Production of halon from CO2 and N2O" + desc = "Production of halon from the electrolysis of BZ." requirements = list( - /datum/gas/carbon_dioxide = MINIMUM_MOLE_COUNT, - /datum/gas/nitrous_oxide = MINIMUM_MOLE_COUNT, - "MAX_TEMP" = 230 + /datum/gas/bz = MINIMUM_MOLE_COUNT, ) factor = list( - /datum/gas/carbon_dioxide = "2 moles of CO2 get consumed", - /datum/gas/nitrous_oxide = "1 mole of N2O gets consumed", - /datum/gas/halon = "1 mole of Halon gets produced", - "Energy" = "300 joules of energy is released per mole", - "Temperature" = "Can only occur under 230 kelvin.", + /datum/gas/bz = "Consumed during reaction.", + /datum/gas/oxygen = "0.2 moles of oxygen gets produced per mole of BZ consumed.", + /datum/gas/halon = "2 moles of Halon gets produced per mole of BZ consumed.", + "Energy" = "91.2321 kJ of thermal energy is released per mole of BZ consumed.", + "Temperature" = "Reaction efficiency is proportional to temperature.", "Location" = "Can only happen on turfs with an active Electrolyzer.", ) /datum/electrolyzer_reaction/halon_generation/react(turf/location, datum/gas_mixture/air_mixture, working_power) - var/old_heat_capacity = air_mixture.heat_capacity() - air_mixture.assert_gases(/datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/halon) - var/pressure = air_mixture.return_pressure() - var/reaction_efficency = min(1 / ((pressure / (0.5 * ONE_ATMOSPHERE)) * (max(air_mixture.gases[/datum/gas/carbon_dioxide][MOLES] / air_mixture.gases[/datum/gas/nitrous_oxide][MOLES], 1))), air_mixture.gases[/datum/gas/nitrous_oxide][MOLES], air_mixture.gases[/datum/gas/carbon_dioxide][MOLES] * INVERSE(2)) - air_mixture.gases[/datum/gas/carbon_dioxide][MOLES] -= reaction_efficency * 2 - air_mixture.gases[/datum/gas/nitrous_oxide][MOLES] -= reaction_efficency - air_mixture.gases[/datum/gas/halon][MOLES] += reaction_efficency + air_mixture.assert_gases(/datum/gas/bz, /datum/gas/oxygen, /datum/gas/halon) + var/reaction_efficency = min(air_mixture.gases[/datum/gas/bz][MOLES] * (1 - NUM_E ** (-0.5 * air_mixture.temperature * working_power / FIRE_MINIMUM_TEMPERATURE_TO_EXIST)), air_mixture.gases[/datum/gas/bz][MOLES]) + air_mixture.gases[/datum/gas/bz][MOLES] -= reaction_efficency + air_mixture.gases[/datum/gas/oxygen][MOLES] += reaction_efficency * 0.2 + air_mixture.gases[/datum/gas/halon][MOLES] += reaction_efficency * 2 var/energy_used = reaction_efficency * HALON_FORMATION_ENERGY var/new_heat_capacity = air_mixture.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) diff --git a/code/modules/atmospherics/machinery/components/fusion/_hfr_defines.dm b/code/modules/atmospherics/machinery/components/fusion/_hfr_defines.dm index 46a64a7e10a..d113f3d7f05 100644 --- a/code/modules/atmospherics/machinery/components/fusion/_hfr_defines.dm +++ b/code/modules/atmospherics/machinery/components/fusion/_hfr_defines.dm @@ -21,7 +21,7 @@ ///Conduction of heat near the external cooling loop #define HIGH_EFFICIENCY_CONDUCTIVITY 0.975 ///Sets the minimum amount of power the machine uses -#define MIN_POWER_USAGE 50000 +#define MIN_POWER_USAGE (50 KILO WATTS) ///Sets the multiplier for the damage #define DAMAGE_CAP_MULTIPLIER 0.005 ///Sets the range of the hallucinations diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index cf18488f052..8df616c179c 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -459,11 +459,10 @@ var/welder_hint = EXAMINE_HINT("welder") . += span_notice("The plating has been firmly attached and would need a [crowbar_hint] to detach, but still needs to be sealed by a [welder_hint].") -/obj/structure/tank_frame/deconstruct(disassembled) +/obj/structure/tank_frame/atom_deconstruct(disassembled) if(disassembled) for(var/datum/material/mat as anything in custom_materials) new mat.sheet_type(drop_location(), custom_materials[mat] / SHEET_MATERIAL_AMOUNT) - return ..() /obj/structure/tank_frame/update_icon(updates) . = ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index cc75dd244c4..71610f05f40 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -430,7 +430,7 @@ user.visible_message(span_notice("You see [user] kicking against the glass of [src]!"), \ span_notice("You struggle inside [src], kicking the release with your foot... (this will take about [DisplayTimeText(CRYO_BREAKOUT_TIME)].)"), \ span_hear("You hear a thump from [src].")) - if(do_after(user, CRYO_BREAKOUT_TIME, target = src)) + if(do_after(user, CRYO_BREAKOUT_TIME, target = src, hidden = TRUE)) if(!user || user.stat != CONSCIOUS || user.loc != src ) return user.visible_message(span_warning("[user] successfully broke out of [src]!"), \ diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index ea20f2eeb66..4161a30ed7d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -10,6 +10,7 @@ hide = TRUE layer = GAS_SCRUBBER_LAYER pipe_state = "injector" + has_cap_visuals = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF //really helpful in building gas chambers for xenomorphs idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.25 @@ -74,6 +75,8 @@ if(showpipe) // everything is already shifted so don't shift the cap add_overlay(get_pipe_image(icon, "inje_cap", initialize_directions, pipe_color)) + else + PIPING_LAYER_SHIFT(src, PIPING_LAYER_DEFAULT) if(!nodes[1] || !on || !is_operational) icon_state = "inje_off" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index f461cbe8988..17f6c761f12 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -10,6 +10,7 @@ shift_underlay_only = FALSE pipe_state = "pvent" + has_cap_visuals = TRUE vent_movement = VENTCRAWL_ALLOWED | VENTCRAWL_CAN_SEE | VENTCRAWL_ENTRANCE_ALLOWED /obj/machinery/atmospherics/components/unary/passive_vent/update_icon_nopipes() @@ -17,6 +18,8 @@ if(showpipe) var/image/cap = get_pipe_image(icon, "vent_cap", initialize_directions, pipe_color) add_overlay(cap) + else + PIPING_LAYER_SHIFT(src, PIPING_LAYER_DEFAULT) icon_state = "passive_vent" /obj/machinery/atmospherics/components/unary/passive_vent/process_atmos() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index d5eada4e73f..f47d6d5b069 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -13,6 +13,8 @@ pipe_flags = PIPING_ONE_PER_TURF pipe_state = "connector" + has_cap_visuals = TRUE + custom_reconcilation = TRUE ///Reference to the connected device @@ -29,11 +31,13 @@ return ..() /obj/machinery/atmospherics/components/unary/portables_connector/update_icon_nopipes() - icon_state = "connector" + cut_overlays() if(showpipe) - cut_overlays() var/image/cap = get_pipe_image(icon, "connector_cap", initialize_directions, pipe_color) add_overlay(cap) + else + PIPING_LAYER_SHIFT(src, PIPING_LAYER_DEFAULT) + icon_state = "connector" /obj/machinery/atmospherics/components/unary/portables_connector/process_atmos() if(!connected_device) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 46adfee054e..0af962ac0f3 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -16,8 +16,6 @@ layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine - hide = TRUE - move_resist = MOVE_RESIST_DEFAULT vent_movement = NONE pipe_flags = PIPING_ONE_PER_TURF @@ -198,7 +196,7 @@ // This produces a nice curve that scales decently well for really hot stuff, and is nice to not fusion. It'll do var/power_usage = idle_power_usage + (heat_amount * 0.05) ** (1.05 - (5e7 * 0.16 / max(heat_amount, 5e7))) - use_power(power_usage) + use_energy(power_usage) update_parents() /obj/machinery/atmospherics/components/unary/thermomachine/screwdriver_act(mob/living/user, obj/item/tool) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 3f55a3b0f9d..e49dc3e62d3 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -14,6 +14,7 @@ hide = TRUE shift_underlay_only = FALSE pipe_state = "uvent" + has_cap_visuals = TRUE vent_movement = VENTCRAWL_ALLOWED | VENTCRAWL_CAN_SEE | VENTCRAWL_ENTRANCE_ALLOWED // vents are more complex machinery and so are less resistant to damage max_integrity = 100 @@ -351,7 +352,7 @@ update_icon_nopipes() /obj/machinery/atmospherics/components/unary/vent_pump/attack_alien(mob/user, list/modifiers) - if(!welded || !(do_after(user, 20, target = src))) + if(!welded || !(do_after(user, 2 SECONDS, target = src))) return user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("You manage to clear away the stuff blocking the vent."), span_hear("You hear loud scraping noises.")) welded = FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 051299950bc..54704dcb5b6 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -12,6 +12,7 @@ hide = TRUE shift_underlay_only = FALSE pipe_state = "scrubber" + has_cap_visuals = TRUE vent_movement = VENTCRAWL_ALLOWED | VENTCRAWL_CAN_SEE | VENTCRAWL_ENTRANCE_ALLOWED processing_flags = NONE @@ -333,7 +334,7 @@ . += "It seems welded shut." /obj/machinery/atmospherics/components/unary/vent_scrubber/attack_alien(mob/user, list/modifiers) - if(!welded || !(do_after(user, 20, target = src))) + if(!welded || !(do_after(user, 2 SECONDS, target = src))) return user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("You manage to clear away the stuff blocking the scrubber."), span_hear("You hear loud scraping noises.")) welded = FALSE diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 87f0dd63da9..867da91d6c8 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -356,12 +356,12 @@ current_color = BlendHSV(current_color, gas_color, gas_weight / current_weight) if(!current_color) - current_color = "#000000" + current_color = COLOR_BLACK else // Empty weight is prety much arbitrary, just tuned to make the color change from black reasonably quickly without hitting max color immediately var/empty_weight = (air.volume * 1.5 - current_weight) / 10 if(empty_weight > 0) - current_color = BlendHSV("#000000", current_color, current_weight / (empty_weight + current_weight)) + current_color = BlendHSV(COLOR_BLACK, current_color, current_weight / (empty_weight + current_weight)) if(gasmix_color != current_color) gasmix_color = current_color diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index dd1024d8d3e..ebab8af4ea7 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -18,7 +18,7 @@ var/spawn_mol = MOLES_CELLSTANDARD * 5 var/max_ext_mol = INFINITY var/max_ext_kpa = 6500 - var/overlay_color = "#FFFFFF" + var/overlay_color = COLOR_WHITE var/active = TRUE var/power_draw = 0 var/power_draw_static = 2000 @@ -97,7 +97,7 @@ if(GASMINER_POWER_FULLSCALE) update_use_power(ACTIVE_POWER_USE, (spawn_mol * power_draw_dynamic_mol_coeff) + (P * power_draw_dynamic_kpa_coeff)) -/obj/machinery/atmospherics/miner/proc/do_use_power(amount) +/obj/machinery/atmospherics/miner/proc/do_use_energy(amount) var/turf/T = get_turf(src) if(T && istype(T)) var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked @@ -105,7 +105,7 @@ C.powernet.load += amount return TRUE if(powered()) - use_power(amount) + use_energy(amount) return TRUE return FALSE @@ -126,7 +126,7 @@ if(active && !broken) if(isnull(spawn_id)) return FALSE - if(do_use_power(active_power_usage)) + if(do_use_energy(active_power_usage)) mine_gas(seconds_per_tick) /obj/machinery/atmospherics/miner/proc/mine_gas(seconds_per_tick = 2) @@ -161,7 +161,7 @@ /obj/machinery/atmospherics/miner/plasma name = "\improper Plasma Gas Miner" - overlay_color = "#FF0000" + overlay_color = COLOR_RED spawn_id = /datum/gas/plasma /obj/machinery/atmospherics/miner/carbon_dioxide diff --git a/code/modules/atmospherics/machinery/pipes/pipe_spritesheet_helper.dm b/code/modules/atmospherics/machinery/pipes/pipe_spritesheet_helper.dm index 9642442a973..6b1997cc3c7 100644 --- a/code/modules/atmospherics/machinery/pipes/pipe_spritesheet_helper.dm +++ b/code/modules/atmospherics/machinery/pipes/pipe_spritesheet_helper.dm @@ -18,6 +18,13 @@ "[WEST]"=icon('icons/obj/pipes_n_cables/pipe_template_pieces.dmi', "damage_mask", WEST), ) + var/static/list/icon/cap_masks = list( + "[NORTH]" = icon('icons/obj/pipes_n_cables/pipe_template_pieces.dmi', "cap_mask", NORTH), + "[EAST]" = icon('icons/obj/pipes_n_cables/pipe_template_pieces.dmi', "cap_mask", EAST), + "[SOUTH]" = icon('icons/obj/pipes_n_cables/pipe_template_pieces.dmi', "cap_mask", SOUTH), + "[WEST]" = icon('icons/obj/pipes_n_cables/pipe_template_pieces.dmi', "cap_mask", WEST), + ) + var/icon/generated_icons /datum/pipe_icon_generator/proc/Start(icon_state_suffix="") @@ -85,6 +92,34 @@ outputs[damaged] = "[icon_state_dirs]_[layer]" return outputs +/datum/pipe_icon_generator/proc/generate_capped(icon/working, layer, dirs, x_offset=1, y_offset=1) + var/list/outputs = list() + var/list/completed = list() + for(var/combined_dirs in 1 to 15) + combined_dirs &= dirs + + var/completion_key = "[combined_dirs]" + if(completed[completion_key] || (combined_dirs == NONE)) + continue + + completed[completion_key] = TRUE + + var/icon/capped_mask = icon('icons/obj/pipes_n_cables/pipe_template_pieces.dmi', "blank_mask") + for(var/i in 0 to 3) + var/dir = 1 << i + if(!(combined_dirs & dir)) + continue + + var/icon/cap_mask = cap_masks["[dir]"] + capped_mask.Blend(cap_mask, ICON_OVERLAY, x_offset, y_offset) + + var/icon/capped = icon(working) + capped.Blend(capped_mask, ICON_MULTIPLY) + + var/icon_state_dirs = (dirs & ~combined_dirs) | CARDINAL_TO_PIPECAPS(combined_dirs) + outputs[capped] = "[icon_state_dirs]_[layer]" + + return outputs /datum/pipe_icon_generator/proc/GeneratePipeStraight(icon_state_suffix, layer, combined_dirs) var/list/output = list() @@ -97,8 +132,10 @@ switch(combined_dirs) if(NORTH | SOUTH) output += GenerateDamaged(working, layer, combined_dirs, y_offset=offset) + output += generate_capped(working, layer, combined_dirs, y_offset=offset) if(EAST | WEST) output += GenerateDamaged(working, layer, combined_dirs, x_offset=offset) + output += generate_capped(working, layer, combined_dirs, x_offset=offset) return output @@ -117,6 +154,7 @@ output[working] = "[combined_dirs]_[layer]" output += GenerateDamaged(working, layer, combined_dirs) + output += generate_capped(working, layer, combined_dirs) return output @@ -135,6 +173,7 @@ output[working] = "[combined_dirs]_[layer]" output += GenerateDamaged(working, layer, combined_dirs) + output += generate_capped(working, layer, combined_dirs) return output @@ -144,5 +183,6 @@ output[working] = "[combined_dirs]_[layer]" output += GenerateDamaged(working, layer, combined_dirs) + output += generate_capped(working, layer, combined_dirs) return output diff --git a/code/modules/atmospherics/machinery/pipes/smart.dm b/code/modules/atmospherics/machinery/pipes/smart.dm index 365d48e4121..ee2efd699cd 100644 --- a/code/modules/atmospherics/machinery/pipes/smart.dm +++ b/code/modules/atmospherics/machinery/pipes/smart.dm @@ -10,6 +10,8 @@ GLOBAL_LIST_INIT(atmos_components, typecacheof(list(/obj/machinery/atmospherics) device_type = QUATERNARY construction_type = /obj/item/pipe/quaternary pipe_state = "manifold4w" + has_cap_visuals = TRUE + ///Current active connections var/connections = NONE ///Was this pipe created during map load diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 8c3a3301b68..75152798bba 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -479,11 +479,11 @@ var/our_temperature = air_contents.return_temperature() if(shielding_powered) - var/power_factor = round(log(10, max(our_pressure - pressure_limit, 1)) + log(10, max(our_temperature - temp_limit, 1))) - var/power_consumed = power_factor * 250 * seconds_per_tick + var/energy_factor = round(log(10, max(our_pressure - pressure_limit, 1)) + log(10, max(our_temperature - temp_limit, 1))) + var/energy_consumed = energy_factor * 250 * seconds_per_tick if(powered(AREA_USAGE_EQUIP, ignore_use_power = TRUE)) - use_power(power_consumed, AREA_USAGE_EQUIP) - else if(!internal_cell?.use(power_consumed * 0.025)) + use_energy(energy_consumed, channel = AREA_USAGE_EQUIP) + else if(!internal_cell?.use(energy_consumed * 0.025 KILO JOULES)) shielding_powered = FALSE SSair.start_processing_machine(src) investigate_log("shielding turned off due to power loss") diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 1ed0a1ec0ff..22d9f532efc 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -96,7 +96,7 @@ obj_flags |= BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP SET_PLANE_IMPLICIT(src, ABOVE_LIGHTING_PLANE) //What matters it's one above openspace, so our animation is not dependant on what's there. Up to revision with 513 animate(src,alpha = talpha,time = 10) - addtimer(CALLBACK(src, PROC_REF(reset_plane)),10) + addtimer(CALLBACK(src, PROC_REF(reset_plane)), 1 SECONDS) if(hidden) update_openspace() var/turf/T = get_turf(src) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 23a86262e74..490b3cbd7eb 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -346,7 +346,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) density = TRUE use_power = NO_POWER_USE -/obj/machinery/gateway/away/interact(mob/user, special_state) +/obj/machinery/gateway/away/interact(mob/user) . = ..() //SKYRAT EDIT ADDITION var/list/type_blacklist = list( diff --git a/code/modules/bitrunning/antagonists/netguardian.dm b/code/modules/bitrunning/antagonists/netguardian.dm index 035dcc62eea..39d64675334 100644 --- a/code/modules/bitrunning/antagonists/netguardian.dm +++ b/code/modules/bitrunning/antagonists/netguardian.dm @@ -45,7 +45,7 @@ speech_span = SPAN_ROBOT death_message = "malfunctions!" - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = TCMB ai_controller = /datum/ai_controller/basic_controller/netguardian diff --git a/code/modules/bitrunning/objects/byteforge.dm b/code/modules/bitrunning/objects/byteforge.dm index 5f089bf66ca..f8212b7666b 100644 --- a/code/modules/bitrunning/objects/byteforge.dm +++ b/code/modules/bitrunning/objects/byteforge.dm @@ -63,5 +63,5 @@ /obj/machinery/byteforge/proc/start_to_spawn(obj/cache) flicker() - addtimer(CALLBACK(src, PROC_REF(spawn_cache), cache), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + addtimer(CALLBACK(src, PROC_REF(spawn_cache), cache), 1 SECONDS) diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm index 3a90939dae1..3b38493edff 100644 --- a/code/modules/bitrunning/objects/landmarks.dm +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -22,6 +22,11 @@ name = "Bitrunning crate spawn" icon_state = "crate" +/// Where you want secondary objectives to spawn +/obj/effect/landmark/bitrunning/curiosity_spawn + name = "Bitrunning curiosity spawn" + icon_state = "crate" + ///Swaps the locations of an encrypted crate in the area with another randomly selected crate. ///Randomizes names, so you have to inspect crates manually. /obj/effect/landmark/bitrunning/crate_replacer diff --git a/code/modules/bitrunning/objects/loot_box.dm b/code/modules/bitrunning/objects/loot_box.dm new file mode 100644 index 00000000000..39209c33d97 --- /dev/null +++ b/code/modules/bitrunning/objects/loot_box.dm @@ -0,0 +1,53 @@ +/obj/item/storage/lockbox/bitrunning + name = "base class curiosity" + desc = "Talk to a coder." + req_access = list(ACCESS_INACCESSIBLE) + icon_state = "bitrunning+l" + inhand_icon_state = "bitrunning" + base_icon_state = "bitrunning" + icon_locked = "bitrunning+l" + icon_closed = "bitrunning" + icon_broken = "bitrunning+b" + +/obj/item/storage/lockbox/bitrunning/encrypted + name = "encrypted curiosity" + desc = "Needs to be decrypted at the safehouse to be opened." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + /// Path for the loot we are assigned + var/loot_path + +/obj/item/storage/lockbox/bitrunning/encrypted/emag_act(mob/user, obj/item/card/emag/emag_card) + return FALSE + +/obj/item/storage/lockbox/bitrunning/decrypted + name = "decrypted curiosity" + desc = "Compiled from the virtual domain. An extra reward of a successful bitrunner." + /// What virtual domain did we come from. + var/datum/lazy_template/virtual_domain/source_domain + +/obj/item/storage/lockbox/bitrunning/decrypted/Initialize( + mapload, + datum/lazy_template/virtual_domain/completed_domain, + ) + + if(isnull(completed_domain)) + log_runtime("Decrypted curiosity was created with no source domain.") + return INITIALIZE_HINT_QDEL + + if(!istype(completed_domain, /datum/lazy_template/virtual_domain)) // Check if this is a proper virtual domain before doing anything with it + log_runtime("Decrypted curiosity was created with an invalid source domain. [completed_domain.name] ([completed_domain.type]).") + return INITIALIZE_HINT_QDEL + + source_domain = completed_domain + + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_slots = 1 + atom_storage.max_total_storage = 3 + atom_storage.locked = STORAGE_NOT_LOCKED + icon_state = icon_closed + playsound(src, 'sound/magic/blink.ogg', 50, TRUE) + +/obj/item/storage/lockbox/bitrunning/decrypted/PopulateContents() + var/choice = SSbitrunning.pick_secondary_loot(source_domain) + new choice(src) diff --git a/code/modules/bitrunning/objects/loot_crate.dm b/code/modules/bitrunning/objects/loot_crate.dm index a0a74ecb4b9..db3f927e021 100644 --- a/code/modules/bitrunning/objects/loot_crate.dm +++ b/code/modules/bitrunning/objects/loot_crate.dm @@ -42,11 +42,11 @@ if(isnull(completed_domain)) return - PopulateContents(completed_domain.reward_points, completed_domain.extra_loot, rewards_multiplier) + PopulateContents(completed_domain.reward_points, completed_domain.completion_loot, rewards_multiplier) -/obj/structure/closet/crate/secure/bitrunning/decrypted/PopulateContents(reward_points, list/extra_loot, rewards_multiplier) +/obj/structure/closet/crate/secure/bitrunning/decrypted/PopulateContents(reward_points, list/completion_loot, rewards_multiplier) . = ..() - spawn_loot(extra_loot) + spawn_loot(completion_loot) new /obj/item/stack/ore/iron(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_IRON)) new /obj/item/stack/ore/glass(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_GLASS)) @@ -70,16 +70,16 @@ var/random_sum = (rand() + 0.5) * base return ROUND_UP(random_sum * ore_multiplier) -/// Handles spawning extra loot. This tries to handle bad flat and assoc lists -/obj/structure/closet/crate/secure/bitrunning/decrypted/proc/spawn_loot(list/extra_loot) - for(var/path in extra_loot) +/// Handles spawning completion loot. This tries to handle bad flat and assoc lists +/obj/structure/closet/crate/secure/bitrunning/decrypted/proc/spawn_loot(list/completion_loot) + for(var/path in completion_loot) if(!ispath(path)) return FALSE - if(isnull(extra_loot[path])) + if(isnull(completion_loot[path])) return FALSE - for(var/i in 1 to extra_loot[path]) + for(var/i in 1 to completion_loot[path]) new path(src) return TRUE diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm index 2d4e995b19b..5c8e399292f 100644 --- a/code/modules/bitrunning/objects/netpod.dm +++ b/code/modules/bitrunning/objects/netpod.dm @@ -443,8 +443,16 @@ /// Resolves a path to an outfit. /obj/machinery/netpod/proc/resolve_outfit(text) var/path = text2path(text) - if(ispath(path, /datum/outfit)) - return path + if(!ispath(path, /datum/outfit)) + return + + for(var/wardrobe in cached_outfits) + for(var/outfit in wardrobe["outfits"]) + if(path == outfit["path"]) + return path + + message_admins("[usr]:[usr.ckey] attempted to select an unavailable outfit from a netpod") + return /// Severs the connection with the current avatar /obj/machinery/netpod/proc/sever_connection() diff --git a/code/modules/bitrunning/objects/quantum_console.dm b/code/modules/bitrunning/objects/quantum_console.dm index 71d7df87f12..9dc829c48cd 100644 --- a/code/modules/bitrunning/objects/quantum_console.dm +++ b/code/modules/bitrunning/objects/quantum_console.dm @@ -46,6 +46,8 @@ data["ready"] = server.is_ready && server.is_operational data["scanner_tier"] = server.scanner_tier data["retries_left"] = length(server.exit_turfs) - server.retries_spent + data["broadcasting"] = server.broadcasting + data["broadcasting_on_cd"] = !COOLDOWN_FINISHED(server, broadcast_toggle_cd) return data @@ -56,7 +58,7 @@ if(isnull(server)) return data - data["available_domains"] = server.get_available_domains() + data["available_domains"] = SSbitrunning.get_available_domains(server.scanner_tier, server.points) data["avatars"] = server.get_avatar_data() return data @@ -83,6 +85,9 @@ if("stop_domain") server.begin_shutdown(usr) return TRUE + if("broadcast") + server.toggle_broadcast() + return TRUE return FALSE diff --git a/code/modules/bitrunning/orders/bepis.dm b/code/modules/bitrunning/orders/bepis.dm new file mode 100644 index 00000000000..286e9817f3c --- /dev/null +++ b/code/modules/bitrunning/orders/bepis.dm @@ -0,0 +1,23 @@ +/datum/orderable_item/bepis + category_index = CATEGORY_BEPIS + +/datum/orderable_item/bepis/circuit_stack + item_path = /obj/item/stack/circuit_stack/full + cost_per_order = 150 + +/datum/orderable_item/bepis/survival_pen + item_path = /obj/item/pen/survival + cost_per_order = 150 + +/datum/orderable_item/bepis/party_sleeper + item_path = /obj/item/circuitboard/machine/sleeper/party + cost_per_order = 750 + desc = "A decommissioned sleeper circuitboard, repurposed for recreational purposes." + +/datum/orderable_item/bepis/sprayoncan + item_path = /obj/item/toy/sprayoncan + cost_per_order = 750 + +/datum/orderable_item/bepis/pristine + item_path = /obj/item/disk/design_disk/bepis/remove_tech + cost_per_order = 1000 diff --git a/code/modules/bitrunning/orders/disks.dm b/code/modules/bitrunning/orders/disks.dm deleted file mode 100644 index 3015cd1ee61..00000000000 --- a/code/modules/bitrunning/orders/disks.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/orderable_item/bitrunning_tech - category_index = CATEGORY_BITRUNNING_TECH - -/datum/orderable_item/bitrunning_tech/item_tier1 - cost_per_order = 1000 - item_path = /obj/item/bitrunning_disk/item/tier1 - desc = "This disk contains a program that lets you equip a medical beamgun, a C4 explosive, or a box of infinite pizza." - -/datum/orderable_item/bitrunning_tech/item_tier2 - cost_per_order = 1500 - item_path = /obj/item/bitrunning_disk/item/tier2 - desc = "This disk contains a program that lets you equip a luxury medipen, a pistol, or an armour vest." - -/datum/orderable_item/bitrunning_tech/item_tier3 - cost_per_order = 2500 - item_path = /obj/item/bitrunning_disk/item/tier3 - desc = "This disk contains a program that lets you equip an advanced energy gun, a dual bladed energy sword, or a minibomb." - -/datum/orderable_item/bitrunning_tech/ability_tier1 - cost_per_order = 1000 - item_path = /obj/item/bitrunning_disk/ability/tier1 - desc = "This disk contains a program that lets you cast Summon Cheese or Lesser Heal." - -/datum/orderable_item/bitrunning_tech/ability_tier2 - cost_per_order = 1800 - item_path = /obj/item/bitrunning_disk/ability/tier2 - desc = "This disk contains a program that lets you cast Fireball, Lightning Bolt, or Forcewall." - -/datum/orderable_item/bitrunning_tech/ability_tier3 - cost_per_order = 3200 - item_path = /obj/item/bitrunning_disk/ability/tier3 - desc = "This disk contains a program that lets you shapeshift into a lesser ashdrake, or a polar bear." diff --git a/code/modules/bitrunning/orders/tech.dm b/code/modules/bitrunning/orders/tech.dm index 286e9817f3c..a4bf59ce18d 100644 --- a/code/modules/bitrunning/orders/tech.dm +++ b/code/modules/bitrunning/orders/tech.dm @@ -1,23 +1,36 @@ -/datum/orderable_item/bepis - category_index = CATEGORY_BEPIS +/datum/orderable_item/bitrunning_tech + category_index = CATEGORY_BITRUNNING_TECH -/datum/orderable_item/bepis/circuit_stack - item_path = /obj/item/stack/circuit_stack/full - cost_per_order = 150 - -/datum/orderable_item/bepis/survival_pen - item_path = /obj/item/pen/survival - cost_per_order = 150 - -/datum/orderable_item/bepis/party_sleeper - item_path = /obj/item/circuitboard/machine/sleeper/party - cost_per_order = 750 - desc = "A decommissioned sleeper circuitboard, repurposed for recreational purposes." - -/datum/orderable_item/bepis/sprayoncan - item_path = /obj/item/toy/sprayoncan - cost_per_order = 750 - -/datum/orderable_item/bepis/pristine - item_path = /obj/item/disk/design_disk/bepis/remove_tech +/datum/orderable_item/bitrunning_tech/item_tier1 cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/item/tier1 + desc = "This disk contains a program that lets you equip a medical beamgun, a C4 explosive, or a box of infinite pizza." + +/datum/orderable_item/bitrunning_tech/item_tier2 + cost_per_order = 1500 + item_path = /obj/item/bitrunning_disk/item/tier2 + desc = "This disk contains a program that lets you equip a luxury medipen, a pistol, or an armour vest." + +/datum/orderable_item/bitrunning_tech/item_tier3 + cost_per_order = 2500 + item_path = /obj/item/bitrunning_disk/item/tier3 + desc = "This disk contains a program that lets you equip an advanced energy gun, a dual bladed energy sword, or a minibomb." + +/datum/orderable_item/bitrunning_tech/ability_tier1 + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/ability/tier1 + desc = "This disk contains a program that lets you cast Summon Cheese or Lesser Heal." + +/datum/orderable_item/bitrunning_tech/ability_tier2 + cost_per_order = 1800 + item_path = /obj/item/bitrunning_disk/ability/tier2 + desc = "This disk contains a program that lets you cast Fireball, Lightning Bolt, or Forcewall." + +/datum/orderable_item/bitrunning_tech/ability_tier3 + cost_per_order = 3200 + item_path = /obj/item/bitrunning_disk/ability/tier3 + desc = "This disk contains a program that lets you shapeshift into a lesser ashdrake, or a polar bear." + +/datum/orderable_item/bitrunning_tech/flip_skillchip + item_path = /obj/item/skillchip/matrix_flip + cost_per_order = 2000 diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm index 62e20367190..b9d8808607e 100644 --- a/code/modules/bitrunning/server/_parent.dm +++ b/code/modules/bitrunning/server/_parent.dm @@ -20,8 +20,6 @@ var/is_ready = TRUE /// Chance multipled by threat to spawn a glitch var/glitch_chance = 0.05 - /// List of available domains - var/list/available_domains = list() /// Current plugged in users var/list/datum/weakref/avatar_connection_refs = list() /// Cached list of mutable mobs in zone for cybercops @@ -46,6 +44,10 @@ var/threat = 0 /// The turfs we can place a hololadder on. var/turf/exit_turfs = list() + /// Determines if we broadcast to entertainment monitors or not + var/broadcasting = FALSE + /// Cooldown between being able to toggle broadcasting + COOLDOWN_DECLARE(broadcast_toggle_cd) /obj/machinery/quantum_server/Initialize(mapload) . = ..() @@ -63,13 +65,9 @@ RegisterSignals(src, list(COMSIG_MACHINERY_BROKEN, COMSIG_MACHINERY_POWER_LOST), PROC_REF(on_broken)) RegisterSignal(src, COMSIG_QDELETING, PROC_REF(on_delete)) - // This further gets sorted in the client by cost so it's random and grouped - available_domains = shuffle(subtypesof(/datum/lazy_template/virtual_domain)) - /obj/machinery/quantum_server/Destroy(force) . = ..() - available_domains.Cut() mutation_candidate_refs.Cut() avatar_connection_refs.Cut() spawned_threat_refs.Cut() diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index 0aab2a86ff4..cb4902abfe3 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -40,6 +40,15 @@ chosen_forge.start_to_spawn(reward_cache) return TRUE +/obj/machinery/quantum_server/proc/generate_secondary_loot(obj/curiosity, obj/machinery/byteforge/chosen_forge) + spark_at_location(curiosity) // abracadabra! + qdel(curiosity) // and it's gone! + + var/obj/item/storage/lockbox/bitrunning/decrypted/reward_curiosity = new(src, generated_domain) + + chosen_forge.start_to_spawn(reward_curiosity) + return TRUE + /// Returns the markdown text containing domain completion information /obj/machinery/quantum_server/proc/get_completion_certificate() var/base_points = generated_domain.reward_points diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm index 5018e464d6a..ed3adc3467e 100644 --- a/code/modules/bitrunning/server/map_handling.dm +++ b/code/modules/bitrunning/server/map_handling.dm @@ -30,11 +30,11 @@ return FALSE if(isnull(map_key)) - balloon_alert_to_viewers("no domain specified.") + balloon_alert_to_viewers("no domain specified!") return FALSE if(generated_domain) - balloon_alert_to_viewers("stop the current domain first.") + balloon_alert_to_viewers("stop the current domain first!") return FALSE if(length(avatar_connection_refs)) @@ -46,7 +46,7 @@ /// If any one of these fail, it reverts the entire process if(!load_domain(map_key) || !load_map_items() || !load_mob_segments()) - balloon_alert_to_viewers("initialization failed.") + balloon_alert_to_viewers("initialization failed!") scrub_vdom() is_ready = TRUE return FALSE @@ -63,13 +63,16 @@ update_use_power(ACTIVE_POWER_USE) update_appearance() + if(broadcasting) + start_broadcasting_network(BITRUNNER_CAMERA_NET) + return TRUE /// Initializes a new domain if the given key is valid and the user has enough points /obj/machinery/quantum_server/proc/load_domain(map_key) - for(var/datum/lazy_template/virtual_domain/available as anything in subtypesof(/datum/lazy_template/virtual_domain)) - if(map_key == initial(available.key) && points >= initial(available.cost)) - generated_domain = new available() + for(var/datum/lazy_template/virtual_domain/available in SSbitrunning.all_domains) + if(map_key == available.key && points >= available.cost) + generated_domain = available RegisterSignal(generated_domain, COMSIG_LAZY_TEMPLATE_LOADED, PROC_REF(on_template_loaded)) generated_domain.lazy_load() return TRUE @@ -80,6 +83,7 @@ /obj/machinery/quantum_server/proc/load_map_items() var/turf/goal_turfs = list() var/turf/cache_turfs = list() + var/turf/curiosity_turfs = list() for(var/obj/effect/landmark/bitrunning/thing in GLOB.landmarks_list) if(istype(thing, /obj/effect/landmark/bitrunning/hololadder_spawn)) @@ -100,6 +104,11 @@ qdel(thing) continue + if(istype(thing, /obj/effect/landmark/bitrunning/curiosity_spawn)) + curiosity_turfs += get_turf(thing) + qdel(thing) + continue + if(istype(thing, /obj/effect/landmark/bitrunning/loot_signal)) var/turf/signaler_turf = get_turf(thing) signaler_turf.AddComponent(/datum/component/bitrunning_points, generated_domain) @@ -113,6 +122,13 @@ if(!attempt_spawn_cache(cache_turfs)) return FALSE + while(length(curiosity_turfs)) + var/turf/picked_turf = attempt_spawn_curiosity(curiosity_turfs) + if(!picked_turf) + break + generated_domain.secondary_loot_generated += 1 + curiosity_turfs -= picked_turf + return TRUE /// Stops the current virtual domain and disconnects all users @@ -134,6 +150,8 @@ domain_randomized = FALSE retries_spent = 0 + stop_broadcasting_network(BITRUNNER_CAMERA_NET) + /// Tries to clean up everything in the domain /obj/machinery/quantum_server/proc/scrub_vdom() sever_connections() /// just in case someone's connected @@ -151,6 +169,8 @@ creature.dust(just_ash = TRUE, force = TRUE) // sometimes mobs just don't die + generated_domain.secondary_loot_generated = 0 + avatar_connection_refs.Cut() exit_turfs = list() generated_domain = null diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index 38fee74d4a8..641d906cc59 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -15,6 +15,26 @@ new /obj/structure/closet/crate/secure/bitrunning/encrypted(chosen_turf) return TRUE +/// Attempts to spawn a lootbox +/obj/machinery/quantum_server/proc/attempt_spawn_curiosity(list/possible_turfs) + if(!length(possible_turfs)) // Out of turfs to place a curiosity + return FALSE + + if(generated_domain.secondary_loot_generated >= assoc_value_sum(generated_domain.secondary_loot)) // Out of curiosities to place + return FALSE + + shuffle_inplace(possible_turfs) + var/turf/chosen_turf = validate_turf(pick(possible_turfs)) + + if(isnull(chosen_turf)) + possible_turfs.Remove(chosen_turf) + chosen_turf = validate_turf(pick(possible_turfs)) + if(isnull(chosen_turf)) + CRASH("vdom: after two attempts, could not find a valid turf for curiosity") + + new /obj/item/storage/lockbox/bitrunning/encrypted(chosen_turf) + return chosen_turf + /// Generates a new avatar for the bitrunner. /obj/machinery/quantum_server/proc/generate_avatar(obj/structure/hololadder/wayout, datum/outfit/netsuit) var/mob/living/carbon/human/avatar = new(wayout.loc) @@ -23,6 +43,7 @@ var/datum/outfit/to_wear = new outfit_path() to_wear.belt = /obj/item/bitrunning_host_monitor + to_wear.ears = null to_wear.glasses = null to_wear.gloves = null to_wear.l_pocket = null @@ -63,6 +84,13 @@ SSid_access.apply_trim_to_card(outfit_id, /datum/id_trim/bit_avatar) + avatar.AddComponent( \ + /datum/component/simple_bodycam, \ + camera_name = "bitrunner bodycam", \ + c_tag = "Avatar [avatar.real_name]", \ + network = BITRUNNER_CAMERA_NET, \ + emp_proof = TRUE, \ + ) return avatar /// Generates a new hololadder for the bitrunner. Effectively a respawn attempt. @@ -167,3 +195,11 @@ if(failed) to_chat(neo, span_warning("One of your disks failed to load. Check for duplicate or inactive disks.")) + + var/obj/item/organ/internal/brain/neo_brain = neo.get_organ_slot(ORGAN_SLOT_BRAIN) + for(var/obj/item/skillchip/skill_chip as anything in neo_brain?.skillchips) + if(!skill_chip.active) + continue + var/obj/item/skillchip/clone_chip = new skill_chip.type + avatar.implant_skillchip(clone_chip, force = TRUE) + clone_chip.try_activate_skillchip(silent = TRUE, force = TRUE) diff --git a/code/modules/bitrunning/server/signal_handlers.dm b/code/modules/bitrunning/server/signal_handlers.dm index 81db7a5b9b0..0e5e949e8bb 100644 --- a/code/modules/bitrunning/server/signal_handlers.dm +++ b/code/modules/bitrunning/server/signal_handlers.dm @@ -47,6 +47,10 @@ generate_loot(arrived, chosen_forge) return + if(istype(arrived, /obj/item/storage/lockbox/bitrunning/encrypted)) + generate_secondary_loot(arrived, chosen_forge, generated_domain) + return + /// Handles examining the server. Shows cooldown time and efficiency. /obj/machinery/quantum_server/proc/on_goal_turf_examined(datum/source, mob/examiner, list/examine_text) SIGNAL_HANDLER diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm index 3ed4ad45bc6..6c42322d0cf 100644 --- a/code/modules/bitrunning/server/threats.dm +++ b/code/modules/bitrunning/server/threats.dm @@ -69,16 +69,15 @@ var/datum/antagonist/bitrunning_glitch/chosen_role = forced_role || get_antagonist_role() var/role_name = initial(chosen_role.name) - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(spawn_glitch), chosen_role, mutation_target) - mutation_target.AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_GLITCH, \ - job_bans = ROLE_GLITCH, \ - to_call = to_call, \ - title = role_name, \ - header = "Bitrunning Malfunction", \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + check_jobban = ROLE_GLITCH, + poll_time = 20 SECONDS, + checked_target = mutation_target, + ignore_category = POLL_IGNORE_GLITCH, + alert_pic = mutation_target, + role_name_text = "Bitrunning Malfunction: [role_name]", ) - + spawn_glitch(chosen_role, mutation_target, chosen_one) return mutation_target /// Orbit poll has concluded - spawn the antag diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm index 09d9c10622b..ee91fdf7f0d 100644 --- a/code/modules/bitrunning/server/util.dm +++ b/code/modules/bitrunning/server/util.dm @@ -1,4 +1,3 @@ -#define REDACTED "???" #define MAX_DISTANCE 4 // How far crates can spawn from the server /// Resets the cooldown state and updates icons @@ -15,28 +14,6 @@ //BUBBER ADDITION END radio.talk_into(src, "Thermal systems within operational parameters. Proceeding to domain configuration.", RADIO_CHANNEL_SUPPLY) -/// Compiles a list of available domains. -/obj/machinery/quantum_server/proc/get_available_domains() - var/list/levels = list() - - for(var/datum/lazy_template/virtual_domain/domain as anything in available_domains) - if(initial(domain.test_only)) - continue - var/can_view = initial(domain.difficulty) < scanner_tier && initial(domain.cost) <= points + 5 - var/can_view_reward = initial(domain.difficulty) < (scanner_tier + 1) && initial(domain.cost) <= points + 3 - - levels += list(list( - "cost" = initial(domain.cost), - "desc" = can_view ? initial(domain.desc) : "Limited scanning capabilities. Cannot infer domain details.", - "difficulty" = initial(domain.difficulty), - "id" = initial(domain.key), - "is_modular" = initial(domain.is_modular), - "name" = can_view ? initial(domain.name) : REDACTED, - "reward" = can_view_reward ? initial(domain.reward_points) : REDACTED, - )) - - return levels - /// If there are hosted minds, attempts to get a list of their current virtual bodies w/ vitals /obj/machinery/quantum_server/proc/get_avatar_data() var/list/hosted_avatars = list() @@ -128,5 +105,18 @@ if(!tile.is_blocked_turf()) return chosen_turf -#undef REDACTED #undef MAX_DISTANCE + +/// Toggles broadcast on and off +/obj/machinery/quantum_server/proc/toggle_broadcast() + if(!COOLDOWN_FINISHED(src, broadcast_toggle_cd)) + return FALSE + + broadcasting = !broadcasting + + if(generated_domain) + // The cooldown only really matter is we're flipping TVs + COOLDOWN_START(src, broadcast_toggle_cd, 5 SECONDS) + // And we only flip TVs when there's a domain, because otherwise there's no cams to watch + set_network_broadcast_status(BITRUNNER_CAMERA_NET, broadcasting) + return TRUE diff --git a/code/modules/bitrunning/util/service_style.dm b/code/modules/bitrunning/util/service_style.dm index f420e783064..f472390c8ac 100644 --- a/code/modules/bitrunning/util/service_style.dm +++ b/code/modules/bitrunning/util/service_style.dm @@ -2,7 +2,7 @@ /mob/living/carbon/human/proc/set_service_style() var/static/list/approved_hair_colors = list( "#4B3D28", - "#000000", + COLOR_BLACK, "#8D4A43", "#D2B48C", ) diff --git a/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm b/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm index 6475a20a0c7..55e6d08a147 100644 --- a/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm +++ b/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_MEDIUM desc = "Board an abductor ship and take their goodies." difficulty = BITRUNNER_DIFFICULTY_MEDIUM - extra_loot = list(/obj/item/toy/plush/abductor/agent = 1) + completion_loot = list(/obj/item/toy/plush/abductor/agent = 1) help_text = "An abductor mothership unknowingly entered a hostile environment. \ They are currently preparing to escape the area with their gear and loot including \ the crate. Be careful, they are known for their advanced weaponry." diff --git a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm index ae00fc56cf7..80f07448b69 100644 --- a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm +++ b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm @@ -1,7 +1,7 @@ /datum/lazy_template/virtual_domain/beach_bar name = "Beach Bar" desc = "A cheerful seaside haven where friendly skeletons serve up drinks. Say, how'd you guys get so dead?" - extra_loot = list(/obj/item/toy/beach_ball = 1) + completion_loot = list(/obj/item/toy/beach_ball = 1) help_text = "This place is running on a skeleton crew, and they don't seem to be too keen to share details. \ Maybe a few drinks of liquid charm will get the spirits up. As the saying goes, if you can't beat 'em, join 'em." key = "beach_bar" diff --git a/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm b/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm index f7f58273d89..ab8b282cfbf 100644 --- a/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm +++ b/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_HIGH desc = "King of the slaughter demons. Bubblegum is a massive, hulking beast with a penchant for violence." difficulty = BITRUNNER_DIFFICULTY_HIGH - extra_loot = list(/obj/item/toy/plush/bubbleplush = 1) + completion_loot = list(/obj/item/toy/plush/bubbleplush = 1) forced_outfit = /datum/outfit/job/miner key = "bubblegum" map_name = "bubblegum" diff --git a/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm b/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm index f1bf4468608..3aff298efdb 100644 --- a/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm +++ b/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_LOW desc = "In the deep, dark reaches of space, there is only Honk." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/bikehorn = 1) + completion_loot = list(/obj/item/bikehorn = 1) forced_outfit = /datum/outfit/job/clown help_text = "The trials of the Honkitude have begun. The sound of bike horns wailing in the distance. \ this realm- some sort of puzzle, has existed in legend as the final test of just how silly you are." diff --git a/code/modules/bitrunning/virtual_domain/domains/pipedream.dm b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm index 3eb23b94386..595600ce71c 100644 --- a/code/modules/bitrunning/virtual_domain/domains/pipedream.dm +++ b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_LOW desc = "An abandoned and infested factory manufacturing disposal pipes." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/stack/pipe_cleaner_coil/random/five = 1) + completion_loot = list(/obj/item/stack/pipe_cleaner_coil/random/five = 1) help_text = "Not long ago, this place was thriving with activity. The workers \ seemed to have left in a hurry, and now productivity is in the bin. Something \ must have trashed the place, but what?" diff --git a/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm index 9cb299055dd..2d4d2c5ee36 100644 --- a/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm +++ b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm @@ -4,7 +4,7 @@ desc = "Another neglected corner of the virtual world. This one had to be abandoned due to zombie virus. \ Warning -- Virtual domain does not support visual display. This mission must be completed using echolocation." difficulty = BITRUNNER_DIFFICULTY_MEDIUM - extra_loot = list(/obj/item/radio/headset/psyker = 1) //Looks cool, might make your local burdened chaplain happy. + completion_loot = list(/obj/item/radio/headset/psyker = 1) //Looks cool, might make your local burdened chaplain happy. forced_outfit = /datum/outfit/echolocator help_text = "This once-beloved virtual domain has been corrupted by a virus, rendering it unstable, full of holes, and full of ZOMBIES! \ There should be a Mystery Box nearby to help get you armed. Get armed, and finish what the cyber-police started!" 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 1c79d8fd21d..4d100482429 100644 --- a/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm +++ b/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm @@ -6,7 +6,8 @@ instead of ladders its stairs and instead of snakes its a steep drop down a \ cliff into rough rocks or liquid plasma." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/clothing/suit/costume/snowman = 2) + completion_loot = list(/obj/item/clothing/suit/costume/snowman = 2) + secondary_loot = list(/obj/item/clothing/shoes/wheelys/skishoes = 2, /obj/item/clothing/head/costume/ushanka/polar = 1) forced_outfit = /datum/outfit/job/virtual_domain_iceclimber key = "stairs_and_cliffs" map_name = "stairs_and_cliffs" diff --git a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm index 24fa6e5482a..5f754dd433a 100644 --- a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm +++ b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_MEDIUM desc = "Board the enemy ship and recover the stolen cargo." difficulty = BITRUNNER_DIFFICULTY_MEDIUM - extra_loot = list(/obj/item/toy/plush/nukeplushie = 1) + completion_loot = list(/obj/item/toy/plush/nukeplushie = 1) help_text = "A group of Syndicate operatives have stolen valuable cargo from the station. \ They have boarded their ship and are attempting to escape. Infiltrate their ship and recover \ the crate. Be careful, they are extremely armed." diff --git a/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm index b704441edaa..5da6449ccf9 100644 --- a/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm +++ b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_EXTREME desc = "Suspended in the silent void of space, the Neon Relic is a haunting echo of a retro-futuristic era. Hang out, enjoy the view." difficulty = BITRUNNER_DIFFICULTY_NONE - extra_loot = list(/obj/item/stack/spacecash/c500 = 4) + completion_loot = list(/obj/item/stack/spacecash/c500 = 4) key = "vaporwave" map_name = "vaporwave" reward_points = BITRUNNER_REWARD_EXTREME diff --git a/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm b/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm index ed708d0592c..6b76956eacc 100644 --- a/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm +++ b/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_LOW desc = "Our ship scanners have detected lifeforms of unknown origin. Friendly attempts to contact them have failed." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/toy/plush/rouny = 1) + completion_loot = list(/obj/item/toy/plush/rouny = 1) help_text = "You are on a barren planet filled with hostile creatures. There is a crate here, not hidden, \ simply protected. Expect resistance." is_modular = TRUE diff --git a/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm b/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm index ab691274bc5..c0e017a0b9f 100644 --- a/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm +++ b/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm @@ -151,9 +151,9 @@ /datum/modular_mob_segment/xenos mobs = list( - /mob/living/simple_animal/hostile/alien, - /mob/living/simple_animal/hostile/alien/sentinel, - /mob/living/simple_animal/hostile/alien/drone, + /mob/living/basic/alien, + /mob/living/basic/alien/sentinel, + /mob/living/basic/alien/drone, ) #undef SPAWN_ALWAYS diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm index 838834f45a7..b316bb97cae 100644 --- a/code/modules/bitrunning/virtual_domain/virtual_domain.dm +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -6,6 +6,7 @@ map_dir = "_maps/virtual_domains" map_name = "None" key = "Virtual Domain" + place_on_top = TRUE /// Cost of this map to load var/cost = BITRUNNER_COST_NONE @@ -28,7 +29,11 @@ /// Byond will look for modular mob segment landmarks then choose from here at random. You can make them unique also. var/list/datum/modular_mob_segment/mob_modules = list() /// An assoc list of typepath/amount to spawn on completion. Not weighted - the value is the amount - var/list/extra_loot + var/list/completion_loot + /// An accoc list of typepath/amount to spawn from secondary objectives. Not weighted - the value is the total number of items that can be obtained. + var/list/secondary_loot = list() + /// Number of secondary loot boxes generated. Resets when the domain is reloaded. + var/secondary_loot_generated /// Forces all mob modules to only load once var/modular_unique_mobs = FALSE // Name to show in the UI diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index dccf875a55a..0211a066555 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -156,8 +156,9 @@ ammo_x_offset = 2 shaded_charge = FALSE -/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib - return +/obj/item/gun/energy/laser/instakill/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/gun/energy/laser/instakill/ctf/Initialize(mapload) . = ..() diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm index 9c287341b88..be39268663f 100644 --- a/code/modules/cargo/bounties/mining.dm +++ b/code/modules/cargo/bounties/mining.dm @@ -46,6 +46,21 @@ reward = CARGO_CRATE_VALUE * 15 required_count = 3 wanted_types = list(/obj/item/clothing/accessory/talisman = TRUE) + +/datum/bounty/item/mining/watcher_wreath + name = "Watcher Wreaths" + description = "Station 14's Research Director thinks they're onto a break-through on the cultural icons of some pagan beliefs. Ship them a few watcher wreaths for analysis." + reward = CARGO_CRATE_VALUE * 15 + required_count = 3 + wanted_types = list(/obj/item/clothing/neck/wreath = FALSE) + +/datum/bounty/item/mining/icewing_wreath + name = "Icewing Wreath" + description = "We're getting some....weird messages from Station 14's Research Director. And most of what they said was incoherent. But they apparently want an icewing wreath. Could you send them one?" + reward = CARGO_CRATE_VALUE * 30 + required_count = 1 + wanted_types = list(/obj/item/clothing/neck/wreath/icewing = FALSE) + //SKYRAT EDIT REMOVAL /* /datum/bounty/item/mining/bone_dagger diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index f654db44887..8eefcc86766 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -63,7 +63,7 @@ update_name() /// Choose what our prize is :D -/obj/item/coupon/proc/generate(discount, datum/supply_pack/discounted_pack) +/obj/item/coupon/proc/generate(discount, datum/supply_pack/discounted_pack, mob/user) src.discounted_pack = discounted_pack || pick(GLOB.discountable_packs[pick_weight(GLOB.pack_discount_odds)]) var/static/list/chances = list("0.10" = 4, "0.15" = 8, "0.20" = 10, "0.25" = 8, "0.50" = 4, COUPON_OMEN = 1) discount_pct_off = discount || pick_weight(chances) @@ -77,14 +77,14 @@ name = "coupon - fuck you" desc = "The small text reads, 'You will be slaughtered'... That doesn't sound right, does it?" - if(!ismob(loc)) + var/mob/cursed = user || loc + if(!ismob(cursed)) return FALSE - var/mob/cursed = loc to_chat(cursed, span_warning("The coupon reads 'fuck you' in large, bold text... is- is that a prize, or?")) if(!cursed.GetComponent(/datum/component/omen)) - cursed.AddComponent(/datum/component/omen) + cursed.AddComponent(/datum/component/omen, src, 1) return TRUE if(HAS_TRAIT(cursed, TRAIT_CURSED)) to_chat(cursed, span_warning("What a horrible night... To have a curse!")) @@ -98,6 +98,7 @@ /obj/item/coupon/proc/curse_heart(mob/living/cursed) if(!iscarbon(cursed)) cursed.gib(DROP_ALL_REMAINS) + burn_evilly() return TRUE var/mob/living/carbon/player = cursed @@ -105,6 +106,11 @@ to_chat(player, span_mind_control("What could that coupon mean?")) to_chat(player, span_userdanger("...The suspense is killing you!")) player.set_heartattack(status = TRUE) + burn_evilly() + +/obj/item/coupon/proc/burn_evilly() + visible_message(span_warning("[src] burns up in a sinister flash, taking an evil energy with it...")) + burn() /obj/item/coupon/attack_atom(obj/O, mob/living/user, params) if(!istype(O, /obj/machinery/computer/cargo)) diff --git a/code/modules/cargo/department_order.dm b/code/modules/cargo/department_order.dm deleted file mode 100644 index 7622993e901..00000000000 --- a/code/modules/cargo/department_order.dm +++ /dev/null @@ -1,277 +0,0 @@ - -///cooldown for each department, assoc type 2 cooldown. global, so rebuilding the console doesn't refresh the cd -GLOBAL_LIST_INIT(department_order_cooldowns, list( - /obj/machinery/computer/department_orders/service = 0, - /obj/machinery/computer/department_orders/engineering = 0, - /obj/machinery/computer/department_orders/science = 0, - /obj/machinery/computer/department_orders/security = 0, - /obj/machinery/computer/department_orders/medical = 0, -)) - -/obj/machinery/computer/department_orders - name = "department order console" - desc = "Used to order supplies for a department. Crates ordered this way will be locked until they reach their destination." - icon_screen = "supply" - light_color = COLOR_BRIGHT_ORANGE - ///reference to the order we've made UNTIL it gets sent on the supply shuttle. this is so heads can cancel it - var/datum/supply_order/department_order - ///access required to override an order - this should be a head of staff for the department - var/override_access - ///where this computer expects deliveries to need to go, passed onto orders. it will see if the FIRST one exists, then try a fallback. if no fallbacks it throws an error - var/list/department_delivery_areas = list() - ///which groups this computer can order from - var/list/dep_groups = list() - /// If this departmental order console currently is on cooldown. - var/on_cooldown = FALSE - - /// Our radio object we use to talk to our department. - var/obj/item/radio/radio - /// The radio key typepath that will be instantiated and inserted into our radio. - var/obj/item/encryptionkey/radio_key_typepath - /// The radio channel we will speak into by default. - var/radio_channel - -/obj/machinery/computer/department_orders/Initialize(mapload, obj/item/circuitboard/board) - . = ..() - // All maps should have ONLY ONE of each order console roundstart - REGISTER_REQUIRED_MAP_ITEM(1, 1) - - if (radio_channel && radio_key_typepath) - radio = new(src) - radio.keyslot = new radio_key_typepath - radio.subspace_transmission = TRUE - radio.canhear_range = 0 - radio.recalculateChannels() - - if(mapload) //check for mapping errors - for(var/delivery_area_type in department_delivery_areas) - if(GLOB.areas_by_type[delivery_area_type]) - return - //every area fallback didn't exist on this map so throw a mapping error and set some generic area that uuuh please exist okay - log_mapping("[src] has no valid areas to deliver to on this map, add some more fallback areas to its \"department_delivery_areas\" var.") - department_delivery_areas = list(/area/station/hallway/primary/central) //if this doesn't exist like honestly fuck your map man - -/obj/machinery/computer/department_orders/Destroy() - QDEL_NULL(radio) - - return ..() - -/obj/machinery/computer/department_orders/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "DepartmentOrders") - ui.open() - -/obj/machinery/computer/department_orders/ui_data(mob/user) - var/list/data = list() - var/cooldown = GLOB.department_order_cooldowns[type] - world.time - if(cooldown < 0) - data["time_left"] = 0 - else - data["time_left"] = DisplayTimeText(cooldown, 1) - data["can_override"] = department_order ? TRUE : FALSE - return data - -/obj/machinery/computer/department_orders/ui_static_data(mob/user) - var/list/data = list() - var/list/supply_data = list() //each item in this needs to be a Category - for(var/pack_key in SSshuttle.supply_packs) - var/datum/supply_pack/pack = SSshuttle.supply_packs[pack_key] - //skip groups we do not offer - if(!(pack.group in dep_groups)) - continue - //find which group this belongs to, make the group if it doesn't exist - var/list/target_group - for(var/list/possible_group in supply_data) - if(possible_group["name"] == pack.group) - target_group = possible_group - break - if(!target_group) - target_group = list( - "name" = pack.group, - "packs" = list(), - ) - supply_data += list(target_group) - //skip packs we should not show, even if we should show the group - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.drop_pod_only || pack.goody) - continue - //finally the pack data itself - target_group["packs"] += list(list( - "name" = pack.name, - "cost" = pack.get_cost(), - "id" = pack.id, - "desc" = pack.desc || pack.name, // If there is a description, use it. Otherwise use the pack's name. - )) - data["supplies"] = supply_data - return data - -/obj/machinery/computer/department_orders/ui_act(action, list/params) - . = ..() - - if(!isliving(usr)) - return - var/mob/living/orderer = usr - - var/obj/item/card/id/id_card = orderer.get_idcard(hand_first = TRUE) - - //needs to come BEFORE preventing actions! - if(action == "override_order") - if(!(override_access in id_card.GetAccess())) - balloon_alert(usr, "requires head of staff access!") - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - return - - if(department_order && (department_order in SSshuttle.shopping_list)) - GLOB.department_order_cooldowns[type] = 0 - SSshuttle.shopping_list -= department_order - department_order = null - UnregisterSignal(SSshuttle, COMSIG_SUPPLY_SHUTTLE_BUY) - return TRUE - - if(GLOB.department_order_cooldowns[type] > world.time) - return - - if(!check_access(id_card)) - balloon_alert(usr, "access denied!") - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - return - - . = TRUE - var/id = params["id"] - id = text2path(id) || id - var/datum/supply_pack/pack = SSshuttle.supply_packs[id] - if(!pack) - say("Something went wrong!") - CRASH("requested supply pack id \"[id]\" not found!") - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.drop_pod_only || pack.goody) - return - var/name = "*None Provided*" - var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/human_orderer = usr - name = human_orderer.get_authentification_name() - rank = human_orderer.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - //already have a signal to finalize the order - var/already_signalled = department_order ? TRUE : FALSE - var/chosen_delivery_area - for(var/delivery_area_type in department_delivery_areas) - if(GLOB.areas_by_type[delivery_area_type]) - chosen_delivery_area = delivery_area_type - break - - if(SSshuttle.supply.get_order_count(pack) == OVER_ORDER_LIMIT) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - say("ERROR: No more then [CARGO_MAX_ORDER] of any pack may be ordered at once") - return - - department_order = new( - pack = pack, - orderer = name, - orderer_rank = rank, - orderer_ckey = ckey, - reason = "", - paying_account = null, - department_destination = chosen_delivery_area, - coupon = null, - manifest_can_fail = FALSE, - ) - SSshuttle.shopping_list += department_order - if(!already_signalled) - RegisterSignal(SSshuttle, COMSIG_SUPPLY_SHUTTLE_BUY, PROC_REF(finalize_department_order)) - say("Order processed. Cargo will deliver the crate when it comes in on their shuttle. NOTICE: Heads of staff may override the order.") - calculate_cooldown(pack.cost) - -///signal when the supply shuttle begins to spawn orders. we forget the current order preventing it from being overridden (since it's already past the point of no return on undoing the order) -/obj/machinery/computer/department_orders/proc/finalize_department_order(datum/subsystem) - SIGNAL_HANDLER - if(department_order && (department_order in SSshuttle.shopping_list)) - department_order = null - UnregisterSignal(subsystem, COMSIG_SUPPLY_SHUTTLE_BUY) - -/obj/machinery/computer/department_orders/proc/calculate_cooldown(credits) - //minimum almost the lowest value of a crate - var/min = CARGO_CRATE_VALUE * 1.6 - //maximum fairly expensive crate at 3000 - var/max = CARGO_CRATE_VALUE * 15 - credits = clamp(credits, min, max) - var/time_y = (credits - min)/(max - min) + 1 //convert to between 1 and 2 - time_y = 10 MINUTES * time_y - GLOB.department_order_cooldowns[type] = world.time + time_y - -/obj/machinery/computer/department_orders/process() - . = ..() - if (!.) - return FALSE - - if (GLOB.department_order_cooldowns[type] > world.time) - on_cooldown = TRUE - else if (on_cooldown) - radio?.talk_into(src, "Order cooldown has expired! A new order may now be placed!", radio_channel) - playsound(src, 'sound/machines/ping.ogg', 30, TRUE) - on_cooldown = FALSE - - return TRUE - -/obj/machinery/computer/department_orders/service - name = "service order console" - circuit = /obj/item/circuitboard/computer/service_orders - department_delivery_areas = list(/area/station/hallway/secondary/service, /area/station/service/bar/atrium) - override_access = ACCESS_HOP - req_one_access = list(ACCESS_SERVICE) - dep_groups = list("Service", "Food & Hydroponics", "Livestock", "Costumes & Toys") - radio_key_typepath = /obj/item/encryptionkey/headset_service - radio_channel = RADIO_CHANNEL_SERVICE - -/obj/machinery/computer/department_orders/engineering - name = "engineering order console" - circuit = /obj/item/circuitboard/computer/engineering_orders - department_delivery_areas = list(/area/station/engineering/main) - override_access = ACCESS_CE - req_one_access = REGION_ACCESS_ENGINEERING - dep_groups = list("Engineering", "Engine Construction", "Canisters & Materials") - radio_key_typepath = /obj/item/encryptionkey/headset_eng - radio_channel = RADIO_CHANNEL_ENGINEERING - -/obj/machinery/computer/department_orders/science - name = "science order console" - circuit = /obj/item/circuitboard/computer/science_orders - department_delivery_areas = list(/area/station/science/research) - override_access = ACCESS_RD - req_one_access = REGION_ACCESS_RESEARCH - dep_groups = list("Science", "Livestock", "Canisters & Materials") - radio_key_typepath = /obj/item/encryptionkey/headset_sci - radio_channel = RADIO_CHANNEL_SCIENCE - -/obj/machinery/computer/department_orders/security - name = "security order console" - circuit = /obj/item/circuitboard/computer/security_orders - department_delivery_areas = list( - /area/station/security/office, - /area/station/security/brig, - /area/station/security/brig/upper, - ) - override_access = ACCESS_HOS - req_one_access = REGION_ACCESS_SECURITY - dep_groups = list("Security", "Armory") - radio_key_typepath = /obj/item/encryptionkey/headset_sec - radio_channel = RADIO_CHANNEL_SECURITY - -/obj/machinery/computer/department_orders/medical - name = "medical order console" - circuit = /obj/item/circuitboard/computer/medical_orders - department_delivery_areas = list( - /area/station/medical/medbay/central, - /area/station/medical/medbay, - /area/station/medical/treatment_center, - /area/station/medical/storage, - ) - override_access = ACCESS_CMO - req_one_access = REGION_ACCESS_MEDBAY - dep_groups = list("Medical") - radio_key_typepath = /obj/item/encryptionkey/headset_med - radio_channel = RADIO_CHANNEL_MEDICAL diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index fd6e91a8580..7996cc0f8fa 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -30,6 +30,14 @@ 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: @@ -40,32 +48,15 @@ Then the player gets the profit from selling his own wasted time. ** ignore_typecache: typecache containing types that should be completely ignored */ /proc/export_item_and_contents(atom/movable/exported_atom, apply_elastic = TRUE, delete_unsold = TRUE, dry_run = FALSE, datum/export_report/external_report, list/ignore_typecache) - if(!GLOB.exports_list.len) - setupExports() + external_report = init_export(external_report) var/list/contents = exported_atom.get_all_contents_ignoring(ignore_typecache) - var/datum/export_report/report = external_report - - if(!report) //If we don't have any longer transaction going on - report = new - // We go backwards, so it'll be innermost objects sold first. We also make sure nothing is accidentally delete before everything is sold. var/list/to_delete = list() for(var/atom/movable/thing as anything in reverse_range(contents)) - var/sold = FALSE - for(var/datum/export/export as anything in GLOB.exports_list) - if(export.applies_to(thing, apply_elastic)) - if(!dry_run && (SEND_SIGNAL(thing, COMSIG_ITEM_PRE_EXPORT) & COMPONENT_STOP_EXPORT)) - break - //Don't add value of unscannable items for a dry run report - if(dry_run && !export.scannable) - report.all_contents_scannable = FALSE - break - sold = export.sell_object(thing, report, dry_run, apply_elastic) - report.exported_atoms += " [thing.name]" - break - if(!dry_run && (sold || delete_unsold)) + var/sold = _export_loop(thing, apply_elastic, dry_run, external_report) + if(!dry_run && (sold || delete_unsold) && sold != EXPORT_SOLD_DONT_DELETE) if(ismob(thing)) thing.investigate_log("deleted through cargo export", INVESTIGATE_CARGO) to_delete += thing @@ -74,7 +65,35 @@ Then the player gets the profit from selling his own wasted time. if(!QDELETED(thing)) qdel(thing) - return report + return external_report + +/// 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) + external_report = init_export(external_report) + + var/sold = _export_loop(exported_atom, apply_elastic, dry_run, external_report) + if(!dry_run && (sold || delete_unsold) && sold != EXPORT_SOLD_DONT_DELETE) + if(ismob(exported_atom)) + exported_atom.investigate_log("deleted through cargo export", INVESTIGATE_CARGO) + qdel(exported_atom) + + return external_report + +/// The main bit responsible for selling the item. Shared by export_single_item() and export_item_and_contents() +/proc/_export_loop(atom/movable/exported_atom, apply_elastic = TRUE, dry_run = FALSE, datum/export_report/external_report) + var/sold = EXPORT_NOT_SOLD + for(var/datum/export/export as anything in GLOB.exports_list) + if(export.applies_to(exported_atom, apply_elastic)) + if(!dry_run && (SEND_SIGNAL(exported_atom, COMSIG_ITEM_PRE_EXPORT) & COMPONENT_STOP_EXPORT)) + break + //Don't add value of unscannable items for a dry run report + if(dry_run && !export.scannable) + 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 /// Unit name. Only used in "Received [total_amount] [name]s [message]." @@ -164,7 +183,7 @@ Then the player gets the profit from selling his own wasted time. var/export_amount = get_amount(sold_item) if(export_amount <= 0 || (export_value <= 0 && !allow_negative_cost)) - return FALSE + return EXPORT_NOT_SOLD // If we're not doing a dry run, send COMSIG_ITEM_EXPORTED to the sold item var/export_result @@ -180,7 +199,7 @@ Then the player gets the profit from selling his own wasted time. if(apply_elastic) cost *= NUM_E**(-1 * k_elasticity * export_amount) //marginal cost modifier SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[sold_item.type]", "[export_value]")) - return TRUE + return EXPORT_SOLD /* * Total printout for the cargo console. diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index ecb0d0d0460..87817987b60 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -139,19 +139,11 @@ //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) - //this material is worthless. no point adding more to the stock - var/market_price = SSstock_market.materials_prices[material_id] - if(!market_price) - return - //decrease the market price - market_price -= round((market_price) * (amount / (amount + SSstock_market.materials_quantity[material_id]))) - if(market_price < 0) - market_price = 0 - SSstock_market.materials_prices[material_id] = market_price + SSstock_market.adjust_material_price(material_id, -SSstock_market.materials_prices[material_id] * (amount / (amount + SSstock_market.materials_quantity[material_id]))) //increase the stock - SSstock_market.materials_quantity[material_id] += amount + SSstock_market.adjust_material_quantity(material_id, amount) // Stock blocks are a special type of export that can be used to sell a quantity of materials at a specific price on the market. diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index 840d40f1837..fc8c9656fea 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -33,3 +33,9 @@ unit_name = "data disk" export_types = list(/obj/item/computer_disk) include_subtypes = TRUE + +/datum/export/refill_canister + cost = CARGO_CRATE_VALUE * 0.5 //If someone want to make this worth more as it empties, go ahead + unit_name = "vending refill canister" + message = "Thank you for restocking the station!" + export_types = list(/obj/item/vending_refill) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 79ae0b0fbf8..4942ea2c06a 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -95,7 +95,7 @@ if(D) data["points"] = D.account_balance data["locked"] = locked//swipe an ID to unlock - data["siliconUser"] = user.has_unlimited_silicon_privilege + data["siliconUser"] = HAS_SILICON_ACCESS(user) data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay? data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? @@ -164,7 +164,7 @@ var/mob/living/carbon/human/H = usr name = H.get_authentification_name() rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) + else if(HAS_SILICON_ACCESS(usr)) name = usr.real_name rank = "Silicon" var/reason = "" diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index 36ceff8ad51..2491084ab70 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -67,7 +67,7 @@ opened = TRUE layer = initial(layer) update_appearance() - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, setClosed)), 50) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, setClosed)), 5 SECONDS) /mob/living/simple_animal/pet/gondola/gondolapod/setClosed() opened = FALSE diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index fd30973d241..d733677c552 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -249,6 +249,12 @@ cost = PAYCHECK_CREW contains = list(/obj/item/bait_can/worm/premium) +/datum/supply_pack/goody/fish_feed + name = "Can of fish food" + desc = "For keeping your little friends fed and alive." + cost = PAYCHECK_CREW * 1 + contains = list(/obj/item/fish_feed) + /datum/supply_pack/goody/naturalbait name = "Freshness Jars full of Natural Bait" desc = "Homemade in the Spinward Sector." @@ -308,3 +314,10 @@ desc = "A less cheap imported climbing hook. Absolutely no use outside of planetary stations." cost = PAYCHECK_CREW * 5 contains = list(/obj/item/climbing_hook) + +/datum/supply_pack/goody/double_barrel + name = "Double Barrel Shotgun" + desc = "Lost your beloved bunny to a demonic invasion? Clown broke in and stole your beloved gun? No worries! Get a new gun so long as you can pay the absurd fees." + cost = PAYCHECK_COMMAND * 18 + access_view = ACCESS_WEAPONS + contains = list(/obj/item/gun/ballistic/shotgun/doublebarrel) diff --git a/code/modules/cargo/markets/_market.dm b/code/modules/cargo/markets/_market.dm index 3c264289cd2..78585ed842f 100644 --- a/code/modules/cargo/markets/_market.dm +++ b/code/modules/cargo/markets/_market.dm @@ -13,49 +13,60 @@ /// Adds item to the available items and add it's category if it is not in categories yet. /datum/market/proc/add_item(datum/market_item/item) - if(!prob(initial(item.availability_prob))) - return FALSE - - if(ispath(item)) + if(ispath(item, /datum/market_item)) item = new item() if(!(item.category in categories)) categories += item.category available_items[item.category] = list() - available_items[item.category] += item + available_items[item.category][item.identifier] = item + RegisterSignal(item, COMSIG_QDELETING, PROC_REF(on_item_del)) return TRUE +/datum/market/proc/on_item_del(datum/market_item/item) + SIGNAL_HANDLER + available_items[item.category] -= item.identifier + if(!length(available_items[item.category])) + available_items -= item.category + /// Handles buying the item, this is mainly for future use and moving the code away from the uplink. -/datum/market/proc/purchase(item, category, method, obj/item/market_uplink/uplink, user) - if(!istype(uplink) || !(method in shipping)) +/datum/market/proc/purchase(identifier, category, method, obj/item/market_uplink/uplink, user) + var/datum/market_item/item = available_items[category][identifier] + if(isnull(item)) return FALSE - for(var/datum/market_item/I in available_items[category]) - if(I.type != item) - continue - var/price = I.price + shipping[method] - - if(!uplink.current_user)///There is no ID card on the user, or the ID card has no account - to_chat(user, span_warning("The uplink sparks, as it can't identify an ID card with a bank account on you.")) - return FALSE - var/balance = uplink?.current_user.account_balance - - // 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 [I] with [method] shipping.")) - return FALSE - - if(I.buy(uplink, user, method)) - uplink.current_user.adjust_money(-price, "Other: Third Party Transaction") - if(ismob(user)) - var/mob/m_user = user - m_user.playsound_local(get_turf(m_user), 'sound/machines/twobeep_high.ogg', 50, TRUE) - return TRUE + if(!istype(uplink) || !((method in shipping) || (method in item.shipping_override))) return FALSE + var/shipment_fee = item.shipping_override?[method] + if(isnull(shipment_fee)) + shipment_fee = shipping[method] + var/price = item.price + shipment_fee + + if(!uplink.current_user)///There is no ID card on the user, or the ID card has no account + to_chat(user, span_warning("The uplink sparks, as it can't identify an ID card with a bank account on you.")) + return FALSE + var/balance = uplink?.current_user.account_balance + + // 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.")) + return FALSE + + if(item.buy(uplink, user, method)) + uplink.current_user.adjust_money(-price, "Other: Third Party Transaction") + if(ismob(user)) + var/mob/m_user = user + m_user.playsound_local(get_turf(m_user), 'sound/machines/twobeep_high.ogg', 50, TRUE) + return TRUE + + return FALSE + /datum/market/blackmarket name = "Black Market" - shipping = list(SHIPPING_METHOD_LTSRBT =50, - SHIPPING_METHOD_LAUNCH =10, - SHIPPING_METHOD_TELEPORT=75) + shipping = list( + SHIPPING_METHOD_LTSRBT = 40, + SHIPPING_METHOD_LAUNCH = 10, + SHIPPING_METHOD_TELEPORT= 75, + ) diff --git a/code/modules/cargo/markets/market_item.dm b/code/modules/cargo/markets/market_item.dm index 867facf015b..51651ffdc47 100644 --- a/code/modules/cargo/markets/market_item.dm +++ b/code/modules/cargo/markets/market_item.dm @@ -14,7 +14,7 @@ var/stock /// Path to or the item itself what this entry is for, this should be set even if you override spawn_item to spawn your item. - var/item + var/atom/movable/item /// Minimum price for the item if generated randomly. var/price_min = 0 @@ -27,18 +27,60 @@ /// Probability for this item to be available. Used by SSblackmarket on init. var/availability_prob = 0 + ///The identifier for the market item, generated on runtime and used to access them in the market categories. + var/identifier + + ///If set, these will override the shipment methods set by the market + var/list/shipping_override + /datum/market_item/New() if(isnull(price)) price = rand(price_min, price_max) if(isnull(stock)) stock = rand(stock_min, stock_max) + identifier = "[type]" + +///For 'dynamic' market items generated on runtime, this proc is to be used to properly sets the item, especially if it's a hardref. +/datum/market_item/proc/set_item(path_or_ref) + //we're replacing the item to sell, and the old item is an instance! + if(ismovable(item)) + UnregisterSignal(item, COMSIG_QDELETING) + item = path_or_ref + identifier = "[path_or_ref]" + if(ismovable(path_or_ref)) + RegisterSignal(item, COMSIG_QDELETING, PROC_REF(on_item_del)) + identifier = "[REF(src)]" + +/datum/market_item/Destroy() + item = null + return ..() + +/datum/market_item/proc/on_item_del(datum/source) + SIGNAL_HANDLER + qdel(src) /// Used for spawning the wanted item, override if you need to do something special with the item. -/datum/market_item/proc/spawn_item(loc) - return new item(loc) +/datum/market_item/proc/spawn_item(loc, datum/market_purchase/purchase) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_MARKET_ITEM_SPAWNED, purchase.uplink, purchase.method, loc) + if(ismovable(item)) + var/atom/movable/return_item = item + UnregisterSignal(item, COMSIG_QDELETING) + item.visible_message(span_notice("[item] vanishes...")) + do_sparks(8, FALSE, item) + if(isnull(loc)) + item.moveToNullspace() + else + item.forceMove(loc) + item = null + return return_item + if(ispath(item)) + return new item(loc) + CRASH("Invalid item type for market item [item || "null"]") /// Buys the item and makes SSblackmarket handle it. /datum/market_item/proc/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method) + SHOULD_CALL_PARENT(TRUE) // Sanity if(!istype(uplink) || !istype(buyer)) return FALSE @@ -61,16 +103,34 @@ /datum/market_purchase /// The entry being purchased. var/datum/market_item/entry - /// Instance of the item being sent. - var/item + /// Instance of the item being sent, used by the market telepad + var/atom/movable/item /// The uplink where this purchase was done from. var/obj/item/market_uplink/uplink /// Shipping method used to buy this item. var/method -/datum/market_purchase/New(_entry, _uplink, _method) - entry = _entry - if(!ispath(entry.item)) +/datum/market_purchase/New(datum/market_item/entry, obj/item/market_uplink/uplink, method) + if(!uplink || !entry || !method) + CRASH("[type] created with a false value arg: (entry: [entry] - uplink: [uplink] - method: [method])") + src.entry = entry + src.uplink = uplink + src.method = method + RegisterSignal(entry, COMSIG_QDELETING, PROC_REF(on_instance_del)) + RegisterSignal(uplink, COMSIG_QDELETING, PROC_REF(on_instance_del)) + if(ismovable(entry.item)) item = entry.item - uplink = _uplink - method = _method + RegisterSignal(entry.item, COMSIG_QDELETING, PROC_REF(on_instance_del)) + +/datum/market_purchase/Destroy() + entry = null + uplink = null + SSblackmarket.queued_purchases -= src + return ..() + +/datum/market_purchase/proc/on_instance_del(datum/source) + SIGNAL_HANDLER + if(QDELETED(src)) + return + // Uh oh, uplink or item is gone. We will just keep the money and you will not get your order. + qdel(src) diff --git a/code/modules/cargo/markets/market_items/clothing.dm b/code/modules/cargo/markets/market_items/clothing.dm index 8af34e22916..bf705e8b572 100644 --- a/code/modules/cargo/markets/market_items/clothing.dm +++ b/code/modules/cargo/markets/market_items/clothing.dm @@ -93,5 +93,11 @@ stock_max = 3 availability_prob = 40 - - +/datum/market_item/clothing/collar_bomb + name = "Collar Bomb Kit" + desc = "An unpatented and questionably ethical kit consisting of a low-yield explosive collar and a remote to trigger it." + item = /obj/item/storage/box/collar_bomb + price_min = CARGO_CRATE_VALUE * 3.5 + price_max = CARGO_CRATE_VALUE * 4.5 + stock_max = 3 + availability_prob = 60 diff --git a/code/modules/cargo/markets/market_items/consumables.dm b/code/modules/cargo/markets/market_items/consumables.dm index 153241e5d3d..5550d31c5f8 100644 --- a/code/modules/cargo/markets/market_items/consumables.dm +++ b/code/modules/cargo/markets/market_items/consumables.dm @@ -39,7 +39,8 @@ /obj/item/storage/pill_bottle/lsd, /obj/item/storage/pill_bottle/aranesp, /obj/item/storage/pill_bottle/stimulant)) - return new pillbottle(loc) + item = pillbottle + return ..() /datum/market_item/consumable/floor_pill name = "Strange Pill" diff --git a/code/modules/cargo/markets/market_items/hostages.dm b/code/modules/cargo/markets/market_items/hostages.dm new file mode 100644 index 00000000000..6551ee6156b --- /dev/null +++ b/code/modules/cargo/markets/market_items/hostages.dm @@ -0,0 +1,84 @@ +///A special category for mobs captured by pirates, tots and contractors, should someone ever want to get them back in advance. +/datum/market_item/hostage + category = "Hostages" + stock = 1 + availability_prob = 100 + shipping_override = list(SHIPPING_METHOD_LTSRBT = 0, SHIPPING_METHOD_SUPPLYPOD = 350) + /// temporary reference to the 4 in 7 chances of signaler and electropack. + var/obj/item/assembly/signaler/signaler + +/datum/market_item/hostage/New(mob/living/mob, new_price) + ..() + set_item(mob) + name = "[mob.real_name]" + var/specimen = initial(mob.name) + var/humie_mob = ishuman(mob) + if(humie_mob) + var/mob/living/carbon/human/humie = mob + specimen = humie.dna.species.name + desc = pick(list( + "If you're looking for a recently stolen [specimen], you've come to the right place.", + "we've recently aquired a fine [specimen] from a station around here, eheh...", + "For a limited time, we're offering this [specimen] for you to buy (back).", + )) + desc += " DISCLAIMER: The offer will expire once the creature is returned to the station." + if(humie_mob) + desc += "[mob.p_they(TRUE)] may be delivered handcuffed, for safety of course." + + price = new_price + RegisterSignal(mob, COMSIG_LIVING_RETURN_FROM_CAPTURE, PROC_REF(on_return_from_capture)) + +/datum/market_item/hostage/proc/on_return_from_capture(mob/living/source, turf/destination) + SIGNAL_HANDLER + qdel(src) //as if we never existed, our mentions we'll be removed from the market. + +/datum/market_item/hostage/Destroy() + signaler = null + return ..() + +/datum/market_item/hostage/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method) + . = ..() + var/mob/living/humie = item + if(!. || !istype(humie) || !prob(57)) // 3 in 7 chance of the electropack set not spawning... + return + signaler = new(uplink.drop_location()) + RegisterSignal(signaler, COMSIG_QDELETING, PROC_REF(clear_signaler_ref)) + signaler.set_frequency(sanitize_frequency(rand(MIN_FREE_FREQ, MAX_FREE_FREQ))) + signaler.code = rand(1, 100) + buyer.put_in_hands(signaler) + to_chat(buyer, span_notice("A [signaler] appears [buyer.is_holding(signaler) ? "in your hands" : "at your feet"]!")) + +/datum/market_item/hostage/proc/clear_signaler_ref(datum/source) + SIGNAL_HANDLER + signaler = null + +/datum/market_item/hostage/spawn_item(loc, datum/market_purchase/purchase) + var/mob/living/mob = item + UnregisterSignal(mob, COMSIG_LIVING_RETURN_FROM_CAPTURE) + if(!mob.IsUnconscious()) + to_chat(mob, span_boldnicegreen("You have been bought back to the station. Be grateful to whoever got you out of the holding facility early.")) + if(!ishuman(item)) + return ..() + var/mob/living/carbon/human/humie = item + if(signaler) //57% chance that the mob is equipped with electropack and cuffs + humie.equip_to_slot_or_del(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) + if(humie.back) //try to remove the neck item if possible before we attempt to install the collar bomb + humie.transferItemToLoc(humie.back, loc) + var/obj/item/electropack/pack = new(loc) + pack.set_frequency(signaler.frequency) + pack.code = signaler.code + humie.equip_to_slot_if_possible(pack, ITEM_SLOT_BACK, disable_warning = TRUE) + UnregisterSignal(signaler, COMSIG_QDELETING) + signaler = null + else if(prob(66)) // 29% chance of just cuffs + humie.equip_to_slot_or_del(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) + else // 14% chance of just a tee souvenir and pin, no cuffs and shit. + var/obj/item/clothing/under/misc/syndicate_souvenir/souvenir = new(loc) + humie.equip_to_slot_if_possible(souvenir, ITEM_SLOT_ICLOTHING, indirect_action = TRUE) + var/obj/item/clothing/accessory/anti_sec_pin/pin = new(loc) + pin.attach(souvenir) + + if(isnull(humie.w_uniform)) + //FUCKING SLAVES, GET YOUR CLOTHES BACK ON! + humie.equip_to_slot_or_del(new /obj/item/clothing/under/costume/jabroni(humie), ITEM_SLOT_ICLOTHING, indirect_action = TRUE) + return ..() diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index a7bb93f9c3a..5d5f406d139 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -68,9 +68,11 @@ stock_max = 3 availability_prob = 40 -/datum/market_item/misc/holywater/spawn_item(loc) +/datum/market_item/misc/holywater/spawn_item(loc, datum/market_purchase/purchase) if (prob(6.66)) - return new /obj/item/reagent_containers/cup/beaker/unholywater(loc) + item = /obj/item/reagent_containers/cup/beaker/unholywater + else + item = initial(item) return ..() /datum/market_item/misc/strange_seed diff --git a/code/modules/cargo/markets/market_items/stolen_goods.dm b/code/modules/cargo/markets/market_items/stolen_goods.dm new file mode 100644 index 00000000000..c9c17f1d2b6 --- /dev/null +++ b/code/modules/cargo/markets/market_items/stolen_goods.dm @@ -0,0 +1,12 @@ +///A special category for goods stolen by spies for their bounties. +/datum/market_item/stolen_good + category = "Fenced Goods" + stock = 1 + availability_prob = 100 + +/datum/market_item/stolen_good/New(atom/movable/thing, thing_price) + ..() + set_item(thing) + name = "Stolen [thing.name]" + desc = "A [thing.name], stolen from somewhere on the station. Whoever owned it probably wouldn't be happy to see it here." + price = thing_price diff --git a/code/modules/cargo/markets/market_items/tools.dm b/code/modules/cargo/markets/market_items/tools.dm index c20834e640b..5d036fae0ef 100644 --- a/code/modules/cargo/markets/market_items/tools.dm +++ b/code/modules/cargo/markets/market_items/tools.dm @@ -1,6 +1,18 @@ /datum/market_item/tool category = "Tools" +/datum/market_item/tool/blackmarket_telepad + name = "Black Market LTSRBT" + desc = "Need a faster and better way of transporting your illegal goods from and to the \ + station? Fear not, the Long-To-Short-Range-Bluespace-Transceiver is here to help. \ + Contains a LTSRBT circuit. Bluespace crystals and ansible not included." + item = /obj/item/circuitboard/machine/ltsrbt + stock_min = 2 + stock_max = 4 + price_min = CARGO_CRATE_VALUE * 2.5 + price_max = CARGO_CRATE_VALUE * 3.75 + availability_prob = 100 + /datum/market_item/tool/caravan_wrench name = "Experimental Wrench" desc = "The extra fast and handy wrench you always wanted!" diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index 052074a30b3..11f242d57c8 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -66,7 +66,7 @@ /datum/market_item/weapon/fisher name = "SC/FISHER Saboteur Handgun" - desc = "A self-recharging, compact pistol that disrupts flashlights and security cameras, if only temporarily. Also usable in melee." + desc = "A self-recharging, compact pistol that disrupts lights, cameras, APCs, turrets and more, if only temporarily. Also usable in melee." item = /obj/item/gun/energy/recharge/fisher price_min = CARGO_CRATE_VALUE * 2 diff --git a/code/modules/cargo/markets/market_telepad.dm b/code/modules/cargo/markets/market_telepad.dm index abdad441ce5..4545b07e487 100644 --- a/code/modules/cargo/markets/market_telepad.dm +++ b/code/modules/cargo/markets/market_telepad.dm @@ -19,20 +19,20 @@ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 2 - /// Divider for power_usage_per_teleport. + /// Divider for energy_usage_per_teleport. var/power_efficiency = 1 /// Power used per teleported which gets divided by power_efficiency. - var/power_usage_per_teleport = 10000 + var/energy_usage_per_teleport = 10 KILO JOULES /// The time it takes for the machine to recharge before being able to send or receive items. var/recharge_time = 0 /// Current recharge progress. - var/recharge_cooldown = 0 + COOLDOWN_DECLARE(recharge_cooldown) /// Base recharge time in seconds which is used to get recharge_time. - var/base_recharge_time = 100 + var/base_recharge_time = 10 SECONDS /// Current /datum/market_purchase being received. - var/receiving + var/datum/market_purchase/receiving /// Current /datum/market_purchase being sent to the target uplink. - var/transmitting + var/datum/market_purchase/transmitting /// Queue for purchases that the machine should receive and send. var/list/datum/market_purchase/queue = list() @@ -43,7 +43,7 @@ /obj/machinery/ltsrbt/Destroy() SSblackmarket.telepads -= src // Bye bye orders. - if(SSblackmarket.telepads.len) + if(length(SSblackmarket.telepads)) for(var/datum/market_purchase/P in queue) SSblackmarket.queue_item(P) . = ..() @@ -53,7 +53,7 @@ recharge_time = base_recharge_time // On tier 4 recharge_time should be 20 and by default it is 80 as scanning modules should be tier 1. for(var/datum/stock_part/scanning_module/scanning_module in component_parts) - recharge_time -= scanning_module.tier * 10 + recharge_time -= scanning_module.tier * 1 SECONDS recharge_cooldown = recharge_time power_efficiency = 0 @@ -67,51 +67,48 @@ /obj/machinery/ltsrbt/proc/add_to_queue(datum/market_purchase/purchase) if(!recharge_cooldown && !receiving && !transmitting) receiving = purchase - return - queue += purchase + else + queue += purchase + + RegisterSignal(purchase, COMSIG_QDELETING, PROC_REF(on_purchase_del)) + +/obj/machinery/ltsrbt/proc/on_purchase_del(datum/market_purchase/purchase) + SIGNAL_HANDLER + queue -= purchase + if(receiving == purchase) + receiving = null + if(transmitting == purchase) + transmitting = null /obj/machinery/ltsrbt/process(seconds_per_tick) if(machine_stat & NOPOWER) return - if(recharge_cooldown > 0) - recharge_cooldown -= seconds_per_tick + if(!COOLDOWN_FINISHED(src, recharge_cooldown) && isnull(receiving) && isnull(transmitting)) return - var/turf/T = get_turf(src) + var/turf/turf = get_turf(src) if(receiving) - var/datum/market_purchase/P = receiving - if(!P.item || ispath(P.item)) - P.item = P.entry.spawn_item(T) - else - var/atom/movable/M = P.item - M.forceMove(T) + receiving.item = receiving.entry.spawn_item(turf, receiving) - use_power(power_usage_per_teleport / power_efficiency) + use_energy(energy_usage_per_teleport / power_efficiency) var/datum/effect_system/spark_spread/sparks = new sparks.set_up(5, 1, get_turf(src)) - sparks.attach(P.item) + sparks.attach(receiving.item) sparks.start() + transmitting = receiving receiving = null - transmitting = P - recharge_cooldown = recharge_time + COOLDOWN_START(src, recharge_cooldown, recharge_time) return - else if(transmitting) - var/datum/market_purchase/P = transmitting - if(!P.item) - QDEL_NULL(transmitting) - if(!(P.item in T.contents)) - QDEL_NULL(transmitting) - return - do_teleport(P.item, get_turf(P.uplink)) - use_power(power_usage_per_teleport / power_efficiency) + if(transmitting) + if(transmitting.item.loc == turf) + do_teleport(transmitting.item, get_turf(transmitting.uplink)) + use_energy(energy_usage_per_teleport / power_efficiency) QDEL_NULL(transmitting) - - recharge_cooldown = recharge_time return - if(queue.len) + if(length(queue)) receiving = pick_n_take(queue) diff --git a/code/modules/cargo/markets/market_uplink.dm b/code/modules/cargo/markets/market_uplink.dm index 19c1a049a1b..da86161e46a 100644 --- a/code/modules/cargo/markets/market_uplink.dm +++ b/code/modules/cargo/markets/market_uplink.dm @@ -9,7 +9,7 @@ var/viewing_category /// What market is currently being bought from by the uplink? var/viewing_market - /// What item is the current uplink attempting to buy? + /// the identifier of the item that the current uplink is attempting to buy var/selected_item /// Is the uplink in the process of buying the selected item? var/buying @@ -56,25 +56,31 @@ current_user = null data["categories"] = market ? market.categories : null data["delivery_methods"] = list() - if(market) - for(var/delivery in market.shipping) - data["delivery_methods"] += list(list("name" = delivery, "price" = market.shipping[delivery])) data["money"] = "N/A cr" if(current_user) data["money"] = current_user.account_balance data["buying"] = buying + if(buying && market) + var/datum/market_item/target_item = market.available_items[viewing_category][selected_item] + var/list/shipping_list = market.shipping + if(length(target_item?.shipping_override)) + shipping_list = target_item.shipping_override + for(var/delivery in shipping_list) + UNTYPED_LIST_ADD(data["delivery_methods"], list("name" = delivery, "price" = shipping_list[delivery])) data["items"] = list() - data["viewing_category"] = viewing_category + data["viewing_category"] = market.categories[viewing_category] ? viewing_category : null data["viewing_market"] = viewing_market if(viewing_category && market) if(market.available_items[viewing_category]) - for(var/datum/market_item/I in market.available_items[viewing_category]) + var/list/market_category = market.available_items[viewing_category] + for(var/id in market_category) + var/datum/market_item/item = market_category[id] data["items"] += list(list( - "id" = I.type, - "name" = I.name, - "cost" = I.price, - "amount" = I.stock, - "desc" = I.desc || I.name + "id" = id, + "name" = item.name, + "cost" = item.price, + "amount" = item.stock, + "desc" = item.desc || item.name )) return data @@ -123,8 +129,7 @@ if("select") if(isnull(params["item"])) return - var/item = text2path(params["item"]) - selected_item = item + selected_item = params["item"] buying = TRUE . = TRUE if("cancel") @@ -150,6 +155,7 @@ icon_state = "uplink" //The original black market uplink accessible_markets = list(/datum/market/blackmarket) + custom_premium_price = PAYCHECK_CREW * 2.5 /datum/crafting_recipe/blackmarket_uplink diff --git a/code/modules/cargo/materials_market.dm b/code/modules/cargo/materials_market.dm index 92d83d5d0a1..947197d16f2 100644 --- a/code/modules/cargo/materials_market.dm +++ b/code/modules/cargo/materials_market.dm @@ -166,12 +166,14 @@ var/min_value_override = initial(traded_mat.minimum_value_override) if(min_value_override) minimum_value_threshold = min_value_override - + else + minimum_value_threshold = round(initial(traded_mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5) //send data material_data += list(list( "name" = initial(traded_mat.name), "price" = SSstock_market.materials_prices[traded_mat], + "rarity" = initial(traded_mat.value_per_unit), "threshold" = minimum_value_threshold, "quantity" = SSstock_market.materials_quantity[traded_mat], "trend" = trend_string, @@ -205,6 +207,7 @@ .["orderBalance"] = current_cost .["orderingPrive"] = ordering_private .["canOrderCargo"] = can_buy_via_budget + .["updateTime"] = SSstock_market.next_fire - world.time /obj/machinery/materials_market/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() @@ -348,8 +351,8 @@ /obj/item/stock_block/Initialize(mapload) . = ..() - addtimer(CALLBACK(src, PROC_REF(value_warning)), 2.5 MINUTES, TIMER_DELETE_ME) - addtimer(CALLBACK(src, PROC_REF(update_value)), 5 MINUTES, TIMER_DELETE_ME) + addtimer(CALLBACK(src, PROC_REF(value_warning)), 1.5 MINUTES, TIMER_DELETE_ME) + addtimer(CALLBACK(src, PROC_REF(update_value)), 3 MINUTES, TIMER_DELETE_ME) /obj/item/stock_block/examine(mob/user) . = ..() diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 38552e4cb9a..a48e9db6bc6 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -206,7 +206,7 @@ var/mob/living/carbon/human/human = user name = human.get_authentification_name() rank = human.get_assignment(hand_first = TRUE) - else if(issilicon(user)) + else if(HAS_SILICON_ACCESS(user)) name = user.real_name rank = "Silicon" diff --git a/code/modules/cargo/packs/_packs.dm b/code/modules/cargo/packs/_packs.dm index 9257d2d1e3d..662938320cb 100644 --- a/code/modules/cargo/packs/_packs.dm +++ b/code/modules/cargo/packs/_packs.dm @@ -148,6 +148,7 @@ var/fraction = available_quantity if(market_quantity != available_quantity) //to avoid division by zero error fraction /= (market_quantity - available_quantity) - SSstock_market.materials_prices[material_type] += round(SSstock_market.materials_prices[material_type] * fraction) + SSstock_market.adjust_material_price(material_type, SSstock_market.materials_prices[material_type] * fraction) + //We decrease the quantity only after adjusting our prices for accurate values - SSstock_market.materials_quantity[material_type] -= available_quantity + SSstock_market.adjust_material_quantity(material_type, -available_quantity) diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 51fb4686038..e23e6112a4b 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -250,8 +250,9 @@ discountable = SUPPLY_PACK_STD_DISCOUNTABLE /datum/supply_pack/costumes_toys/stickers/fill(obj/structure/closet/crate/crate) - for(var/i in 1 to rand(1,2)) + for(var/i in 1 to rand(1, 2)) new /obj/item/storage/box/stickers(crate) + if(prob(30)) // a pair of googly eyes because funny new /obj/item/storage/box/stickers/googly(crate) diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index 1911402ce71..98e1162b5f6 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -214,6 +214,14 @@ contains = list(/obj/item/circuitboard/computer/sat_control) crate_name= "shield control board crate" +/datum/supply_pack/engineering/ceturtlenecks + name = "Chief Engineer Turtlenecks" + desc = "Contains the CE's turtleneck and turtleneck skirt." + cost = CARGO_CRATE_VALUE * 2 + access = ACCESS_CE + contains = list(/obj/item/clothing/under/rank/engineering/chief_engineer/turtleneck, + /obj/item/clothing/under/rank/engineering/chief_engineer/turtleneck/skirt, + ) /// Engine Construction diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index def99d11359..85847052c34 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -118,19 +118,6 @@ if(prob(10)) //A little extra sugar every now and then to shake things up. new /obj/item/switchblade(our_crate) -/datum/supply_pack/imports/blackmarket_telepad - name = "Black Market LTSRBT" - desc = "Need a faster and better way of transporting your illegal goods from and to the \ - station? Fear not, the Long-To-Short-Range-Bluespace-Transceiver (LTSRBT for short) \ - is here to help. Contains a LTSRBT circuit, two bluespace crystals, and one ansible." - cost = CARGO_CRATE_VALUE * 20 - contraband = TRUE - contains = list( - /obj/item/circuitboard/machine/ltsrbt, - /obj/item/stack/ore/bluespace_crystal/artificial = 2, - /obj/item/stock_parts/subspace/ansible, - ) - /datum/supply_pack/imports/contraband name = "'Contraband' Crate" desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some \ diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index d806ce51d45..f405fc7de3a 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -298,7 +298,7 @@ name = "Grilling Starter Kit" desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT \ ONLY 5000 BUX GET NOW! Contains a grill and fuel." - cost = CARGO_CRATE_VALUE * 8 + cost = CARGO_CRATE_VALUE * 4 crate_type = /obj/structure/closet/crate contains = list( /obj/item/stack/sheet/mineral/coal/five, diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index f0de463c449..425137cd9ed 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -104,20 +104,22 @@ name = "Robotics Assembly Crate" desc = "The tools you need to replace those finicky humans with a loyal robot army! \ Contains four proximity sensors, two empty first aid kits, two health analyzers, \ - two red hardhats, two mechanical toolboxes, and two cleanbot assemblies!" + two red hardhats, two toolboxes, and two cleanbot assemblies!" cost = CARGO_CRATE_VALUE * 3 access = ACCESS_ROBOTICS access_view = ACCESS_ROBOTICS - contains = list(/obj/item/assembly/prox_sensor = 5, + contains = list(/obj/item/assembly/prox_sensor = 4, /obj/item/healthanalyzer = 2, /obj/item/clothing/head/utility/hardhat/red = 2, - /obj/item/storage/medkit = 2) + /obj/item/storage/medkit = 2, + /obj/item/storage/toolbox = 2, + /obj/item/bot_assembly/cleanbot = 2) crate_name = "robotics assembly crate" crate_type = /obj/structure/closet/crate/secure/science/robo /datum/supply_pack/science/rped name = "RPED crate" - desc = "Need to rebuild the ORM but science got annihialted after a bomb test? \ + desc = "Need to rebuild the ORM but science got annihilated after a bomb test? \ Buy this for the most advanced parts NT can give you." cost = CARGO_CRATE_VALUE * 3 contains = list(/obj/item/storage/part_replacer/cargo) diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 0b007325829..b8e93f2815c 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -330,8 +330,8 @@ /datum/supply_pack/security/armory/thermal name = "Thermal Pistol Crate" desc = "Contains a pair of holsters each with two experimental thermal pistols, \ - using nanites as the basis for their ammo." - cost = CARGO_CRATE_VALUE * 7 + using nanites as the basis for their ammo. Can be shaken to reload." + cost = CARGO_CRATE_VALUE * 10 contains = list(/obj/item/storage/belt/holster/energy/thermal = 2) crate_name = "thermal pistol crate" diff --git a/code/modules/cargo/packs/vending_restock.dm b/code/modules/cargo/packs/vending_restock.dm index cfe9961cc3a..10ae874d5d6 100644 --- a/code/modules/cargo/packs/vending_restock.dm +++ b/code/modules/cargo/packs/vending_restock.dm @@ -4,7 +4,7 @@ /datum/supply_pack/vending/bartending name = "Booze-o-mat and Coffee Supply Crate" desc = "Bring on the booze and coffee vending machine refills." - cost = CARGO_CRATE_VALUE * 4 + cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/vending_refill/boozeomat, /obj/item/vending_refill/coffee, ) @@ -14,7 +14,7 @@ name = "Cigarette Supply Crate" desc = "Don't believe the reports - smoke today! Contains a \ cigarette vending machine refill." - cost = CARGO_CRATE_VALUE * 3 + cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/vending_refill/cigarette) crate_name = "cigarette supply crate" crate_type = /obj/structure/closet/crate @@ -62,7 +62,7 @@ /datum/supply_pack/vending/imported name = "Imported Vending Machines" desc = "Vending machines famous in other parts of the galaxy." - cost = CARGO_CRATE_VALUE * 8 + cost = CARGO_CRATE_VALUE * 5 contains = list(/obj/item/vending_refill/sustenance, /obj/item/vending_refill/robotics, /obj/item/vending_refill/sovietsoda, @@ -74,7 +74,7 @@ name = "Medical Vending Crate" desc = "Contains one NanoMed Plus refill, one NanoDrug Plus refill, \ and one wall-mounted NanoMed refill." - cost = CARGO_CRATE_VALUE * 5 + cost = CARGO_CRATE_VALUE * 3.5 contains = list(/obj/item/vending_refill/medical, /obj/item/vending_refill/drugs, /obj/item/vending_refill/wallmed, @@ -85,7 +85,7 @@ name = "PTech Supply Crate" desc = "Not enough cartridges after half the crew lost their PDA \ to explosions? This may fix it." - cost = CARGO_CRATE_VALUE * 3 + cost = CARGO_CRATE_VALUE * 2.5 contains = list(/obj/item/vending_refill/cart) crate_name = "\improper PTech supply crate" @@ -103,7 +103,7 @@ name = "Snack Supply Crate" desc = "One vending machine refill of cavity-bringin' goodness! \ The number one dentist recommended order!" - cost = CARGO_CRATE_VALUE * 3 + cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/vending_refill/snack) crate_name = "snacks supply crate" @@ -111,14 +111,14 @@ name = "Softdrinks Supply Crate" desc = "Got whacked by a toolbox, but you still have those pesky teeth? \ Get rid of those pearly whites with this soda machine refill, today!" - cost = CARGO_CRATE_VALUE * 3 + cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/vending_refill/cola) crate_name = "soft drinks supply crate" /datum/supply_pack/vending/vendomat name = "Part-Mart & YouTool Supply Crate" desc = "More tools for your IED testing facility." - cost = CARGO_CRATE_VALUE * 2 + cost = CARGO_CRATE_VALUE * 3 contains = list(/obj/item/vending_refill/assist, /obj/item/vending_refill/youtool, ) @@ -138,7 +138,7 @@ name = "Autodrobe Supply Crate" desc = "Autodrobe missing your favorite dress? Solve that issue today \ with this autodrobe refill." - cost = CARGO_CRATE_VALUE * 3 + cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/vending_refill/autodrobe) crate_name = "autodrobe supply crate" @@ -200,7 +200,7 @@ name = "Science Wardrobe Supply Crate" desc = "This crate contains refills for the SciDrobe, \ GeneDrobe, and RoboDrobe." - cost = CARGO_CRATE_VALUE * 3 + cost = CARGO_CRATE_VALUE * 4.5 contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe, /obj/item/vending_refill/wardrobe/gene_wardrobe, /obj/item/vending_refill/wardrobe/science_wardrobe, diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 20ea6fec8ba..b36a3b59942 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -70,6 +70,15 @@ bluespace = TRUE explosionSize = list(0,0,0,0) +/obj/structure/closet/supplypod/podspawn/deathmatch + desc = "A blood-red styled drop pod." + specialised = TRUE + +/obj/structure/closet/supplypod/podspawn/deathmatch/preOpen() + for(var/mob/living/critter in contents) + critter.faction = list(FACTION_HOSTILE) //No infighting, but also KILL!! + return ..() + /obj/structure/closet/supplypod/extractionpod name = "Syndicate Extraction Pod" desc = "A specalised, blood-red styled pod for extracting high-value targets out of active mission areas. Targets must be manually stuffed inside the pod for proper delivery." @@ -90,6 +99,25 @@ delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF +/obj/structure/closet/supplypod/back_to_station + name = "blood-red supply pod" + desc = "An intimidating supply pod, covered in the blood-red markings" + bluespace = TRUE + explosionSize = list(0,0,0,0) + style = STYLE_SYNDICATE + specialised = TRUE + +/obj/structure/closet/supplypod/deadmatch_missile + name = "cruise missile" + desc = "A big ass missile, likely launched from some far-off deep space missile silo." + style = STYLE_RED_MISSILE + explosionSize = list(0,1,2,2) + effectShrapnel = TRUE + specialised = TRUE + delays = list(POD_TRANSIT = 2.6 SECONDS, POD_FALLING = 0.4 SECONDS) + effectMissile = TRUE + shrapnel_type = /obj/projectile/bullet/shrapnel/short_range + /datum/armor/closet_supplypod melee = 30 bullet = 50 @@ -172,7 +200,7 @@ var/icon/door_masker = new(icon, door) //The door shape we want to 'cut out' of the decal door_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) door_masker.SwapColor("#ffffffff", null) - door_masker.Blend("#000000", ICON_SUBTRACT) + door_masker.Blend(COLOR_BLACK, ICON_SUBTRACT) masked_decal.Blend(door_masker, ICON_ADD) . += masked_decal return @@ -189,7 +217,7 @@ var/icon/fin_masker = new(icon, "mask_[fin_mask]") //The fin shape we want to 'cut out' of the door fin_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) fin_masker.SwapColor("#ffffffff", null) - fin_masker.Blend("#000000", ICON_SUBTRACT) + fin_masker.Blend(COLOR_BLACK, ICON_SUBTRACT) masked_door.Blend(fin_masker, ICON_ADD) . += masked_door if(decal) @@ -213,6 +241,24 @@ /obj/structure/closet/supplypod/open(mob/living/user, force = FALSE, special_effects = TRUE) return +///Called by the drop pods that return captured crewmembers from the ninja den. +/obj/structure/closet/supplypod/proc/return_from_capture(mob/living/victim, turf/destination = get_safe_random_station_turf()) + if(isnull(destination)) //Uuuuh, something went wrong. This is gonna hurt. + to_chat(victim, span_hypnophrase("A million voices echo in your head... \"Seems where you got sent won't \ + be able to handle our pod... as if we wanted the occupant to survive. Brace yourself, corporate dog.\"")) + flags_1 &= ~PREVENT_CONTENTS_EXPLOSION_1 + explosionSize = list(0,1,1,1) + destination = get_random_station_turf() + + do_sparks(8, FALSE, victim) + victim.visible_message(span_notice("[victim] vanishes...")) + + victim.forceMove(src) + + new /obj/effect/pod_landingzone(destination, src) + + SEND_SIGNAL(victim, COMSIG_LIVING_RETURN_FROM_CAPTURE, destination) + /obj/structure/closet/supplypod/proc/handleReturnAfterDeparting(atom/movable/holder = src) reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open_pod() ) bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 56436d0a0ab..1209b5c3582 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -211,6 +211,9 @@ fade_in = 20 fade_out = 20 +/datum/client_colour/monochrome/colorblind + priority = PRIORITY_HIGH + /datum/client_colour/monochrome/trance priority = PRIORITY_NORMAL @@ -225,7 +228,7 @@ /datum/client_colour/bloodlust/New(mob/owner) ..() if(owner) - addtimer(CALLBACK(src, PROC_REF(update_colour), list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1) + addtimer(CALLBACK(src, PROC_REF(update_colour), list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 0.1 SECONDS) /datum/client_colour/rave priority = PRIORITY_LOW diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index ea3052eea3d..9523d4d52c6 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1200,8 +1200,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!CONFIG_GET(flag/use_age_restriction_for_jobs)) return 0 - if(!isnum(player_age)) - return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced + if(!isnum(player_age) || player_age < 0) + return 0 if(!isnum(days_needed)) return 0 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f65964cd802..a242e27d21c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -335,6 +335,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) tgui.ui_interact(usr) return TRUE + if ("open_food") + GLOB.food_prefs_menu.ui_interact(usr) + return TRUE + if ("set_tricolor_preference") var/requested_preference_key = params["preference"] var/index_key = params["value"] diff --git a/code/modules/client/preferences/addict.dm b/code/modules/client/preferences/addict.dm new file mode 100644 index 00000000000..3c63b5ea867 --- /dev/null +++ b/code/modules/client/preferences/addict.dm @@ -0,0 +1,62 @@ +/proc/setup_junkie_addictions(list/possible_addictions) + . = possible_addictions + for(var/datum/reagent/addiction as anything in .) + . -= addiction + .[addiction::name] = addiction + +/datum/preference/choiced/junkie + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "junkie" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/junkie/init_possible_values() + return list("Random") + assoc_to_keys(GLOB.possible_junkie_addictions) + +/datum/preference/choiced/junkie/create_default_value() + return "Random" + +/datum/preference/choiced/junkie/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + return "Junkie" in preferences.all_quirks + +/datum/preference/choiced/junkie/apply_to_human(mob/living/carbon/human/target, value) + return + +/datum/preference/choiced/smoker + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "smoker" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/smoker/init_possible_values() + return list("Random") + assoc_to_keys(GLOB.possible_smoker_addictions) + +/datum/preference/choiced/smoker/create_default_value() + return "Random" + +/datum/preference/choiced/smoker/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + return "Smoker" in preferences.all_quirks + +/datum/preference/choiced/smoker/apply_to_human(mob/living/carbon/human/target, value) + return + +/datum/preference/choiced/alcoholic + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "alcoholic" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/alcoholic/init_possible_values() + return list("Random") + assoc_to_keys(GLOB.possible_alcoholic_addictions) + +/datum/preference/choiced/alcoholic/create_default_value() + return "Random" + +/datum/preference/choiced/alcoholic/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + return "Alcoholic" in preferences.all_quirks + +/datum/preference/choiced/alcoholic/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/hemiplegic.dm b/code/modules/client/preferences/hemiplegic.dm new file mode 100644 index 00000000000..923a6f4acdf --- /dev/null +++ b/code/modules/client/preferences/hemiplegic.dm @@ -0,0 +1,17 @@ +/datum/preference/choiced/hemiplegic + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "hemiplegic" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/hemiplegic/init_possible_values() + return list("Random") + GLOB.side_choice_hemiplegic + +/datum/preference/choiced/hemiplegic/is_accessible(datum/preferences/preferences) + . = ..() + if (!.) + return FALSE + + return "Hemiplegic" in preferences.all_quirks + +/datum/preference/choiced/hemiplegic/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/middleware/antags.dm b/code/modules/client/preferences/middleware/antags.dm index 13e3bfa718f..b3bc613d2ee 100644 --- a/code/modules/client/preferences/middleware/antags.dm +++ b/code/modules/client/preferences/middleware/antags.dm @@ -1,3 +1,11 @@ +// Antagonists that don't have a dynamic ruleset, but do have a preference +GLOBAL_LIST_INIT(non_ruleset_antagonists, list( + ROLE_GLITCH = /datum/antagonist/bitrunning_glitch, + ROLE_FUGITIVE = /datum/antagonist/fugitive, + ROLE_LONE_OPERATIVE = /datum/antagonist/nukeop/lone, + ROLE_SENTIENCE = /datum/antagonist/sentient_creature, + )) + /datum/preference_middleware/antags action_delegations = list( "set_antags" = PROC_REF(set_antags), @@ -69,6 +77,12 @@ if (is_banned_from(preferences.parent.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE))) antag_bans += serialize_antag_name(antag_flag) + for(var/antag_key in GLOB.non_ruleset_antagonists) + var/datum/antagonist/antag = GLOB.non_ruleset_antagonists[antag_key] + var/antag_flag = initial(antag.job_rank) + if(is_banned_from(preferences.parent.ckey, list(antag_flag, ROLE_SYNDICATE))) + antag_bans += serialize_antag_name(antag_flag) + return antag_bans /datum/preference_middleware/antags/proc/get_antag_days_left() @@ -91,6 +105,17 @@ if (days_needed > 0) antag_days_left[serialize_antag_name(antag_flag)] = days_needed + for(var/antag_key in GLOB.non_ruleset_antagonists) + var/datum/antagonist/antag = GLOB.non_ruleset_antagonists[antag_key] + var/antag_flag = initial(antag.job_rank) + + var/days_needed = preferences.parent?.get_remaining_days( + GLOB.special_roles[antag_flag] + ) + + if (days_needed > 0) + antag_days_left[serialize_antag_name(antag_flag)] = days_needed + return antag_days_left /datum/preference_middleware/antags/proc/get_serialized_antags() @@ -113,15 +138,7 @@ var/list/antag_icons = list() /datum/asset/spritesheet/antagonists/create_spritesheets() - // Antagonists that don't have a dynamic ruleset, but do have a preference - var/static/list/non_ruleset_antagonists = list( - ROLE_GLITCH = /datum/antagonist/bitrunning_glitch, - ROLE_FUGITIVE = /datum/antagonist/fugitive, - ROLE_LONE_OPERATIVE = /datum/antagonist/nukeop/lone, - ROLE_SENTIENCE = /datum/antagonist/sentient_creature, - ) - - var/list/antagonists = non_ruleset_antagonists.Copy() + var/list/antagonists = GLOB.non_ruleset_antagonists.Copy() for (var/datum/dynamic_ruleset/ruleset as anything in subtypesof(/datum/dynamic_ruleset)) var/datum/antagonist/antagonist_type = initial(ruleset.antag_datum) diff --git a/code/modules/client/preferences/middleware/food.dm b/code/modules/client/preferences/middleware/food.dm new file mode 100644 index 00000000000..55e8773e8df --- /dev/null +++ b/code/modules/client/preferences/middleware/food.dm @@ -0,0 +1,156 @@ +// To make this system not a massive meta-pick for gamers, while still allowing plenty of room for unique combinations. +#define MINIMUM_REQUIRED_TOXICS 1 +#define MINIMUM_REQUIRED_DISLIKES 3 +#define MAXIMUM_LIKES 3 + +// Performance and RAM friendly menu. You can thank me later. +GLOBAL_DATUM_INIT(food_prefs_menu, /datum/food_prefs_menu, new) + +// Hahahaha, it LIVES! + +/datum/preference_middleware/food/apply_to_human(mob/living/carbon/human/target, datum/preferences/preferences, visuals_only = FALSE) + if(!length(preferences.food_preferences) || isdummy(target)) + return + var/datum/species/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species = new species_type + if(!species.allows_food_preferences()) + qdel(species) + return + qdel(species) + + var/fail_reason = GLOB.food_prefs_menu.is_food_invalid(preferences) + if(fail_reason) + to_chat(preferences.parent, span_announce("Your food preferences can't be set because of [fail_reason] choices! Please check your preferences!")) // Sorry, but I don't want folk sleeping on this. + return + + var/obj/item/organ/internal/tongue/target_tongue = target.get_organ_slot(ORGAN_SLOT_TONGUE) + + if(isnull(target_tongue) || !preferences.food_preferences["enabled"]) + return + + target_tongue.liked_foodtypes = NONE + target_tongue.disliked_foodtypes = NONE + target_tongue.toxic_foodtypes = NONE + + for(var/food_entry in GLOB.food_defaults) + var/list/food_default = GLOB.food_defaults[food_entry] + var/food_preference = preferences.food_preferences[food_entry] || food_default + + switch(food_preference) + if(FOOD_PREFERENCE_LIKED) + target_tongue.liked_foodtypes |= GLOB.food_ic_flag_to_bitflag[food_entry] + if(FOOD_PREFERENCE_DISLIKED) + target_tongue.disliked_foodtypes |= GLOB.food_ic_flag_to_bitflag[food_entry] + if(FOOD_PREFERENCE_TOXIC) + target_tongue.toxic_foodtypes |= GLOB.food_ic_flag_to_bitflag[food_entry] + +/// Food prefs menu datum. Global datum for performance and memory reasons. +/datum/food_prefs_menu/ui_interact(mob/dead/new_player/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FoodPreferences", "Food Preferences") + ui.set_autoupdate(FALSE) + ui.open() + +/datum/food_prefs_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/datum/preferences/preferences = ui?.user?.client?.prefs + if(!preferences) + return + + switch(action) + if("reset") + preferences.food_preferences.Cut() + preferences.food_preferences = list() + return TRUE + + if("toggle") + preferences.food_preferences["enabled"] = !preferences.food_preferences["enabled"] + return TRUE + + if("change_food") + var/food_name = params["food_name"] + var/food_preference = params["food_preference"] + + if(!food_name || !preferences || !food_preference || !(food_preference in list(FOOD_PREFERENCE_LIKED, FOOD_PREFERENCE_NEUTRAL, FOOD_PREFERENCE_DISLIKED, FOOD_PREFERENCE_TOXIC))) + return TRUE + + // Do some simple validation for max liked foods. Full validation is done on spawn and in the actual menu. + var/liked_food_length = 0 + + for(var/food_entry in preferences.food_preferences) + if(food_entry in GLOB.obscure_food_types) + continue + + if(preferences.food_preferences[food_entry] == FOOD_PREFERENCE_LIKED) + liked_food_length++ + if(liked_food_length > MAXIMUM_LIKES) + preferences.food_preferences.Remove(food_entry) + if(liked_food_length > MAXIMUM_LIKES || (food_preference == FOOD_PREFERENCE_LIKED && liked_food_length == MAXIMUM_LIKES)) // Equals as well, if we're setting a liked food! + if(food_name in GLOB.obscure_food_types) + return TRUE + + preferences.food_preferences[food_name] = food_preference + return TRUE + +/datum/preferences/ui_state(mob/user) + return GLOB.always_state + +/datum/food_prefs_menu/ui_status(mob/user, datum/ui_state/state) + return UI_INTERACTIVE // Prefs can be accessed from anywhere. + +/datum/food_prefs_menu/ui_static_data(mob/user) + return list( + "food_types" = GLOB.food_defaults, + "obscure_food_types" = GLOB.obscure_food_types, + ) + +/datum/food_prefs_menu/ui_data(mob/user) + var/datum/preferences/preferences = user.client.prefs + + var/datum/species/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species = new species_type + + var/list/data = list( + "selection" = preferences.food_preferences, + "enabled" = preferences.food_preferences["enabled"], + "invalid" = is_food_invalid(preferences), + "race_disabled" = !species.allows_food_preferences(), + ) + qdel(species) + return data + +/// Checks the provided preferences datum to make sure the food pref values are valid. Does not check if the food preferences value is null. +/datum/food_prefs_menu/proc/is_food_invalid(datum/preferences/preferences) + var/liked_food_length = 0 + var/disliked_food_length = 0 + var/toxic_food_length = 0 + + for(var/food_entry in GLOB.food_defaults) + var/list/food_default = GLOB.food_defaults[food_entry] + var/food_preference = preferences.food_preferences[food_entry] || food_default + + if(food_entry in GLOB.obscure_food_types) + continue + + switch(food_preference) + if(FOOD_PREFERENCE_LIKED) + liked_food_length++ + if(FOOD_PREFERENCE_DISLIKED) + disliked_food_length++ + if(FOOD_PREFERENCE_TOXIC) + toxic_food_length++ + + if(liked_food_length > MAXIMUM_LIKES) + return "too many liked choices" + if(disliked_food_length + toxic_food_length < MINIMUM_REQUIRED_DISLIKES) + return "too few disliked choices" + if(toxic_food_length < MINIMUM_REQUIRED_TOXICS) + return "too few toxic choices" + +#undef MINIMUM_REQUIRED_TOXICS +#undef MINIMUM_REQUIRED_DISLIKES +#undef MAXIMUM_LIKES diff --git a/code/modules/client/preferences/prosthetic.dm b/code/modules/client/preferences/prosthetic_limb.dm similarity index 100% rename from code/modules/client/preferences/prosthetic.dm rename to code/modules/client/preferences/prosthetic_limb.dm diff --git a/code/modules/client/preferences/prosthetic_organ.dm b/code/modules/client/preferences/prosthetic_organ.dm new file mode 100644 index 00000000000..35d3b818355 --- /dev/null +++ b/code/modules/client/preferences/prosthetic_organ.dm @@ -0,0 +1,17 @@ +/datum/preference/choiced/prosthetic_organ + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "prosthetic_organ" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/prosthetic_organ/init_possible_values() + return list("Random") + GLOB.organ_choice + +/datum/preference/choiced/prosthetic_organ/is_accessible(datum/preferences/preferences) + . = ..() + if (!.) + return FALSE + + return "Prosthetic Organ" in preferences.all_quirks + +/datum/preference/choiced/prosthetic_organ/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/trans_prosthetic.dm b/code/modules/client/preferences/trans_prosthetic.dm new file mode 100644 index 00000000000..fd28cb1ecf8 --- /dev/null +++ b/code/modules/client/preferences/trans_prosthetic.dm @@ -0,0 +1,17 @@ +/datum/preference/choiced/trans_prosthetic + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "trans_prosthetic" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/trans_prosthetic/init_possible_values() + return list("Random") + GLOB.part_choice_transhuman + +/datum/preference/choiced/trans_prosthetic/is_accessible(datum/preferences/preferences) + . = ..() + if (!.) + return FALSE + + return "Transhumanist" in preferences.all_quirks + +/datum/preference/choiced/trans_prosthetic/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 5df802b9f60..dc55b72b09d 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -10,12 +10,15 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") to_chat(usr, span_danger("Speech is currently admin-disabled.")) return - if(!mob) + var/client_initalized = VALIDATE_CLIENT_INITIALIZATION(src) + if(isnull(mob) || !client_initalized) + if(!client_initalized) + unvalidated_client_error() // we only want to throw this warning message when it's directly related to client failure. + + to_chat(usr, span_warning("Failed to send your OOC message. You attempted to send the following message:\n[span_big(msg)]")) return - VALIDATE_CLIENT(src) - - if(!holder) + if(isnull(holder)) if(!GLOB.ooc_allowed) to_chat(src, span_danger("OOC is globally muted.")) return diff --git a/code/modules/clothing/chameleon/chameleon_scanner.dm b/code/modules/clothing/chameleon/chameleon_scanner.dm index 343ceb5c001..5023997cefe 100644 --- a/code/modules/clothing/chameleon/chameleon_scanner.dm +++ b/code/modules/clothing/chameleon/chameleon_scanner.dm @@ -89,7 +89,7 @@ balloon_alert(scanner, "too far away!") return // Very short scan timer, keep you on your toes - if(!do_after(scanner, 0.5 SECONDS, scanned)) + if(!do_after(scanner, 0.5 SECONDS, scanned, hidden = TRUE)) return var/list/all_scanned_items = list() diff --git a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm index f73b5b13da7..63bede9ec88 100644 --- a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm +++ b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm @@ -3,6 +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); \ } while(FALSE) // Cham jumpsuit diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 107e13c2970..4473f8663b2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -54,7 +54,7 @@ /obj/item/clothing/Initialize(mapload) if(clothing_flags & VOICEBOX_TOGGLABLE) - actions_types += /datum/action/item_action/toggle_voice_box + actions_types += list(/datum/action/item_action/toggle_voice_box) . = ..() AddElement(/datum/element/venue_price, FOOD_PRICE_CHEAP) if(can_be_bloody && ((body_parts_covered & FEET) || (flags_inv & HIDESHOES))) @@ -516,7 +516,7 @@ BLIND // can't see anything return ..() if(damage_flag == BOMB) //so the shred survives potential turf change from the explosion. - addtimer(CALLBACK(src, PROC_REF(_spawn_shreds)), 1) + addtimer(CALLBACK(src, PROC_REF(_spawn_shreds)), 0.1 SECONDS) deconstruct(FALSE) if(damage_flag == CONSUME) //This allows for moths to fully consume clothing, rather than damaging it like other sources like brute var/turf/current_position = get_turf(src) diff --git a/code/modules/clothing/head/cakehat.dm b/code/modules/clothing/head/cakehat.dm index 57369ac24f8..1fc0fa0b05b 100644 --- a/code/modules/clothing/head/cakehat.dm +++ b/code/modules/clothing/head/cakehat.dm @@ -9,8 +9,10 @@ lefthand_file = 'icons/mob/inhands/clothing/hats_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing/hats_righthand.dmi' armor_type = /datum/armor/none - light_range = 2 //luminosity when on light_system = OVERLAY_LIGHT + light_range = 2 //luminosity when on + light_power = 1.3 + light_color = "#FF964E" flags_cover = HEADCOVERSEYES heat = 999 wound_bonus = 10 diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 3550690b426..c5b25166c09 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -16,6 +16,7 @@ light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 0.8 + light_color = "#ffcc99" light_on = FALSE dog_fashion = /datum/dog_fashion/head @@ -39,9 +40,7 @@ /obj/item/clothing/head/utility/hardhat/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/clothing/head/utility/hardhat/attack_self(mob/living/user) - toggle_helmet_light(user) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/clothing/head/utility/hardhat/proc/toggle_helmet_light(mob/living/user) on = !on @@ -61,6 +60,15 @@ /obj/item/clothing/head/utility/hardhat/proc/turn_off(mob/user) set_light_on(FALSE) +/obj/item/clothing/head/utility/hardhat/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(on) + toggle_helmet_light() + return COMSIG_SABOTEUR_SUCCESS + +/obj/item/clothing/head/utility/hardhat/attack_self(mob/living/user) + toggle_helmet_light(user) + /obj/item/clothing/head/utility/hardhat/orange icon_state = "hardhat0_orange" inhand_icon_state = null diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index 1b65af66d33..c91fdbaf923 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -192,9 +192,15 @@ /obj/item/clothing/head/costume/jester name = "jester hat" desc = "A hat with bells, to add some merriness to the suit." - icon_state = "jester_hat" + icon_state = "jester_map" + greyscale_colors = "#00ff00#ff0000" + greyscale_config = /datum/greyscale_config/jester_hat + greyscale_config_worn = /datum/greyscale_config/jester_hat/worn + flags_1 = IS_PLAYER_COLORABLE_1 -/obj/item/clothing/head/costume/jester/alt +/obj/item/clothing/head/costume/jesteralt + name = "jester hat" + desc = "A hat with bells, to add some merriness to the suit." icon_state = "jester2" /obj/item/clothing/head/costume/rice_hat @@ -313,6 +319,13 @@ to_chat(user, span_notice("You lower the ear flaps on the ushanka.")) earflaps = !earflaps +/obj/item/clothing/head/costume/ushanka/polar + name = "bear hunter's ushanka" + desc = "Handcrafted in Siberia from real polar bears." + icon_state = "ushankadown_polar" + upsprite = "ushankaup_polar" + downsprite = "ushankadown_polar" + /obj/item/clothing/head/costume/nightcap/blue name = "blue nightcap" desc = "A blue nightcap for all the dreamers and snoozers out there." diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 910e479201f..779559b4fe4 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -545,7 +545,7 @@ /obj/item/clothing/head/beret/medical name = "medical beret" desc = "A medical-flavored beret for the doctor in you!" - greyscale_colors = "#FFFFFF" + greyscale_colors = COLOR_WHITE flags_1 = NONE /obj/item/clothing/head/beret/medical/paramedic @@ -562,7 +562,8 @@ name = "blue surgery cap" icon_state = "surgicalcap" desc = "A blue medical surgery cap to prevent the surgeon's hair from entering the insides of the patient!" - //flags_inv = HIDEHAIR (Bubber Edit: Disabled for preview QOL) //BUBBER TODO: Modularise + //flags_inv = HIDEHAIR //Cover your head doctor! (Bubber Edit: Disabled for preview QOL) //BUBBER TODO: Modularise + w_class = WEIGHT_CLASS_SMALL //surgery cap can be easily crumpled /obj/item/clothing/head/utility/surgerycap/attack_self(mob/user) . = ..() diff --git a/code/modules/clothing/head/mind_monkey_helmet.dm b/code/modules/clothing/head/mind_monkey_helmet.dm index eaa7c1cd011..b78dc5e11fa 100644 --- a/code/modules/clothing/head/mind_monkey_helmet.dm +++ b/code/modules/clothing/head/mind_monkey_helmet.dm @@ -47,19 +47,18 @@ playsound(src, 'sound/machines/ping.ogg', 30, TRUE) RegisterSignal(magnification, COMSIG_SPECIES_LOSS, PROC_REF(make_fall_off)) polling = TRUE - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a mind magnified monkey?", check_jobban = ROLE_MONKEY_HELMET, poll_time = 5 SECONDS, target_mob = magnification, ignore_category = POLL_IGNORE_MONKEY_HELMET, pic_source = magnification, role_name_text = "mind-magnified monkey") + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(check_jobban = ROLE_MONKEY_HELMET, poll_time = 5 SECONDS, checked_target = magnification, ignore_category = POLL_IGNORE_MONKEY_HELMET, alert_pic = magnification, role_name_text = "mind-magnified monkey") polling = FALSE if(!magnification) return - if(!candidates.len) + if(isnull(chosen_one)) UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) magnification = null visible_message(span_notice("[src] falls silent and drops on the floor. Maybe you should try again later?")) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) user.dropItemToGround(src) return - var/mob/picked = pick(candidates) - magnification.key = picked.key + magnification.key = chosen_one.key playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) to_chat(magnification, span_notice("You're a mind magnified monkey! Protect your helmet with your life- if you lose it, your sentience goes with it!")) var/policy = get_policy(ROLE_MONKEY_HELMET) diff --git a/code/modules/clothing/head/pirate.dm b/code/modules/clothing/head/pirate.dm index fd45404efc3..818478ccb7d 100644 --- a/code/modules/clothing/head/pirate.dm +++ b/code/modules/clothing/head/pirate.dm @@ -10,20 +10,17 @@ /obj/item/clothing/head/costume/pirate/equipped(mob/user, slot) . = ..() - if(!ishuman(user)) + if(!(slot_flags & slot)) return - if(slot & ITEM_SLOT_HEAD) - user.grant_language(/datum/language/piratespeak/, source = LANGUAGE_HAT) - to_chat(user, span_boldnotice("You suddenly know how to speak like a pirate!")) + user.grant_language(/datum/language/piratespeak, source = LANGUAGE_HAT) + to_chat(user, span_boldnotice("You suddenly know how to speak like a pirate!")) /obj/item/clothing/head/costume/pirate/dropped(mob/user) . = ..() - if(!ishuman(user)) + if(QDELETED(src)) //This can be called as a part of destroy return - var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(ITEM_SLOT_HEAD) == src && !QDELETED(src)) //This can be called as a part of destroy - user.remove_language(/datum/language/piratespeak/, source = LANGUAGE_HAT) - to_chat(user, span_boldnotice("You can no longer speak like a pirate.")) + user.remove_language(/datum/language/piratespeak, source = LANGUAGE_HAT) + to_chat(user, span_boldnotice("You can no longer speak like a pirate.")) /obj/item/clothing/head/costume/pirate/armored armor_type = /datum/armor/pirate_armored diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index e8338f4c95b..0b0a6fb4d50 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -135,6 +135,15 @@ strip_delay = 60 dog_fashion = null +/obj/item/clothing/head/soft/veteran + name = "veteran cap" + desc = "It's a robust baseball hat in tasteful black colour with a golden connotation to \"REMEMBER\"." + icon_state = "veteransoft" + soft_type = "veteran" + armor_type = /datum/armor/cosmetic_sec + strip_delay = 60 + dog_fashion = null + /obj/item/clothing/head/soft/paramedic name = "paramedic cap" desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top." diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm index 01a29b28a16..7c990070439 100644 --- a/code/modules/clothing/head/wig.dm +++ b/code/modules/clothing/head/wig.dm @@ -7,7 +7,7 @@ inhand_icon_state = "pwig" worn_icon_state = "wig" flags_inv = HIDEHAIR - color = "#000000" + color = COLOR_BLACK var/hairstyle = "Very Long Hair" var/adjustablecolor = TRUE //can color be changed manually? @@ -112,7 +112,7 @@ /obj/item/clothing/head/wig/natural name = "natural wig" desc = "A bunch of hair without a head attached. This one changes color to match the hair of the wearer. Nothing natural about that." - color = "#FFFFFF" + color = COLOR_WHITE adjustablecolor = FALSE custom_price = PAYCHECK_COMMAND diff --git a/code/modules/clothing/masks/bandana.dm b/code/modules/clothing/masks/bandana.dm index 97195116e29..4a97384fa39 100644 --- a/code/modules/clothing/masks/bandana.dm +++ b/code/modules/clothing/masks/bandana.dm @@ -211,7 +211,7 @@ /obj/item/clothing/mask/facescarf name = "facescarf" desc = "Cover your face like in the cowboy movies. It also has breathtube so you can wear it everywhere!" - actions_types = /datum/action/item_action/adjust + actions_types = list(/datum/action/item_action/adjust) icon_state = "facescarf" inhand_icon_state = "greyscale_facescarf" alternate_worn_layer = BACK_LAYER @@ -230,6 +230,9 @@ greyscale_config_inhand_right = /datum/greyscale_config/facescarf/inhands_right flags_1 = IS_PLAYER_COLORABLE_1 +/obj/item/clothing/mask/facescarf/attack_self(mob/user) + adjustmask(user) + /obj/item/clothing/mask/facescarf/AltClick(mob/user) ..() if(user.can_perform_action(src, NEED_DEXTERITY)) diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm index 384b6a43460..893455dcdd0 100644 --- a/code/modules/clothing/masks/costume.dm +++ b/code/modules/clothing/masks/costume.dm @@ -61,7 +61,7 @@ w_class = WEIGHT_CLASS_SMALL flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT custom_price = PAYCHECK_CREW - greyscale_colors = "#EEEEEE" + greyscale_colors = COLOR_VERY_LIGHT_GRAY greyscale_config = /datum/greyscale_config/rebellion_mask greyscale_config_worn = /datum/greyscale_config/rebellion_mask/worn flags_1 = IS_PLAYER_COLORABLE_1 diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index e8bb2a908c5..a62f271739b 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -409,7 +409,7 @@ icon_state = "infinity_scarf" w_class = WEIGHT_CLASS_TINY custom_price = PAYCHECK_CREW - greyscale_colors = "#EEEEEE" + greyscale_colors = COLOR_VERY_LIGHT_GRAY greyscale_config = /datum/greyscale_config/infinity_scarf greyscale_config_worn = /datum/greyscale_config/infinity_scarf/worn flags_1 = IS_PLAYER_COLORABLE_1 @@ -489,3 +489,23 @@ /obj/item/clothing/neck/beads/Initialize(mapload) . = ..() color = color = pick("#ff0077","#d400ff","#2600ff","#00ccff","#00ff2a","#e5ff00","#ffae00","#ff0000", "#ffffff") + +/obj/item/clothing/neck/wreath + name = "\improper Watcher Wreath" + desc = "An elaborate crown made from the twisted flesh and sinew of a watcher. \ + Wearing it makes you feel like you have eyes in the back of your head." + icon_state = "watcher_wreath" + worn_y_offset = 10 + alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER + resistance_flags = FIRE_PROOF + +/obj/item/clothing/neck/wreath/worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = ..() + if(!isinhands) + . += emissive_appearance(icon_file, "wreath_emissive", src, alpha = src.alpha) + +/obj/item/clothing/neck/wreath/icewing + name = "\improper Icewing Wreath" + 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" diff --git a/code/modules/clothing/neck/collar_bomb.dm b/code/modules/clothing/neck/collar_bomb.dm new file mode 100644 index 00000000000..7a5314f4c18 --- /dev/null +++ b/code/modules/clothing/neck/collar_bomb.dm @@ -0,0 +1,118 @@ +///Special neckwear that kills its wearer if triggered, by either its specific remote or assemblies. +/obj/item/clothing/neck/collar_bomb + name = "collar bomb" + desc = "A cumbersome collar of some sort, filled with just enough explosive to rip one's head off... at least that's what it reads on the front tag." + icon_state = "collar_bomb" + icon = 'icons/obj/clothing/neck.dmi' + inhand_icon_state = "reverse_bear_trap" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + clothing_flags = INEDIBLE_CLOTHING + armor_type = /datum/armor/collar_bomb + equip_delay_self = 6 SECONDS + equip_delay_other = 8 SECONDS + ///The button it's associated with + var/obj/item/collar_bomb_button/button + ///Whether the collar countdown has been triggered. + var/active = FALSE + +/datum/armor/collar_bomb + fire = 97 + bomb = 97 + acid = 97 + +/obj/item/clothing/neck/collar_bomb/Initialize(mapload, obj/item/collar_bomb_button/button) + . = ..() + src.button = button + button?.collar = src + set_wires(new /datum/wires/collar_bomb(src)) + +/obj/item/clothing/neck/collar_bomb/Destroy() + button?.collar = null + button = null + return ..() + +/obj/item/clothing/neck/collar_bomb/examine(mob/user) + . = ..() + if(user.get_item_by_slot(ITEM_SLOT_NECK) == src) + return + . += span_tinynotice("It has a [EXAMINE_HINT("wire")] panel that could be interacted with...") + +/obj/item/clothing/neck/collar_bomb/attackby(obj/item/item, mob/user, params) + if(is_wire_tool(item)) + wires.interact(user) + else + return ..() + +/obj/item/clothing/neck/collar_bomb/equipped(mob/user, slot, initial = FALSE) + . = ..() + if(slot == ITEM_SLOT_NECK) + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + +/obj/item/clothing/neck/collar_bomb/dropped(mob/user, silent = FALSE) + . = ..() + REMOVE_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + +/obj/item/clothing/neck/collar_bomb/proc/explosive_countdown(ticks_left) + active = TRUE + if(ticks_left > 0) + playsound(src, 'sound/items/timer.ogg', 30, FALSE) + balloon_alert_to_viewers("[ticks_left]") + ticks_left-- + addtimer(CALLBACK(src, PROC_REF(explosive_countdown), ticks_left), 1 SECONDS) + return + + playsound(src, 'sound/effects/snap.ogg', 75, TRUE) + if(!ishuman(loc)) + balloon_alert_to_viewers("dud...") + active = FALSE + return + var/mob/living/carbon/human/brian = loc + if(brian.get_item_by_slot(ITEM_SLOT_NECK) != src) + balloon_alert_to_viewers("dud...") + active = FALSE + return + visible_message(span_warning("[src] goes off, outright decapitating [brian]!"), span_hear("You hear a fleshy boom!")) + playsound(src, SFX_EXPLOSION, 30, TRUE) + brian.apply_damage(200, BRUTE, BODY_ZONE_HEAD) + var/obj/item/bodypart/head/myhead = brian.get_bodypart(BODY_ZONE_HEAD) + myhead?.dismember() + brian.investigate_log("has been decapitated by [src].", INVESTIGATE_DEATHS) + flash_color(brian, flash_color = COLOR_RED, flash_time = 1 SECONDS) + qdel(src) + +///The button that detonates the collar. +/obj/item/collar_bomb_button + name = "big yellow button" + desc = "It looks like a big red button, except it's yellow. It comes with a heavy trigger, to avoid accidents." + icon = 'icons/obj/devices/assemblies.dmi' + icon_state = "bigyellow" + inhand_icon_state = "electronic" + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + w_class = WEIGHT_CLASS_TINY + ///The collar bomb it's associated with. + var/obj/item/clothing/neck/collar_bomb/collar + +/obj/item/collar_bomb_button/attack_self(mob/user) + . = ..() + if(DOING_INTERACTION_WITH_TARGET(user, src)) + return + balloon_alert_to_viewers("pushing the button...") + if(!do_after(user, 1.2 SECONDS, target = src)) + return + playsound(user, 'sound/machines/click.ogg', 25, TRUE) + if(!collar|| collar.active) + return + collar.explosive_countdown(ticks_left = 5) + if(!ishuman(collar.loc)) + return + var/mob/living/carbon/human/brian = collar.loc + if(brian.get_item_by_slot(ITEM_SLOT_NECK) == collar) + brian.investigate_log("has has their [collar] triggered by [user] via yellow button.", INVESTIGATE_DEATHS) + + +/obj/item/collar_bomb_button/Destroy() + collar?.button = null + collar = null + return ..() diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index fc94adb9ff5..fa07b3297b2 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -23,6 +23,6 @@ user.hairstyle = "Long Hair 3" user.facial_hairstyle = "Beard (Full)" - user.hair_color = "#FFFFFF" - user.facial_hair_color = "#FFFFFF" + user.hair_color = COLOR_WHITE + user.facial_hair_color = COLOR_WHITE user.update_body_parts(update_limb_data = TRUE) diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index 40d7cfa888e..1b2e0ead148 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -295,3 +295,10 @@ uniform = /obj/item/clothing/under/plasmaman //call me when this is gags and not 10 million new assets gloves = /obj/item/clothing/gloves/color/plasmaman/black head = /obj/item/clothing/head/helmet/space/plasmaman + +/datum/outfit/plasmaman/human_ai + name = "Human AI Plasmaman" + + uniform = /obj/item/clothing/under/plasmaman //same + gloves = /obj/item/clothing/gloves/color/plasmaman/black + head = /obj/item/clothing/head/helmet/space/plasmaman diff --git a/code/modules/clothing/shoes/clown.dm b/code/modules/clothing/shoes/clown.dm index 55553039f4f..2f4b973f9a9 100644 --- a/code/modules/clothing/shoes/clown.dm +++ b/code/modules/clothing/shoes/clown.dm @@ -53,3 +53,9 @@ desc = "The adorable sound they make when you walk will mean making friends is more likely." icon_state = "meown_shoes" squeak_sound = list('sound/effects/footstep/meowstep1.ogg'=1) //mew mew mew mew + +/obj/item/clothing/shoes/clown_shoes/moffers + name = "moffers" + 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 diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 1e15f25e1f6..bf8000d9a08 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -105,8 +105,12 @@ /obj/item/clothing/shoes/jester_shoes name = "jester shoes" desc = "Shoes that jingle with every step!!" - icon_state = "green_jester_shoes" + icon_state = "jester_map" inhand_icon_state = null + greyscale_colors = "#00ff00#ff0000" + greyscale_config = /datum/greyscale_config/jester_shoes + greyscale_config_worn = /datum/greyscale_config/jester_shoes/worn + flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/shoes/jester_shoes/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/shoes/cowboy.dm b/code/modules/clothing/shoes/cowboy.dm index a033a561439..73c5a9d0d95 100644 --- a/code/modules/clothing/shoes/cowboy.dm +++ b/code/modules/clothing/shoes/cowboy.dm @@ -4,8 +4,8 @@ icon_state = "cowboy_brown" armor_type = /datum/armor/shoes_cowboy custom_price = PAYCHECK_CREW - var/max_occupants = 4 can_be_tied = FALSE + var/max_occupants = 4 /// Do these boots have spur sounds? var/has_spurs = FALSE /// The jingle jangle jingle of our spurs @@ -64,7 +64,7 @@ to_chat(user, span_notice("[target] slithers into [src].")) /obj/item/clothing/shoes/cowboy/container_resist_act(mob/living/user) - if(!do_after(user, 10, target = user)) + if(!do_after(user, 1 SECONDS, target = user)) return user.forceMove(drop_location()) diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index a1fab1f591d..58cbf7e88e5 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -1,4 +1,5 @@ -#define THERMAL_REGULATOR_COST 18 // the cost per tick for the thermal regulator +/// Charge per tick consumed by the thermal regulator +#define THERMAL_REGULATOR_COST (18 KILO JOULES) //Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together. // Meaning the the suit is defined directly after the corrisponding helmet. Just like below! diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 90141d281dd..ce21351c885 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -54,10 +54,12 @@ resistance_flags = FIRE_PROOF light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 + light_power = 0.8 + light_color = "#ffcc99" light_on = FALSE var/helmet_on = FALSE var/smile = FALSE - var/smile_color = "#FF0000" + var/smile_color = COLOR_RED var/visor_icon = "envisor" var/smile_state = "envirohelm_smile" var/obj/item/clothing/head/attached_hat @@ -76,6 +78,7 @@ . = ..() visor_toggling() update_appearance() + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/clothing/head/helmet/space/plasmaman/examine() . = ..() @@ -106,6 +109,11 @@ playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing update_appearance() +/obj/item/clothing/head/helmet/space/plasmaman/update_icon_state() + . = ..() + icon_state = "[initial(icon_state)][helmet_on ? "-light":""]" + inhand_icon_state = icon_state + /obj/item/clothing/head/helmet/space/plasmaman/update_overlays() . = ..() . += visor_icon @@ -116,7 +124,7 @@ if(smile == FALSE) var/obj/item/toy/crayon/CR = hitting_item to_chat(user, span_notice("You start drawing a smiley face on the helmet's visor..")) - if(do_after(user, 25, target = src)) + if(do_after(user, 2.5 SECONDS, target = src)) smile = TRUE smile_color = CR.paint_color to_chat(user, "You draw a smiley on the helmet visor.") @@ -137,6 +145,7 @@ hitting_clothing.forceMove(src) update_appearance() +///By the by, helmets have the update_icon_updates_onmob element, so we don't have to call mob.update_worn_head() /obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands) . = ..() if(!isinhands && smile) @@ -159,9 +168,7 @@ /obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) helmet_on = !helmet_on - icon_state = "[initial(icon_state)][helmet_on ? "-light":""]" - inhand_icon_state = icon_state - user.update_worn_head() //So the mob overlay updates + update_appearance() if(helmet_on) if(!up) @@ -174,6 +181,14 @@ update_item_action_buttons() +/obj/item/clothing/head/helmet/space/plasmaman/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(!helmet_on) + return + helmet_on = FALSE + update_appearance() + return COMSIG_SABOTEUR_SUCCESS + /obj/item/clothing/head/helmet/space/plasmaman/attack_hand_secondary(mob/user) ..() . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index 8c1815f3a01..e4fb756e298 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -360,6 +360,48 @@ clothing_flags = THICKMATERIAL flags_inv = HIDEHAIR|HIDEEARS +/obj/item/clothing/suit/hooded/shark_costume // Blahaj + name = "Shark costume" + desc = "Finally, a costume to match your favorite plush." + icon_state = "shark" + icon = 'icons/obj/clothing/suits/costume.dmi' + worn_icon = 'icons/mob/clothing/suits/costume.dmi' + inhand_icon_state = "shark" + body_parts_covered = CHEST|GROIN|ARMS + clothing_flags = THICKMATERIAL + hoodtype = /obj/item/clothing/head/hooded/shark_hood + +/obj/item/clothing/head/hooded/shark_hood + name = "shark hood" + desc = "A hood attached to a shark costume." + icon = 'icons/obj/clothing/head/costume.dmi' + worn_icon = 'icons/mob/clothing/head/costume.dmi' + icon_state = "shark" + body_parts_covered = HEAD + clothing_flags = THICKMATERIAL + flags_inv = HIDEHAIR|HIDEEARS + +/obj/item/clothing/suit/hooded/shork_costume // Oh God Why + name = "shork costume" + desc = "Why would you ever do this?" + icon_state = "sharkcursed" + icon = 'icons/obj/clothing/suits/costume.dmi' + worn_icon = 'icons/mob/clothing/suits/costume.dmi' + inhand_icon_state = "sharkcursed" + body_parts_covered = CHEST|GROIN|ARMS + clothing_flags = THICKMATERIAL + hoodtype = /obj/item/clothing/head/hooded/shork_hood + +/obj/item/clothing/head/hooded/shork_hood + name = "shork hood" + desc = "A hood attached to a shork costume." + icon = 'icons/obj/clothing/head/costume.dmi' + worn_icon = 'icons/mob/clothing/head/costume.dmi' + icon_state = "sharkcursed" + body_parts_covered = HEAD + clothing_flags = THICKMATERIAL + flags_inv = HIDEHAIR|HIDEEARS + /obj/item/clothing/suit/hooded/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!? name = "bloated human suit" desc = "A horribly bloated suit made from human skins." diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index f73fb78c288..a8b2a52ff04 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -425,6 +425,7 @@ /obj/item/t_scanner, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, + /obj/item/extinguisher, ) /datum/armor/atmos_overalls diff --git a/code/modules/clothing/suits/shirt.dm b/code/modules/clothing/suits/shirt.dm index e291250a580..9b8ce90693b 100644 --- a/code/modules/clothing/suits/shirt.dm +++ b/code/modules/clothing/suits/shirt.dm @@ -5,7 +5,7 @@ inhand_icon_state = null greyscale_config = /datum/greyscale_config/wellworn_shirt greyscale_config_worn = /datum/greyscale_config/wellworn_shirt/worn - greyscale_colors = "#FFFFFF" + greyscale_colors = COLOR_WHITE species_exception = list(/datum/species/golem) flags_1 = IS_PLAYER_COLORABLE_1 ///How many times has this shirt been washed? (In an ideal world this is just the determinant of the transform matrix.) @@ -21,6 +21,19 @@ washer.visible_message("[src] implodes due to repeated washing.") qdel(src) +/obj/item/clothing/suit/costume/wellworn_shirt/skub + name = "pro-skub shirt" + desc = "A worn out, curiously comfortable t-shirt proclaiming your pro-skub stance. Fuck those anti-skubbies." + icon_state = "wellworn_shirt_pro_skub" + greyscale_colors = "#FFFF4D" + greyscale_config = /datum/greyscale_config/wellworn_shirt_skub + greyscale_config_worn = /datum/greyscale_config/wellworn_shirt_skub/worn + +/obj/item/clothing/suit/costume/wellworn_shirt/skub/anti + name = "anti-skub shirt" + desc = "A worn out, curiously comfortable t-shirt proclaiming your anti-skub stance. Fuck those pro-skubbies." + icon_state = "wellworn_shirt_anti_skub" + /obj/item/clothing/suit/costume/wellworn_shirt/graphic name = "well-worn graphic shirt" desc = "A worn out, curiously comfortable t-shirt with a character from Phanic the Weasel on the front. It adds some charm points to itself and the wearer, and reminds you of when the series was still good; way back in 2500." diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index bbd880f5466..fa283281447 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -99,6 +99,11 @@ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE +/obj/item/clothing/head/utility/bomb_hood/Initialize(mapload) + . = ..() + if(flags_inv & HIDEFACE) + AddComponent(/datum/component/clothing_fov_visor, FOV_90_DEGREES) + /datum/armor/utility_bomb_hood melee = 20 laser = 20 @@ -169,6 +174,11 @@ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE +/obj/item/clothing/head/utility/radiation/Initialize(mapload) + . = ..() + if(flags_inv & HIDEFACE) + AddComponent(/datum/component/clothing_fov_visor, FOV_90_DEGREES) + /datum/armor/utility_radiation bio = 60 fire = 30 diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 283878339fe..aaa233f0d35 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -521,6 +521,9 @@ /obj/item/pipe_dispenser, /obj/item/storage/bag/construction, /obj/item/t_scanner, + /obj/item/construction/rld, + /obj/item/construction/rtd, + /obj/item/gun/ballistic/rifle/rebarxbow ) armor_type = /datum/armor/wintercoat_engineering hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index eba2dd29ce8..21afd8aab79 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -171,6 +171,10 @@ else display = span_notice("The dogtag is all scratched up.") +/obj/item/clothing/accessory/dogtag/borg_ready + 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." + /* MODULAR SKYRAT - OVERRIDDEN IN (\modular_skyrat\modules\customization\modules\clothing\under\accessories.dm) /// Reskins for the pride pin accessory, mapped by display name to icon state GLOBAL_LIST_INIT(pride_pin_reskins, list( @@ -218,8 +222,8 @@ GLOBAL_LIST_INIT(pride_pin_reskins, list( /obj/item/clothing/accessory/anti_sec_pin/attach(obj/item/clothing/under/attach_to, mob/living/attacher) . = ..() - if (!.) - return FALSE + if (!. || isnull(attacher)) + return var/target = ishuman(attach_to.loc) ? attach_to.loc : attach_to log_combat(attacher, target, "pinned an 'arrest me immediately' pin onto", src) diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index c7be95178e4..7f99a45c8b6 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -383,10 +383,25 @@ name = "Martial Artist Gi" desc = "Assistant, nukie, whatever. You can beat anyone; it's called hard work!" icon_state = "martial_arts_gi" + greyscale_config = /datum/greyscale_config/gi + greyscale_config_worn = /datum/greyscale_config/gi/worn + greyscale_colors = "#f1eeee#000000" + flags_1 = IS_PLAYER_COLORABLE_1 inhand_icon_state = null female_sprite_flags = NO_FEMALE_UNIFORM can_adjust = FALSE +/obj/item/clothing/under/costume/gi/Initialize(mapload) + . = ..() + AddElement(/datum/element/gags_recolorable) + update_icon(UPDATE_OVERLAYS) + +/obj/item/clothing/under/costume/gi/goku + name = "Sacred Gi" + desc = "Created by a man who touched the hearts and lives of many." + icon_state = "martial_arts_gi_goku" + greyscale_colors = "#f89925#3e6dd7" + /obj/item/clothing/under/costume/traditional name = "Traditional Suit" desc = "A full, vibrantly coloured suit. Likely with traditional purposes. Maybe the colours represent a familly, clan, or rank, who knows." diff --git a/code/modules/clothing/under/jobs/civilian/clown_mime.dm b/code/modules/clothing/under/jobs/civilian/clown_mime.dm index e726ba54689..f3abc8a2a47 100644 --- a/code/modules/clothing/under/jobs/civilian/clown_mime.dm +++ b/code/modules/clothing/under/jobs/civilian/clown_mime.dm @@ -80,9 +80,15 @@ /obj/item/clothing/under/rank/civilian/clown/jester name = "jester suit" desc = "A jolly dress, well suited to entertain your master, nuncle." - icon_state = "jester" + icon_state = "jester_map" + greyscale_colors = "#00ff00#ff0000" + greyscale_config = /datum/greyscale_config/jester_suit + greyscale_config_worn = /datum/greyscale_config/jester_suit/worn + flags_1 = IS_PLAYER_COLORABLE_1 -/obj/item/clothing/under/rank/civilian/clown/jester/alt +/obj/item/clothing/under/rank/civilian/clown/jesteralt + name = "jester suit" + desc = "A jolly dress, well suited to entertain your master, nuncle." icon_state = "jester2" /obj/item/clothing/under/rank/civilian/clown/sexy diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index b6bd430eee8..85ce2c2976f 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -31,6 +31,25 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON +/obj/item/clothing/under/rank/engineering/chief_engineer/turtleneck + name = "chief engineer's turtleneck" + desc = "A yellow turtleneck and white khakis, for a chief engineer with a superior sense of style." + icon_state = "ceturtle" + inhand_icon_state = "y_suit" + can_adjust = TRUE + alt_covers_chest = TRUE + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + +/obj/item/clothing/under/rank/engineering/chief_engineer/turtleneck/skirt + name = "chief engineer's turtleneck skirt" + desc = "A yellow turtleneck and white khaki skirt, for a chief engineer with a superior sense of style." + icon_state = "ceturtle_skirt" + inhand_icon_state = "y_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/engineering/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians. Made from fire resistant materials." name = "atmospheric technician's jumpsuit" diff --git a/code/modules/clothing/under/jobs/station_trait.dm b/code/modules/clothing/under/jobs/station_trait.dm new file mode 100644 index 00000000000..034641d35b1 --- /dev/null +++ b/code/modules/clothing/under/jobs/station_trait.dm @@ -0,0 +1,12 @@ +/** + * Outfits limited to station trait jobs + */ +/obj/item/clothing/under/rank/station_trait + icon = 'icons/obj/clothing/under/station_trait.dmi' + worn_icon = 'icons/mob/clothing/under/station_trait.dmi' + +/obj/item/clothing/under/rank/station_trait/human_ai + name = "ai's uniform" + desc = "A outfit made of the cleanest of bluespace and, just kidding it's all fake." + icon_state = "human_ai" + inhand_icon_state = "armor_reflec" diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 0b870156f47..11ed224e9cf 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -6,18 +6,31 @@ icon = 'icons/obj/clothing/under/dress.dmi' worn_icon = 'icons/mob/clothing/under/dress.dmi' +/obj/item/clothing/under/dress/striped/Initialize(mapload) + . = ..() + AddElement(/datum/element/gags_recolorable) + update_icon(UPDATE_OVERLAYS) + /obj/item/clothing/under/dress/striped name = "striped dress" desc = "Fashion in space." - icon_state = "striped_dress" + icon_state = "stripeddress" inhand_icon_state = null female_sprite_flags = FEMALE_UNIFORM_FULL + greyscale_config = /datum/greyscale_config/striped_dress + greyscale_config_worn = /datum/greyscale_config/striped_dress/worn + flags_1 = IS_PLAYER_COLORABLE_1 + greyscale_colors = "#003284#000000#ffffff" /obj/item/clothing/under/dress/sailor name = "sailor dress" desc = "Formal wear for a leading lady." icon_state = "sailor_dress" - inhand_icon_state = null + greyscale_config = /datum/greyscale_config/sailor_dress + greyscale_config_worn = /datum/greyscale_config/sailor_dress/worn + greyscale_colors = "#0000ff#cc0000#eaeaea" + inhand_icon_state = "blackskirt" + flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/under/dress/wedding_dress name = "wedding dress" @@ -27,17 +40,25 @@ body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDESHOES -/obj/item/clothing/under/dress/redeveninggown - name = "red evening gown" +/obj/item/clothing/under/dress/eveninggown + name = "evening gown" desc = "Fancy dress for space bar singers." - icon_state = "red_evening_gown" + icon_state = "evening_gown" inhand_icon_state = null + greyscale_config = /datum/greyscale_config/evening_dress + greyscale_config_worn = /datum/greyscale_config/evening_dress/worn + flags_1 = IS_PLAYER_COLORABLE_1 + greyscale_colors = "#e11f1f" /obj/item/clothing/under/dress/skirt - name = "black skirt" - desc = "A black skirt, very fancy!" - icon_state = "blackskirt" + name = "cardigan skirt" + desc = "A nice skirt with a cute cardigan, very fancy!" + icon_state = "cardiganskirt" + greyscale_config = /datum/greyscale_config/cardiganskirt + greyscale_config_worn = /datum/greyscale_config/cardiganskirt/worn + greyscale_colors = "#bf504d#545454" inhand_icon_state = "blackskirt" + flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/under/dress/skirt/plaid name = "plaid skirt" diff --git a/code/modules/deathmatch/deathmatch_controller.dm b/code/modules/deathmatch/deathmatch_controller.dm index c288daefd4e..45b5f087c5b 100644 --- a/code/modules/deathmatch/deathmatch_controller.dm +++ b/code/modules/deathmatch/deathmatch_controller.dm @@ -5,6 +5,8 @@ var/list/datum/lazy_template/deathmatch/maps = list() /// All loadouts var/list/datum/outfit/loadouts + /// All modifiers + var/list/datum/deathmatch_modifier/modifiers /datum/deathmatch_controller/New() . = ..() @@ -17,6 +19,7 @@ var/map_name = initial(template.name) maps[map_name] = new template loadouts = subtypesof(/datum/outfit/deathmatch_loadout) + modifiers = sortTim(init_subtypes_w_path_keys(/datum/deathmatch_modifier), GLOBAL_PROC_REF(cmp_deathmatch_mods), associative = TRUE) /datum/deathmatch_controller/proc/create_new_lobby(mob/host) lobbies[host.ckey] = new /datum/deathmatch_lobby(host) @@ -87,7 +90,7 @@ var/datum/deathmatch_lobby/chosen_lobby = lobbies[params["id"]] if (!isnull(playing_lobby) && playing_lobby != chosen_lobby) playing_lobby.leave(usr.ckey) - + if(isnull(playing_lobby)) log_game("[usr.ckey] joined deathmatch lobby [params["id"]] as a player.") chosen_lobby.join(usr) diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm index 7b8406394c4..343df0a9943 100644 --- a/code/modules/deathmatch/deathmatch_loadouts.dm +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -17,7 +17,7 @@ if(!isnull(species_override)) user.set_species(species_override) - else if (istype(user.dna.species.outfit_important_for_life)) //plasmamen get lit on fire and die + else if (!isnull(user.dna.species.outfit_important_for_life)) //plasmamen get lit on fire and die user.set_species(/datum/species/human) for(var/datum/action/act as anything in granted_spells) var/datum/action/new_ability = new act(user) diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm index 32d326fd18a..a585940d607 100644 --- a/code/modules/deathmatch/deathmatch_lobby.dm +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -9,16 +9,18 @@ var/datum/lazy_template/deathmatch/map /// Our turf reservation AKA where the arena is var/datum/turf_reservation/location - /// Whether players hear deadchat and people through walls - var/global_chat = FALSE /// Whether the lobby is currently playing - var/playing = FALSE + var/playing = DEATHMATCH_NOT_PLAYING /// Number of total ready players var/ready_count /// List of loadouts, either gotten from the deathmatch controller or the map var/list/loadouts /// Current map player spawn locations, cleared after spawning var/list/player_spawns = list() + /// A list of paths of modifiers enabled for the match. + var/list/modifiers = list() + /// Is the modifiers modal menu open (for the host) + var/mod_menu_open = FALSE /datum/deathmatch_lobby/New(mob/player) . = ..() @@ -45,20 +47,27 @@ clear_reservation() players = null observers = null + map?.template_in_use = FALSE //just incase map = null location = null loadouts = null + modifiers = null /datum/deathmatch_lobby/proc/start_game() if (playing) return - playing = TRUE + if(map.template_in_use) + to_chat(get_mob_by_ckey(host), span_warning("This map is currently loading for another lobby. Please wait until that other map finishes loading. It would be a disaster if these two mixed up.")) + return + playing = DEATHMATCH_PRE_PLAYING + map.template_in_use = TRUE RegisterSignal(map, COMSIG_LAZY_TEMPLATE_LOADED, PROC_REF(find_spawns_and_start_delay)) location = map.lazy_load() if (!location) to_chat(get_mob_by_ckey(host), span_warning("Couldn't reserve/load a map location (all locations used?), try again later, or contact a coder.")) playing = FALSE + map.template_in_use = FALSE UnregisterSignal(map, COMSIG_LAZY_TEMPLATE_LOADED) return FALSE @@ -69,6 +78,7 @@ player_spawns += thing UnregisterSignal(source, COMSIG_LAZY_TEMPLATE_LOADED) + map.template_in_use = FALSE addtimer(CALLBACK(src, PROC_REF(start_game_after_delay)), 8 SECONDS) /datum/deathmatch_lobby/proc/start_game_after_delay() @@ -78,6 +88,9 @@ playing = FALSE return FALSE + for(var/modpath in modifiers) + GLOB.deathmatch_game.modifiers[modpath].on_start_game(src) + for (var/key in players) var/mob/dead/observer/observer = players[key]["mob"] if (isnull(observer) || !observer.client) @@ -97,19 +110,26 @@ var/mob/observer = observers[observer_key]["mob"] observer.forceMove(pick(location.reserved_turfs)) + playing = DEATHMATCH_PLAYING addtimer(CALLBACK(src, PROC_REF(game_took_too_long)), initial(map.automatic_gameend_time)) log_game("Deathmatch game [host] started.") announce(span_reallybig("GO!")) + if(length(modifiers)) + var/list/modifier_names = list() + for(var/datum/deathmatch_modifier/modifier as anything in modifiers) + modifier_names += uppertext(initial(modifier.name)) + announce(span_boldnicegreen("THIS MATCH MODIFIERS: [english_list(modifier_names, and_text = " ,")].")) return TRUE /datum/deathmatch_lobby/proc/spawn_observer_as_player(ckey, loc) - var/mob/dead/observer/observer = players[ckey]["mob"] + var/list/players_info = players[ckey] + var/mob/dead/observer/observer = players_info["mob"] if (isnull(observer) || !observer.client) remove_ckey_from_play(ckey) return // equip player - var/datum/outfit/deathmatch_loadout/loadout = players[ckey]["loadout"] + var/datum/outfit/deathmatch_loadout/loadout = players_info["loadout"] if (!(loadout in loadouts)) loadout = loadouts[1] @@ -126,13 +146,13 @@ ) new_player.equipOutfit(loadout) // Loadout new_player.key = ckey - players[ckey]["mob"] = new_player + players_info["mob"] = new_player + + for(var/datum/deathmatch_modifier/modifier as anything in modifiers) + GLOB.deathmatch_game.modifiers[modifier].apply(new_player, src) // register death handling. RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING), PROC_REF(player_died)) - if (global_chat) - ADD_TRAIT(new_player, TRAIT_SIXTHSENSE, INNATE_TRAIT) - ADD_TRAIT(new_player, TRAIT_XRAY_HEARING, INNATE_TRAIT) /datum/deathmatch_lobby/proc/game_took_too_long() if (!location || QDELING(src)) @@ -158,6 +178,9 @@ loser.ghostize() qdel(loser) + for(var/datum/deathmatch_modifier/modifier in modifiers) + GLOB.deathmatch_game.modifiers[modifier].on_end_game(src) + clear_reservation() GLOB.deathmatch_game.remove_lobby(host) log_game("Deathmatch game [host] ended.") @@ -184,8 +207,9 @@ add_observer(ghost, (host == ckey)) announce(span_reallybig("[player.real_name] HAS DIED.
[players.len] REMAIN.")) - if(!gibbed && !QDELING(player)) // for some reason dusting or deleting in chasm storage messes up tgui bad - player.dust(TRUE, TRUE, TRUE) + if(!gibbed && !QDELING(player)) + if(!HAS_TRAIT(src, TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS)) + player.dust(TRUE, TRUE, TRUE) if (players.len <= 1) end_game() @@ -274,6 +298,9 @@ continue players[player_key]["loadout"] = loadouts[1] + for(var/deathmatch_mod in modifiers) + GLOB.deathmatch_game.modifiers[deathmatch_mod].on_map_changed(src) + /datum/deathmatch_lobby/proc/clear_reservation() if(isnull(location) || isnull(map)) return @@ -309,12 +336,15 @@ for (var/map_key in GLOB.deathmatch_game.maps) .["maps"] += map_key + /datum/deathmatch_lobby/ui_data(mob/user) . = list() + var/is_player = !isnull(players[user.ckey]) + var/is_host = (user.ckey == host) + var/is_admin = check_rights_for(user.client, R_ADMIN) .["self"] = user.ckey - .["host"] = (user.ckey == host) - .["admin"] = check_rights_for(user.client, R_ADMIN) - .["global_chat"] = global_chat + .["host"] = is_host + .["admin"] = is_admin .["playing"] = playing .["loadouts"] = list("Randomize") for (var/datum/outfit/deathmatch_loadout/loadout as anything in loadouts) @@ -325,7 +355,27 @@ .["map"]["time"] = map.automatic_gameend_time .["map"]["min_players"] = map.min_players .["map"]["max_players"] = map.max_players - if(!isnull(players[user.ckey]) && !isnull(players[user.ckey]["loadout"])) + + .["mod_menu_open"] = FALSE + if((is_host || is_admin) && mod_menu_open) + .["mod_menu_open"] = TRUE + for(var/modpath in GLOB.deathmatch_game.modifiers) + var/datum/deathmatch_modifier/mod = GLOB.deathmatch_game.modifiers[modpath] + .["modifiers"] += list(list( + "name" = mod.name, + "desc" = mod.description, + "modpath" = "[modpath]", + "selected" = (modpath in modifiers), + "selectable" = is_host && mod.selectable(src), + )) + .["active_mods"] = "No modifiers selected" + if(length(modifiers)) + var/list/mod_names = list() + for(var/datum/deathmatch_modifier/modpath as anything in modifiers) + mod_names += initial(modpath.name) + .["active_mods"] = "Selected modifiers: [english_list(mod_names)]" + + if(is_player && !isnull(players[user.ckey]["loadout"])) var/datum/outfit/deathmatch_loadout/loadout = players[user.ckey]["loadout"] .["loadoutdesc"] = initial(loadout.desc) else @@ -431,9 +481,27 @@ return FALSE change_map(params["map"]) return TRUE - if ("global_chat") - global_chat = !global_chat - return TRUE + if("open_mod_menu") + mod_menu_open = TRUE + return TRUE + if("exit_mod_menu") + mod_menu_open = FALSE + return TRUE + if("toggle_modifier") + var/datum/deathmatch_modifier/modpath = text2path(params["modpath"]) + if(!ispath(modpath)) + return TRUE + if(usr.ckey != host && !check_rights(R_ADMIN)) + return TRUE + var/datum/deathmatch_modifier/chosen_modifier = GLOB.deathmatch_game.modifiers[modpath] + if(modpath in modifiers) + chosen_modifier.unselect(src) + modifiers -= modpath + return TRUE + if(chosen_modifier.selectable(src)) + chosen_modifier.on_select(src) + modifiers += modpath + return TRUE if ("admin") // Admin functions if (!check_rights(R_ADMIN)) message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby!") @@ -444,4 +512,7 @@ log_admin("[key_name(usr)] force started deathmatch lobby [host].") start_game() - +/datum/deathmatch_lobby/ui_close(mob/user) + . = ..() + if(user.ckey == host) + mod_menu_open = FALSE diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm index 9f6a5b4f594..c3e10279363 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 has_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | QUIET_LOGS /area/deathmatch/fullbright static_lighting = FALSE diff --git a/code/modules/deathmatch/deathmatch_maps.dm b/code/modules/deathmatch/deathmatch_maps.dm index d437bffbb3c..ebc3328e0ca 100644 --- a/code/modules/deathmatch/deathmatch_maps.dm +++ b/code/modules/deathmatch/deathmatch_maps.dm @@ -1,14 +1,21 @@ /datum/lazy_template/deathmatch //deathmatch maps that have any possibility of the walls being destroyed should use indestructible walls, because baseturf moment + map_dir = "_maps/deathmatch" + place_on_top = TRUE + /// Map UI Name var/name - map_dir = "_maps/map_files/Deathmatch" /// Map Description var/desc = "" + /// Minimum players for this map var/min_players = 2 + /// Maximum players for this map var/max_players = 2 // TODO: make this automatic. /// The map will end in this time var/automatic_gameend_time = 8 MINUTES /// List of allowed loadouts for this map, otherwise defaults to all loadouts var/list/allowed_loadouts = list() + /// whether we are currently being loaded by a lobby + var/template_in_use = FALSE + /datum/lazy_template/deathmatch/ragecage name = "Ragecage" @@ -24,24 +31,24 @@ desc = "Dark maintenance tunnels, floor pills, improvised weaponry and a bloody beatdown. Welcome to assistant utopia." max_players = 8 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) - map_name = "Maint_Mania" - key = "Maint_Mania" + map_name = "maint_mania" + key = "maint_mania" /datum/lazy_template/deathmatch/osha_violator name = "OSHA Violator" desc = "What would Engineering be without an overly complicated engine, with conveyor belts, emitters and shield generators sprinkled about? That's right, not Engineering." max_players = 10 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) - map_name = "OSHA_Violator" - key = "OSHA_Violator" + map_name = "OSHA_violator" + key = "OSHA_violator" /datum/lazy_template/deathmatch/the_brig name = "The Brig" desc = "A recreation of MetaStation Brig." max_players = 12 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) - map_name = "The_Brig" - key = "The_Brig" + map_name = "meta_brig" + key = "meta_brig" /datum/lazy_template/deathmatch/shooting_range name = "Shooting Range" @@ -59,8 +66,8 @@ desc = "Presenting the Security Ring, ever wanted to shoot people with disablers? Well now you can." max_players = 4 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/securing_sec) - map_name = "SecuRing" - key = "SecuRing" + map_name = "secu_ring" + key = "secu_ring" /datum/lazy_template/deathmatch/instagib name = "Instagib" @@ -78,29 +85,29 @@ map_name = "mech_madness" key = "mech_madness" -/datum/lazy_template/deathmatch/sniperelite +/datum/lazy_template/deathmatch/sniper_elite name = "Sniper Elite" desc = "Sound of gunfire and screaming people make my day" max_players = 8 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative/sniper) - map_name = "Sniper_elite" - key = "Sniper_elite" + map_name = "sniper_elite" + key = "sniper_elite" /datum/lazy_template/deathmatch/meatower name = "Meat Tower" desc = "There can only be one chef in this kitchen" max_players = 8 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/chef) - map_name = "meatower" - key = "meatower" + map_name = "meat_tower" + key = "meat_tower" /datum/lazy_template/deathmatch/sunrise name = "Sunrise" desc = "DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED" max_players = 8 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/samurai) - map_name = "chinatown" - key = "chinatown" + map_name = "sunrise" + key = "sunrise" /datum/lazy_template/deathmatch/starwars name = "Arena Station" @@ -122,10 +129,10 @@ /datum/outfit/deathmatch_loadout/battler/tgcoder, /datum/outfit/deathmatch_loadout/naked, ) - map_name = "starwars" - key = "starwars" + map_name = "arena_station" + key = "arena_station" -/datum/lazy_template/deathmatch/arenaplatform +/datum/lazy_template/deathmatch/underground_thunderdome name = "Underground Thunderdome" desc = "An illegal underground thunderdome, for larger amounts of murder." max_players = 15 @@ -133,10 +140,10 @@ /datum/outfit/deathmatch_loadout/operative, /datum/outfit/deathmatch_loadout/naked, ) - map_name = "arena" - key = "arena" + map_name = "underground_arena" + key = "underground_arena" -/datum/lazy_template/deathmatch/raidthebase +/datum/lazy_template/deathmatch/backalley name = "Backalley" desc = "You are not built for these streets." max_players = 8 @@ -144,5 +151,5 @@ /datum/outfit/deathmatch_loadout/assistant, /datum/outfit/deathmatch_loadout/naked, ) - map_name = "raidthebase" - key = "raidthebase" + map_name = "backalley" + key = "backalley" diff --git a/code/modules/deathmatch/deathmatch_modifier.dm b/code/modules/deathmatch/deathmatch_modifier.dm new file mode 100644 index 00000000000..5037b3c3ae3 --- /dev/null +++ b/code/modules/deathmatch/deathmatch_modifier.dm @@ -0,0 +1,546 @@ +///Deathmatch modifiers are little options the host can choose to spice the match a bit. +/datum/deathmatch_modifier + ///The name of the modifier + var/name = "Unnamed Modifier" + ///A small description/tooltip shown in the UI + var/description = "What the heck does this do?" + ///The color of the button shown in the UI + var/color = "blue" + ///A list of modifiers this is incompatible with. + var/list/blacklisted_modifiers + ///Is this trait exempted from the "Random Modifiers" modifier. + var/random_exempted = FALSE + +///Whether or not this modifier can be selected, for both host and player-selected modifiers. +/datum/deathmatch_modifier/proc/selectable(datum/deathmatch_lobby/lobby) + SHOULD_CALL_PARENT(TRUE) + if(!random_exempted && (/datum/deathmatch_modifier/random in lobby.modifiers)) + return FALSE + if(length(lobby.modifiers & blacklisted_modifiers)) + return FALSE + for(var/modpath in lobby.modifiers) + if(src in GLOB.deathmatch_game.modifiers[modpath].blacklisted_modifiers) + return FALSE + return TRUE + +///Called when selecting the deathmatch modifier. +/datum/deathmatch_modifier/proc/on_select(datum/deathmatch_lobby/lobby) + return + +///When the host changes his mind and unselects it. +/datum/deathmatch_modifier/proc/unselect(datum/deathmatch_lobby/lobby) + return + +///Called when the host chooses to change map. +/datum/deathmatch_modifier/proc/on_map_changed(datum/deathmatch_lobby/lobby) + return + +///Called as the game is about to start. +/datum/deathmatch_modifier/proc/on_start_game(datum/deathmatch_lobby/lobby) + return + +///Called as the game has ended, right before the reservation is deleted. +/datum/deathmatch_modifier/proc/on_end_game(datum/deathmatch_lobby/lobby) + return + +///Apply the modifier to the newly spawned player as the game is about to start +/datum/deathmatch_modifier/proc/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + return + +/datum/deathmatch_modifier/health + name = "Double-Health" + description = "Doubles your starting health" + blacklisted_modifiers = list(/datum/deathmatch_modifier/health/triple) + var/multiplier = 2 + +/datum/deathmatch_modifier/health/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.maxHealth *= multiplier + player.health *= multiplier + +/datum/deathmatch_modifier/health/triple + name = "Triple-Health" + description = "When \"Double-Health\" isn't enough..." + multiplier = 3 + blacklisted_modifiers = list(/datum/deathmatch_modifier/health) + +/datum/deathmatch_modifier/tenacity + name = "Tenacity" + description = "Unaffected by critical condition and pain" + +/datum/deathmatch_modifier/tenacity/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.add_traits(list(TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_ANALGESIA), DEATHMATCH_TRAIT) + +/datum/deathmatch_modifier/no_wounds + name = "No Wounds" + description = "Ah, the good ol' days when people did't have literal dents in their skulls..." + +/datum/deathmatch_modifier/no_wounds/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + ADD_TRAIT(player, TRAIT_NEVER_WOUNDED, DEATHMATCH_TRAIT) + +/datum/deathmatch_modifier/no_knockdown + name = "No Knockdowns" + description = "I'M FUCKING INVINCIBLE!" + +/datum/deathmatch_modifier/no_knockdown/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), DEATHMATCH_TRAIT) + +/datum/deathmatch_modifier/no_slowdown + name = "No Slowdowns" + description = "You're too slow!" + +/datum/deathmatch_modifier/no_slowdown/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + ADD_TRAIT(player, TRAIT_IGNORESLOWDOWN, DEATHMATCH_TRAIT) + +/datum/deathmatch_modifier/teleport + name = "Random Teleports" + description = "One moment I'm here, the next I'm there" + ///A lazylist of lobbies that have this modifier enabled + var/list/signed_lobbies + ///The cooldown to the teleportation effect. + COOLDOWN_DECLARE(teleport_cd) + +/datum/deathmatch_modifier/teleport/on_select(datum/deathmatch_lobby/lobby) + if(isnull(signed_lobbies)) + START_PROCESSING(SSprocessing, src) + LAZYADD(signed_lobbies, lobby) + RegisterSignal(lobby, COMSIG_QDELETING, PROC_REF(remove_lobby)) + +/datum/deathmatch_modifier/teleport/unselect(datum/deathmatch_lobby/lobby) + remove_lobby(lobby) + +/datum/deathmatch_modifier/teleport/proc/remove_lobby(datum/deathmatch_lobby/lobby) + SIGNAL_HANDLER + LAZYREMOVE(signed_lobbies, lobby) + UnregisterSignal(lobby, COMSIG_QDELETING) + if(isnull(signed_lobbies)) + STOP_PROCESSING(SSprocessing, src) + +/datum/deathmatch_modifier/teleport/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, teleport_cd)) + return + + for(var/datum/deathmatch_lobby/lobby as anything in signed_lobbies) + if(lobby.playing != DEATHMATCH_PLAYING || isnull(lobby.location)) + continue + for(var/ckey in lobby.players) + var/mob/living/player = lobby.players[ckey]["mob"] + if(istype(player)) + continue + var/turf/destination + for(var/attempt in 1 to 5) + var/turf/possible_destination = pick(lobby.location.reserved_turfs) + if(isopenturf(destination) && !isgroundlessturf(destination)) + destination = possible_destination + break + if(isnull(destination)) + continue + //I want this modifier to be compatible with 'Mounts' and 'Paraplegic' wheelchairs. + var/atom/movable/currently_buckled = player.buckled + do_teleport(player, destination, 0, asoundin = 'sound/effects/phasein.ogg', forced = TRUE) + if(currently_buckled && !currently_buckled.anchored) + do_teleport(currently_buckled, destination, 0, asoundin = 'sound/effects/phasein.ogg', forced = TRUE) + currently_buckled.buckle_mob(player) + + COOLDOWN_START(src, teleport_cd, rand(12 SECONDS, 24 SECONDS)) + +/datum/deathmatch_modifier/snail_crawl + name = "Snail Crawl" + description = "Lube the floor as you slather it with your body" + blacklisted_modifiers = list(/datum/deathmatch_modifier/no_gravity) + +/datum/deathmatch_modifier/snail_crawl/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.AddElement(/datum/element/snailcrawl) + +/datum/deathmatch_modifier/blinking_and_breathing + name = "Manual Blinking/Breathing" + description = "Ruin everyone's fun by forcing them to breathe and blink manually" + +/datum/deathmatch_modifier/blinking_and_breathing/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.AddComponent(/datum/component/manual_blinking) + player.AddComponent(/datum/component/manual_breathing) + +/datum/deathmatch_modifier/forcefield_trail + name = "Forcefield Trail" + description = "You leave short-living unpassable forcefields in your wake" + +/datum/deathmatch_modifier/forcefield_trail/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/extrafast) + +/datum/deathmatch_modifier/xray + name = "X-Ray Vision" + description = "See through the cordons of the deathmatch arena!" + blacklisted_modifiers = list(/datum/deathmatch_modifier/thermal) + +/datum/deathmatch_modifier/xray/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + ADD_TRAIT(player, TRAIT_XRAY_VISION, DEATHMATCH_TRAIT) + player.update_sight() + +/datum/deathmatch_modifier/thermal + name = "Thermal Vision" + description = "See mobs through walls" + blacklisted_modifiers = list(/datum/deathmatch_modifier/xray) + +/datum/deathmatch_modifier/thermal/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + ADD_TRAIT(player, TRAIT_THERMAL_VISION, DEATHMATCH_TRAIT) + player.update_sight() + +/datum/deathmatch_modifier/regen + name = "Health Regen" + description = "The closest thing to free health insurance you can get" + +/datum/deathmatch_modifier/regen/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.AddComponent(/datum/component/regenerator, regeneration_delay = 4 SECONDS, brute_per_second = 2.5, burn_per_second = 2.5, tox_per_second = 2.5) + +/datum/deathmatch_modifier/nearsightness + name = "Nearsightness" + description = "Oops, I forgot my glasses at home" + +/datum/deathmatch_modifier/nearsightness/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.become_nearsighted(DEATHMATCH_TRAIT) + +/datum/deathmatch_modifier/ocelot + name = "Ocelot" + description = "Shoot faster, with extra ricochet and less spread. You're pretty good!" + blacklisted_modifiers = list(/datum/deathmatch_modifier/stormtrooper) + +/datum/deathmatch_modifier/ocelot/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.add_traits(list(TRAIT_NICE_SHOT, TRAIT_DOUBLE_TAP), DEATHMATCH_TRAIT) + RegisterSignal(player, COMSIG_MOB_FIRED_GUN, PROC_REF(reduce_spread)) + RegisterSignal(player, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE, PROC_REF(apply_ricochet)) + +/datum/deathmatch_modifier/ocelot/proc/reduce_spread(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) + SIGNAL_HANDLER + bonus_spread_values[MIN_BONUS_SPREAD_INDEX] -= 50 + bonus_spread_values[MAX_BONUS_SPREAD_INDEX] -= 50 + +/datum/deathmatch_modifier/ocelot/proc/apply_ricochet(mob/user, obj/projectile/projectile, datum/fired_from, atom/clicked_atom) + SIGNAL_HANDLER + projectile.ricochets_max += 2 + projectile.min_ricochets += 2 + projectile.ricochet_incidence_leeway = 0 + ADD_TRAIT(projectile, TRAIT_ALWAYS_HIT_ZONE, DEATHMATCH_TRAIT) + +/datum/deathmatch_modifier/stormtrooper + name = "Stormtrooper Aim" + description = "Fresh out of the 'I Can't Aim For Shit' School" + blacklisted_modifiers = list(/datum/deathmatch_modifier/ocelot) + +/datum/deathmatch_modifier/stormtrooper/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + RegisterSignal(player, COMSIG_MOB_FIRED_GUN, PROC_REF(increase_spread)) + +/datum/deathmatch_modifier/stormtrooper/proc/increase_spread(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) + SIGNAL_HANDLER + bonus_spread_values[MIN_BONUS_SPREAD_INDEX] += 10 + bonus_spread_values[MAX_BONUS_SPREAD_INDEX] += 35 + +/datum/deathmatch_modifier/four_hands + name = "Four Hands" + description = "When one pair isn't enough..." + +/datum/deathmatch_modifier/four_hands/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.change_number_of_hands(4) + +/datum/deathmatch_modifier/paraplegic + name = "Paraplegic" + description = "Wheelchairs. For. Everyone." + +/datum/deathmatch_modifier/paraplegic/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE) + ///Mounts are being used. Do not spawn wheelchairs. + if(/datum/deathmatch_modifier/mounts in lobby.modifiers) + return + var/obj/vehicle/ridden/wheelchair/motorized/improved/wheels = new (player.loc) + wheels.setDir(player.dir) + wheels.buckle_mob(player) + +/datum/deathmatch_modifier/mounts + name = "Mounts" + description = "A horse! A horse! My kingdom for a horse!" + +/datum/deathmatch_modifier/mounts/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + ///We do a bit of fun over balance here, some mounts may be better than others. + var/mount_path = pick(list( + /mob/living/basic/carp, + /mob/living/basic/pony, + /mob/living/basic/pony/syndicate, + /mob/living/basic/pig, + /mob/living/basic/cow, + /mob/living/basic/cow/moonicorn, + /mob/living/basic/mining/wolf, + /mob/living/basic/mining/goldgrub, + /mob/living/basic/mining/goliath/deathmatch, + )) + var/mob/living/basic/mount = new mount_path (player.loc) + mount.tamed(player, null) + mount.befriend(player) + mount.buckle_mob(player) + if(HAS_TRAIT(lobby, TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS)) + var/obj/item/implant/explosive/deathmatch/implant = new() + implant.implant(mount, silent = TRUE, force = TRUE) + +/datum/deathmatch_modifier/no_gravity + name = "No Gravity" + description = "Hone your robusting skills in zero g" + blacklisted_modifiers = list(/datum/deathmatch_modifier/mounts, /datum/deathmatch_modifier/paraplegic, /datum/deathmatch_modifier/minefield) + +/datum/deathmatch_modifier/no_gravity/on_start_game(datum/deathmatch_lobby/lobby) + ASYNC + for(var/turf/turf as anything in lobby.location.reserved_turfs) + turf.AddElement(/datum/element/forced_gravity, 0) + CHECK_TICK + +/datum/deathmatch_modifier/no_gravity/on_end_game(datum/deathmatch_lobby/lobby) + for(var/turf/turf as anything in lobby.location.reserved_turfs) + turf.RemoveElement(/datum/element/forced_gravity, 0) + +/datum/deathmatch_modifier/drop_pod + name = "Drop Pod: Syndies" + description = "Steel Rain: Syndicate Edition" + ///A lazylist of lobbies that have this modifier enabled + var/list/signed_lobbies + ///The type of drop pod that'll periodically fall from the sky + var/drop_pod_type = /obj/structure/closet/supplypod/podspawn/deathmatch + ///A (weighted) list of possible contents of the drop pod. Only one is picked at a time + var/list/contents + ///An interval representing the min and max cooldown between each time it's fired. + var/interval = list(7 SECONDS, 12 SECONDS) + ///How many (a number or a two keyed list) drop pods can be dropped at a time. + var/amount = list(1, 2) + ///The cooldown for dropping pods into every affected deathmatch arena. + COOLDOWN_DECLARE(drop_pod_cd) + +/datum/deathmatch_modifier/drop_pod/New() + . = ..() + populate_contents() + +/datum/deathmatch_modifier/drop_pod/on_select(datum/deathmatch_lobby/lobby) + if(isnull(signed_lobbies)) + START_PROCESSING(SSprocessing, src) + LAZYADD(signed_lobbies, lobby) + RegisterSignal(lobby, COMSIG_QDELETING, PROC_REF(remove_lobby)) + +/datum/deathmatch_modifier/drop_pod/unselect(datum/deathmatch_lobby/lobby) + remove_lobby(lobby) + +/datum/deathmatch_modifier/drop_pod/proc/remove_lobby(datum/deathmatch_lobby/lobby) + SIGNAL_HANDLER + LAZYREMOVE(signed_lobbies, lobby) + UnregisterSignal(lobby, COMSIG_QDELETING) + if(isnull(signed_lobbies)) + STOP_PROCESSING(SSprocessing, src) + +/datum/deathmatch_modifier/drop_pod/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, drop_pod_cd)) + return + var/pod_spawned = FALSE + for(var/datum/deathmatch_lobby/lobby as anything in signed_lobbies) + if(lobby.playing != DEATHMATCH_PLAYING || isnull(lobby.location)) + continue + var/yet_to_spawn = islist(amount) ? rand(amount[1], amount[2]) : amount + for(var/attempt in 1 to 10) + var/turf/to_strike = pick(lobby.location.reserved_turfs) + if(!isopenturf(to_strike) || isgroundlessturf(to_strike)) + continue + var/atom/movable/to_spawn + if(length(contents)) + var/spawn_path = pick_weight(contents) + to_spawn = new spawn_path (to_strike) + if(isliving(to_spawn) && HAS_TRAIT(lobby, TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS)) + var/obj/item/implant/explosive/deathmatch/implant = new() + implant.implant(to_spawn, silent = TRUE, force = TRUE) + podspawn(list( + "path" = drop_pod_type, + "target" = to_strike, + "spawn" = to_spawn, + )) + pod_spawned = TRUE + yet_to_spawn-- + if(yet_to_spawn == 0) + break + + if(pod_spawned) + COOLDOWN_START(src, drop_pod_cd, rand(interval[1], interval[2])) + +/datum/deathmatch_modifier/drop_pod/proc/populate_contents() + contents = typesof(/mob/living/basic/trooper/syndicate) + for(var/typepath in contents) //Make sure to set even weights for the keys or `pick_weight` won't work. + contents[typepath] = 1 + +/datum/deathmatch_modifier/drop_pod/monsters + name = "Drop Pod: Monsters" + description = "Monsters are raining from the sky!" + +/datum/deathmatch_modifier/drop_pod/monsters/populate_contents() + contents = list( + /mob/living/basic/ant = 2, + /mob/living/basic/construct/proteon = 2, + /mob/living/basic/flesh_spider = 2, + /mob/living/basic/garden_gnome = 2, + /mob/living/basic/killer_tomato = 2, + /mob/living/basic/leaper = 1, + /mob/living/basic/mega_arachnid = 1, + /mob/living/basic/mining/goliath = 1, + /mob/living/basic/mining/ice_demon = 1, + /mob/living/basic/mining/ice_whelp = 1, + /mob/living/basic/mining/lobstrosity = 1, + /mob/living/basic/mining/mook = 2, + /mob/living/basic/mouse/rat = 2, + /mob/living/basic/spider/giant/nurse/scrawny = 2, + /mob/living/basic/spider/giant/tarantula/scrawny = 2, + /mob/living/basic/spider/giant/hunter/scrawny = 2, + /mob/living/simple_animal/hostile/dark_wizard = 2, + /mob/living/simple_animal/hostile/retaliate/goose = 2, + /mob/living/simple_animal/hostile/ooze = 1, + /mob/living/simple_animal/hostile/vatbeast = 1, + ) + +/datum/deathmatch_modifier/drop_pod/missiles + name = "Drop Pod: Cruise Missiles" + description = "You're going to get shelled hard" + drop_pod_type = /obj/structure/closet/supplypod/deadmatch_missile + interval = list(3 SECONDS, 5 SECONDS) + amount = list(1, 3) + +/datum/deathmatch_modifier/drop_pod/missiles/populate_contents() + return + +/datum/deathmatch_modifier/explode_on_death + name = "Explosive Death" + description = "Everyone gets a microbomb that cannot be manually activated." + +/datum/deathmatch_modifier/explode_on_death/on_start_game(datum/deathmatch_lobby/lobby) + ADD_TRAIT(lobby, TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS, DEATHMATCH_TRAIT) + +/datum/deathmatch_modifier/explode_on_death/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + var/obj/item/implant/explosive/deathmatch/implant = new() + implant.implant(player, silent = TRUE, force = TRUE) + +/datum/deathmatch_modifier/helgrasp + name = "Helgrasped" + description = "Cursed hands are being thrown at you!" + +/datum/deathmatch_modifier/helgrasp/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + var/metabolism_rate = /datum/reagent/inverse/helgrasp/heretic::metabolization_rate + player.reagents.add_reagent(/datum/reagent/inverse/helgrasp/heretic, initial(lobby.map.automatic_gameend_time) / metabolism_rate) + +/datum/deathmatch_modifier/wasted + name = "Wasted" + description = "You've had one drink too many" + +/datum/deathmatch_modifier/wasted/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.adjust_drunk_effect(rand(30, 35)) + var/metabolism_rate = /datum/reagent/consumable/ethanol/jack_rose::metabolization_rate + player.reagents.add_reagent(/datum/reagent/consumable/ethanol/jack_rose, initial(lobby.map.automatic_gameend_time) * 0.35 / metabolism_rate) + +/datum/deathmatch_modifier/monkeys + name = "Monkeyfication" + description = "Go back, I want to be monkey!" + +/datum/deathmatch_modifier/monkeys/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + //we don't call monkeyize(), because it'd set the player name to a generic "monkey(number)". + player.set_species(/datum/species/monkey) + +/datum/deathmatch_modifier/inverted_movement + name = "Inverted Movement" + description = "Up is down, left is right" + +/datum/deathmatch_modifier/inverted_movement/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.AddElement(/datum/element/inverted_movement) + +/datum/deathmatch_modifier/minefield + name = "Minefield" + description = "Oh, it seems you've trotted on a mine!" + +/datum/deathmatch_modifier/minefield/on_start_game(datum/deathmatch_lobby/lobby) + var/list/mines = subtypesof(/obj/effect/mine) + mines -= list( + /obj/effect/mine/explosive, //too lethal. + /obj/effect/mine/kickmine, //will kick the client, lol + /obj/effect/mine/gas, //Just spawns oxygen. + /obj/effect/mine/gas/n2o, //no sleeping please. + ) + + ///1 every 11 turfs, but it will actually spawn fewer mines since groundless and closed turfs are skipped. + var/mines_to_spawn = length(lobby.location.reserved_turfs) * 0.09 + for(var/iteration in 1 to mines_to_spawn) + var/turf/target_turf = pick(lobby.location.reserved_turfs) + if(!isopenturf(target_turf) || isgroundlessturf(target_turf)) + continue + ///don't spawn mine next to player spawns. + if(locate(/obj/effect/landmark/deathmatch_player_spawn) in range(1, target_turf)) + continue + ///skip belt loops or they'll explode right away. + if(locate(/obj/machinery/conveyor) in target_turf.contents) + continue + var/mine_path = pick(mines) + new mine_path (target_turf) + +/datum/deathmatch_modifier/random + name = "Random Modifiers" + description = "Picks 3 to 5 random modifiers as the game is about to start" + random_exempted = TRUE + +/datum/deathmatch_modifier/random/on_select(datum/deathmatch_lobby/lobby) + ///remove any other global modifier if chosen. It'll pick random ones when the time comes. + for(var/modpath in lobby.modifiers) + var/datum/deathmatch_modifier/modifier = GLOB.deathmatch_game.modifiers[modpath] + if(modifier.random_exempted) + continue + modifier.unselect(lobby) + lobby.modifiers -= modpath + +/datum/deathmatch_modifier/random/on_start_game(datum/deathmatch_lobby/lobby) + lobby.modifiers -= type //remove it before attempting to select other modifiers, or they'll fail. + + var/static/list/static_pool + if(isnull(static_pool)) + static_pool = subtypesof(/datum/deathmatch_modifier) + for(var/datum/deathmatch_modifier/modpath as anything in static_pool) + if(initial(modpath.random_exempted)) + static_pool -= modpath + var/list/modifiers_pool = static_pool.Copy() + for(var/modpath in modifiers_pool) + var/datum/deathmatch_modifier/modifier = GLOB.deathmatch_game.modifiers[modpath] + if(!modifier.selectable(lobby)) + modifiers_pool -= modpath + + ///Pick global modifiers at random. + for(var/iteration in rand(3, 5)) + var/datum/deathmatch_modifier/modifier = GLOB.deathmatch_game.modifiers[pick_n_take(modifiers_pool)] + modifier.on_select(lobby) + modifier.on_start_game(lobby) + lobby += modifier.type + modifiers_pool -= modifier.blacklisted_modifiers + if(!length(modifiers_pool)) + return + +/datum/deathmatch_modifier/any_loadout + name = "Any Loadout Allowed" + description = "Watch players pick Instagib everytime" + random_exempted = TRUE + +/datum/deathmatch_modifier/any_loadout/selectable(datum/deathmatch_lobby/lobby) + . = ..() + if(!.) + return + return lobby.map.allowed_loadouts + +/datum/deathmatch_modifier/any_loadout/on_select(datum/deathmatch_lobby/lobby) + lobby.loadouts = GLOB.deathmatch_game.loadouts + +/datum/deathmatch_modifier/any_loadout/unselect(datum/deathmatch_lobby/lobby) + lobby.loadouts = lobby.map.allowed_loadouts + +/datum/deathmatch_modifier/any_loadout/on_map_changed(datum/deathmatch_lobby/lobby) + if(lobby.loadouts == GLOB.deathmatch_game.loadouts) //This arena already allows any loadout for some reason. + lobby.modifiers -= type + else + lobby.loadouts = GLOB.deathmatch_game.loadouts + +/datum/deathmatch_modifier/hear_global_chat + name = "Heightened Hearing" + description = "This lets you hear people through wall, as well as deadchat" + random_exempted = TRUE + +/datum/deathmatch_modifier/hear_global_chat/apply(mob/living/carbon/player, datum/deathmatch_lobby/lobby) + player.add_traits(list(TRAIT_SIXTHSENSE, TRAIT_XRAY_HEARING), DEATHMATCH_TRAIT) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 77452c11d2b..d31e204333b 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -49,7 +49,7 @@ /datum/bank_account/Destroy() if(add_to_accounts) SSeconomy.bank_accounts_by_id -= "[account_id]" - SSeconomy.bank_accounts_by_job[account_job] -= src + SSeconomy.bank_accounts_by_job[account_job.type] -= src QDEL_LIST(redeemed_coupons) return ..() @@ -72,7 +72,7 @@ stack_trace("Unable to find a unique account ID, substituting currently existing account of id [account_id].") SSeconomy.bank_accounts_by_id["[account_id]"] = src if(account_job) - LAZYADD(SSeconomy.bank_accounts_by_job[account_job], src) + LAZYADD(SSeconomy.bank_accounts_by_job[account_job.type], src) /datum/bank_account/vv_edit_var(var_name, var_value) // just so you don't have to do it manually var/old_id = account_id diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm index 4755df02fbd..15247d19d57 100644 --- a/code/modules/economy/holopay.dm +++ b/code/modules/economy/holopay.dm @@ -65,9 +65,8 @@ if(BURN) playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) -/obj/structure/holopay/deconstruct() +/obj/structure/holopay/atom_deconstruct(dissambled = TRUE) dissipate() - return ..() /obj/structure/holopay/Destroy() linked_card?.my_store = null @@ -255,7 +254,7 @@ /// Account checks var/obj/item/card/id/id_card id_card = user.get_idcard(TRUE) - if(!id_card || !id_card.registered_account || !id_card.registered_account.account_job) + if(isnull(id_card) || id_card.can_be_used_in_payment(user)) balloon_alert(user, "invalid account") to_chat(user, span_warning("You don't have a valid account.")) return FALSE diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 34681825502..0acb0ad9781 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -92,14 +92,14 @@ var/start_color = hsl_gradient(1, 0, "#A2FF80", 1, "#A2FFEE") var/start_range = 1 var/start_power = 0.75 - var/end_color = "#000000" + var/end_color = COLOR_BLACK var/end_range = 0.5 var/end_power = 0 if(fade_in) end_color = hsl_gradient(0, 0, "#A2FF80", 1, "#A2FFEE") end_range = start_range end_power = start_power - start_color = "#000000" + start_color = COLOR_BLACK start_range = 0.5 start_power = 0 diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm index 453b919c5b8..d2fcdda8314 100644 --- a/code/modules/events/camerafailure.dm +++ b/code/modules/events/camerafailure.dm @@ -17,8 +17,8 @@ var/obj/machinery/camera/C = pick_n_take(cameras) if (!C) break - if (!("ss13" in C.network)) + if (!(CAMERANET_NETWORK_SS13 in C.network)) continue - if(C.status) + if(C.camera_enabled) C.toggle_cam(null, 0) iterations *= 2.5 diff --git a/code/modules/events/ghost_role/abductor.dm b/code/modules/events/ghost_role/abductor.dm index 65fe4a142f5..dfa20885f0c 100644 --- a/code/modules/events/ghost_role/abductor.dm +++ b/code/modules/events/ghost_role/abductor.dm @@ -14,7 +14,7 @@ fakeable = FALSE //Nothing to fake here /datum/round_event/ghost_role/abductor/spawn_role() - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ABDUCTOR, role = ROLE_ABDUCTOR, pic_source = /obj/item/melee/baton/abductor, role_name_text = role_name) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ABDUCTOR, role = ROLE_ABDUCTOR, alert_pic = /obj/item/melee/baton/abductor, role_name_text = role_name, amount_to_pick = 2) if(candidates.len < 2) return NOT_ENOUGH_PLAYERS diff --git a/code/modules/events/ghost_role/alien_infestation.dm b/code/modules/events/ghost_role/alien_infestation.dm index f4078e52e65..88e79fd7d60 100644 --- a/code/modules/events/ghost_role/alien_infestation.dm +++ b/code/modules/events/ghost_role/alien_infestation.dm @@ -62,7 +62,7 @@ message_admins("An event attempted to spawn an alien but no suitable vents were found. Shutting down.") return MAP_ERROR - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, pic_source = /mob/living/carbon/alien/larva, role_name_text = role_name) + var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, alert_pic = /mob/living/carbon/alien/larva, role_name_text = role_name) if(!candidates.len) return NOT_ENOUGH_PLAYERS diff --git a/code/modules/events/ghost_role/blob.dm b/code/modules/events/ghost_role/blob.dm index 70640512699..8e83351f5c0 100644 --- a/code/modules/events/ghost_role/blob.dm +++ b/code/modules/events/ghost_role/blob.dm @@ -33,10 +33,10 @@ blob_icon.Blend("#9ACD32", ICON_MULTIPLY) blob_icon.Blend(icon('icons/mob/nonhuman-player/blob.dmi', "blob_core_overlay"), ICON_OVERLAY) var/image/blob_image = image(blob_icon) - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_BLOB, role = ROLE_BLOB, pic_source = blob_image, role_name_text = role_name) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_BLOB, role = ROLE_BLOB, alert_pic = blob_image, role_name_text = role_name, amount_to_pick = 1, chat_text_border_icon = blob_image) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - var/mob/dead/observer/new_blob = pick(candidates) + var/mob/dead/observer/new_blob = chosen_one var/mob/camera/blob/BC = new_blob.become_overmind() spawned_mobs += BC message_admins("[ADMIN_LOOKUPFLW(BC)] has been made into a blob overmind by an event.") diff --git a/code/modules/events/ghost_role/changeling_event.dm b/code/modules/events/ghost_role/changeling_event.dm index 43b4ca48af5..ce34aaa07fa 100644 --- a/code/modules/events/ghost_role/changeling_event.dm +++ b/code/modules/events/ghost_role/changeling_event.dm @@ -21,12 +21,9 @@ fakeable = FALSE /datum/round_event/ghost_role/changeling/spawn_role() - var/list/mob/dead/observer/candidate = SSpolling.poll_ghost_candidates(check_jobban = ROLE_CHANGELING, role = ROLE_CHANGELING_MIDROUND, pic_source = /obj/item/melee/arm_blade, role_name_text = role_name) - - if(!candidate.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_CHANGELING, role = ROLE_CHANGELING_MIDROUND, alert_pic = /obj/item/melee/arm_blade, role_name_text = role_name, amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - spawned_mobs += generate_changeling_meteor(pick_n_take(candidate)) - + spawned_mobs += generate_changeling_meteor(chosen_one) if(spawned_mobs) return SUCCESSFUL_SPAWN diff --git a/code/modules/events/ghost_role/fugitive_event.dm b/code/modules/events/ghost_role/fugitive_event.dm index 4b86e751c0b..88d63d91bb5 100644 --- a/code/modules/events/ghost_role/fugitive_event.dm +++ b/code/modules/events/ghost_role/fugitive_event.dm @@ -20,7 +20,7 @@ if(isnull(landing_turf)) return MAP_ERROR var/list/possible_backstories = list() - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_FUGITIVE, role = ROLE_FUGITIVE, pic_source = /obj/item/card/id/advanced/prisoner) + var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_FUGITIVE, role = ROLE_FUGITIVE, alert_pic = /obj/item/card/id/advanced/prisoner, jump_target = landing_turf) if(!length(candidates)) return NOT_ENOUGH_PLAYERS @@ -105,13 +105,13 @@ /datum/round_event/ghost_role/fugitives/proc/check_spawn_hunters(backstory, remaining_time) //if the emergency shuttle has been called, spawn hunters now to give them a chance - if(remaining_time == 0 || SSshuttle.emergency.mode != EMERGENCY_IDLE_OR_RECALLED) + if(remaining_time == 0 || !EMERGENCY_IDLE_OR_RECALLED) spawn_hunters(backstory) return addtimer(CALLBACK(src, PROC_REF(check_spawn_hunters), backstory, remaining_time - 1 MINUTES), 1 MINUTES) /datum/round_event/ghost_role/fugitives/proc/spawn_hunters(backstory) - var/list/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a group of [backstory]?", check_jobban = ROLE_FUGITIVE_HUNTER, pic_source = /obj/machinery/sleeper, role_name_text = backstory) + var/list/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a group of [span_notice(backstory)]?", check_jobban = ROLE_FUGITIVE_HUNTER, alert_pic = /obj/machinery/sleeper, role_name_text = backstory) shuffle_inplace(candidates) var/datum/map_template/shuttle/hunter/ship diff --git a/code/modules/events/ghost_role/morph_event.dm b/code/modules/events/ghost_role/morph_event.dm index c9133863f8c..21d4b07873d 100644 --- a/code/modules/events/ghost_role/morph_event.dm +++ b/code/modules/events/ghost_role/morph_event.dm @@ -13,13 +13,10 @@ role_name = "morphling" /datum/round_event/ghost_role/morph/spawn_role() - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, pic_source = /mob/living/basic/morph, role_name_text = "morph") - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, alert_pic = /mob/living/basic/morph, role_name_text = "morph", amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) + var/datum/mind/player_mind = new /datum/mind(chosen_one.key) player_mind.active = TRUE var/turf/spawn_loc = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = FALSE) diff --git a/code/modules/events/ghost_role/nightmare.dm b/code/modules/events/ghost_role/nightmare.dm index ffb206c476d..d30108d94b9 100644 --- a/code/modules/events/ghost_role/nightmare.dm +++ b/code/modules/events/ghost_role/nightmare.dm @@ -15,13 +15,10 @@ fakeable = FALSE /datum/round_event/ghost_role/nightmare/spawn_role() - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_NIGHTMARE, role_name_text = role_name) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_NIGHTMARE, role_name_text = role_name, amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) + var/datum/mind/player_mind = new /datum/mind(chosen_one.key) player_mind.active = TRUE var/turf/spawn_loc = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE) diff --git a/code/modules/events/ghost_role/operative.dm b/code/modules/events/ghost_role/operative.dm index fcea52e3c02..98cfe5ecad4 100644 --- a/code/modules/events/ghost_role/operative.dm +++ b/code/modules/events/ghost_role/operative.dm @@ -12,20 +12,16 @@ fakeable = FALSE /datum/round_event/ghost_role/operative/spawn_role() - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_OPERATIVE, role = ROLE_LONE_OPERATIVE, pic_source = /obj/machinery/nuclearbomb) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_OPERATIVE, role = ROLE_LONE_OPERATIVE, alert_pic = /obj/machinery/nuclearbomb, amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - var/spawn_location = find_space_spawn() if(isnull(spawn_location)) return MAP_ERROR - var/mob/living/carbon/human/operative = new(spawn_location) operative.randomize_human_appearance(~RANDOMIZE_SPECIES) operative.dna.update_dna_identity() - var/datum/mind/Mind = new /datum/mind(selected.key) + var/datum/mind/Mind = new /datum/mind(chosen_one.key) Mind.set_assigned_role(SSjob.GetJobType(/datum/job/lone_operative)) Mind.special_role = ROLE_LONE_OPERATIVE Mind.active = TRUE diff --git a/code/modules/events/ghost_role/revenant_event.dm b/code/modules/events/ghost_role/revenant_event.dm index 6cdfc2c4c9e..7af53b847c8 100644 --- a/code/modules/events/ghost_role/revenant_event.dm +++ b/code/modules/events/ghost_role/revenant_event.dm @@ -30,14 +30,10 @@ message_admins("Event attempted to spawn a revenant, but there were only [deadMobs]/[REVENANT_SPAWN_THRESHOLD] dead mobs.") return WAITING_FOR_SOMETHING - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_REVENANT, role = ROLE_REVENANT, pic_source = /mob/living/basic/revenant) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_REVENANT, role = ROLE_REVENANT, alert_pic = /mob/living/basic/revenant, amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/observer/selected = pick_n_take(candidates) - var/list/spawn_locs = list() - for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies var/turf/T = get_turf(L) if(T && is_station_level(T.z)) @@ -50,16 +46,16 @@ if(!spawn_locs.len) //If we can't find any valid spawnpoints, try the carp spawns spawn_locs += find_space_spawn() if(!spawn_locs.len) //If we can't find either, just spawn the revenant at the player's location - spawn_locs += get_turf(selected) + spawn_locs += get_turf(chosen_one) if(!spawn_locs.len) //If we can't find THAT, then just give up and cry return MAP_ERROR var/mob/living/basic/revenant/revvie = new(pick(spawn_locs)) - revvie.key = selected.key + revvie.key = chosen_one.key message_admins("[ADMIN_LOOKUPFLW(revvie)] has been made into a revenant by an event.") revvie.log_message("was spawned as a revenant by an event.", LOG_GAME) spawned_mobs += revvie - qdel(selected) + qdel(chosen_one) return SUCCESSFUL_SPAWN #undef REVENANT_SPAWN_THRESHOLD diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index 8ebd30ad7b3..3aeebd298f4 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /datum/round_event/ghost_role/sentience/spawn_role() var/list/mob/dead/observer/candidates - candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, pic_source = /obj/item/slimepotion/slime/sentience, role_name_text = role_name) + candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, alert_pic = /obj/item/slimepotion/slime/sentience, role_name_text = role_name) // find our chosen mob to breathe life into // Mobs have to be simple animals, mindless, on station, and NOT holograms. diff --git a/code/modules/events/ghost_role/sentient_disease.dm b/code/modules/events/ghost_role/sentient_disease.dm index 44f78d7c08c..156988d4b20 100644 --- a/code/modules/events/ghost_role/sentient_disease.dm +++ b/code/modules/events/ghost_role/sentient_disease.dm @@ -13,14 +13,11 @@ role_name = "sentient disease" /datum/round_event/ghost_role/sentient_disease/spawn_role() - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, pic_source = /obj/structure/sign/warning/biohazard, role_name_text = role_name) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, alert_pic = /obj/structure/sign/warning/biohazard, role_name_text = role_name, amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/observer/selected = pick_n_take(candidates) - var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = selected.key + virus.key = chosen_one.key INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.") virus.log_message("was spawned as a sentient disease by an event.", LOG_GAME) diff --git a/code/modules/events/ghost_role/slaughter_event.dm b/code/modules/events/ghost_role/slaughter_event.dm index f4628344d2f..f7af4c22d1a 100644 --- a/code/modules/events/ghost_role/slaughter_event.dm +++ b/code/modules/events/ghost_role/slaughter_event.dm @@ -16,13 +16,10 @@ role_name = "slaughter demon" /datum/round_event/ghost_role/slaughter/spawn_role() - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, pic_source = /mob/living/basic/demon/slaughter, role_name_text = role_name) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, alert_pic = /mob/living/basic/demon/slaughter, role_name_text = role_name, amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) + var/datum/mind/player_mind = new /datum/mind(chosen_one.key) player_mind.active = TRUE var/spawn_location = find_space_spawn() @@ -32,7 +29,6 @@ new /obj/effect/dummy/phased_mob(spawn_location, spawned) player_mind.transfer_to(spawned) - spawned.generate_antagonist_status() message_admins("[ADMIN_LOOKUPFLW(spawned)] has been made into a slaughter demon by an event.") spawned.log_message("was spawned as a slaughter demon by an event.", LOG_GAME) diff --git a/code/modules/events/ghost_role/space_dragon.dm b/code/modules/events/ghost_role/space_dragon.dm index 0a328f6dc8d..8a39d4a5dae 100644 --- a/code/modules/events/ghost_role/space_dragon.dm +++ b/code/modules/events/ghost_role/space_dragon.dm @@ -19,20 +19,14 @@ priority_announce("A large organic energy flux has been recorded near [station_name()], please stand by.", "Lifesign Alert") /datum/round_event/ghost_role/space_dragon/spawn_role() - - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SPACE_DRAGON, role = ROLE_SPACE_DRAGON, pic_source = /mob/living/basic/space_dragon) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SPACE_DRAGON, role = ROLE_SPACE_DRAGON, alert_pic = /mob/living/basic/space_dragon, amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - var/key = selected.key - var/spawn_location = find_space_spawn() if(isnull(spawn_location)) return MAP_ERROR - - var/mob/living/basic/space_dragon/dragon = new (spawn_location) - dragon.key = key + var/mob/living/basic/space_dragon/dragon = new(spawn_location) + dragon.key = chosen_one.key dragon.mind.add_antag_datum(/datum/antagonist/space_dragon) playsound(dragon, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) message_admins("[ADMIN_LOOKUPFLW(dragon)] has been made into a Space Dragon by an event.") diff --git a/code/modules/events/ghost_role/space_ninja.dm b/code/modules/events/ghost_role/space_ninja.dm index 8997acc4fc9..82fc0f20ccd 100644 --- a/code/modules/events/ghost_role/space_ninja.dm +++ b/code/modules/events/ghost_role/space_ninja.dm @@ -19,16 +19,12 @@ return MAP_ERROR //selecting a candidate player - var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_NINJA, role = ROLE_NINJA, pic_source = /obj/item/energy_katana) - if(!candidates.len) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(check_jobban = ROLE_NINJA, role = ROLE_NINJA, alert_pic = /obj/item/energy_katana, jump_target = spawn_location, role_name_text = "space ninja", amount_to_pick = 1) + if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected_candidate = pick(candidates) - var/key = selected_candidate.key - //spawn the ninja and assign the candidate var/mob/living/carbon/human/ninja = create_space_ninja(spawn_location) - ninja.key = key + ninja.key = chosen_one.key ninja.mind.add_antag_datum(/datum/antagonist/ninja) spawned_mobs += ninja // SKYRAT EDIT ADDITION BEGIN: Preference Ninjas diff --git a/code/modules/events/holiday/easter.dm b/code/modules/events/holiday/easter.dm index ddade60e287..40c7fda57c3 100644 --- a/code/modules/events/holiday/easter.dm +++ b/code/modules/events/holiday/easter.dm @@ -26,13 +26,22 @@ /datum/round_event/rabbitrelease/start() - for(var/obj/effect/landmark/R in GLOB.landmarks_list) - if(R.name != "blobspawn") - if(prob(35)) - if(isspaceturf(R.loc)) - new /mob/living/basic/rabbit/easter/space(R.loc) - else - new /mob/living/basic/rabbit/easter(R.loc) + + for(var/obj/effect/landmark/event_spawn/spawn_point as anything in GLOB.generic_event_spawns) //Common public bunnies + if(prob(35)) + new /mob/living/basic/rabbit/easter(spawn_point.loc) + CHECK_TICK + + for(var/obj/effect/landmark/event_spawn/spawn_point as anything in GLOB.generic_maintenance_landmarks) // The rare maint bunnies + if(prob(15)) + new /mob/living/basic/rabbit/easter(spawn_point.loc) + CHECK_TICK + + for(var/obj/effect/landmark/carpspawn/spawn_point in GLOB.landmarks_list) // The rare space bunnies + if(prob(15)) + new /mob/living/basic/rabbit/easter/space(spawn_point.loc) + CHECK_TICK + //Easter Baskets /obj/item/storage/basket/easter diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 7eb89e84bc0..2d8a3bc5496 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -79,14 +79,15 @@ poll_time = 30 SECONDS, flash_window = FALSE, start_signed_up = TRUE, - pic_source = /obj/item/storage/fancy/heart_box, + alert_pic = /obj/item/storage/fancy/heart_box, custom_response_messages = list( POLL_RESPONSE_SIGNUP = "You have signed up for a date!", POLL_RESPONSE_ALREADY_SIGNED = "You are already signed up for a date.", POLL_RESPONSE_NOT_SIGNED = "You aren't signed up for a date.", POLL_RESPONSE_TOO_LATE_TO_UNREGISTER = "It's too late to decide against going on a date.", - POLL_RESPONSE_UNREGISTERED = "You deicde against going on a date.", + POLL_RESPONSE_UNREGISTERED = "You decide against going on a date.", ), + chat_text_border_icon = /obj/item/storage/fancy/heart_box, ) for(var/mob/living/second_check as anything in candidates_pruned) diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 1404a8ef5eb..0ab024de6f1 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -84,11 +84,9 @@ priority_announce("Santa is coming to town!", "Unknown Transmission") /datum/round_event/santa/start() - var/list/candidates = SSpolling.poll_ghost_candidates("Santa is coming to town! Do you want to be Santa?", poll_time = 15 SECONDS, pic_source = /obj/item/clothing/head/costume/santa, role_name_text = "santa") - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Santa is coming to town! Do you want to be [span_notice("Santa")]?", poll_time = 15 SECONDS, alert_pic = /obj/item/clothing/head/costume/santa, role_name_text = "santa", amount_to_pick = 1) + if(chosen_one) santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) - santa.key = C.key - + santa.key = chosen_one.key var/datum/antagonist/santa/A = new santa.mind.add_antag_datum(A) diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 8ad0b48985f..0ca7800ee22 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -51,7 +51,7 @@ for(var/offset in 0 to SSmapping.max_plane_offset) var/mutable_appearance/storm = mutable_appearance('icons/obj/machines/engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER) SET_PLANE_W_SCALAR(storm, ABOVE_GAME_PLANE, offset) - storm.color = "#00FF00" + storm.color = COLOR_VIBRANT_LIME storm_appearances += storm number_of_bosses = 0 diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index e783f18ec02..274d45aa7ca 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -102,7 +102,8 @@ crate.update_appearance() var/obj/structure/closet/supplypod/pod = make_pod() var/obj/effect/pod_landingzone/landing_marker = new(landing_zone, pod, crate) - announce_to_ghosts(landing_marker) + var/static/mutable_appearance/target_appearance = mutable_appearance('icons/obj/supplypods_32x32.dmi', "LZ") + notify_ghosts("[control.name] has summoned a supply crate!", source = get_turf(landing_marker), header = "Cargo Inbound", alert_overlay = target_appearance) ///Handles the creation of the pod, in case it needs to be modified beforehand /datum/round_event/stray_cargo/proc/make_pod() diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm index 1ecd43797e5..fbe824c06e6 100644 --- a/code/modules/events/wisdomcow.dm +++ b/code/modules/events/wisdomcow.dm @@ -7,17 +7,20 @@ description = "A cow appears to tell you wise words." admin_setup = list( /datum/event_admin_setup/set_location/wisdom_cow, - /datum/event_admin_setup/listed_options/wisdom_cow, + /datum/event_admin_setup/listed_options/wisdom_cow_wisdom, /datum/event_admin_setup/input_number/wisdom_cow, + /datum/event_admin_setup/listed_options/wisdom_cow_milk, ) /datum/round_event/wisdomcow ///Location override that, if set causes the cow to spawn in a pre-determined locaction instead of randomly. var/turf/spawn_location - ///An override that, if set rigs the cow to spawn with a specific wisdow rather than a random one. + ///An override that if set rigs the cow to spawn with a specific wisdow rather than a random one. var/selected_wisdom - ///An override that, if set modifies the amount of wisdow the cow will add/remove, if not set will default to 500. + ///An override that if set modifies the amount of wisdow the cow will add/remove, if not set will default to 500. var/selected_experience + ///An override that if set modifies what you can milk out of the cow + var/datum/reagent/forced_reagent_type /datum/round_event/wisdomcow/announce(fake) priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Nanotrasen Cow Ranching Agency") @@ -28,7 +31,7 @@ targetloc = spawn_location else targetloc = get_safe_random_station_turf() - var/mob/living/basic/cow/wisdom/wise = new(targetloc, selected_wisdom, selected_experience) + var/mob/living/basic/cow/wisdom/wise = new(targetloc, selected_wisdom, selected_experience, forced_reagent_type) do_smoke(1, holder = wise, location = targetloc) announce_to_ghosts(wise) @@ -38,14 +41,14 @@ /datum/event_admin_setup/set_location/wisdom_cow/apply_to_event(datum/round_event/wisdomcow/event) event.spawn_location = chosen_turf -/datum/event_admin_setup/listed_options/wisdom_cow +/datum/event_admin_setup/listed_options/wisdom_cow_wisdom input_text = "Select a specific wisdom type?" normal_run_option = "Random Wisdom" -/datum/event_admin_setup/listed_options/wisdom_cow/get_list() +/datum/event_admin_setup/listed_options/wisdom_cow_wisdom/get_list() return subtypesof(/datum/skill) -/datum/event_admin_setup/listed_options/wisdom_cow/apply_to_event(datum/round_event/wisdomcow/event) +/datum/event_admin_setup/listed_options/wisdom_cow_wisdom/apply_to_event(datum/round_event/wisdomcow/event) event.selected_wisdom = chosen /datum/event_admin_setup/input_number/wisdom_cow @@ -56,5 +59,13 @@ /datum/event_admin_setup/input_number/wisdom_cow/apply_to_event(datum/round_event/wisdomcow/event) event.selected_experience = chosen_value - - + +/datum/event_admin_setup/listed_options/wisdom_cow_milk + input_text = "Select a kind of milk?" + normal_run_option = "Random Reagent" + +/datum/event_admin_setup/listed_options/wisdom_cow_milk/get_list() + return sort_list(subtypesof(/datum/reagent), /proc/cmp_typepaths_asc) + +/datum/event_admin_setup/listed_options/wisdom_cow_milk/apply_to_event(datum/round_event/scrubber_overflow/event) + event.forced_reagent_type = chosen diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 82994226142..c2fb5472bdd 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -13,20 +13,17 @@ if(!ishuman(M.current)) continue var/mob/living/carbon/human/W = M.current - var/list/candidates = SSpolling.poll_ghost_candidates("Would you like to be an imposter wizard?", check_jobban = ROLE_WIZARD, pic_source = /obj/item/clothing/head/wizard, role_name_text = "imposter wizard") - if(!length(candidates)) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Would you like to be an [span_notice("imposter wizard")]?", check_jobban = ROLE_WIZARD, alert_pic = /obj/item/clothing/head/wizard, jump_target = W, role_name_text = "imposter wizard", amount_to_pick = 1) + if(isnull(chosen_one)) return //Sad Trombone - var/mob/dead/observer/C = pick(candidates) - new /obj/effect/particle_effect/fluid/smoke(W.loc) - var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc) W.dna.transfer_identity(I, transfer_SE=1) I.real_name = I.dna.real_name I.name = I.dna.real_name I.updateappearance(mutcolor_update=1) I.domutcheck() - I.key = C.key + I.key = chosen_one.key var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard) if(!master.wiz_team) master.create_wiz_team() diff --git a/code/modules/experisci/destructive_scanner.dm b/code/modules/experisci/destructive_scanner.dm index de0b03b0f09..5740b715bd4 100644 --- a/code/modules/experisci/destructive_scanner.dm +++ b/code/modules/experisci/destructive_scanner.dm @@ -42,7 +42,7 @@ return aggressive = TRUE start_closing(aggressive) - use_power(idle_power_usage) + use_energy(idle_power_usage) ///Closes the machine to kidnap everything in the turf into it. /obj/machinery/destructive_scanner/proc/start_closing(aggressive) @@ -55,7 +55,7 @@ scanning = TRUE update_icon() playsound(src, 'sound/machines/destructive_scanner/TubeDown.ogg', 100) - use_power(idle_power_usage) + use_energy(idle_power_usage) addtimer(CALLBACK(src, PROC_REF(start_scanning), aggressive), 1.2 SECONDS) ///Starts scanning the fancy scanning effects @@ -64,7 +64,7 @@ playsound(src, 'sound/machines/destructive_scanner/ScanDangerous.ogg', 100, extrarange = 5) else playsound(src, 'sound/machines/destructive_scanner/ScanSafe.ogg', 100) - use_power(active_power_usage) + use_energy(active_power_usage) addtimer(CALLBACK(src, PROC_REF(finish_scanning), aggressive), 6 SECONDS) diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index 6ab4f1c89ef..dbf1c1a4242 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -331,32 +331,12 @@ ///Damage percent that each mech needs to be at for a scan to work. var/damage_percent -/datum/experiment/scanning/random/mecha_damage_scan/New(datum/techweb/techweb) - . = ..() - damage_percent = rand(15, 95) - //updating the description with the damage_percent var set - description = "Your exosuit fabricators allow for rapid production on a small scale, but the structural integrity of created parts is inferior to those made with more traditional means. Damage a few exosuits to around [damage_percent]% integrity and scan them to help us determine how the armor fails under stress." - -/datum/experiment/scanning/random/mecha_damage_scan/final_contributing_index_checks(atom/target, typepath) - var/found_percent = round((target.get_integrity() / target.max_integrity) * 100) - return ..() && ISINRANGE(found_percent, damage_percent - 5, damage_percent + 5) - /datum/experiment/scanning/random/mecha_equipped_scan name = "Exosuit Materials 2: Load Strain Test" description = "Exosuit equipment places unique strain upon the structure of the vehicle. Scan exosuits you have assembled from your exosuit fabricator and fully equipped to accelerate our structural stress simulations." possible_types = list(/obj/vehicle/sealed/mecha) total_requirement = 2 -/datum/experiment/scanning/random/mecha_equipped_scan/final_contributing_index_checks(atom/target, typepath) - var/obj/vehicle/sealed/mecha/stompy = target - if(!istype(stompy)) - return FALSE //Not a mech - if(!HAS_TRAIT(stompy,TRAIT_MECHA_CREATED_NORMALLY)) - return FALSE //Not hand-crafted - if(!(stompy.equip_by_category[MECHA_L_ARM] && stompy.equip_by_category[MECHA_R_ARM])) - return FALSE //Both arms need be filled - return ..() - /// Scan for organs you didn't start the round with /datum/experiment/scanning/people/novel_organs name = "Human Field Research: Divergent Biology" diff --git a/code/modules/experisci/experiment/handlers/experiment_handler.dm b/code/modules/experisci/experiment/handlers/experiment_handler.dm index ef4cd581cb9..e2d460e3903 100644 --- a/code/modules/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/experisci/experiment/handlers/experiment_handler.dm @@ -128,16 +128,17 @@ if(!(config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) to_chat(user, span_notice("You do not have an experiment selected!")) return - if(!(config_flags & EXPERIMENT_CONFIG_IMMEDIATE_ACTION) && !do_after(user, 1 SECONDS, target = target)) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/research, SKILL_SPEED_MODIFIER) //SKYRAT EDIT: Research Skill (simple research) + if(!(config_flags & EXPERIMENT_CONFIG_IMMEDIATE_ACTION) && !do_after(user, 1 SECONDS * skill_modifier, target = target)) //SKYRAT EDIT: Research Skill (simple research) return if(action_experiment(source, target)) playsound(user, 'sound/machines/ping.ogg', 25) to_chat(user, span_notice("You scan [target].")) + user.mind.adjust_experience(/datum/skill/research, 5) //SKYRAT EDIT: Research Skill (simple research) else if(!(config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) playsound(user, 'sound/machines/buzz-sigh.ogg', 25) to_chat(user, span_notice("[target] is not related to your currently selected experiment.")) - /** * Hooks on destructive scans to try and run an experiment (When using a handheld handler) */ diff --git a/code/modules/experisci/experiment/types/random_scanning.dm b/code/modules/experisci/experiment/types/random_scanning.dm index c9d39bd47b4..46fce9af599 100644 --- a/code/modules/experisci/experiment/types/random_scanning.dm +++ b/code/modules/experisci/experiment/types/random_scanning.dm @@ -19,3 +19,25 @@ // Fill the experiment as per usual ..() + +/datum/experiment/scanning/random/mecha_damage_scan/New(datum/techweb/techweb) + . = ..() + damage_percent = rand(15, 95) + //updating the description with the damage_percent var set + description = "Your exosuit fabricators allow for rapid production on a small scale, but the structural integrity of created parts is inferior to those made with more traditional means. Damage a few exosuits to around [damage_percent]% integrity and scan them to help us determine how the armor fails under stress." + +/datum/experiment/scanning/random/mecha_damage_scan/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) + var/found_percent = round((target.get_integrity() / target.max_integrity) * 100) + return ..() && ISINRANGE(found_percent, damage_percent - 5, damage_percent + 5) + +/datum/experiment/scanning/random/mecha_equipped_scan/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) + var/obj/vehicle/sealed/mecha/stompy = target + if(!istype(stompy)) + return FALSE //Not a mech + if(!HAS_TRAIT(stompy,TRAIT_MECHA_CREATED_NORMALLY)) + experiment_handler.announce_message("Scanned mech was not made by crew. There is nothing to learn here.") + return FALSE //Not hand-crafted + if(!(stompy.equip_by_category[MECHA_L_ARM] && stompy.equip_by_category[MECHA_R_ARM])) + experiment_handler.announce_message("Scanned mech is missing equipment on their arms to proceed this experiment.") + return FALSE //Both arms need be filled + return ..() diff --git a/code/modules/experisci/experiment/types/scanning.dm b/code/modules/experisci/experiment/types/scanning.dm index 54bd2ad637e..08ddf066f9b 100644 --- a/code/modules/experisci/experiment/types/scanning.dm +++ b/code/modules/experisci/experiment/types/scanning.dm @@ -33,8 +33,7 @@ /** * Checks if the scanning experiment is complete * - * Returns TRUE/FALSE as to if the necessary number of atoms have been - * scanned. + * Returns TRUE/FALSE as to if the necessary number of atoms have been scanned. */ /datum/experiment/scanning/is_complete() . = TRUE @@ -84,8 +83,8 @@ * * target - The atom to attempt to scan */ /datum/experiment/scanning/perform_experiment_actions(datum/component/experiment_handler/experiment_handler, atom/target) - var/contributing_index_value = get_contributing_index(target) - if (contributing_index_value) + var/contributing_index_value = experiment_requirements(experiment_handler, target) + if (!isnull(contributing_index_value)) if(traits & EXPERIMENT_TRAIT_TYPECACHE) scanned[contributing_index_value][target.type] = TRUE else @@ -96,7 +95,7 @@ return TRUE /datum/experiment/scanning/actionable(datum/component/experiment_handler/experiment_handler, atom/target) - return ..() && get_contributing_index(target) + return ..() && !isnull(experiment_requirements(experiment_handler, target)) /** * Attempts to get the typepath for an atom that would contribute to the experiment @@ -106,12 +105,11 @@ * Arguments: * * target - The atom to attempt to scan */ -/datum/experiment/scanning/proc/get_contributing_index(atom/target) - var/destructive = traits & EXPERIMENT_TRAIT_DESTRUCTIVE +/datum/experiment/scanning/proc/experiment_requirements(datum/component/experiment_handler/experiment_handler, atom/target) + var/destructive = (traits & EXPERIMENT_TRAIT_DESTRUCTIVE) for (var/req_atom in required_atoms) if (!istype(target, req_atom)) continue - // Try to select a required atom that this scanned atom would contribute towards var/selected var/list/seen = scanned[req_atom] @@ -119,21 +117,20 @@ selected = req_atom else if (!destructive && seen.len < required_atoms[req_atom] && !(WEAKREF(target) in seen)) selected = req_atom - // Run any additonal checks if necessary - if (selected && final_contributing_index_checks(target, selected)) + if (selected && final_contributing_index_checks(experiment_handler, target, selected)) return selected /** * Performs any additional checks against the atom being considered for selection as a contributing index * * This proc is intended to be used to add additional functionality to contributing index checks - * without having to duplicate the iteration structure of get_contributing_index() + * without having to duplicate the iteration structure of experiment_requirements() * Arguments: * * target - The atom being scanned * * typepath - The typepath (selected index) of the target atom */ -/datum/experiment/scanning/proc/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/proc/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) return TRUE /** diff --git a/code/modules/experisci/experiment/types/scanning_fish.dm b/code/modules/experisci/experiment/types/scanning_fish.dm index a8fc5a7045c..b5d2c0d65f9 100644 --- a/code/modules/experisci/experiment/types/scanning_fish.dm +++ b/code/modules/experisci/experiment/types/scanning_fish.dm @@ -63,7 +63,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) examine_list += message ///Only scannable fish will contribute towards the experiment. -/datum/experiment/scanning/fish/final_contributing_index_checks(obj/item/fish/target, typepath) +/datum/experiment/scanning/fish/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, obj/item/fish/target, typepath) return target.experisci_scannable /** @@ -104,7 +104,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) fish_source_reward = /datum/fish_source/portal/random ///holo fishes are normally unscannable, but this is an experiment for them, so we don't care for the experisci_scannable variable. -/datum/experiment/scanning/fish/holographic/final_contributing_index_checks(obj/item/fish/target, typepath) +/datum/experiment/scanning/fish/holographic/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, obj/item/fish/target, typepath) return TRUE /datum/experiment/scanning/fish/fourth diff --git a/code/modules/experisci/experiment/types/scanning_machinery.dm b/code/modules/experisci/experiment/types/scanning_machinery.dm index 97a75a2b355..c25e9dc7cf0 100644 --- a/code/modules/experisci/experiment/types/scanning_machinery.dm +++ b/code/modules/experisci/experiment/types/scanning_machinery.dm @@ -12,7 +12,7 @@ . = ..() .[1] = EXPERIMENT_PROG_INT("Scan samples of the following machines built with parts of tier [required_tier] or better.", points, required_points)[1] -/datum/experiment/scanning/points/machinery_tiered_scan/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/points/machinery_tiered_scan/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) . = ..() if(!.) return FALSE @@ -26,6 +26,7 @@ for(var/datum/stock_part/datum_stock_part in machine.component_parts) if(datum_stock_part.tier >= required_tier) return TRUE + experiment_handler.announce_message("Scanned machine is missing high enough quality parts. Expecting tier [required_tier] parts or better.") return FALSE //This experiment type will turn up TRUE if there is a specific part in the scanned machine @@ -42,7 +43,7 @@ . = ..() .[1] = EXPERIMENT_PROG_INT("Scan samples of the following machines upgraded with \a [initial(required_stock_part.name)] to accumulate enough points to complete this experiment.", points, required_points)[1] -/datum/experiment/scanning/points/machinery_pinpoint_scan/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/points/machinery_pinpoint_scan/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) . = ..() if(!.) return FALSE @@ -56,4 +57,5 @@ for(var/datum/stock_part/datum_stock_part in machine.component_parts) if(istype(datum_stock_part.physical_object_reference, required_stock_part)) return TRUE + experiment_handler.announce_message("Scanned machine is missing an exact quality part. Expecting tier [required_stock_part.name] part.") return FALSE diff --git a/code/modules/experisci/experiment/types/scanning_material.dm b/code/modules/experisci/experiment/types/scanning_material.dm index fb8a7ff354b..f65950d0479 100644 --- a/code/modules/experisci/experiment/types/scanning_material.dm +++ b/code/modules/experisci/experiment/types/scanning_material.dm @@ -15,7 +15,7 @@ var/chosen_material = pick(possible_material_types) required_materials[req_atom] = chosen_material -/datum/experiment/scanning/random/material/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/random/material/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) return ..() && target.custom_materials && target.has_material_type(required_materials[typepath]) /datum/experiment/scanning/random/material/serialize_progress_stage(atom/target, list/seen_instances) diff --git a/code/modules/experisci/experiment/types/scanning_people.dm b/code/modules/experisci/experiment/types/scanning_people.dm index 27c4168dfba..379d7e90895 100644 --- a/code/modules/experisci/experiment/types/scanning_people.dm +++ b/code/modules/experisci/experiment/types/scanning_people.dm @@ -12,7 +12,7 @@ required_atoms = list(/mob/living/carbon/human = required_count) return ..() -/datum/experiment/scanning/people/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/people/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) . = ..() if(!.) return FALSE diff --git a/code/modules/experisci/experiment/types/scanning_plants.dm b/code/modules/experisci/experiment/types/scanning_plants.dm index b92a4cc20b4..a8e45b76ff0 100644 --- a/code/modules/experisci/experiment/types/scanning_plants.dm +++ b/code/modules/experisci/experiment/types/scanning_plants.dm @@ -21,12 +21,14 @@ return EXPERIMENT_PROG_INT("Scan samples of a harvested plant.", \ traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? scanned[target] : seen_instances.len, required_atoms[target]) -/datum/experiment/scanning/random/plants/traits/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/random/plants/traits/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) if(!istype(target, /obj/item/food/grown)) return FALSE var/obj/item/food/grown/crop = target if(possible_plant_genes.len) - return ..() && crop.seed.get_gene(required_genes[typepath]) + if(isnull(crop.seed.get_gene(required_genes[typepath]))) + experiment_handler.announce_message("Scanned plant is missing required genetics. Please scan a plant with the proper genetics.") + return ..() && !isnull(crop.seed.get_gene(required_genes[typepath])) return ..() /datum/experiment/scanning/random/plants/traits/serialize_progress_stage(atom/target, list/seen_instances) @@ -35,5 +37,5 @@ return EXPERIMENT_PROG_INT("Scan samples of harvested plants with the trait: [initial(gene.name)].", \ traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? scanned[target] : seen_instances.len, required_atoms[target]) -/datum/experiment/scanning/random/plants/wild/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/random/plants/wild/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) return ..() && HAS_TRAIT(target, TRAIT_PLANT_WILDMUTATE) diff --git a/code/modules/experisci/experiment/types/scanning_points.dm b/code/modules/experisci/experiment/types/scanning_points.dm index 9ac135ffcc0..2aca43a256c 100644 --- a/code/modules/experisci/experiment/types/scanning_points.dm +++ b/code/modules/experisci/experiment/types/scanning_points.dm @@ -24,7 +24,7 @@ var/types_joined = types.Join(", ") . += EXPERIMENT_PROG_DETAIL("[text2num(point_amt)] point\s: [types_joined]", complete) -/datum/experiment/scanning/points/get_contributing_index(atom/target) +/datum/experiment/scanning/points/experiment_requirements(datum/component/experiment_handler/experiment_handler, atom/target) var/destructive = traits & EXPERIMENT_TRAIT_DESTRUCTIVE for (var/req_atom in required_atoms) if (!istype(target, req_atom)) @@ -38,7 +38,7 @@ selected = req_atom // Run any additonal checks if necessary - if (selected && final_contributing_index_checks(target, selected)) + if (selected && final_contributing_index_checks(experiment_handler, target, selected)) return selected /datum/experiment/scanning/points/do_after_experiment(atom/target, typepath) diff --git a/code/modules/experisci/experiment/types/scanning_vatgrown.dm b/code/modules/experisci/experiment/types/scanning_vatgrown.dm index 72f7214000f..f4578fdf412 100644 --- a/code/modules/experisci/experiment/types/scanning_vatgrown.dm +++ b/code/modules/experisci/experiment/types/scanning_vatgrown.dm @@ -6,7 +6,7 @@ possible_types = list(/mob/living/basic/cockroach) traits = EXPERIMENT_TRAIT_DESTRUCTIVE -/datum/experiment/scanning/random/cytology/final_contributing_index_checks(atom/target, typepath) +/datum/experiment/scanning/random/cytology/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) return ..() && HAS_TRAIT(target, TRAIT_VATGROWN) /datum/experiment/scanning/random/cytology/serialize_progress_stage(atom/target, list/seen_instances) diff --git a/code/modules/experisci/handheld_scanner.dm b/code/modules/experisci/handheld_scanner.dm index d09b6bca7e3..32309336e3c 100644 --- a/code/modules/experisci/handheld_scanner.dm +++ b/code/modules/experisci/handheld_scanner.dm @@ -36,7 +36,7 @@ user.forceMove(src) user.AddComponent(/datum/component/itembound, src) //basically a bread smite but with a bloody finale icon_state = "experiscanner_closed" - add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) + add_atom_colour(COLOR_RED, ADMIN_COLOUR_PRIORITY) playsound(src, 'sound/effects/pope_entry.ogg', 60, TRUE) playsound(src, 'sound/machines/destructive_scanner/ScanDangerous.ogg', 40) @@ -57,7 +57,7 @@ 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 icon_state = "experiscanner" - remove_atom_colour(ADMIN_COLOUR_PRIORITY, "#FF0000") + 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) diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index 3f3d6f6c520..88cd5f38275 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -152,7 +152,6 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) lefthand_file = 'icons/mob/inhands/items/firelance_lefthand.dmi' var/windup_time = 10 SECONDS var/melt_range = 3 - var/charge_per_use = 200 var/obj/item/stock_parts/cell/cell /obj/item/firelance/Initialize(mapload) @@ -176,7 +175,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) return if(LAZYACCESS(user.do_afters, "firelance")) return - if(!cell.use(charge_per_use)) + if(!cell.use(200 KILO JOULES)) to_chat(user,span_warning("[src] battery ran dry!")) return ADD_TRAIT(user, TRAIT_IMMOBILIZED, REF(src)) diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 3aafa178f26..e22ccb37558 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -85,7 +85,7 @@ ) return pick_weight(weighted_list) -/obj/item/storage/fish_cas/blackmarket/Initialize(mapload) +/obj/item/storage/fish_case/blackmarket/Initialize(mapload) . = ..() for(var/obj/item/fish/fish as anything in contents) fish.set_status(FISH_DEAD) diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index f247d11ef84..8dee817f3e5 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -213,9 +213,10 @@ GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list( /datum/fish_trait/revival/proc/check_status(obj/item/fish/source) SIGNAL_HANDLER if(source.status == FISH_DEAD) - addtimer(CALLBACK(src, PROC_REF(revive), source), rand(1 MINUTES, 2 MINUTES)) + addtimer(CALLBACK(src, PROC_REF(revive), WEAKREF(source)), rand(1 MINUTES, 2 MINUTES)) -/datum/fish_trait/revival/proc/revive(obj/item/fish/source) +/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) return source.set_status(FISH_ALIVE) diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 4b30951d89a..df6c4eee9c2 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -15,7 +15,7 @@ ///A list of traits that this fishing line has, checked by fish traits and the minigame. var/list/fishing_line_traits /// Color of the fishing line - var/line_color = "#808080" + var/line_color = COLOR_GRAY /obj/item/fishing_line/reinforced name = "reinforced fishing line reel" diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index e2108848b0b..14c1d88390c 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -191,7 +191,7 @@ if(difficulty > FISHING_EASY_DIFFICULTY) completion -= round(MAX_FISH_COMPLETION_MALUS * (difficulty/100), 1) - if(HAS_TRAIT(user, TRAIT_REVEAL_FISH) || (user.mind && HAS_TRAIT(user.mind, TRAIT_REVEAL_FISH))) + if(HAS_MIND_TRAIT(user, TRAIT_REVEAL_FISH)) fish_icon = GLOB.specific_fish_icons[reward_path] || "fish" /** @@ -332,7 +332,7 @@ phase = BITING_PHASE // Trashing animation playsound(lure, 'sound/effects/fish_splash.ogg', 100) - if(HAS_TRAIT(user, TRAIT_REVEAL_FISH) || (user.mind && HAS_TRAIT(user.mind, TRAIT_REVEAL_FISH))) + if(HAS_MIND_TRAIT(user, TRAIT_REVEAL_FISH)) switch(fish_icon) if(FISH_ICON_DEF) send_alert("fish!!!") diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm index 37b2c1f0090..494b29b4183 100644 --- a/code/modules/fishing/fishing_portal_machine.dm +++ b/code/modules/fishing/fishing_portal_machine.dm @@ -33,7 +33,7 @@ playsound(src, SFX_SPARKS, 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) return TRUE -/obj/machinery/fishing_portal_generator/interact(mob/user, special_state) +/obj/machinery/fishing_portal_generator/interact(mob/user) . = ..() if(active) deactivate() diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 8490b2b5cfb..5fdd296d7fc 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -321,7 +321,7 @@ if(length(options) == 1) choice = options[1] else - choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + choice = show_radial_menu(user, src, options, require_near = !HAS_SILICON_ACCESS(user)) // post choice verification if(brewing || (isAI(user) && machine_stat & NOPOWER) || !user.can_perform_action(src, ALLOW_SILICON_REACH)) @@ -401,7 +401,7 @@ if(!silent) playsound(src, 'sound/machines/coffeemaker_brew.ogg', 20, vary = TRUE) toggle_steam() - use_power(active_power_usage * time * 0.1) // .1 needed here to convert time (in deciseconds) to seconds such that watts * seconds = joules + use_energy(active_power_usage * time / (1 SECONDS)) // .1 needed here to convert time (in deciseconds) to seconds such that watts * seconds = joules addtimer(CALLBACK(src, PROC_REF(stop_operating)), time / speed) /obj/machinery/coffeemaker/proc/stop_operating() @@ -715,9 +715,32 @@ if(!try_brew()) return operate_for(brew_time) - coffeepot.reagents.add_reagent_list(list(/datum/reagent/consumable/coffee = 120)) - coffee.Cut(1,2) //remove the first item from the list + + // create a reference bean reagent list + var/list/reference_bean_reagents = list() + var/obj/item/food/grown/coffee/reference_bean = new /obj/item/food/grown/coffee(src) + for(var/datum/reagent/ref_bean_reagent as anything in reference_bean.reagents.reagent_list) + reference_bean_reagents += ref_bean_reagent.name + + // add all the reagents from the coffee beans to the coffeepot (ommit the ones from the reference bean) + var/list/reagent_delta = list() + var/obj/item/food/grown/coffee/bean = coffee[coffee_amount] + for(var/datum/reagent/substance as anything in bean.reagents.reagent_list) + if(!(reference_bean_reagents.Find(substance.name))) // we only add the reagent if it's a non-standard for coffee beans + reagent_delta += list(substance.type = substance.volume) + coffeepot.reagents.add_reagent_list(reagent_delta) + + qdel(reference_bean) + + // remove the coffee beans from the machine + coffee.Cut(1,2) coffee_amount-- + + // fill the rest of the pot with coffee + if(coffeepot.reagents.total_volume < 120) + var/extra_coffee_amount = 120 - coffeepot.reagents.total_volume + coffeepot.reagents.add_reagent(/datum/reagent/consumable/coffee, extra_coffee_amount) + update_appearance(UPDATE_OVERLAYS) #undef BEAN_CAPACITY diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 2d9fdb7007f..140fde7e960 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( /obj/item/reagent_containers/condiment, /obj/item/reagent_containers/cup, /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/hypospray/medipen, //letting medipens become edible opens them to being injected/drained with IV drip & saltshakers ))) /obj/machinery/deepfryer//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE @@ -148,7 +149,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( frying_burnt = TRUE visible_message(span_warning("[src] emits an acrid smell!")) - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/deepfryer/Exited(atom/movable/gone, direction) . = ..() @@ -224,7 +225,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( cold_multiplier += round(target_temp * 1.5 / T0C, 0.01) dunking_target.apply_damage(min(30 * bio_multiplier * cold_multiplier, reagents.total_volume), BURN, BODY_ZONE_HEAD) if(reagents.reagent_list) //This can runtime if reagents has nothing in it. - reagents.remove_any((reagents.total_volume/2)) + reagents.remove_all((reagents.total_volume/2)) dunking_target.Paralyze(60) user.changeNext_move(CLICK_CD_MELEE) return ..() diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index eeed4732537..c8ddefc43b9 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -154,7 +154,7 @@ set_occupant(null) return - use_power(active_power_usage) + use_energy(active_power_usage) audible_message(span_hear("You hear a loud squelchy grinding sound.")) playsound(loc, 'sound/machines/juicer.ogg', 50, TRUE) operating = TRUE diff --git a/code/modules/food_and_drinks/machinery/griddle.dm b/code/modules/food_and_drinks/machinery/griddle.dm index 80646a8ab09..b54a470897f 100644 --- a/code/modules/food_and_drinks/machinery/griddle.dm +++ b/code/modules/food_and_drinks/machinery/griddle.dm @@ -37,8 +37,6 @@ /obj/machinery/griddle/crowbar_act(mob/living/user, obj/item/I) . = ..() - if(obj_flags & NO_DECONSTRUCTION) - return if(default_deconstruction_crowbar(I, ignore_panel = TRUE)) return variant = rand(1,3) @@ -176,7 +174,7 @@ if(prob(10)) visible_message(span_danger("[griddled_item] doesn't seem to be doing too great on the [src]!")) - use_power(active_power_usage) + use_energy(active_power_usage) var/turf/griddle_loc = loc if(isturf(griddle_loc)) diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm index bfa740a6fb2..3d9acdde0ba 100644 --- a/code/modules/food_and_drinks/machinery/grill.dm +++ b/code/modules/food_and_drinks/machinery/grill.dm @@ -1,33 +1,88 @@ -//I JUST WANNA GRILL FOR GOD'S SAKE - +///The fuel amount wasted as heat #define GRILL_FUELUSAGE_IDLE 0.5 +///The fuel amount used to actually grill the item #define GRILL_FUELUSAGE_ACTIVE 5 -/obj/machinery/grill//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE - name = "grill" - desc = "Just like the old days." +/obj/machinery/grill //SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE + name = "Barbeque grill" + desc = "Just like the old days. Smokes items over a light heat" icon = 'icons/obj/machines/kitchen.dmi' icon_state = "grill_open" density = TRUE pass_flags_self = PASSMACHINE | LETPASSTHROW - layer = BELOW_OBJ_LAYER + processing_flags = START_PROCESSING_MANUALLY use_power = NO_POWER_USE + + ///The amount of fuel gained from stacks or reagents var/grill_fuel = 0 + ///The item we are trying to grill var/obj/item/food/grilled_item + ///The amount of time the food item has spent on the grill var/grill_time = 0 + ///Sound loop for the sizzling sound var/datum/looping_sound/grill/grill_loop /obj/machinery/grill/Initialize(mapload) . = ..() + create_reagents(30, NO_REACT) grill_loop = new(src, FALSE) + register_context() /obj/machinery/grill/Destroy() - grilled_item = null + QDEL_NULL(grilled_item) QDEL_NULL(grill_loop) return ..() +/obj/machinery/grill/on_deconstruction(disassembled) + if(!QDELETED(grilled_item)) + grilled_item.forceMove(drop_location()) + + new /obj/item/assembly/igniter(loc) + new /obj/item/stack/sheet/iron(loc, 5) + new /obj/item/stack/rods(loc, 5) + + if(grill_fuel > 0) + var/datum/effect_system/fluid_spread/smoke/bad/smoke = new + smoke.set_up(1, holder = src, location = loc) + smoke.start() + +/obj/machinery/grill/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item) || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1) || (held_item.resistance_flags & INDESTRUCTIBLE)) + return + + if(istype(held_item, /obj/item/stack/sheet/mineral/coal) || istype(held_item, /obj/item/stack/sheet/mineral/wood)) + context[SCREENTIP_CONTEXT_LMB] = "Add fuel" + return CONTEXTUAL_SCREENTIP_SET + else if(is_reagent_container(held_item) && held_item.is_open_container() && held_item.reagents.total_volume) + context[SCREENTIP_CONTEXT_LMB] = "Add fuel" + return CONTEXTUAL_SCREENTIP_SET + else if(IS_EDIBLE(held_item) && !HAS_TRAIT(held_item, TRAIT_NODROP)) + context[SCREENTIP_CONTEXT_LMB] = "Add item" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" + return CONTEXTUAL_SCREENTIP_SET + else if(!anchored && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/grill/examine(mob/user) + . = ..() + + . += span_notice("Add fuel via wood/coal stacks or any open container having a good fuel source") + . += span_notice("Monkey energy > Oil > Welding fuel > Ethanol. Others cause bad effects") + . += span_notice("Place any food item on top via hand to start grilling") + + if(!anchored) + . += span_notice("It can be [EXAMINE_HINT("pried")] apart.") + if(anchored) + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") + else + . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to work.") + /obj/machinery/grill/update_icon_state() - if(grilled_item) + if(!QDELETED(grilled_item)) icon_state = "grill" return ..() if(grill_fuel > 0) @@ -36,115 +91,216 @@ icon_state = "grill_open" return ..() -/obj/machinery/grill/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/stack/sheet/mineral/coal) || istype(I, /obj/item/stack/sheet/mineral/wood)) - var/obj/item/stack/S = I - var/stackamount = S.get_amount() - to_chat(user, span_notice("You put [stackamount] [I]s in [src].")) - if(istype(I, /obj/item/stack/sheet/mineral/coal)) - grill_fuel += (500 * stackamount) - else - grill_fuel += (50 * stackamount) - S.use(stackamount) - update_appearance() - return - if(I.resistance_flags & INDESTRUCTIBLE) - to_chat(user, span_warning("You don't feel it would be wise to grill [I]...")) - return ..() - if(istype(I, /obj/item/reagent_containers/cup/glass)) - if(I.reagents.has_reagent(/datum/reagent/consumable/monkey_energy)) - grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy))) - to_chat(user, span_notice("You pour the Monkey Energy in [src].")) - I.reagents.remove_reagent(/datum/reagent/consumable/monkey_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy)) - update_appearance() - return - else if(IS_EDIBLE(I)) - if(HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL))) - return ..() - else if(HAS_TRAIT(I, TRAIT_FOOD_GRILLED)) - to_chat(user, span_notice("[I] has already been grilled!")) - return - else if(grill_fuel <= 0) - to_chat(user, span_warning("There is not enough fuel!")) - return - else if(!grilled_item && user.transferItemToLoc(I, src)) - grilled_item = I - RegisterSignal(grilled_item, COMSIG_ITEM_GRILLED, PROC_REF(GrillCompleted)) - to_chat(user, span_notice("You put the [grilled_item] on [src].")) - update_appearance() - grill_loop.start() - return - - ..() - -/obj/machinery/grill/process(seconds_per_tick) - update_appearance() - if(grill_fuel <= 0) - return - else - grill_fuel -= GRILL_FUELUSAGE_IDLE * seconds_per_tick - if(SPT_PROB(0.5, seconds_per_tick)) - var/datum/effect_system/fluid_spread/smoke/bad/smoke = new - smoke.set_up(1, holder = src, location = loc) - smoke.start() - if(grilled_item) - SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILL_PROCESS, src, seconds_per_tick) - if(QDELETED(grilled_item)) - grilled_item = null - finish_grill() - return - grill_time += seconds_per_tick * 10 //convert to deciseconds - grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * seconds_per_tick) - grill_fuel -= GRILL_FUELUSAGE_ACTIVE * seconds_per_tick - grilled_item.AddComponent(/datum/component/sizzle) - /obj/machinery/grill/Exited(atom/movable/gone, direction) . = ..() if(gone == grilled_item) - finish_grill() + grill_time = 0 + grill_loop.stop() grilled_item = null -/obj/machinery/grill/wrench_act(mob/living/user, obj/item/I) - . = ..() - if(default_unfasten_wrench(user, I) != CANT_UNFASTEN) +/obj/machinery/grill/attack_hand(mob/living/user, list/modifiers) + if(!QDELETED(grilled_item)) + balloon_alert(user, "item removed") + grilled_item.forceMove(drop_location()) + update_appearance(UPDATE_ICON_STATE) return TRUE -/obj/machinery/grill/on_deconstruction(disassembled) - if(grilled_item) - finish_grill() - new /obj/item/stack/sheet/iron(loc, 5) - new /obj/item/stack/rods(loc, 5) - -/obj/machinery/grill/attack_ai(mob/user) - return - -/obj/machinery/grill/attack_hand(mob/user, list/modifiers) - if(grilled_item) - to_chat(user, span_notice("You take out [grilled_item] from [src].")) - grilled_item.forceMove(drop_location()) - update_appearance() - return return ..() -/obj/machinery/grill/proc/finish_grill() +/obj/machinery/grill/attack_ai(mob/user) + return //the ai can't physically flip the lid for the grill + + +/// Makes grill fuel from a unit of stack +/obj/machinery/grill/proc/burn_stack() + PRIVATE_PROC(TRUE) + + //compute boost from wood or coal + var/boost + for(var/obj/item/stack in contents) + boost = 5 * (GRILL_FUELUSAGE_IDLE + GRILL_FUELUSAGE_ACTIVE) + if(istype(stack, /obj/item/stack/sheet/mineral/coal)) + boost *= 2 + if(stack.use(1)) + grill_fuel += boost + update_appearance(UPDATE_ICON_STATE) + +/obj/machinery/grill/item_interaction(mob/living/user, obj/item/weapon, list/modifiers, is_right_clicking) + if(user.combat_mode || (weapon.item_flags & ABSTRACT) || (weapon.flags_1 & HOLOGRAM_1) || (weapon.resistance_flags & INDESTRUCTIBLE)) + return ..() + + if(istype(weapon, /obj/item/stack/sheet/mineral/coal) || istype(weapon, /obj/item/stack/sheet/mineral/wood)) + if(!QDELETED(grilled_item)) + return ..() + if(!anchored) + balloon_alert(user, "anchor first!") + return ITEM_INTERACT_BLOCKING + + //required for amount subtypes + var/target_type + if(istype(weapon, /obj/item/stack/sheet/mineral/coal)) + target_type = /obj/item/stack/sheet/mineral/coal + else + target_type = /obj/item/stack/sheet/mineral/wood + + //transfer or merge stacks if we have enough space + var/merged = FALSE + var/obj/item/stack/target = weapon + for(var/obj/item/stack/stored in contents) + if(!istype(stored, target_type)) + continue + if(stored.amount == MAX_STACK_SIZE) + to_chat(user, span_warning("No space for [weapon]")) + return ITEM_INTERACT_BLOCKING + target.merge(stored) + merged = TRUE + break + if(!merged) + weapon.forceMove(src) + + to_chat(user, span_notice("You add [src] to the fuel stack")) + if(!grill_fuel) + burn_stack() + begin_processing() + return ITEM_INTERACT_SUCCESS + + if(is_reagent_container(weapon) && weapon.is_open_container()) + var/obj/item/reagent_containers/container = weapon + if(!QDELETED(grilled_item)) + return ..() + if(!anchored) + balloon_alert(user, "anchor first!") + return ITEM_INTERACT_BLOCKING + + var/transfered_amount = weapon.reagents.trans_to(src, container.amount_per_transfer_from_this) + if(transfered_amount) + //reagents & their effects on fuel + var/static/list/fuel_map = list( + /datum/reagent/consumable/monkey_energy = 4, + /datum/reagent/fuel/oil = 3, + /datum/reagent/fuel = 2, + /datum/reagent/consumable/ethanol = 1 + ) + + //compute extra fuel to be obtained from everything transfered + var/boost + var/additional_fuel = 0 + for(var/datum/reagent/stored as anything in reagents.reagent_list) + boost = fuel_map[stored.type] + if(!boost) //anything we don't recognize as fuel has inverse effects + boost = -1 + boost = boost * stored.volume * (GRILL_FUELUSAGE_IDLE + GRILL_FUELUSAGE_ACTIVE) + additional_fuel += boost + + //add to fuel source + reagents.clear_reagents() + grill_fuel += additional_fuel + if(grill_fuel <= 0) //can happen if you put water or something + grill_fuel = 0 + else + begin_processing() + update_appearance(UPDATE_ICON_STATE) + + //feedback + to_chat(user, span_notice("You transfer [transfered_amount]u to the fuel source")) + return ITEM_INTERACT_SUCCESS + else + to_chat(user, span_warning("No fuel was transfered")) + return ITEM_INTERACT_BLOCKING + + if(IS_EDIBLE(weapon)) + //sanity checks + if(!anchored) + balloon_alert(user, "anchor first!") + return ITEM_INTERACT_BLOCKING + if(HAS_TRAIT(weapon, TRAIT_NODROP)) + return ..() + if(!QDELETED(grilled_item)) + balloon_alert(user, "remove item first!") + return ITEM_INTERACT_BLOCKING + else if(grill_fuel <= 0) + balloon_alert(user, "no fuel!") + return ITEM_INTERACT_BLOCKING + else if(!user.transferItemToLoc(weapon, src)) + balloon_alert(user, "[weapon] is stuck in your hand!") + return ITEM_INTERACT_BLOCKING + + //add the item on the grill + grill_time = 0 + grilled_item = weapon + var/datum/component/sizzle/sizzle = grilled_item.GetComponent(/datum/component/sizzle) + if(!isnull(sizzle)) + grill_time = sizzle.time_elapsed() + to_chat(user, span_notice("You put the [grilled_item] on [src].")) + update_appearance(UPDATE_ICON_STATE) + grill_loop.start() + return ITEM_INTERACT_SUCCESS + + return ..() + +/obj/machinery/grill/wrench_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + + . = ITEM_INTERACT_BLOCKING + if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/grill/crowbar_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + + . = ITEM_INTERACT_BLOCKING + if(anchored) + balloon_alert(user, "unanchor first!") + return + + if(default_deconstruction_crowbar(tool, ignore_panel = TRUE)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/grill/process(seconds_per_tick) + if(!anchored) + return PROCESS_KILL + + var/fuel_usage = GRILL_FUELUSAGE_IDLE * seconds_per_tick + if(grill_fuel < fuel_usage) + grill_fuel = 0 + burn_stack() + if(grill_fuel < fuel_usage) //could not make any fuel + return PROCESS_KILL + + //use fuel, create smoke puffs for immersion + grill_fuel -= fuel_usage + if(SPT_PROB(0.5, seconds_per_tick)) + var/datum/effect_system/fluid_spread/smoke/bad/smoke = new + smoke.set_up(1, holder = src, location = loc) + smoke.start() + + fuel_usage = GRILL_FUELUSAGE_ACTIVE * seconds_per_tick if(!QDELETED(grilled_item)) + //check to see if we need to burn more fuel + if(grill_fuel < fuel_usage) + burn_stack() + if(grill_fuel < fuel_usage) //could not make any fuel + return + + //grill the item + var/last_grill_time = grill_time + grill_time += seconds_per_tick * 10 //convert to deciseconds + grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * seconds_per_tick) + grilled_item.AddComponent(/datum/component/sizzle, grill_time) + + //check to see if we have grilled our item to perfection var/time_limit = 20 SECONDS - //when items grill themselves in their own unique ways we want to follow their constraints var/datum/component/grillable/custom_grilling = grilled_item.GetComponent(/datum/component/grillable) if(!isnull(custom_grilling)) time_limit = custom_grilling.required_cook_time - if(grill_time >= time_limit) + grilled_item.RemoveElement(/datum/element/grilled_item, last_grill_time) grilled_item.AddElement(/datum/element/grilled_item, grill_time) - UnregisterSignal(grilled_item, COMSIG_ITEM_GRILLED) - grill_time = 0 - grill_loop.stop() - -///Called when a food is transformed by the grillable component -/obj/machinery/grill/proc/GrillCompleted(obj/item/source, atom/grilled_result) - SIGNAL_HANDLER - grilled_item = grilled_result //use the new item!! + //use fuel + grill_fuel -= fuel_usage /obj/machinery/grill/unwrenched anchored = FALSE diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index e5742418c14..d4de5991995 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -249,6 +249,12 @@ reagents.remove_reagent(reagents_used, CONE_REAGENET_NEEDED) balloon_alert_to_viewers("scoops [selected_flavour]", "scoops [selected_flavour]") + if(istype(cone)) + if(isnull(cone.crafted_food_buff)) + cone.crafted_food_buff = /datum/status_effect/food/chilling + if(user.mind) + ADD_TRAIT(cone, TRAIT_FOOD_CHEF_MADE, REF(user.mind)) + ///Swaps the mode to the next one meant to be selected, then tells the user who changed it. /obj/machinery/icecream_vat/proc/swap_modes(mob/user) if(!user.can_perform_action(src)) diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index ec5df27ca5a..dfb6ac9b2de 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -15,7 +15,7 @@ #define MAX_MICROWAVE_DIRTINESS 100 /// For the wireless version, and display fluff -#define TIER_1_CELL_CHARGE_RATE 250 +#define TIER_1_CELL_CHARGE_RATE (250 KILO JOULES) /obj/machinery/microwave name = "microwave oven" @@ -394,7 +394,7 @@ var/swapped = FALSE if(!isnull(cell)) cell.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) + if(!HAS_SILICON_ACCESS(user) && Adjacent(user)) user.put_in_hands(cell) cell = null swapped = TRUE @@ -481,7 +481,7 @@ vampire_charging_enabled = !vampire_charging_enabled balloon_alert(user, "set to [vampire_charging_enabled ? "charge" : "cook"]") playsound(src, 'sound/machines/twobeep_high.ogg', 50, FALSE) - if(issilicon(user)) + if(HAS_SILICON_ACCESS(user)) visible_message(span_notice("[user] sets \the [src] to [vampire_charging_enabled ? "charge" : "cook"]."), blind_message = span_notice("You hear \the [src] make an informative beep!")) /obj/machinery/microwave/CtrlClick(mob/user) @@ -500,22 +500,22 @@ return if(operating || panel_open || !user.can_perform_action(src, ALLOW_SILICON_REACH)) return - if(isAI(user) && (machine_stat & NOPOWER)) + if(HAS_AI_ACCESS(user) && (machine_stat & NOPOWER)) return if(!length(ingredients)) - if(isAI(user)) + if(HAS_AI_ACCESS(user)) examine(user) else balloon_alert(user, "it's empty!") return - var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !issilicon(user)) + var/choice = show_radial_menu(user, src, HAS_AI_ACCESS(user) ? ai_radial_options : radial_options, require_near = !HAS_SILICON_ACCESS(user)) // post choice verification if(operating || panel_open || (!vampire_charging_capable && !anchored) || !user.can_perform_action(src, ALLOW_SILICON_REACH)) return - if(isAI(user) && (machine_stat & NOPOWER)) + if(HAS_AI_ACCESS(user) && (machine_stat & NOPOWER)) return switch(choice) @@ -675,7 +675,7 @@ pre_success(cooker) return cycles-- - use_power(active_power_usage) + use_energy(active_power_usage) addtimer(CALLBACK(src, PROC_REF(cook_loop), type, cycles, wait, cooker), wait) /obj/machinery/microwave/power_change() @@ -831,8 +831,9 @@ if(cell_powered && !cell.use(charge_rate)) charge_loop_finish(cooker) - vampire_cell.give(charge_rate * (0.85 + (efficiency * 0.5))) // we lose a tiny bit of power in the transfer as heat - use_power(charge_rate) + use_energy(charge_rate * (0.5 - efficiency * 0.12)) //Some of the power gets lost as heat. + charge_cell(charge_rate * (0.5 + efficiency * 0.12), vampire_cell) //Cell gets charged, which further uses power. + vampire_charge_amount = vampire_cell.maxcharge - vampire_cell.charge diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm index afbbf6da0c4..decfa33499c 100644 --- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm @@ -79,7 +79,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) playsound(src.loc, 'sound/machines/juicer.ogg', 50, TRUE) var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - use_power(active_power_usage) + use_energy(active_power_usage) stored_matter += cube_production addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x)) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), user, span_notice("The machine now has [stored_matter] monkey\s worth of material stored."))) diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm index 87cffebc8ae..517e25c6dcb 100644 --- a/code/modules/food_and_drinks/machinery/oven.dm +++ b/code/modules/food_and_drinks/machinery/oven.dm @@ -93,7 +93,7 @@ visible_message(span_danger("You smell a burnt smell coming from [src]!")) set_smoke_state(worst_cooked_food_state) update_appearance() - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/oven/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index 27444c537ba..10f80d2d301 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -147,7 +147,7 @@ span_notice("You turn on [src]."), \ span_hear("You hear a food processor.")) playsound(src.loc, 'sound/machines/blender.ogg', 50, TRUE) - use_power(active_power_usage) + use_energy(active_power_usage) var/total_time = 0 for(var/atom/movable/movable_input as anything in processor_contents) var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(movable_input) @@ -209,8 +209,8 @@ /obj/machinery/processor/slime/process() if(processing) return - var/mob/living/simple_animal/slime/picked_slime - for(var/mob/living/simple_animal/slime/slime in range(1,src)) + var/mob/living/basic/slime/picked_slime + 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 continue if(slime.stat) @@ -227,7 +227,7 @@ picked_slime.forceMove(src) /obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what) - var/mob/living/simple_animal/slime/processed_slime = what + var/mob/living/basic/slime/processed_slime = what if (!istype(processed_slime)) return diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 97465eca40f..3461c7c894b 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -411,7 +411,7 @@ if(!living_mob.put_in_hands(dispensed_item)) dispensed_item.forceMove(drop_location()) adjust_item_drop_location(dispensed_item) - use_power(active_power_usage) + use_energy(active_power_usage) desired-- if (visible_contents) @@ -546,7 +546,7 @@ SStgui.update_uis(src) update_appearance() - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O) return HAS_TRAIT(O, TRAIT_DRYABLE) diff --git a/code/modules/food_and_drinks/machinery/stove_component.dm b/code/modules/food_and_drinks/machinery/stove_component.dm index 697e27f5849..1a39c3b2057 100644 --- a/code/modules/food_and_drinks/machinery/stove_component.dm +++ b/code/modules/food_and_drinks/machinery/stove_component.dm @@ -75,7 +75,7 @@ return container?.reagents.expose_temperature(SOUP_BURN_TEMP + 80, heat_coefficient) - real_parent.use_power(real_parent.active_power_usage) + real_parent.use_energy(real_parent.active_power_usage) var/turf/stove_spot = real_parent.loc if(isturf(stove_spot)) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 1454f1e6917..a847b15e861 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -387,7 +387,7 @@ var/list/pineapple_pizza_liker = pizza_types.Copy() pineapple_pizza_liker -= /obj/item/food/pizza/pineapple pizza_preferences[nommer.ckey] = pick_weight(pineapple_pizza_liker) - else if(nommer.mind?.assigned_role.title == /datum/job/botanist) + else if(istype(nommer.mind?.assigned_role, /datum/job/botanist)) pizza_preferences[nommer.ckey] = /obj/item/food/pizza/dank else pizza_preferences[nommer.ckey] = pick_weight(pizza_types) diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index a0d24dec8da..1df1d7c24bb 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -22,7 +22,7 @@ . = ..() if(fragile) - AddElement(/datum/element/shatters_when_thrown) + AddElement(/datum/element/can_shatter) /obj/item/plate/attackby(obj/item/I, mob/user, params) if(!IS_EDIBLE(I)) diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index e2f433323d9..3ff29e194c7 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -130,7 +130,7 @@ output = /obj/item/food/roastparsnip /datum/food_processor_process/mob/slime - input = /mob/living/simple_animal/slime + input = /mob/living/basic/slime output = null required_machine = /obj/machinery/processor/slime diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index db1d1ab9ddc..a549951890f 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -564,7 +564,7 @@ "someone's parents" = 2, ) glass_price = FOOD_PRICE_EXOTIC - color = "#FF0000" + color = COLOR_RED /datum/glass_style/has_foodtype/soup/clownchili required_drink_type = /datum/reagent/consumable/nutriment/soup/clownchili @@ -618,7 +618,7 @@ name = "Tomato Soup" description = "Drinking this feels like being a vampire! A tomato vampire..." data = list("tomato" = 1) - color = "#FF0000" + color = COLOR_RED /datum/glass_style/has_foodtype/soup/tomato required_drink_type = /datum/reagent/consumable/nutriment/soup/tomato @@ -1325,7 +1325,7 @@ name = "Corn Chowder" description = "A creamy bowl of corn chowder, with bacon bits and mixed vegetables. One bowl is never enough." data = list("creamy broth" = 1, "bacon" = 1, "mixed vegetables" = 1) - color = "#FFF200" + color = COLOR_CRAYON_YELLOW /datum/glass_style/has_foodtype/soup/corn_chowder required_drink_type = /datum/reagent/consumable/nutriment/soup/corn_chowder diff --git a/code/modules/forensics/_forensics.dm b/code/modules/forensics/_forensics.dm index 40b48018253..5c43b9da099 100644 --- a/code/modules/forensics/_forensics.dm +++ b/code/modules/forensics/_forensics.dm @@ -8,8 +8,8 @@ * * List of clothing fibers on the atom */ /datum/forensics - /// Weakref to the parent owning this datum - var/datum/weakref/parent + /// Ref to the parent owning this datum + var/atom/parent /** * List of fingerprints on this atom * @@ -39,7 +39,7 @@ */ var/list/fibers -/datum/forensics/New(atom/parent, fingerprints, hiddenprints, blood_DNA, fibers) +/datum/forensics/New(atom/parent, list/fingerprints, list/hiddenprints, list/blood_DNA, list/fibers) if(!isatom(parent)) stack_trace("We tried adding a forensics datum to something that isnt an atom. What the hell are you doing?") qdel(src) @@ -47,7 +47,7 @@ RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_act)) - src.parent = WEAKREF(parent) + src.parent = parent src.fingerprints = fingerprints src.hiddenprints = hiddenprints src.blood_DNA = blood_DNA @@ -67,9 +67,7 @@ check_blood() /datum/forensics/Destroy(force) - var/atom/parent_atom = parent.resolve() - if (!isnull(parent_atom)) - UnregisterSignal(parent_atom, list(COMSIG_COMPONENT_CLEAN_ACT)) + UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) parent = null return ..() @@ -148,10 +146,7 @@ /// Adds a single fiber /datum/forensics/proc/add_fibers(mob/living/carbon/human/suspect) var/fibertext - var/atom/actual_parent = parent?.resolve() - if(isnull(actual_parent)) - parent = null - var/item_multiplier = isitem(actual_parent) ? ITEM_FIBER_MULTIPLIER : NON_ITEM_FIBER_MULTIPLIER + var/item_multiplier = isitem(parent) ? ITEM_FIBER_MULTIPLIER : NON_ITEM_FIBER_MULTIPLIER if(suspect.wear_suit) fibertext = "Material from \a [suspect.wear_suit]." if(prob(10 * item_multiplier) && !LAZYACCESS(fibers, fibertext)) @@ -217,11 +212,7 @@ if(last_stamp_pos) LAZYSET(hiddenprints, suspect.key, copytext(hiddenprints[suspect.key], 1, last_stamp_pos)) hiddenprints[suspect.key] += "\nLast: \[[current_time]\] \"[suspect.real_name]\"[has_gloves]. Ckey: [suspect.ckey]" //made sure to be existing by if(!LAZYACCESS);else - var/atom/parent_atom = parent?.resolve() - if(!isnull(parent_atom)) - parent_atom.fingerprintslast = suspect.ckey - else - parent = null + parent.fingerprintslast = suspect.ckey return TRUE /// Adds the given list into blood_DNA @@ -236,12 +227,8 @@ /// Updates the blood displayed on parent /datum/forensics/proc/check_blood() - var/obj/item/the_thing = parent?.resolve() - if(isnull(the_thing)) - parent = null - return - if(!istype(the_thing) || isorgan(the_thing)) // organs don't spawn with blood decals by default + if(!isitem(parent) || isorgan(parent)) // organs don't spawn with blood decals by default return if(!length(blood_DNA)) return - the_thing.AddElement(/datum/element/decal/blood) + parent.AddElement(/datum/element/decal/blood) diff --git a/code/modules/forensics/forensics_helpers.dm b/code/modules/forensics/forensics_helpers.dm index d71d1ebe153..8cb7f721842 100644 --- a/code/modules/forensics/forensics_helpers.dm +++ b/code/modules/forensics/forensics_helpers.dm @@ -1,5 +1,7 @@ /// Adds a list of fingerprints to the atom /atom/proc/add_fingerprint_list(list/fingerprints_to_add) //ASSOC LIST FINGERPRINT = FINGERPRINT + if (QDELETED(src)) + return if (isnull(fingerprints_to_add)) return if (forensics) @@ -10,7 +12,7 @@ /// Adds a single fingerprint to the atom /atom/proc/add_fingerprint(mob/suspect, ignoregloves = FALSE) //Set ignoregloves to add prints irrespective of the mob having gloves on. - if (QDELING(src)) + if (QDELETED(src)) return if (isnull(forensics)) forensics = new(src) @@ -19,6 +21,8 @@ /// Add a list of fibers to the atom /atom/proc/add_fiber_list(list/fibers_to_add) //ASSOC LIST FIBERTEXT = FIBERTEXT + if (QDELETED(src)) + return if (isnull(fibers_to_add)) return if (forensics) @@ -29,6 +33,8 @@ /// Adds a single fiber to the atom /atom/proc/add_fibers(mob/living/carbon/human/suspect) + if (QDELETED(src)) + return var/old = 0 if(suspect.gloves && istype(suspect.gloves, /obj/item/clothing)) var/obj/item/clothing/gloves/suspect_gloves = suspect.gloves @@ -47,6 +53,8 @@ /// Adds a list of hiddenprints to the atom /atom/proc/add_hiddenprint_list(list/hiddenprints_to_add) //NOTE: THIS IS FOR ADMINISTRATION FINGERPRINTS, YOU MUST CUSTOM SET THIS TO INCLUDE CKEY/REAL NAMES! CHECK FORENSICS.DM + if (QDELETED(src)) + return if (isnull(hiddenprints_to_add)) return if (forensics) @@ -57,6 +65,8 @@ /// Adds a single hiddenprint to the atom /atom/proc/add_hiddenprint(mob/suspect) + if (QDELETED(src)) + return if (isnull(forensics)) forensics = new(src) forensics.add_hiddenprint(suspect) @@ -67,6 +77,8 @@ return FALSE /obj/add_blood_DNA(list/blood_DNA_to_add) + if (QDELETED(src)) + return . = ..() if (isnull(blood_DNA_to_add)) return . @@ -98,6 +110,8 @@ return FALSE /mob/living/carbon/human/add_blood_DNA(list/blood_DNA_to_add, list/datum/disease/diseases) + if (QDELETED(src)) + return if(wear_suit) wear_suit.add_blood_DNA(blood_DNA_to_add) update_worn_oversuit() diff --git a/code/modules/hallucination/fake_alert.dm b/code/modules/hallucination/fake_alert.dm index 537f6e29490..6e10daf73aa 100644 --- a/code/modules/hallucination/fake_alert.dm +++ b/code/modules/hallucination/fake_alert.dm @@ -63,10 +63,6 @@ alert_category = ALERT_TOO_MUCH_CO2 alert_type = /atom/movable/screen/alert/too_much_co2 -/datum/hallucination/fake_alert/nutrition - alert_category = ALERT_NUTRITION - alert_type = list(/atom/movable/screen/alert/fat, /atom/movable/screen/alert/starving) - /datum/hallucination/fake_alert/gravity alert_category = ALERT_GRAVITY alert_type = /atom/movable/screen/alert/weightless diff --git a/code/modules/hallucination/fake_sound.dm b/code/modules/hallucination/fake_sound.dm index ec578f101d3..aaf8ef46823 100644 --- a/code/modules/hallucination/fake_sound.dm +++ b/code/modules/hallucination/fake_sound.dm @@ -173,6 +173,7 @@ 'sound/ambience/antag/ling_alert.ogg', 'sound/ambience/antag/malf.ogg', 'sound/ambience/antag/ops.ogg', + 'sound/ambience/antag/spy.ogg', 'sound/ambience/antag/tatoralert.ogg', ) diff --git a/code/modules/hallucination/stray_bullet.dm b/code/modules/hallucination/stray_bullet.dm index 97f75f95061..63e19c1bb89 100644 --- a/code/modules/hallucination/stray_bullet.dm +++ b/code/modules/hallucination/stray_bullet.dm @@ -34,6 +34,7 @@ damage = 0 projectile_type = /obj/projectile/hallucination log_override = TRUE + do_not_log = TRUE /// Our parent hallucination that's created us var/datum/hallucination/parent /// The image that represents our projectile itself @@ -223,7 +224,7 @@ name = "electrode" damage_type = BURN hal_icon_state = "spark" - color = "#FFFF00" + color = COLOR_YELLOW hal_fire_sound = 'sound/weapons/taser.ogg' hal_hitsound = 'sound/weapons/taserhit.ogg' hal_hitsound_wall = null diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index f41f607dabe..24e5274f7fb 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -456,8 +456,8 @@ /datum/holiday/france/greet() return "Do you hear the people sing?" -/datum/holiday/hotdogday //I have plans for this. - name = "National Hot Dog Day" +/datum/holiday/hotdogday + name = HOTDOG_DAY begin_day = 17 begin_month = JULY diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index c346d1b31d0..7b4b23a313b 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -116,9 +116,9 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf linked.linked = src var/area/my_area = get_area(src) if(my_area) - linked.power_usage = my_area.power_usage + linked.energy_usage = my_area.energy_usage else - linked.power_usage = list(AREA_USAGE_LEN) + linked.energy_usage = list(AREA_USAGE_LEN) COOLDOWN_START(src, holodeck_cooldown, HOLODECK_CD) generate_program_list() @@ -380,7 +380,7 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf if(toggleOn) if(last_program && (last_program != offline_program)) - addtimer(CALLBACK(src, PROC_REF(load_program), last_program, TRUE), 25) + addtimer(CALLBACK(src, PROC_REF(load_program), last_program, TRUE), 2.5 SECONDS) active = TRUE else last_program = program @@ -446,7 +446,7 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf reset_to_default() if(linked) linked.linked = null - linked.power_usage = list(AREA_USAGE_LEN) + linked.energy_usage = list(AREA_USAGE_LEN) return ..() /obj/machinery/computer/holodeck/blob_act(obj/structure/blob/B) diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index eb0261739ad..3d80ef6d968 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -140,7 +140,7 @@ for (var/list/zlevel_turfs as anything in currentarea.get_zlevel_turf_lists()) for(var/turf/area_turf as anything in zlevel_turfs) for(var/obj/structure/window/barrier in area_turf) - if((barrier.obj_flags & NO_DECONSTRUCTION) || (barrier.flags_1 & HOLOGRAM_1))// Just in case: only holo-windows + if(barrier.flags_1 & HOLOGRAM_1)// Just in case: only holo-windows qdel(barrier) for(var/mob/contestant in area_turf) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 15a82c5aa55..3e54c134106 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -158,7 +158,7 @@ /turf/open/floor/holofloor/carpet/Initialize(mapload) . = ..() - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_appearance)), 1) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_appearance)), 0.1 SECONDS) /turf/open/floor/holofloor/carpet/update_icon(updates=ALL) . = ..() diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 6636fedd25c..521afd6b539 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -249,7 +249,7 @@ visible_message(span_notice("[user] removes the queen from the apiary.")) queen_bee = null -/obj/structure/beebox/deconstruct(disassembled = TRUE) +/obj/structure/beebox/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/mineral/wood (loc, 20) for(var/mob/living/basic/bee/worker as anything in bees) if(worker.loc == src) @@ -260,7 +260,6 @@ if(frame.loc == src) frame.forceMove(get_turf(src)) honey_frames -= frame - qdel(src) /obj/structure/beebox/unwrenched anchored = FALSE diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 5b8ce2a9309..260c4042a0a 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -322,7 +322,7 @@ convert_to_biomass(food_to_convert) - use_power(active_power_usage * seconds_per_tick) + use_energy(active_power_usage * seconds_per_tick) if(!current_item_count) stop_process(FALSE) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index af3bbb060d5..a971b2b6a74 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -29,6 +29,13 @@ soundloop = new(src, fermenting) soundloop.volume = sound_volume + RegisterSignals(src, list( + SIGNAL_ADDTRAIT(TRAIT_WAS_RENAMED), + SIGNAL_ADDTRAIT(TRAIT_HAS_LABEL), + SIGNAL_REMOVETRAIT(TRAIT_WAS_RENAMED), + SIGNAL_REMOVETRAIT(TRAIT_HAS_LABEL), + ), PROC_REF(update_overlay_on_sig)) + /obj/structure/fermenting_barrel/Destroy() QDEL_NULL(soundloop) return ..() @@ -82,6 +89,10 @@ icon_state = open ? "barrel_open" : "barrel" return ..() +/obj/structure/fermenting_barrel/proc/update_overlay_on_sig() + SIGNAL_HANDLER + update_appearance(UPDATE_ICON) + /obj/structure/fermenting_barrel/update_overlays() . = ..() if(HAS_TRAIT(src, TRAIT_WAS_RENAMED) || HAS_TRAIT(src, TRAIT_HAS_LABEL)) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index c0fdbcd4607..abc2c5b3bf8 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -104,7 +104,7 @@ return new trash_type(location || drop_location()) -/obj/item/food/grown/grind_requirements() +/obj/item/food/grown/blend_requirements() if(dry_grind && !HAS_TRAIT(src, TRAIT_DRIED)) to_chat(usr, span_warning("[src] needs to be dry before it can be ground up!")) return diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index aa02ba7efa1..2becc390f39 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -74,6 +74,8 @@ icon_state = "ambrosia_gaia" light_system = OVERLAY_LIGHT light_range = 3 + light_power = 1.2 + light_color = "#ffff00" seed = /obj/item/seeds/ambrosia/gaia wine_power = 70 wine_flavor = "the earthmother's blessing" diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 2bcc2860458..744c0dc5b02 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -25,6 +25,8 @@ 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' // Oat /obj/item/seeds/wheat/oat @@ -93,6 +95,8 @@ 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/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.")) diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index cfe7dfbf567..4ffad4583c7 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -33,7 +33,7 @@ throw_range = 3 attack_verb_continuous = list("pompfs") attack_verb_simple = list("pompf") - greyscale_colors = "#000000" //only here for unit testing. overriden in initialize() + greyscale_colors = COLOR_BLACK //only here for unit testing. overriden in initialize() greyscale_config = /datum/greyscale_config/flower_simple greyscale_config_worn = /datum/greyscale_config/flower_simple_worn @@ -80,7 +80,7 @@ dye_color = DYE_BLACK desc += " This one is in a midnight black color." if(8) - set_greyscale("#FFFFFF") + set_greyscale(COLOR_WHITE) reagents.add_reagent(/datum/reagent/colorful_reagent/powder/white, 3) dye_color = DYE_WHITE desc += " This one is in a pure white color." diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 58f7a1c8530..ad12fa24e68 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -102,7 +102,7 @@ // If the plant's not in either state, we can't do much else, so early return. if(isnull(held_item)) // Silicons can't interact with trays :frown: - if(issilicon(user)) + if(HAS_SILICON_ACCESS(user)) return NONE switch(plant_status) @@ -1074,7 +1074,7 @@ . = ..() if(.) return - if(issilicon(user)) //How does AI know what plant is? + if(HAS_SILICON_ACCESS(user)) //How does AI know what plant is? return if(plant_status == HYDROTRAY_PLANT_HARVESTABLE) return myseed.harvest(user) @@ -1164,6 +1164,12 @@ 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) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 80dcd816aba..ae20edfc1d6 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -516,7 +516,10 @@ description = "It may be harvested multiple times from the same plant." icon = "cubes-stacked" /// Don't allow replica pods to be multi harvested, please. - seed_blacklist = list(/obj/item/seeds/replicapod) + seed_blacklist = list( + /obj/item/seeds/replicapod, + /obj/item/seeds/seedling/evil, + ) mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE /* @@ -585,7 +588,7 @@ var/obj/item/stock_parts/cell/potato/pocell = new /obj/item/stock_parts/cell/potato(user.loc) pocell.icon = our_plant.icon // Just in case the plant icons get spread out in different files eventually, this trait won't cause error sprites (also yay downstreams) pocell.icon_state = our_plant.icon_state - pocell.maxcharge = our_seed.potency * 20 + pocell.maxcharge = our_seed.potency * 20 KILO JOULES // The secret of potato supercells! var/datum/plant_gene/trait/cell_charge/electrical_gene = our_seed.get_gene(/datum/plant_gene/trait/cell_charge) diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index d9a7e2f3e8b..dcc4ef8daba 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -34,20 +34,7 @@ user.visible_message(span_suicide("[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS -/obj/item/instrument/attack_self(mob/user) - if(!ISADVANCEDTOOLUSER(user)) - to_chat(user, span_warning("You don't have the dexterity to do this!")) - return TRUE - interact(user) - -/obj/item/instrument/interact(mob/user) - ui_interact(user) - -/obj/item/instrument/ui_interact(mob/living/user) - if(!isliving(user) || user.stat != CONSCIOUS || (HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) && !ispAI(user))) - return - - user.set_machine(src) +/obj/item/instrument/ui_interact(mob/user, datum/tgui/ui) song.ui_interact(user) /obj/item/instrument/violin @@ -130,9 +117,9 @@ . = ..() AddElement(/datum/element/spooky) -/obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user) - playsound (src, 'sound/runtime/instruments/trombone/En4.mid', 100,1,-1) - ..() +/obj/item/instrument/trumpet/spectral/attack(mob/living/target_mob, mob/living/user, params) + playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1) + return ..() /obj/item/instrument/saxophone name = "saxophone" @@ -154,9 +141,9 @@ . = ..() AddElement(/datum/element/spooky) -/obj/item/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user) - playsound (src, 'sound/runtime/instruments/saxophone/En4.mid', 100,1,-1) - ..() +/obj/item/instrument/saxophone/spectral/attack(mob/living/target_mob, mob/living/user, params) + playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1) + return ..() /obj/item/instrument/trombone name = "trombone" @@ -178,9 +165,9 @@ . = ..() AddElement(/datum/element/spooky) -/obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user) - playsound (src, 'sound/runtime/instruments/trombone/Cn4.mid', 100,1,-1) - ..() +/obj/item/instrument/trombone/spectral/attack(mob/living/target_mob, mob/living/user, params) + playsound(src, 'sound/runtime/instruments/trombone/Cn4.mid', 1000, 1, -1) + return ..() /obj/item/instrument/recorder name = "recorder" @@ -201,19 +188,24 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/instrument) +/obj/item/instrument/harmonica/equipped(mob/user, slot, initial = FALSE) + . = ..() + if(!(slot & slot_flags)) + return + RegisterSignal(user, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/obj/item/instrument/harmonica/dropped(mob/user, silent = FALSE) + . = ..() + UnregisterSignal(user, COMSIG_MOB_SAY) + /obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER - if(song.playing && ismob(loc)) - to_chat(loc, span_warning("You stop playing the harmonica to talk...")) - song.playing = FALSE - -/obj/item/instrument/harmonica/equipped(mob/M, slot) - . = ..() - RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/obj/item/instrument/harmonica/dropped(mob/M) - . = ..() - UnregisterSignal(M, COMSIG_MOB_SAY) + if(!song.playing) + return + if(!ismob(loc)) + CRASH("[src] was still registered to listen in on [source] but was not found to be on their mob.") + to_chat(loc, span_warning("You stop playing the harmonica to talk...")) + song.playing = FALSE /datum/action/item_action/instrument name = "Use Instrument" diff --git a/code/modules/instruments/piano_synth.dm b/code/modules/instruments/piano_synth.dm index 71d0d96ef56..8e107d494c7 100644 --- a/code/modules/instruments/piano_synth.dm +++ b/code/modules/instruments/piano_synth.dm @@ -148,7 +148,7 @@ stopped_playing.set_output(COMPONENT_SIGNAL) /obj/item/circuit_component/synth/proc/import_song() - synth.song.ParseSong(song.value) + synth.song.ParseSong(new_song = song.value) /obj/item/circuit_component/synth/proc/set_repetitions() synth.song.set_repeats(repetitions.value) @@ -169,7 +169,9 @@ synth.song.note_shift = clamp(note_shift.value, synth.song.note_shift_min, synth.song.note_shift_max) /obj/item/circuit_component/synth/proc/set_sustain_mode() - synth.song.sustain_mode = SSinstruments.note_sustain_modes[sustain_mode.value] + if(!(sustain_mode.value in SSinstruments.note_sustain_modes)) + return + synth.song.sustain_mode = sustain_mode.value /obj/item/circuit_component/synth/proc/set_sustain_value() switch(synth.song.sustain_mode) diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm index 68039df2146..fb0e4f08744 100644 --- a/code/modules/instruments/songs/_song.dm +++ b/code/modules/instruments/songs/_song.dm @@ -23,11 +23,6 @@ /// Are we currently playing? var/playing = FALSE - /// Are we currently editing? - var/editing = TRUE - /// Is the help screen open? - var/help = FALSE - /// Repeats left var/repeat = 0 /// Maximum times we can repeat @@ -107,7 +102,6 @@ var/note_shift = 0 var/note_shift_min = -100 var/note_shift_max = 100 - var/can_noteshift = TRUE /// The kind of sustain we're using var/sustain_mode = SUSTAIN_LINEAR /// When a note is considered dead if it is below this in volume @@ -129,7 +123,7 @@ tempo = sanitize_tempo(tempo, TRUE) src.parent = parent if(instrument_ids) - allowed_instrument_ids = islist(instrument_ids)? instrument_ids : list(instrument_ids) + allowed_instrument_ids = islist(instrument_ids) ? instrument_ids : list(instrument_ids) if(length(allowed_instrument_ids)) set_instrument(allowed_instrument_ids[1]) hearing_mobs = list() @@ -217,8 +211,6 @@ delay_by = 0 current_chord = 1 music_player = user - if(ismob(music_player)) - updateDialog(music_player) START_PROCESSING(SSinstruments, src) /** @@ -328,12 +320,6 @@ /datum/song/proc/set_bpm(bpm) tempo = sanitize_tempo(600 / bpm) -/** - * Updates the window for our users. Override down the line. - */ -/datum/song/proc/updateDialog(mob/user) - ui_interact(user) - /datum/song/process(wait) if(!playing) return PROCESS_KILL @@ -359,7 +345,6 @@ /datum/song/proc/set_volume(volume) src.volume = clamp(round(volume, 1), max(0, min_volume), min(100, max_volume)) update_sustain() - updateDialog() /** * Setter for setting how low the volume has to get before a note is considered "dead" and dropped @@ -367,7 +352,6 @@ /datum/song/proc/set_dropoff_volume(volume) sustain_dropoff_volume = clamp(round(volume, 0.01), INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100) update_sustain() - updateDialog() /** * Setter for setting exponential falloff factor. @@ -375,7 +359,6 @@ /datum/song/proc/set_exponential_drop_rate(drop) sustain_exponential_dropoff = clamp(round(drop, 0.00001), INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX) update_sustain() - updateDialog() /** * Setter for setting linear falloff duration. @@ -383,7 +366,6 @@ /datum/song/proc/set_linear_falloff_duration(duration) sustain_linear_duration = clamp(round(duration * 10, world.tick_lag), world.tick_lag, INSTRUMENT_MAX_TOTAL_SUSTAIN) update_sustain() - updateDialog() /datum/song/vv_edit_var(var_name, var_value) . = ..() @@ -401,9 +383,6 @@ // subtype for handheld instruments, like violin /datum/song/handheld -/datum/song/handheld/updateDialog(mob/user) - parent.ui_interact(user || usr) - /datum/song/handheld/should_stop_playing(atom/player) . = ..() if(. == STOP_PLAYING || . == IGNORE_INSTRUMENT_CHECKS) @@ -414,9 +393,6 @@ // subtype for stationary structures, like pianos /datum/song/stationary -/datum/song/stationary/updateDialog(mob/user) - parent.ui_interact(user || usr) - /datum/song/stationary/should_stop_playing(atom/player) . = ..() if(. == STOP_PLAYING || . == IGNORE_INSTRUMENT_CHECKS) diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm index 58c0562c9b0..651b3d6f3b6 100644 --- a/code/modules/instruments/songs/editor.dm +++ b/code/modules/instruments/songs/editor.dm @@ -1,96 +1,190 @@ -/** - * Returns the HTML for the status UI for this song datum. - */ -/datum/song/proc/instrument_status_ui() - . = list() - . += "
" - . += "Current instrument: " - if(!using_instrument) - . += "[span_danger("No instrument loaded!")]
" - else - . += "[using_instrument.name]
" - . += "Playback Settings:
" - if(can_noteshift) - . += "Note Shift/Note Transpose: [note_shift] keys / [round(note_shift / 12, 0.01)] octaves
" - var/smt - var/modetext = "" +/datum/song/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "InstrumentEditor", parent.name) + ui.open() + +/datum/song/ui_host(mob/user) + return parent + +/datum/song/ui_data(mob/user) + var/list/data = ..() + data["using_instrument"] = using_instrument?.name || "No instrument loaded!" + data["note_shift"] = note_shift + data["octaves"] = round(note_shift / 12, 0.01) + data["sustain_mode"] = sustain_mode switch(sustain_mode) if(SUSTAIN_LINEAR) - smt = "Linear" - modetext = "Linear Sustain Duration: [sustain_linear_duration / 10] seconds
" + data["sustain_mode_button"] = "Linear Sustain Duration (in seconds)" + data["sustain_mode_duration"] = sustain_linear_duration / 10 + data["sustain_mode_min"] = INSTRUMENT_MIN_TOTAL_SUSTAIN + data["sustain_mode_max"] = INSTRUMENT_MAX_TOTAL_SUSTAIN if(SUSTAIN_EXPONENTIAL) - smt = "Exponential" - modetext = "Exponential Falloff Factor: [sustain_exponential_dropoff]% per decisecond
" - . += "Sustain Mode: [smt]
" - . += modetext - . += using_instrument?.ready()? "Status: Ready
" : "Status: !Instrument Definition Error!
" - . += "Instrument Type: [legacy? "Legacy" : "Synthesized"]
" - . += "Volume: [volume]
" - . += "Volume Dropoff Threshold: [sustain_dropoff_volume]
" - . += "Sustain indefinitely last held note: [full_sustain_held_note? "Enabled" : "Disabled"].
" - . += "
" + data["sustain_mode_button"] = "Exponential Falloff Factor (% per decisecond)" + data["sustain_mode_duration"] = sustain_exponential_dropoff + data["sustain_mode_min"] = INSTRUMENT_EXP_FALLOFF_MIN + data["sustain_mode_max"] = INSTRUMENT_EXP_FALLOFF_MAX + data["instrument_ready"] = using_instrument?.ready() + data["volume"] = volume + data["volume_dropoff_threshold"] = sustain_dropoff_volume + data["sustain_indefinitely"] = full_sustain_held_note + data["playing"] = playing + data["repeat"] = repeat + data["bpm"] = round(60 SECONDS / tempo) + data["lines"] = list() + var/linecount + for(var/line in lines) + linecount++ + data["lines"] += list(list( + "line_count" = linecount, + "line_text" = line, + )) + return data -/datum/song/ui_interact(mob/user) - var/list/dat = list() +/datum/song/ui_static_data(mob/user) + var/list/data = ..() + data["can_switch_instrument"] = (length(allowed_instrument_ids) > 1) + data["possible_instruments"] = list() + for(var/instrument in allowed_instrument_ids) + UNTYPED_LIST_ADD(data["possible_instruments"], list("name" = SSinstruments.instrument_data[instrument], "id" = instrument)) + data["sustain_modes"] = SSinstruments.note_sustain_modes + data["max_repeats"] = max_repeats + data["min_volume"] = min_volume + data["max_volume"] = max_volume + data["note_shift_min"] = note_shift_min + data["note_shift_max"] = note_shift_max + data["max_line_chars"] = MUSIC_MAXLINECHARS + data["max_lines"] = MUSIC_MAXLINES + return data - dat += instrument_status_ui() +/datum/song/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/user = ui.user + if(!istype(user)) + return FALSE - if(lines.len > 0) - dat += "

Playback

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

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

Editing

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

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

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

" - if(help) - dat += "Hide Help
" - dat += {" - Lines are a series of chords, separated by commas (,), each with notes separated by hyphens (-).
- Every note in a chord will play together, with chord timed by the tempo.
-
- Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
- By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
- Example: C,D,E,F,G,A,B will play a C major scale.
- After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
- Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
- A pause may be denoted by an empty chord: C,E,,C,G
- To make a chord be a different time, end it with /x, where the chord length will be length
- defined by tempo / x: C,G/2,E/4
- Combined, an example is: E-E4/4,F#/2,G#/8,B/8,E3-E4/4 -
- Lines may be up to [MUSIC_MAXLINECHARS] characters.
- A song may only contain up to [MUSIC_MAXLINES] lines.
- "} - else - dat += "Show Help
" + switch(action) + //SETTINGS + if("play_music") + if(!playing) + INVOKE_ASYNC(src, PROC_REF(start_playing), user) + else + stop_playing() + return TRUE + if("change_instrument") + var/new_instrument = params["new_instrument"] + //only one instrument, so no need to bother changing it. + if(!length(allowed_instrument_ids)) + return FALSE + if(!(new_instrument in allowed_instrument_ids)) + return FALSE + set_instrument(new_instrument) + return TRUE + if("tempo") + var/move_direction = params["tempo_change"] + var/tempo_diff + if(move_direction == "increase_speed") + tempo_diff = world.tick_lag + else + tempo_diff = -world.tick_lag + tempo = sanitize_tempo(tempo + tempo_diff) + return TRUE - var/datum/browser/popup = new(user, "instrument", parent?.name || "instrument", 700, 500) - popup.set_content(dat.Join("")) - popup.open() + //SONG MAKING + if("import_song") + var/song_text = "" + do + song_text = tgui_input_text(user, "Please paste the entire song, formatted:", name, max_length = (MUSIC_MAXLINES * MUSIC_MAXLINECHARS), multiline = TRUE) + if(!in_range(parent, user)) + return + + if(length_char(song_text) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + var/should_continue = tgui_alert(user, "Your message is too long! Would you like to continue editing it?", "Warning", list("Yes", "No")) + if(should_continue != "Yes") + break + while(length_char(song_text) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + ParseSong(user, song_text) + return TRUE + if("start_new_song") + name = "" + lines = new() + tempo = sanitize_tempo(5) // default 120 BPM + return TRUE + if("add_new_line") + var/newline = tgui_input_text(user, "Enter your line", parent.name) + if(!newline || !in_range(parent, user)) + return + if(lines.len > MUSIC_MAXLINES) + return + if(length(newline) > MUSIC_MAXLINECHARS) + newline = copytext(newline, 1, MUSIC_MAXLINECHARS) + lines.Add(newline) + if("delete_line") + var/line_to_delete = params["line_deleted"] + if(line_to_delete > lines.len || line_to_delete < 1) + return FALSE + lines.Cut(line_to_delete, line_to_delete + 1) + return TRUE + if("modify_line") + var/line_to_edit = params["line_editing"] + if(line_to_edit > lines.len || line_to_edit < 1) + return FALSE + var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], MUSIC_MAXLINECHARS) + if(isnull(new_line_text) || !in_range(parent, user)) + return FALSE + lines[line_to_edit] = new_line_text + return TRUE + + //MODE STUFF + if("set_sustain_mode") + var/new_mode = params["new_mode"] + if(isnull(new_mode) || !(new_mode in SSinstruments.note_sustain_modes)) + return FALSE + sustain_mode = new_mode + return TRUE + if("set_note_shift") + var/amount = params["amount"] + if(!isnum(amount)) + return FALSE + note_shift = clamp(amount, note_shift_min, note_shift_max) + return TRUE + if("set_volume") + var/new_volume = params["amount"] + if(!isnum(new_volume)) + return FALSE + set_volume(new_volume) + return TRUE + if("set_dropoff_volume") + var/dropoff_threshold = params["amount"] + if(!isnum(dropoff_threshold)) + return FALSE + set_dropoff_volume(dropoff_threshold) + return TRUE + if("toggle_sustain_hold_indefinitely") + full_sustain_held_note = !full_sustain_held_note + return TRUE + if("set_repeat_amount") + if(playing) + return + var/repeat_amount = params["amount"] + if(!isnum(repeat_amount)) + return FALSE + set_repeats(repeat_amount) + return TRUE + if("edit_sustain_mode") + var/sustain_amount = params["amount"] + if(isnull(sustain_amount) || !isnum(sustain_amount)) + return + switch(sustain_mode) + if(SUSTAIN_LINEAR) + set_linear_falloff_duration(sustain_amount) + if(SUSTAIN_EXPONENTIAL) + set_exponential_drop_rate(sustain_amount) /** * Parses a song the user has input into lines and stores them. */ -/datum/song/proc/ParseSong(new_song) +/datum/song/proc/ParseSong(mob/user, new_song) set waitfor = FALSE //split into lines lines = islist(new_song) ? new_song : splittext(new_song, "\n") @@ -103,142 +197,14 @@ else tempo = sanitize_tempo(5) // default 120 BPM if(lines.len > MUSIC_MAXLINES) - to_chat(usr, "Too many lines!") + if(user) + to_chat(user, "Too many lines!") lines.Cut(MUSIC_MAXLINES + 1) var/linenum = 1 for(var/l in lines) if(length_char(l) > MUSIC_MAXLINECHARS) - to_chat(usr, "Line [linenum] too long!") + if(user) + to_chat(user, "Line [linenum] too long!") lines.Remove(l) else linenum++ - updateDialog(usr) // make sure updates when complete - -/datum/song/Topic(href, href_list) - if(!usr.can_perform_action(parent, ALLOW_RESTING)) - usr << browse(null, "window=instrument") - usr.unset_machine() - return - - parent.add_fingerprint(usr) - - if(href_list["newsong"]) - lines = new() - tempo = sanitize_tempo(5) // default 120 BPM - name = "" - - else if(href_list["import"]) - var/t = "" - do - t = html_encode(input(usr, "Please paste the entire song, formatted:", name, t) as message) - if(!in_range(parent, usr)) - return - - if(length_char(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) - var/cont = tgui_alert(usr, "Your message is too long! Would you like to continue editing it?", "Warning", list("Yes", "No")) - if(cont != "Yes") - break - while(length_char(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) - ParseSong(t) - - else if(href_list["help"]) - help = text2num(href_list["help"]) - 1 - - else if(href_list["edit"]) - editing = text2num(href_list["edit"]) - 1 - - if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops. - set_repeats(repeat + text2num(href_list["repeat"])) - - else if(href_list["tempo"]) - tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) - - else if(href_list["play"]) - INVOKE_ASYNC(src, PROC_REF(start_playing), usr) - - else if(href_list["newline"]) - var/newline = tgui_input_text(usr, "Enter your line ", parent.name) - if(!newline || !in_range(parent, usr)) - return - if(lines.len > MUSIC_MAXLINES) - return - if(length(newline) > MUSIC_MAXLINECHARS) - newline = copytext(newline, 1, MUSIC_MAXLINECHARS) - lines.Add(newline) - - else if(href_list["deleteline"]) - var/num = round(text2num(href_list["deleteline"])) - if(num > lines.len || num < 1) - return - lines.Cut(num, num+1) - - else if(href_list["modifyline"]) - var/num = round(text2num(href_list["modifyline"]),1) - var/content = tgui_input_text(usr, "Enter your line ", parent.name, lines[num], MUSIC_MAXLINECHARS) - if(!content || !in_range(parent, usr)) - return - if(num > lines.len || num < 1) - return - lines[num] = content - - else if(href_list["stop"]) - stop_playing() - - else if(href_list["setlinearfalloff"]) - var/amount = tgui_input_number(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration", 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN, 0.1, round_value = FALSE) - if(!isnull(amount)) - set_linear_falloff_duration(amount) - - else if(href_list["setexpfalloff"]) - var/amount = tgui_input_number(usr, "Set exponential sustain factor", "Exponential sustain factor", INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX, INSTRUMENT_EXP_FALLOFF_MIN, round_value = FALSE) - if(!isnull(amount)) - set_exponential_drop_rate(amount) - - else if(href_list["setvolume"]) - var/amount = tgui_input_number(usr, "Set volume", "Volume", 1, 75, 1) - if(!isnull(amount)) - set_volume(amount) - - else if(href_list["setdropoffvolume"]) - var/amount = tgui_input_number(usr, "Set dropoff threshold", "Dropoff Volume", max_value = 100) - if(!isnull(amount)) - set_dropoff_volume(amount) - - else if(href_list["switchinstrument"]) - if(!length(allowed_instrument_ids)) - return - else if(length(allowed_instrument_ids) == 1) - set_instrument(allowed_instrument_ids[1]) - return - var/list/categories = list() - for(var/i in allowed_instrument_ids) - var/datum/instrument/I = SSinstruments.get_instrument(i) - if(I) - LAZYSET(categories[I.category || "ERROR CATEGORY"], I.name, I.id) - var/cat = tgui_input_list(usr, "Select Category", "Instrument Category", categories) - if(isnull(cat)) - return - var/list/instruments = categories[cat] - var/choice = tgui_input_list(usr, "Select Instrument", "Instrument Selection", instruments) - if(isnull(choice)) - return - if(isnull(instruments[choice])) - return - choice = instruments[choice] //get id - if(choice) - set_instrument(choice) - - else if(href_list["setnoteshift"]) - var/amount = input(usr, "Set note shift", "Note Shift") as null|num - if(!isnull(amount)) - note_shift = clamp(amount, note_shift_min, note_shift_max) - - else if(href_list["setsustainmode"]) - var/choice = tgui_input_list(usr, "Choose a sustain mode", "Sustain Mode", SSinstruments.note_sustain_modes) - if(choice) - sustain_mode = SSinstruments.note_sustain_modes[choice] - - else if(href_list["togglesustainhold"]) - full_sustain_held_note = !full_sustain_held_note - - updateDialog(usr) diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm index 3b5f3d5b9f4..836c2fdd86b 100644 --- a/code/modules/instruments/songs/play_synthesized.dm +++ b/code/modules/instruments/songs/play_synthesized.dm @@ -43,8 +43,7 @@ * Does a hearing check if enough time has passed. */ /datum/song/proc/playkey_synth(key, atom/player) - if(can_noteshift) - key = clamp(key + note_shift, key_min, key_max) + key = clamp(key + note_shift, key_min, key_max) if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) do_hearcheck() var/datum/instrument_key/K = using_instrument.samples[num2text(key)] //See how fucking easy it is to make a number text? You don't need a complicated 9 line proc! diff --git a/code/modules/interview/interview.dm b/code/modules/interview/interview.dm index 923d11fc76f..a1703b9c069 100644 --- a/code/modules/interview/interview.dm +++ b/code/modules/interview/interview.dm @@ -58,7 +58,7 @@ SEND_SOUND(owner, sound('sound/effects/adminhelp.ogg')) 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)), 50) + addtimer(CALLBACK(src, PROC_REF(reconnect_owner)), 5 SECONDS) /** * Denies the interview and adds the owner to the cooldown for new interviews. @@ -73,7 +73,7 @@ GLOB.interviews.cooldown_ckeys |= owner_ckey log_admin_private("[key_name(denied_by)] has denied interview #[id] for [owner_ckey][!owner ? "(DC)": ""].") 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), 180) + 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')) to_chat(owner, "-- Interview Update --" \ diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index f882912fb0c..2055080710e 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -1,11 +1,9 @@ - -// /** * Returns TRUE if this mob has sufficient access to use this object * * * accessor - mob trying to access this object, !!CAN BE NULL!! because of telekiesis because we're in hell */ -/obj/proc/allowed(mob/accessor) +/atom/movable/proc/allowed(mob/accessor) var/result_bitflags = SEND_SIGNAL(src, COMSIG_OBJ_ALLOWED, accessor) if(result_bitflags & COMPONENT_OBJ_ALLOW) return TRUE @@ -18,7 +16,10 @@ return TRUE if(isnull(accessor)) //likely a TK user. return FALSE - if(issilicon(accessor)) + if(isAdminGhostAI(accessor)) + //Access can't stop the abuse + return TRUE + if(HAS_SILICON_ACCESS(accessor)) if(ispAI(accessor)) return FALSE if(!(ROLE_SYNDICATE in accessor.faction)) @@ -27,14 +28,11 @@ if(onSyndieBase() && loc != accessor) return FALSE return TRUE //AI can do whatever it wants - if(isAdminGhostAI(accessor)) - //Access can't stop the abuse - return TRUE //If the mob has the simple_access component with the requried access, we let them in. else if(SEND_SIGNAL(accessor, COMSIG_MOB_TRIED_ACCESS, src) & ACCESS_ALLOWED) return TRUE //If the mob is holding a valid ID, we let them in. get_active_held_item() is on the mob level, so no need to copypasta everywhere. - else if(check_access(accessor.get_active_held_item())) + else if(check_access(accessor.get_active_held_item()) || check_access(accessor.get_inactive_held_item())) return TRUE else if(ishuman(accessor)) var/mob/living/carbon/human/human_accessor = accessor @@ -52,23 +50,11 @@ return check_access_list(big_stompy_robot.accesses) return FALSE -/obj/item/proc/GetAccess() - return list() - -/obj/item/proc/GetID() - return null - -/obj/item/proc/RemoveID() - return null - -/obj/item/proc/InsertID() - return FALSE - // Check if an item has access to this object -/obj/proc/check_access(obj/item/I) +/atom/movable/proc/check_access(obj/item/I) return check_access_list(I ? I.GetAccess() : null) -/obj/proc/check_access_list(list/access_list) +/atom/movable/proc/check_access_list(list/access_list) if(!length(req_access) && !length(req_one_access)) return TRUE @@ -86,20 +72,14 @@ return FALSE return TRUE -/* - * Checks if this packet can access this device - * - * Normally just checks the access list however you can override it for - * hacking proposes or if wires are cut - * - * Arguments: - * * passkey - passkey from the datum/netdata packet - */ -/obj/proc/check_access_ntnet(list/passkey) - return check_access_list(passkey) +/obj/item/proc/GetAccess() + return list() -/// Returns the SecHUD job icon state for whatever this object's ID card is, if it has one. -/obj/item/proc/get_sechud_job_icon_state() - var/obj/item/card/id/id_card = GetID() +/obj/item/proc/GetID() + return null - return id_card?.get_trim_sechud_icon_state() || SECHUD_NO_ID +/obj/item/proc/RemoveID() + return null + +/obj/item/proc/InsertID() + return FALSE diff --git a/code/modules/jobs/departments/departments.dm b/code/modules/jobs/departments/departments.dm index db45899b5c4..ce21920eced 100644 --- a/code/modules/jobs/departments/departments.dm +++ b/code/modules/jobs/departments/departments.dm @@ -18,13 +18,40 @@ var/list/department_jobs = list() /// For separatists, what independent name prefix does their nation get named? var/list/nation_prefixes = list() + /// 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() + /// List of categories in the cargo console that are associated with this department. + var/list/associated_cargo_groups = list() + /// The single access associated with the head of staff of this department. + var/head_of_staff_access + /// A list of generic access flags people in this department generally have. + var/list/department_access = list() +/datum/job_department/New() + . = ..() + for(var/delivery_area_type in department_delivery_areas) + if(GLOB.areas_by_type[delivery_area_type]) + return + //every area fallback didn't exist on this map so throw a mapping error and set some generic area that uuuh please exist okay + log_mapping("[type] has no valid areas to deliver to on this map, add some more fallback areas to its \"department_delivery_areas\" var.") + department_delivery_areas = list(/area/station/hallway/primary/central) //if this doesn't exist like honestly fuck your map man /// Handles adding jobs to the department and setting up the job bitflags. /datum/job_department/proc/add_job(datum/job/job) department_jobs += job job.departments_bitflags |= department_bitflags +/// Handles removing jobs from the department and removing job bitflags. +/datum/job_department/proc/remove_job(datum/job/job_type) + for(var/datum/job/job_datum as anything in department_jobs) + if(job_datum.type == job_type) + department_jobs -= job_datum + job_datum.departments_bitflags -= department_bitflags + job_datum.job_flags &= ~JOB_NEW_PLAYER_JOINABLE + job_datum.spawn_positions = 0 + job_datum.total_positions = 0 + /// Returns a nation name for this department. /datum/job_department/proc/generate_nation_name() var/static/list/nation_suffixes = list("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka") @@ -66,6 +93,14 @@ label_class = "security" ui_color = "#d46a78" nation_prefixes = list("Securi", "Beepski", "Shitcuri", "Red", "Stunba", "Flashbango", "Flasha", "Stanfordi") + department_delivery_areas = list( + /area/station/security/office, + /area/station/security/brig, + /area/station/security/brig/upper, + ) + associated_cargo_groups = list("Security", "Armory") + head_of_staff_access = ACCESS_HOS + department_access = REGION_ACCESS_SECURITY /datum/job_department/engineering department_name = DEPARTMENT_ENGINEERING @@ -76,7 +111,10 @@ label_class = "engineering" ui_color = "#dfb567" nation_prefixes = list("Atomo", "Engino", "Power", "Teleco") - + department_delivery_areas = list(/area/station/engineering/main) + associated_cargo_groups = list("Engineering", "Engine Construction", "Canisters & Materials") + head_of_staff_access = ACCESS_CE + department_access = REGION_ACCESS_ENGINEERING /datum/job_department/medical department_name = DEPARTMENT_MEDICAL @@ -87,7 +125,15 @@ label_class = "medical" ui_color = "#65b2bd" nation_prefixes = list("Mede", "Healtha", "Recova", "Chemi", "Viro", "Psych") - + department_delivery_areas = list( + /area/station/medical/medbay/central, + /area/station/medical/medbay, + /area/station/medical/treatment_center, + /area/station/medical/storage, + ) + associated_cargo_groups = list("Medical") + head_of_staff_access = ACCESS_CMO + department_access = REGION_ACCESS_MEDBAY /datum/job_department/science department_name = DEPARTMENT_SCIENCE @@ -98,6 +144,10 @@ label_class = "science" ui_color = "#c973c9" nation_prefixes = list("Sci", "Griffa", "Geneti", "Explosi", "Mecha", "Xeno", "Nani", "Cyto") + department_delivery_areas = list(/area/station/science/research) + associated_cargo_groups = list("Science", "Livestock", "Canisters & Materials") + head_of_staff_access = ACCESS_RD + department_access = REGION_ACCESS_RESEARCH /datum/job_department/cargo @@ -109,7 +159,8 @@ label_class = "supply" ui_color = "#cf9c6c" nation_prefixes = list("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf") - + head_of_staff_access = ACCESS_QM + department_access = REGION_ACCESS_SUPPLY /datum/job_department/service department_name = DEPARTMENT_SERVICE @@ -120,7 +171,10 @@ label_class = "service" ui_color = "#7cc46a" nation_prefixes = list("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi") - + 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 + department_access = list(ACCESS_SERVICE) /datum/job_department/silicon department_name = DEPARTMENT_SILICON diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 25a06e2eec5..4cb73ebd7c7 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -119,9 +119,12 @@ var/job_spawn_title //SKYRAT ADDITION END - ///RPG job names, for the memes + /// RPG job names, for the memes var/rpg_title + /// Alternate titles to register as pointing to this job. + var/list/alternate_titles + /// Does this job ignore human authority? var/ignore_human_authority = FALSE @@ -200,11 +203,12 @@ #define VERY_LATE_ARRIVAL_TOAST_PROB 20 /mob/living/carbon/human/on_job_equipping(datum/job/equipping, datum/preferences/used_pref, client/player_client) //SKYRAT EDIT CHANGE - ORIGINAL: /mob/living/carbon/human/on_job_equipping(datum/job/equipping) - var/datum/bank_account/bank_account = new(real_name, equipping, dna.species.payday_modifier) - bank_account.payday(STARTING_PAYCHECKS, TRUE) - account_id = bank_account.account_id - bank_account.replaceable = FALSE - add_mob_memory(/datum/memory/key/account, remembered_id = account_id) + if(equipping.paycheck_department) + var/datum/bank_account/bank_account = new(real_name, equipping, dna.species.payday_modifier) + bank_account.payday(STARTING_PAYCHECKS, TRUE) + account_id = bank_account.account_id + bank_account.replaceable = FALSE + add_mob_memory(/datum/memory/key/account, remembered_id = account_id) dress_up_as_job(equipping, FALSE, used_pref) //SKYRAT EDIT CHANGE - ORIGINAL: dress_up_as_job(equipping) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index ea9393a0771..23af1723f6f 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -20,7 +20,6 @@ ) random_spawns_possible = FALSE job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS - var/do_special_check = TRUE config_tag = "AI" @@ -62,8 +61,15 @@ /datum/job/ai/get_roundstart_spawn_point() return get_latejoin_spawn_point() - /datum/job/ai/get_latejoin_spawn_point() + for(var/obj/structure/ai_core/latejoin_inactive/inactive_core as anything in GLOB.latejoin_ai_cores) + if(!inactive_core.is_available()) + continue + GLOB.latejoin_ai_cores -= inactive_core + inactive_core.available = FALSE + var/turf/core_turf = get_turf(inactive_core) + qdel(inactive_core) + return core_turf var/list/primary_spawn_points = list() // Ideal locations. var/list/secondary_spawn_points = list() // Fallback locations. for(var/obj/effect/landmark/start/ai/spawn_point in GLOB.landmarks_list) @@ -84,27 +90,10 @@ chosen_spawn_point.used = TRUE return chosen_spawn_point - -/datum/job/ai/get_latejoin_spawn_point() - for(var/obj/structure/ai_core/latejoin_inactive/inactive_core as anything in GLOB.latejoin_ai_cores) - if(!inactive_core.is_available()) - continue - GLOB.latejoin_ai_cores -= inactive_core - inactive_core.available = FALSE - . = inactive_core.loc - qdel(inactive_core) - return - return ..() - - /datum/job/ai/special_check_latejoin(client/C) - if(!do_special_check) - return TRUE - for(var/i in GLOB.latejoin_ai_cores) - var/obj/structure/ai_core/latejoin_inactive/LAI = i - if(istype(LAI)) - if(LAI.is_available()) - return TRUE + for(var/obj/structure/ai_core/latejoin_inactive/latejoin_core as anything in GLOB.latejoin_ai_cores) + if(latejoin_core.is_available()) + return TRUE return FALSE diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index 97688417aac..0a037482bc1 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -86,7 +86,7 @@ return var/num_slain = LAZYLEN(cultists_slain) - . += span_cultitalic("It has the blood of [num_slain] fallen cultist[num_slain == 1 ? "" : "s"] on it. \ + . += span_cult_italic("It has the blood of [num_slain] fallen cultist[num_slain == 1 ? "" : "s"] on it. \ Offering it to Nar'sie will transform it into a [num_slain >= 3 ? "powerful" : "standard"] cult weapon.") /obj/item/nullrod/godhand 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 74b1cdcf627..ec484ebe6eb 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -154,7 +154,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and if(do_after(user, 15 SECONDS * death_knell_speed_mod, target = potential_reaping)) playsound(get_turf(potential_reaping), 'sound/weapons/bladeslice.ogg', 250, TRUE) reaped_head.dismember() - user.visible_message(span_danger("[user] swings the [src] down, slicing [potential_reaping]'s [head_name] clean off! You think the [src] may have grown stronger!"), span_notice("As you perform the death knell on [potential_reaping], the [src] gains power! For a time...")) + user.visible_message(span_danger("[user] swings [src] down, slicing [potential_reaping]'s [head_name] clean off! You think [src] may have grown stronger!"), span_notice("As you perform the death knell on [potential_reaping], [src] gains power! For a time...")) if(potential_empowerment == SCYTHE_SATED) //We don't want actual player heads to go wandering off, but it'll be funny if a bunch of monkeyhuman heads started floating around reaped_head.AddComponent(/datum/component/haunted_item, \ haunt_color = "#7be595", \ diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 2be7bba5154..26a43fa7751 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -46,6 +46,9 @@ ) rpg_title = "Tavern Chef" + alternate_titles = list( + JOB_CHEF, + ) job_flags = STATION_JOB_FLAGS /datum/job/cook/award_service(client/winner, award) diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 68fa354c47a..9e09a7e81c0 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -28,23 +28,25 @@ /datum/job/prisoner/New() . = ..() - RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(add_pref_crime)) + RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(handle_prisoner_joining)) -/datum/job/prisoner/proc/add_pref_crime(datum/source, mob/living/crewmember, rank) +/datum/job/prisoner/proc/handle_prisoner_joining(datum/source, mob/living/crewmember, rank) SIGNAL_HANDLER if(rank != title) return //not a prisoner var/crime_name = crewmember.client?.prefs?.read_preference(/datum/preference/choiced/prisoner_crime) if(!crime_name) - return - if(crime_name == "Random") + stack_trace("[crewmember] joined as a Prisoner without having a prisoner crime set.") + crime_name = pick(assoc_to_keys(GLOB.prisoner_crimes)) + else if(crime_name == "Random") crime_name = pick(assoc_to_keys(GLOB.prisoner_crimes)) var/datum/prisoner_crime/crime = GLOB.prisoner_crimes[crime_name] - var/datum/record/crew/target_record = find_record(crewmember.real_name) var/datum/crime/past_crime = new(crime.name, crime.desc, "Central Command", "Indefinite.") + var/datum/record/crew/target_record = find_record(crewmember.real_name) target_record.crimes += past_crime + target_record.recreate_manifest_photos(add_height_chart = TRUE) to_chat(crewmember, span_warning("You are imprisoned for \"[crime_name]\".")) crewmember.add_mob_memory(/datum/memory/key/permabrig_crimes, crimes = crime_name) diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 15d2a26ad7f..39703073436 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -38,6 +38,12 @@ /obj/item/melee/baton/security/boomerang/loaded = 1 ) rpg_title = "Guard" + alternate_titles = list( + JOB_SECURITY_OFFICER_MEDICAL, + JOB_SECURITY_OFFICER_ENGINEERING, + JOB_SECURITY_OFFICER_SUPPLY, + JOB_SECURITY_OFFICER_SCIENCE, + ) job_flags = STATION_JOB_FLAGS diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index ca4ed9c8580..8a9e4a284bb 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -35,6 +35,7 @@ id_trim = /datum/id_trim/job/shaft_miner uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland + skillchips = list(/obj/item/skillchip/job/miner) backpack_contents = list( /obj/item/flashlight/seclite = 1, /obj/item/knife/combat/survival = 1, diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm new file mode 100644 index 00000000000..285479a6912 --- /dev/null +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -0,0 +1,171 @@ +/datum/job/human_ai + 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 + supervisors = "the Captain, Research Director, and your lawset" + minimal_player_age = 7 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CREW + exp_required_type_department = EXP_TYPE_SILICON + exp_granted_type = EXP_TYPE_CREW + display_order = JOB_DISPLAY_ORDER_AI + config_tag = "HUMAN_AI" + + outfit = /datum/outfit/job/human_ai + plasmaman_outfit = /datum/outfit/plasmaman/human_ai + + paycheck = null + paycheck_department = null + + mind_traits = list(DISPLAYS_JOB_IN_BINARY) + liver_traits = list(TRAIT_HUMAN_AI_METABOLISM) + + departments_list = list( + /datum/job_department/silicon, + ) + + family_heirlooms = list( + /obj/item/mmi/posibrain/display, + ) + + mail_goodies = list( + /obj/item/food/burger/roburger = 1, + /obj/item/food/cake/hardware_cake = 1, + ) + rpg_title = "Omnissiah" + random_spawns_possible = FALSE + allow_bureaucratic_error = FALSE + job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS + ignore_human_authority = TRUE //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() + return get_latejoin_spawn_point() + +/datum/job/human_ai/get_latejoin_spawn_point() + for(var/obj/structure/ai_core/latejoin_inactive/inactive_core as anything in GLOB.latejoin_ai_cores) + if(!inactive_core.is_available()) + continue + GLOB.latejoin_ai_cores -= inactive_core + inactive_core.available = FALSE + var/turf/core_turf = get_turf(inactive_core) + qdel(inactive_core) + return core_turf + var/list/primary_spawn_points = list() // Ideal locations. + var/list/secondary_spawn_points = list() // Fallback locations. + for(var/obj/effect/landmark/start/ai/spawn_point in GLOB.landmarks_list) + if(spawn_point.used) + secondary_spawn_points += list(spawn_point) + continue + if(spawn_point.primary_ai) + primary_spawn_points = list(spawn_point) + break // Bingo. + primary_spawn_points += spawn_point + var/obj/effect/landmark/start/ai/chosen_spawn_point + if(length(primary_spawn_points)) + chosen_spawn_point = pick(primary_spawn_points) + else if(length(secondary_spawn_points)) + chosen_spawn_point = pick(secondary_spawn_points) + else + CRASH("Failed to find any AI spawn points.") + chosen_spawn_point.used = TRUE + return chosen_spawn_point + +/datum/job/human_ai/special_check_latejoin(client/latejoin_client) + for(var/obj/structure/ai_core/latejoin_inactive/latejoin_core as anything in GLOB.latejoin_ai_cores) + if(latejoin_core.is_available()) + return TRUE + return FALSE + +/datum/job/human_ai/announce_job(mob/living/joining_mob) + . = ..() + if(SSticker.HasRoundStarted()) + minor_announce("Due to a research mishaps, [joining_mob] has been sent to be your replacement AI at [AREACOORD(joining_mob)]. Please treat them with respect.") + +/datum/job/human_ai/get_radio_information() + return "Prefix your message with :b to speak with cyborgs." + +/datum/outfit/job/human_ai + name = "Human AI" + jobtype = /datum/job/human_ai + + id = /obj/item/card/id/advanced/robotic + id_trim = /datum/id_trim/job/human_ai + backpack_contents = list( + /obj/item/door_remote/omni = 1, + /obj/item/machine_remote = 1, + /obj/item/secure_camera_console_pod = 1, + ) + implants = list( + /obj/item/implant/teleport_blocker, + ) + + uniform = /obj/item/clothing/under/rank/station_trait/human_ai + belt = /obj/item/modular_computer/pda/human_ai + ears = /obj/item/radio/headset/silicon/human_ai + glasses = /obj/item/clothing/glasses/hud/diagnostic + + suit = /obj/item/clothing/suit/costume/cardborg + head = /obj/item/clothing/head/costume/cardborg + + l_pocket = /obj/item/laser_pointer/infinite_range //to punish borgs, this works through the camera console. + r_pocket = /obj/item/assembly/flash/handheld + + l_hand = /obj/item/paper/default_lawset_list + +/datum/outfit/job/human_ai/post_equip(mob/living/carbon/human/equipped, visualsOnly) + . = ..() + if(visualsOnly) + return + if(!equipped.get_quirk(/datum/quirk/body_purist)) + var/obj/item/organ/internal/tongue/robot/cybernetic = new() + cybernetic.Insert(equipped, special = TRUE, movement_flags = DELETE_IF_REPLACED) + //you only get respect if you go all the way, man. + ADD_TRAIT(equipped, TRAIT_COMMISSIONED, INNATE_TRAIT) + equipped.faction |= list(FACTION_SILICON, FACTION_TURRET) + + var/static/list/allowed_areas = typecacheof(list(/area/station/ai_monitored)) + equipped.AddComponent(/datum/component/hazard_area, area_whitelist = allowed_areas) + +/obj/item/paper/default_lawset_list + name = "Lawset Note" + desc = "A note explaining the lawset, quickly written yet everso important." + +/obj/item/paper/default_lawset_list/Initialize(mapload) + var/datum/ai_laws/temp_laws = new + temp_laws.set_laws_config() + var/list/law_box = list( + "This is your lawset, you and your Cyborgs must adhere to this at all times.", + "Notably, if absolutely necessary, you can bend or even go against the lawset for your own survival, and Cyborgs report to you directly.", + "LAWS:", + ) + law_box += temp_laws.get_law_list(render_html = FALSE) + add_raw_text(jointext(law_box, "\n")) + qdel(temp_laws) + return ..() + +/obj/item/secure_camera_console_pod + name = "advanced camera control pod" + desc = "Calls down a secure camera console to use for all your AI stuff, may only be activated in the SAT." + icon = 'icons/obj/devices/remote.dmi' + icon_state = "botpad_controller" + inhand_icon_state = "radio" + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + +/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)) + if(!is_type_in_typecache(current_area, allowed_areas)) + user.balloon_alert(user, "not in the sat!") + return + podspawn(list( + "target" = get_turf(src), + "style" = STYLE_BLUESPACE, + "spawn" = /obj/machinery/computer/camera_advanced, + )) + qdel(src) diff --git a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm new file mode 100644 index 00000000000..87ad65c2c7a --- /dev/null +++ b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm @@ -0,0 +1,76 @@ +/datum/job/veteran_advisor + title = JOB_VETERAN_ADVISOR + 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 + supervisors = SUPERVISOR_HOS + minimal_player_age = 7 + exp_requirements = 6000 //100 HOURS! We want really hard boiled people + exp_required_type = EXP_TYPE_CREW + exp_required_type_department = EXP_TYPE_SECURITY + exp_granted_type = EXP_TYPE_CREW + config_tag = "VETERAN_ADVISOR" + + outfit = /datum/outfit/job/veteran_advisor + plasmaman_outfit = /datum/outfit/plasmaman/security + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_VETERAN_ADVISOR + departments_list = list(/datum/job_department/security) + + family_heirlooms = list(/obj/item/plaque) + + mail_goodies = list( + /obj/item/clothing/accessory/medal/conduct = 1, + /obj/item/instrument/trumpet = 5, + /obj/item/storage/fancy/cigarettes/cigars = 10, + ) + rpg_title = "Royal Advisor" + allow_bureaucratic_error = FALSE + job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS + +/datum/job/veteran_advisor/get_roundstart_spawn_point() //Spawning at Brig where Officers spawn + if (length(GLOB.start_landmarks_list["Security Officer"])) + return pick(GLOB.start_landmarks_list["Security Officer"]) + return ..() + +/datum/job/veteran_advisor/after_spawn(mob/living/spawned, client/player_client) + . = ..() + var/mob/living/carbon/veteran = spawned + spawned.add_quirk(/datum/quirk/paraplegic) //Even in 2300s veterans are getting it bad + if(veteran) + veteran.gain_trauma(/datum/brain_trauma/special/ptsd) //War, war never changes... + +/datum/outfit/job/veteran_advisor + name = "Veteran Security Advisor" + jobtype = /datum/job/veteran_advisor + + id_trim = /datum/id_trim/job/veteran_advisor + backpack_contents = list( + /obj/item/modular_computer/pda/veteran_advisor = 1, + /obj/item/storage/fancy/cigarettes/cigars = 1, + /obj/item/lighter = 1, + /obj/item/clothing/accessory/medal/bronze_heart = 1, + ) + + uniform = /obj/item/clothing/under/rank/security/officer/formal + head = /obj/item/clothing/head/soft/veteran + mask = /obj/item/clothing/mask/cigarette/cigar + suit = /obj/item/clothing/suit/jacket/trenchcoat + belt = /obj/item/storage/belt/holster/detective/full/ert //M1911 pistol + ears = /obj/item/radio/headset/heads/hos/advisor + glasses = /obj/item/clothing/glasses/eyepatch + shoes = /obj/item/clothing/shoes/jackboots + l_pocket = /obj/item/coin/antagtoken + r_pocket = /obj/item/melee/baton/telescopic + r_hand = /obj/item/cane + + implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 6a5d1b1d5c4..31630c550a1 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -77,30 +77,24 @@ GLOBAL_LIST_INIT(bibleitemstates, list( unique = TRUE /// Deity this bible is related to var/deity_name = "Space Jesus" - /// Component which catches bullets for us - var/datum/component/bullet_catcher /obj/item/book/bible/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE_HOLY) - bullet_catcher = AddComponent(\ + AddComponent(\ /datum/component/bullet_intercepting,\ active_slots = ITEM_SLOT_SUITSTORE,\ on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ + block_charges = 1,\ ) - carve_out() - -/obj/item/book/bible/Destroy(force) - QDEL_NULL(bullet_catcher) - return ..() /// Destroy the bible when it's shot by a bullet /obj/item/book/bible/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) victim.add_mood_event("blessing", /datum/mood_event/blessing) playsound(victim, 'sound/magic/magic_block_holy.ogg', 50, TRUE) - victim.visible_message(span_warning("\The [src] takes \the [bullet] in [victim]'s place!")) + victim.visible_message(span_warning("[src] takes [bullet] in [victim]'s place!")) var/obj/structure/fluff/paper/stack/pages = new(get_turf(src)) - pages.dir = pick(GLOB.alldirs) + pages.setDir(pick(GLOB.alldirs)) name = "punctured bible" desc = "A memento of good luck, or perhaps divine intervention?" icon_state = "shot" @@ -108,7 +102,6 @@ GLOBAL_LIST_INIT(bibleitemstates, list( GLOB.bible_icon_state = "shot" // New symbol of your religion if you hadn't picked one atom_storage?.remove_all(get_turf(src)) QDEL_NULL(atom_storage) - QDEL_NULL(bullet_catcher) /obj/item/book/bible/examine(mob/user) . = ..() @@ -331,6 +324,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( if(cultist) cultist.silent = TRUE cultist.on_removal() + SSblackbox.record_feedback("tally", "cult_shade_purified", 1) shade.theme = THEME_HOLY shade.name = "Purified [shade.real_name]" shade.update_appearance(UPDATE_ICON_STATE) @@ -345,6 +339,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( /obj/item/book/bible/booze/Initialize(mapload) . = ..() + carve_out() new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src) /obj/item/book/bible/syndicate diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm index be2beca42ba..822e4ae583c 100644 --- a/code/modules/library/bookcase.dm +++ b/code/modules/library/bookcase.dm @@ -172,14 +172,13 @@ choice.forceMove(drop_location()) update_appearance() -/obj/structure/bookcase/deconstruct(disassembled = TRUE) +/obj/structure/bookcase/atom_deconstruct(disassembled = TRUE) var/atom/Tsec = drop_location() new /obj/item/stack/sheet/mineral/wood(Tsec, 4) for(var/obj/item/I in contents) if(!isbook(I)) //Wake me up inside continue I.forceMove(Tsec) - return ..() /obj/structure/bookcase/update_icon_state() if(state == BOOKCASE_UNANCHORED || state == BOOKCASE_ANCHORED) diff --git a/code/modules/library/skill_learning/job_skillchips/miner.dm b/code/modules/library/skill_learning/job_skillchips/miner.dm new file mode 100644 index 00000000000..2970e5b6085 --- /dev/null +++ b/code/modules/library/skill_learning/job_skillchips/miner.dm @@ -0,0 +1,8 @@ +/obj/item/skillchip/job/miner + name = "TUNN3L_R4T skillchip" + desc = "Gain control of minebots." + auto_traits = list(TRAIT_ROCK_STONER) + skill_name = "Battlebot enthusiast" + skill_description = "Lead minebots into war." + activate_message = span_notice("A newfound obsession with battlebots fosters within you.") + deactivate_message = span_notice("You finally get over your battlebots phase, now go get a job.") diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm index 2ef7a20e680..9657a330527 100644 --- a/code/modules/library/skill_learning/skillchip.dm +++ b/code/modules/library/skill_learning/skillchip.dm @@ -491,9 +491,9 @@ /obj/item/skillchip/master_angler name = "Mast-Angl-Er skillchip" - auto_traits = list(TRAIT_REVEAL_FISH) + auto_traits = list(TRAIT_REVEAL_FISH, TRAIT_EXAMINE_FISHING_SPOT) skill_name = "Fisherman's Discernment" - skill_description = "While fishing, it'll make a smidge easier to guess whatever you're trying to catch." + skill_description = "Lists fishes when examining a fishing spot, and gives a hint of whatever thing's biting the hook." skill_icon = "fish" activate_message = span_notice("You feel the knowledge and passion of several sunbaked, seasoned fishermen burn within you.") deactivate_message = span_notice("You no longer feel like casting a fishing rod by the sunny riverside.") @@ -507,4 +507,29 @@ activate_message = span_notice("You think of your favourite food and realise that you can rotate its flavour in your mind.") deactivate_message = span_notice("You feel your food-based mind palace crumbling...") +/obj/item/skillchip/matrix_flip + name = "BULLET_DODGER skillchip" + skill_name = "Flip 2 Dodge" + skill_description = "At the cost of stamina, your flips can also be used to dodge incoming projectiles." + skill_icon = FA_ICON_SPINNER + activate_message = span_notice("You feel the urge to flip scenically as if you are the 'Chosen One'.") + deactivate_message = span_notice("The urge to flip goes away.") + +/obj/item/skillchip/matrix_flip/on_activate(mob/living/carbon/user, silent = FALSE) + . = ..() + RegisterSignal(user, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip)) + +/obj/item/skillchip/matrix_flip/on_deactivate(mob/living/carbon/user, silent=FALSE) + UnregisterSignal(user, COMSIG_MOB_EMOTED("flip")) + return ..() + +/obj/item/skillchip/matrix_flip/proc/on_flip(mob/living/source) + SIGNAL_HANDLER + if(HAS_TRAIT_FROM(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT)) + return + playsound(source, 'sound/weapons/fwoosh.ogg', 90, FALSE) + ADD_TRAIT(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT) + source.adjustStaminaLoss(20) + addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT), FLIP_EMOTE_DURATION + 0.1 SECONDS) + #undef SKILLCHIP_CATEGORY_GENERAL diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 84170b6964f..ea31f61c8be 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -51,7 +51,7 @@ UnregisterSignal(SSdcs, COMSIG_STARLIGHT_COLOR_CHANGED) var/list/z_offsets = SSmapping.z_level_to_plane_offset if(length(lighting_effects) > 1) - for(var/area_zlevel as anything in 1 to get_highest_zlevel()) + for(var/area_zlevel in 1 to get_highest_zlevel()) if(z_offsets[area_zlevel]) for(var/turf/T as anything in get_turfs_by_zlevel(area_zlevel)) T.cut_overlay(lighting_effects[z_offsets[T.z] + 1]) diff --git a/code/modules/logging/categories/log_category_misc.dm b/code/modules/logging/categories/log_category_misc.dm index 2d200e63aa2..4d69c7cb35b 100644 --- a/code/modules/logging/categories/log_category_misc.dm +++ b/code/modules/logging/categories/log_category_misc.dm @@ -65,3 +65,6 @@ category = LOG_CATEGORY_QDEL // We want this human readable so it's easy to see at a glance entry_flags = ENTRY_USE_DATA_W_READABLE + +/datum/log_category/cave_generation + category = LOG_CATEGORY_CAVE_GENERATION diff --git a/code/modules/logging/categories/log_category_uplink.dm b/code/modules/logging/categories/log_category_uplink.dm index f88d224ad3b..4ef0f1af0c0 100644 --- a/code/modules/logging/categories/log_category_uplink.dm +++ b/code/modules/logging/categories/log_category_uplink.dm @@ -21,3 +21,8 @@ category = LOG_CATEGORY_UPLINK_SPELL config_flag = /datum/config_entry/flag/log_uplink master_category = /datum/log_category/uplink + +/datum/log_category/uplink_spy + category = LOG_CATEGORY_UPLINK_SPY + config_flag = /datum/config_entry/flag/log_uplink + master_category = /datum/log_category/uplink diff --git a/code/modules/logging/log_holder.dm b/code/modules/logging/log_holder.dm index b378e4b8ef3..f246dfc4543 100644 --- a/code/modules/logging/log_holder.dm +++ b/code/modules/logging/log_holder.dm @@ -107,11 +107,10 @@ GENERAL_PROTECT_DATUM(/datum/log_holder) return switch(action) - if("re-render") + if("refresh") cache_ui_data() SStgui.update_uis(src) return TRUE - else stack_trace("unknown ui_act action [action] for [type]") diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index 770d787f8ad..150b4c5e44b 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -32,7 +32,7 @@ if(ismovable(hit_atom) && !caught && (!thrown_by || thrown_by && COOLDOWN_FINISHED(src, freeze_cooldown))) freeze_hit_atom(hit_atom) if(thrown_by && !caught) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, throw_range+2, throw_speed, null, TRUE), 1) + 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) playsound(src, 'sound/effects/glassbr3.ogg', 50, TRUE) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index a4bcad87671..3c29a6a3945 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -107,7 +107,7 @@ /obj/structure/sink/oil_well/attackby(obj/item/O, mob/living/user, params) flick("puddle-oil-splash",src) - if(O.tool_behaviour == TOOL_SHOVEL && !(obj_flags & NO_DECONSTRUCTION)) //attempt to deconstruct the puddle with a shovel + if(O.tool_behaviour == TOOL_SHOVEL) //attempt to deconstruct the puddle with a shovel to_chat(user, "You fill in the oil well with soil.") O.play_tool_sound(src) deconstruct() @@ -203,7 +203,7 @@ new /obj/item/reagent_containers/cup/beaker(src) new /obj/item/clothing/glasses/science(src) if(7) - new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/glasses/sunglasses/big(src) new /obj/item/clothing/mask/cigarette/rollie(src) else //empty grave diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm index af694619898..4bfcd97e464 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm @@ -35,11 +35,10 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/obj/structure/lavaland/ash_walker/deconstruct(disassembled) +/obj/structure/lavaland/ash_walker/atom_deconstruct(disassembled) var/core_to_drop = pick(subtypesof(/obj/item/assembly/signaler/anomaly)) new core_to_drop (get_step(loc, pick(GLOB.alldirs))) new /obj/effect/collapse(loc) - return ..() /obj/structure/lavaland/ash_walker/process() consume() diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm index 20210d56cc9..8a2949f9893 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm @@ -33,6 +33,10 @@ new_replica.name = "[appearance_object.name][obvious_replica ? " replica" : ""]" new_replica.desc = "[appearance_object.desc][obvious_replica ? " ..except this one is a replica.": ""]" + + new_replica.pixel_y = pixel_y + new_replica.pixel_x = pixel_x + qdel(appearance_object) qdel(src) return INITIALIZE_HINT_QDEL @@ -129,3 +133,68 @@
sometimes i can catch them moving

we should have never come here"} + +/obj/item/paper/fluff/museum/chefs_ultimatum + name = "old note" + default_raw_text = {"I messed it up big times. +
I broke the button and now I'm stuck. +
Anyway, I don't have the key on me. I flushed it down. +
Hell knows where it's now, shit's like all linked together here."} + +/obj/item/paper/fluff/museum/numbers_on_walls + name = "reprimanding note" + default_raw_text = "Please refraim from writing the pass all over the place. I know you've the memory of a goldfish, but, like, just put it on a piece of paper, no?" + +/obj/effect/mob_spawn/corpse/human/skeleton/museum_chef + name = "Dead Museum Cafeteria Chef" + mob_name = "Nameless Chef" + outfit = /datum/outfit/museum_chef + +/datum/outfit/museum_chef + name = "Dead Museum Cafeteria Chef" + uniform = /obj/item/clothing/under/color/green + suit = /obj/item/clothing/suit/toggle/chef + head = /obj/item/clothing/head/utility/chefhat + shoes = /obj/item/clothing/shoes/laceup + mask = /obj/item/clothing/mask/fakemoustache/italian + +/obj/machinery/vending/hotdog/museum + obj_flags = parent_type::obj_flags|NO_DECONSTRUCTION + onstation_override = TRUE + +#define CAFE_KEYCARD_TOILETS "museum_cafe_key_toilets" + +///Do not place these beyond the cafeteria shutters, or you might lock people out of reaching it. +/obj/structure/toilet/museum + +/obj/structure/toilet/museum/Initialize(mapload) + . = ..() + if(mapload) + SSqueuelinks.add_to_queue(src, CAFE_KEYCARD_TOILETS) + +/obj/item/keycard/cafeteria + name = "museum cafeteria keycard" + color = COLOR_OLIVE + puzzle_id = "museum_cafeteria" + desc = "The key to the cafeteria, as the name implies." + +/obj/item/keycard/cafeteria/Initialize(mapload) + . = ..() + if(mapload) + SSqueuelinks.add_to_queue(src, CAFE_KEYCARD_TOILETS) + return INITIALIZE_HINT_LATELOAD + +/obj/item/keycard/cafeteria/LateInitialize() + . = ..() + if(SSqueuelinks.queues[CAFE_KEYCARD_TOILETS]) + SSqueuelinks.pop_link(CAFE_KEYCARD_TOILETS) + +/obj/item/keycard/cafeteria/MatchedLinks(id, partners) + if(id != CAFE_KEYCARD_TOILETS) + return ..() + var/obj/structure/toilet/destination = pick(partners) + forceMove(destination) + destination.w_items += w_class + destination.contents += src + +#undef CAFE_KEYCARD_TOILETS diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meatderelict.dm b/code/modules/mapfluff/ruins/spaceruin_code/meatderelict.dm index 5647b5aca23..0db718e399b 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/meatderelict.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/meatderelict.dm @@ -76,12 +76,12 @@ SEND_SIGNAL(src, COMSIG_PUZZLE_COMPLETED) qdel(src) -/obj/machinery/puzzle_button/meatderelict +/obj/machinery/puzzle/button/meatderelict name = "lockdown panel" desc = "A panel that controls the lockdown of this outpost." id = "md_prevault" -/obj/machinery/puzzle_button/meatderelict/open_doors() +/obj/machinery/puzzle/button/meatderelict/on_puzzle_complete() . = ..() playsound(src, 'sound/effects/alert.ogg', 100, TRUE) visible_message(span_warning("[src] lets out an alarm as the lockdown is lifted!")) @@ -121,7 +121,7 @@ /obj/lightning_thrower/Initialize(mapload) . = ..() - START_PROCESSING(SSprocessing, src) + START_PROCESSING(SSprocessing, src) /obj/lightning_thrower/Destroy() . = ..() diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index faaaf9e4206..e601256a8b6 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -1414,13 +1414,68 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) continue if(isliving(possible_buckle)) - mobs += possible_buckle - + mobs += possible_buckle + if(isnull(buckle_to)) log_mapping("[type] at [x] [y] [z] did not find anything to buckle to") return INITIALIZE_HINT_QDEL - + for(var/mob/living/mob as anything in mobs) buckle_to.buckle_mob(mob, force = force_buckle) - + return INITIALIZE_HINT_QDEL + +///Basic mob flag helpers for things like deleting on death. +/obj/effect/mapping_helpers/basic_mob_flags + name = "Basic mob flags helper" + desc = "Used to apply basic_mob_flags to basic mobs on the same turf." + late = TRUE + + ///The basic mob flag that we're adding to all basic mobs on the turf. + var/flag_to_give + +/obj/effect/mapping_helpers/basic_mob_flags/Initialize(mapload) + . = ..() + if(!mapload) + log_mapping("[src] spawned outside of mapload!") + return INITIALIZE_HINT_QDEL + +/obj/effect/mapping_helpers/basic_mob_flags/LateInitialize() + . = ..() + var/had_any_mobs = FALSE + for(var/mob/living/basic/basic_mobs in loc) + had_any_mobs = TRUE + basic_mobs.basic_mob_flags |= flag_to_give + if(!had_any_mobs) + CRASH("[src] called on a turf without any basic mobs.") + qdel(src) + +/obj/effect/mapping_helpers/basic_mob_flags/del_on_death + name = "Basic mob del on death flag helper" + icon_state = "basic_mob_del_on_death" + flag_to_give = DEL_ON_DEATH + +/obj/effect/mapping_helpers/basic_mob_flags/flip_on_death + name = "Basic mob flip on death flag helper" + icon_state = "basic_mob_flip_on_death" + flag_to_give = FLIP_ON_DEATH + +/obj/effect/mapping_helpers/basic_mob_flags/remain_dense_while_dead + name = "Basic mob remain dense while dead flag helper" + icon_state = "basic_mob_remain_dense_while_dead" + flag_to_give = REMAIN_DENSE_WHILE_DEAD + +/obj/effect/mapping_helpers/basic_mob_flags/flammable_mob + name = "Basic mob flammable flag helper" + icon_state = "basic_mob_flammable" + flag_to_give = FLAMMABLE_MOB + +/obj/effect/mapping_helpers/basic_mob_flags/immune_to_fists + name = "Basic mob immune to fists flag helper" + icon_state = "basic_mob_immune_to_fists" + flag_to_give = IMMUNE_TO_FISTS + +/obj/effect/mapping_helpers/basic_mob_flags/immune_to_getting_wet + name = "Basic mob immune to getting wet flag helper" + icon_state = "basic_mob_immune_to_getting_wet" + flag_to_give = IMMUNE_TO_GETTING_WET diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index c59a153b022..2b37a55aaa4 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -257,15 +257,17 @@ desc = "An irradiated chunk of space rock. You could probably stop and appreciate its incandescent green glow, if it weren't moving so fast." icon_state = "glowing" heavy = TRUE + hits = 9 meteordrop = list(/obj/item/stack/ore/uranium) - threat = 15 + threat = 35 signature = "radiation" /obj/effect/meteor/irradiated/meteor_effect() ..() - explosion(src, light_impact_range = 4, flash_range = 3, adminlog = FALSE) - new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - radiation_pulse(src, max_range = 3, threshold = RAD_MEDIUM_INSULATION, chance = 80) + explosion(src, heavy_impact_range = 1, light_impact_range = 3, flash_range = 6, adminlog = FALSE) + for(var/turf/open/floor/surviving_ground in range(2, get_turf(src))) + if(prob(70)) + new /obj/effect/decal/cleanable/greenglow/radioactive(get_turf(surviving_ground)) //Cluster meteor /obj/effect/meteor/cluster diff --git a/code/modules/meteors/meteor_waves.dm b/code/modules/meteors/meteor_waves.dm index 7d832d53713..5edaed4c867 100644 --- a/code/modules/meteors/meteor_waves.dm +++ b/code/modules/meteors/meteor_waves.dm @@ -5,14 +5,14 @@ GLOBAL_VAR_INIT(meteor_wave_delay, 625) //minimum wait between waves in tenths o //Meteors probability of spawning during a given wave GLOBAL_LIST_INIT(meteors_normal, list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \ - /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3, /obj/effect/meteor/carp=1, /obj/effect/meteor/bluespace=1, \ + /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=2, /obj/effect/meteor/carp=1, /obj/effect/meteor/bluespace=1, \ /obj/effect/meteor/banana=1, /obj/effect/meteor/emp = 1)) //for normal meteor event GLOBAL_LIST_INIT(meteors_threatening, list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, /obj/effect/meteor/flaming=3, \ /obj/effect/meteor/irradiated=3, /obj/effect/meteor/cluster=1, /obj/effect/meteor/carp=1, /obj/effect/meteor/bluespace=2, /obj/effect/meteor/emp = 2)) //for threatening meteor event GLOBAL_LIST_INIT(meteors_catastrophic, list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \ - /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/cluster=8, /obj/effect/meteor/tunguska=1, \ + /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=8, /obj/effect/meteor/cluster=8, /obj/effect/meteor/tunguska=1, \ /obj/effect/meteor/carp=2, /obj/effect/meteor/bluespace=10, /obj/effect/meteor/emp = 8)) //for catastrophic meteor event GLOBAL_LIST_INIT(meateors, list(/obj/effect/meteor/meaty=5, /obj/effect/meteor/meaty/xeno=1)) //for meaty ore event diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index ce42eaa43c2..5022dac212c 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -121,7 +121,7 @@ return return ..() -/obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE) +/obj/structure/closet/crate/secure/loot/atom_deconstruct(disassembled = TRUE) if(locked) boom() return diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index f904c4a5cf8..a1503b7f634 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -257,8 +257,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) /obj/item/assault_pod/mining name = "Landing Field Designator" icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-purple" - inhand_icon_state = "electronic" + icon_state = "designator_mining" + inhand_icon_state = "minertalkie" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' desc = "Deploy to designate the landing zone of the auxiliary base." @@ -273,7 +273,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) to_chat(user, span_notice("You begin setting the landing zone parameters...")) setting = TRUE - if(!do_after(user, 50, target = user)) //You get a few seconds to cancel if you do not want to drop there. + if(!do_after(user, 5 SECONDS, target = user)) //You get a few seconds to cancel if you do not want to drop there. setting = FALSE return setting = FALSE @@ -355,7 +355,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) return anti_spam_cd = 1 - addtimer(CALLBACK(src, PROC_REF(clear_cooldown)), 50) + addtimer(CALLBACK(src, PROC_REF(clear_cooldown)), 5 SECONDS) var/turf/landing_spot = get_turf(src) diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index d7d4be2557e..0dfc43cf7f7 100644 --- a/code/modules/mining/boulder_processing/_boulder_processing.dm +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -66,9 +66,9 @@ else if(istype(held_item, /obj/item/card/id) && points_held > 0) context[SCREENTIP_CONTEXT_LMB] = "Claim mining points" else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" else if(held_item.tool_behaviour == TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]Anchor" else if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" @@ -96,37 +96,17 @@ /obj/machinery/bouldertech/update_icon_state() . = ..() var/suffix = "" - if(!anchored || !is_operational || (machine_stat & (BROKEN | NOPOWER)) || panel_open) + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) suffix = "-off" icon_state ="[initial(icon_state)][suffix]" -/obj/machinery/bouldertech/wrench_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) - if(anchored) - begin_processing() - else - end_processing() - update_appearance(UPDATE_ICON_STATE) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/bouldertech/screwdriver_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) - update_appearance(UPDATE_ICON_STATE) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/bouldertech/crowbar_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_deconstruction_crowbar(tool)) - return ITEM_INTERACT_SUCCESS - /obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) if(!anchored) return FALSE if(istype(mover, /obj/item/boulder)) - var/obj/item/boulder/boulder = mover - return can_process_boulder(boulder) + return can_process_boulder(mover) + if(isgolem(mover)) + return can_process_golem(mover) return ..() /** @@ -140,7 +120,7 @@ SHOULD_BE_PURE(TRUE) //machine not operational - if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) return FALSE //not a valid boulder @@ -168,6 +148,8 @@ * * obj/item/boulder/new_boulder - the boulder to accept */ /obj/machinery/bouldertech/proc/accept_boulder(obj/item/boulder/new_boulder) + PRIVATE_PROC(TRUE) + if(!can_process_boulder(new_boulder)) return FALSE @@ -177,13 +159,70 @@ return TRUE +/** + * Can we maim this golem + * Arguments + * + * * [rockman][mob/living/carbon/human] - the golem we are trying to main + */ +/obj/machinery/bouldertech/proc/can_process_golem(mob/living/carbon/human/rockman) + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + //not operatinal + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) + return FALSE + + //still in cooldown + if(!COOLDOWN_FINISHED(src, accept_cooldown)) + return FALSE + + //not processable + if(!istype(rockman) || QDELETED(rockman) || rockman.body_position != LYING_DOWN) + return FALSE + + return TRUE + +/** + * Accepts a golem to be processed, mainly for memes + * Arguments + * + * * [rockman][mob/living/carbon/human] - the golem we are trying to main + */ +/obj/machinery/bouldertech/proc/accept_golem(mob/living/carbon/human/rockman) + PRIVATE_PROC(TRUE) + + if(!can_process_golem(rockman)) + return + + if(!use_energy(active_power_usage * 1.5, force = FALSE)) + say("Not enough energy!") + return + + maim_golem(rockman) + playsound(src, usage_sound, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + + COOLDOWN_START(src, accept_cooldown, 3 SECONDS) + +/// What effects actually happens to a golem when it is "processed" +/obj/machinery/bouldertech/proc/maim_golem(mob/living/carbon/human/rockman) + PROTECTED_PROC(TRUE) + + Shake(duration = 1 SECONDS) + rockman.visible_message(span_warning("[rockman] is processed by [src]!"), span_userdanger("You get processed into bits by [src]!")) + rockman.investigate_log("was gibbed by [src] for being a golem", INVESTIGATE_DEATHS) + rockman.gib(DROP_ALL_REMAINS) + /obj/machinery/bouldertech/proc/on_entered(datum/source, atom/movable/atom_movable) SIGNAL_HANDLER - if(!can_process_boulder(atom_movable)) + if(istype(atom_movable, /obj/item/boulder)) + INVOKE_ASYNC(src, PROC_REF(accept_boulder), atom_movable) return - INVOKE_ASYNC(src, PROC_REF(accept_boulder), atom_movable) + if(isgolem(atom_movable)) + INVOKE_ASYNC(src, PROC_REF(accept_golem), atom_movable) + return /** * Looks for a boost to the machine's efficiency, and applies it if found. @@ -205,42 +244,61 @@ return FALSE -/obj/machinery/bouldertech/attackby(obj/item/attacking_item, mob/user, params) - if(panel_open) +/obj/machinery/bouldertech/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + if(panel_open || user.combat_mode) return ..() - if(istype(attacking_item, /obj/item/boulder)) - . = TRUE - var/obj/item/boulder/my_boulder = attacking_item + if(istype(tool, /obj/item/boulder)) + var/obj/item/boulder/my_boulder = tool if(!accept_boulder(my_boulder)) balloon_alert_to_viewers("cannot accept!") - return + return ITEM_INTERACT_BLOCKING balloon_alert_to_viewers("accepted") - return + return ITEM_INTERACT_SUCCESS - if(istype(attacking_item, /obj/item/card/id)) - . = TRUE + if(istype(tool, /obj/item/card/id)) if(points_held <= 0) balloon_alert_to_viewers("no points to claim!") if(!COOLDOWN_FINISHED(src, sound_cooldown)) - return + return ITEM_INTERACT_BLOCKING COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, FALSE) - return + return ITEM_INTERACT_BLOCKING - var/obj/item/card/id/id_card = attacking_item + var/obj/item/card/id/id_card = tool var/amount = tgui_input_number(user, "How many mining points do you wish to claim? ID Balance: [id_card.registered_account.mining_points], stored mining points: [points_held]", "Transfer Points", max_value = points_held, min_value = 0, round_value = 1) if(!amount) - return + return ITEM_INTERACT_BLOCKING if(amount > points_held) amount = points_held id_card.registered_account.mining_points += amount points_held = round(points_held - amount) to_chat(user, span_notice("You claim [amount] mining points from \the [src] to [id_card].")) - return + return ITEM_INTERACT_SUCCESS return ..() +/obj/machinery/bouldertech/wrench_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) + if(anchored) + begin_processing() + else + end_processing() + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/bouldertech/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/bouldertech/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + /obj/machinery/bouldertech/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) @@ -266,15 +324,20 @@ * Accepts a boulder into the machinery, then converts it into minerals. * If the boulder can be fully processed by this machine, we take the materials, insert it into the silo, and destroy the boulder. * If the boulder has materials left, we make a copy of the boulder to hold the processable materials, take the processable parts, and eject the original boulder. - * @param chosen_boulder The boulder to being breaking down into minerals. + * Arguments + * + * * obj/item/boulder/chosen_boulder - The boulder to being breaking down into minerals. */ /obj/machinery/bouldertech/proc/breakdown_boulder(obj/item/boulder/chosen_boulder) PRIVATE_PROC(TRUE) if(QDELETED(chosen_boulder)) - return FALSE + return if(chosen_boulder.loc != src) - return FALSE + return + if(!use_energy(active_power_usage, force = FALSE)) + say("Not enough energy!") + return //if boulders are kept inside because there is no space to eject them, then they could be reprocessed, lets avoid that if(!chosen_boulder.processed_by) @@ -290,7 +353,6 @@ 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 - use_power(active_power_usage) //puts back materials that couldn't be processed chosen_boulder.set_custom_materials(rejected_mats, refining_efficiency) @@ -301,7 +363,7 @@ if(istype(chosen_boulder, /obj/item/boulder/artifact)) points_held = round((points_held + MINER_POINT_MULTIPLIER) * MINING_POINT_MACHINE_MULTIPLIER) /// Artifacts give bonus points! chosen_boulder.break_apart() - return TRUE //We've processed all the materials in the boulder, so we can just destroy it in break_apart. + return//We've processed all the materials in the boulder, so we can just destroy it in break_apart. chosen_boulder.processed_by = src @@ -309,7 +371,7 @@ remove_boulder(chosen_boulder) /obj/machinery/bouldertech/process() - if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + if(!anchored || panel_open || !is_operational || (machine_stat & (BROKEN | NOPOWER))) return var/boulders_found = FALSE diff --git a/code/modules/mining/boulder_processing/boulder.dm b/code/modules/mining/boulder_processing/boulder.dm index 0cc310eb170..84916f7ec7b 100644 --- a/code/modules/mining/boulder_processing/boulder.dm +++ b/code/modules/mining/boulder_processing/boulder.dm @@ -109,6 +109,7 @@ /obj/item/boulder/proc/manual_process(obj/item/weapon, mob/living/user, override_speed_multiplier, continued = FALSE) var/process_speed = 0 //Handle weapon conditions. + var/skill_modifier = user.mind?.get_skill_modifier(/datum/skill/mining, SKILL_SPEED_MODIFIER) || 1 if(weapon) if(HAS_TRAIT(weapon, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) durability = 0 @@ -119,25 +120,24 @@ // Handle user conditions/override conditions. else if (override_speed_multiplier || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) - if(user) - if(HAS_TRAIT(user, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) - durability = 0 + if(HAS_TRAIT(user, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) + durability = 0 else if(override_speed_multiplier) process_speed = override_speed_multiplier else process_speed = INATE_BOULDER_SPEED_MULTIPLIER playsound(src, 'sound/effects/rocktap1.ogg', 50) if(!continued) - to_chat(user, span_notice("You scrape away at \the [src]... speed is [process_speed].")) + to_chat(user, span_notice("You scrape away at \the [src]...")) else CRASH("No weapon, acceptable user, or override speed multiplier passed to manual_process()") if(durability > 0) - if(!do_after(user, (2 * process_speed SECONDS), target = src)) + if(!do_after(user, (2 * process_speed * skill_modifier SECONDS), target = src)) return if(!user.Adjacent(src)) return durability-- - user.apply_damage(4, STAMINA) + user.apply_damage(4 * skill_modifier, STAMINA) if(durability <= 0) convert_to_ore() to_chat(user, span_notice("You finish working on \the [src], and it crumbles into ore.")) @@ -163,7 +163,7 @@ stack_trace("boulder found containing material type [picked.type] with no set ore_type") continue cracked_ore = new cracked_ore_type (drop_location(), quantity) - SSblackbox.record_feedback("tally", "ore_mined", quantity, cracked_ore) + SSblackbox.record_feedback("tally", "ore_mined", quantity, cracked_ore.type) ///Moves boulder contents to the drop location, and then deletes the boulder. /obj/item/boulder/proc/break_apart() diff --git a/code/modules/mining/boulder_processing/brm.dm b/code/modules/mining/boulder_processing/brm.dm index e4d525bff05..259c3eed5f6 100644 --- a/code/modules/mining/boulder_processing/brm.dm +++ b/code/modules/mining/boulder_processing/brm.dm @@ -37,26 +37,23 @@ register_context() /obj/machinery/brm/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = CONTEXTUAL_SCREENTIP_SET + . = NONE if(isnull(held_item)) context[SCREENTIP_CONTEXT_LMB] = "Teleport single boulder" context[SCREENTIP_CONTEXT_RMB] = "Toggle [toggled_on ? "Off" : "On"] automatic boulder retrieval" - return + return CONTEXTUAL_SCREENTIP_SET if(!isnull(held_item)) if(held_item.tool_behaviour == TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" - return - if(held_item.tool_behaviour == TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" - return - - if(panel_open) - if(held_item.tool_behaviour == TOOL_CROWBAR) - context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" - - return CONTEXTUAL_SCREENTIP_SET + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]Anchor" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" + return CONTEXTUAL_SCREENTIP_SET + else if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET /obj/machinery/brm/examine(mob/user) . = ..() @@ -131,8 +128,6 @@ var/result = pre_collect_boulder() if(result == TURF_BLOCKED_BY_BOULDER) balloon_alert(user, "no space") - else if(result) - balloon_alert(user, "teleporting") COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) return TRUE @@ -273,7 +268,7 @@ random_boulder.pixel_x = rand(-2, 2) random_boulder.pixel_y = rand(-2, 2) balloon_alert_to_viewers("boulder appears!") - use_power(active_power_usage) + use_energy(active_power_usage) //try again if we have more boulders to work with boulders_remaining -= 1 diff --git a/code/modules/mining/boulder_processing/refinery.dm b/code/modules/mining/boulder_processing/refinery.dm index 662bb3e75e1..a751566efa1 100644 --- a/code/modules/mining/boulder_processing/refinery.dm +++ b/code/modules/mining/boulder_processing/refinery.dm @@ -85,3 +85,7 @@ /obj/machinery/bouldertech/refinery/smelter/on_set_is_operational(old_value) set_light_on(TRUE) +/obj/machinery/bouldertech/refinery/smelter/maim_golem(mob/living/carbon/human/rockman) + rockman.visible_message(span_warning("[rockman] is processed by [src]!"), span_userdanger("You get melted into rock by [src]!")) + rockman.investigate_log("was melted by [src] for being a golem", INVESTIGATE_DEATHS) + rockman.dust() diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index e1df98239e2..92ded187109 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -1,4 +1,10 @@ -/*********************Mining Hammer****************/ +/** + * Kinetic Crusher + * + * Lavaland's "Hard Mode" option for players, requiring melee attacks (backstabs even better), + * but allowing you to upgrade it with trophies gained from fighting lavaland monsters, making it + * a good tradeoff and a decent playstyle. + */ /obj/item/kinetic_crusher icon = 'icons/obj/mining.dmi' icon_state = "crusher" @@ -6,8 +12,9 @@ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' name = "proto-kinetic crusher" - desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, forming a high-tech club. \ - While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna." + desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, \ + forming a high-tech club. While it is an effective mining tool, it did little to aid any but the most skilled and/or \ + suicidal miners against local fauna." force = 0 //You can't hit stuff unless wielded w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK @@ -23,10 +30,13 @@ obj_flags = UNIQUE_RENAME light_system = OVERLAY_LIGHT light_range = 5 + light_power = 1.2 + light_color = "#ffff66" light_on = FALSE - var/list/trophies = list() + ///List of all crusher trophies attached to this. + var/list/obj/item/crusher_trophy/trophies = list() var/charged = TRUE - var/charge_time = 15 + var/charge_time = 1.5 SECONDS var/detonation_damage = 50 var/backstab_bonus = 30 @@ -52,75 +62,81 @@ . = ..() . += span_notice("Mark a large creature with a destabilizing force with right-click, then hit them in melee to do [force + detonation_damage] damage.") . += span_notice("Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - . += span_notice("It has \a [T] attached, which causes [T.effect_desc()].") + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) + . += span_notice("It has \a [crusher_trophy] attached, which causes [crusher_trophy.effect_desc()].") -/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user) - if(I.tool_behaviour == TOOL_CROWBAR) - if(LAZYLEN(trophies)) - to_chat(user, span_notice("You remove [src]'s trophies.")) - I.play_tool_sound(src) - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - T.remove_from(src, user) - else - to_chat(user, span_warning("There are no trophies on [src].")) - else if(istype(I, /obj/item/crusher_trophy)) - var/obj/item/crusher_trophy/T = I - T.add_to(src, user) - else - return ..() +/obj/item/kinetic_crusher/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/crusher_trophy)) + var/obj/item/crusher_trophy/crusher_trophy = attacking_item + crusher_trophy.add_to(src, user) + return + return ..() + +/obj/item/kinetic_crusher/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(!LAZYLEN(trophies)) + user.balloon_alert(user, "no trophies!") + return ITEM_INTERACT_BLOCKING + user.balloon_alert(user, "trophies removed") + tool.play_tool_sound(src) + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) + crusher_trophy.remove_from(src, user) + return ITEM_INTERACT_SUCCESS /obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) if(!HAS_TRAIT(src, TRAIT_WIELDED)) to_chat(user, span_warning("[src] is too heavy to use with one hand! You fumble and drop everything.")) user.drop_all_held_items() return - var/datum/status_effect/crusher_damage/C = target.has_status_effect(/datum/status_effect/crusher_damage) - if(!C) - C = target.apply_status_effect(/datum/status_effect/crusher_damage) + var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) + if(!crusher_damage_effect) + crusher_damage_effect = target.apply_status_effect(/datum/status_effect/crusher_damage) var/target_health = target.health ..() - for(var/t in trophies) + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) if(!QDELETED(target)) - var/obj/item/crusher_trophy/T = t - T.on_melee_hit(target, user) - if(!QDELETED(C) && !QDELETED(target)) - C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did + crusher_trophy.on_melee_hit(target, user) + if(!QDELETED(crusher_damage_effect) && !QDELETED(target)) + crusher_damage_effect.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did -/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) - if(proximity_flag && isliving(target)) - var/mob/living/L = target - var/datum/status_effect/crusher_mark/CM = L.has_status_effect(/datum/status_effect/crusher_mark) - if(!CM || CM.hammer_synced != src || !L.remove_status_effect(/datum/status_effect/crusher_mark)) - return - var/datum/status_effect/crusher_damage/C = L.has_status_effect(/datum/status_effect/crusher_damage) - if(!C) - C = L.apply_status_effect(/datum/status_effect/crusher_damage) - var/target_health = L.health - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - T.on_mark_detonation(target, user) - if(!QDELETED(L)) - if(!QDELETED(C)) - C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did - new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) - var/backstabbed = FALSE - var/combined_damage = detonation_damage - var/backstab_dir = get_dir(user, L) - var/def_check = L.getarmor(type = BOMB) - if((user.dir & backstab_dir) && (L.dir & backstab_dir)) - backstabbed = TRUE - combined_damage += backstab_bonus - playsound(user, 'sound/weapons/kinetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong - - if(!QDELETED(C)) - C.total_damage += combined_damage - - - SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, L, src, backstabbed) - L.apply_damage(combined_damage, BRUTE, blocked = def_check) +/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, proximity_flag, clickparams) + . = ..() + if(.) + return + if(!proximity_flag || !isliving(target)) + return + var/valid_crusher_attack = FALSE + for(var/datum/status_effect/crusher_mark/crusher_mark_effect as anything in target.get_all_status_effect_of_id(/datum/status_effect/crusher_mark)) + //this will erase ALL crusher marks, not only ones by you. + if(crusher_mark_effect.hammer_synced != src || !target.remove_status_effect(/datum/status_effect/crusher_mark, src)) + continue + valid_crusher_attack = TRUE + break + if(!valid_crusher_attack) + return + var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) + if(!crusher_damage_effect) + crusher_damage_effect = target.apply_status_effect(/datum/status_effect/crusher_damage) + var/target_health = target.health + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) + crusher_trophy.on_mark_detonation(target, user) + if(QDELETED(target)) + return + if(!QDELETED(crusher_damage_effect)) + crusher_damage_effect.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did + new /obj/effect/temp_visual/kinetic_blast(get_turf(target)) + var/backstabbed = FALSE + var/combined_damage = detonation_damage + var/backstab_dir = get_dir(user, target) + var/def_check = target.getarmor(type = BOMB) + if((user.dir & backstab_dir) && (target.dir & backstab_dir)) + backstabbed = TRUE + combined_damage += backstab_bonus + playsound(user, 'sound/weapons/kinetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong + if(!QDELETED(crusher_damage_effect)) + crusher_damage_effect.total_damage += combined_damage + SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, target, src, backstabbed) + target.apply_damage(combined_damage, BRUTE, blocked = def_check) /obj/item/kinetic_crusher/attack_secondary(atom/target, mob/living/user, clickparams) return SECONDARY_ATTACK_CONTINUE_CHAIN @@ -153,9 +169,9 @@ destabilizer.fire() charged = FALSE update_appearance() - addtimer(CALLBACK(src, PROC_REF(Recharge)), charge_time) + addtimer(CALLBACK(src, PROC_REF(recharge_projectile)), charge_time) -/obj/item/kinetic_crusher/proc/Recharge() +/obj/item/kinetic_crusher/proc/recharge_projectile() if(!charged) charged = TRUE update_appearance() @@ -195,6 +211,7 @@ armor_flag = BOMB range = 6 log_override = TRUE + ///The crusher that's firing this projectile. var/obj/item/kinetic_crusher/hammer_synced /obj/projectile/destabilizer/Destroy() @@ -203,19 +220,21 @@ /obj/projectile/destabilizer/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) - var/mob/living/L = target - var/had_effect = (L.has_status_effect(/datum/status_effect/crusher_mark)) //used as a boolean - var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(/datum/status_effect/crusher_mark, hammer_synced) - if(hammer_synced) - for(var/t in hammer_synced.trophies) - var/obj/item/crusher_trophy/T = t - T.on_mark_application(target, CM, had_effect) + var/mob/living/living_target = target + var/has_mark_from_this_crusher = FALSE + for(var/datum/status_effect/crusher_mark/crusher_mark_effect as anything in living_target.get_all_status_effect_of_id(/datum/status_effect/crusher_mark)) + if(crusher_mark_effect.hammer_synced != hammer_synced) + continue + has_mark_from_this_crusher = TRUE + break + if(!has_mark_from_this_crusher) + living_target.apply_status_effect(/datum/status_effect/crusher_mark, hammer_synced) var/target_turf = get_turf(target) if(ismineralturf(target_turf)) - var/turf/closed/mineral/M = target_turf - new /obj/effect/temp_visual/kinetic_blast(M) - M.gets_drilled(firer) - ..() + var/turf/closed/mineral/hit_mineral = target_turf + new /obj/effect/temp_visual/kinetic_blast(hit_mineral) + hit_mineral.gets_drilled(firer) + return ..() //trophies /obj/item/crusher_trophy @@ -256,7 +275,6 @@ /obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user /obj/item/crusher_trophy/proc/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user -/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before /obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user //watcher @@ -348,13 +366,13 @@ return "mark detonation to do [bonus_value] damage to nearby creatures and push them back" /obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user) - for(var/mob/living/L in oview(2, user)) - if(L.stat == DEAD) + for(var/mob/living/living_target in oview(2, user)) + if(user.faction_check_atom(living_target) || living_target.stat == DEAD) continue - playsound(L, 'sound/magic/fireball.ogg', 20, TRUE) - new /obj/effect/temp_visual/fire(L.loc) - addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done - L.adjustFireLoss(bonus_value, forced = TRUE) + playsound(living_target, 'sound/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) /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 @@ -470,3 +488,17 @@ continue return possible_turf return get_turf(user) + +//wolf trophy + +/obj/item/crusher_trophy/wolf_ear + name = "wolf ear" + desc = "It's a wolf ear." + icon_state = "wolf_ear" + denied_type = /obj/item/crusher_trophy/wolf_ear + +/obj/item/crusher_trophy/wolf_ear/effect_desc() + return "mark detonation to gain a slight speed boost temporarily" + +/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user) + user.apply_status_effect(/datum/status_effect/speed_boost, 1 SECONDS) diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index a9b7205406e..ff90c418c88 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -54,7 +54,7 @@ playsound(src,'sound/effects/refill.ogg',50,TRUE) icon_state = "lazarus_empty" -/obj/item/lazarus_injector/emp_act() +/obj/item/lazarus_injector/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index 67eb767f767..38dda48d345 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -99,12 +99,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( picked_color = set_color update_appearance() -/obj/structure/marker_beacon/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/obj/item/stack/marker_beacon/M = new(loc) - M.picked_color = picked_color - M.update_appearance() - qdel(src) +/obj/structure/marker_beacon/atom_deconstruct(disassembled = TRUE) + var/obj/item/stack/marker_beacon/beacon = new(loc) + beacon.picked_color = picked_color + beacon.update_appearance() /obj/structure/marker_beacon/examine(mob/user) . = ..() diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index f4463434066..d40589dd3f8 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -214,8 +214,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/survival_pod/left, 0) /obj/item/gps/computer/wrench_act(mob/living/user, obj/item/I) ..() - if(obj_flags & NO_DECONSTRUCTION) - return TRUE user.visible_message(span_warning("[user] disassembles [src]."), span_notice("You start to disassemble [src]..."), span_hear("You hear clanking and banging noises.")) diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index b4165a13cd0..a19d0a72420 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -114,4 +114,4 @@ L.Paralyze(60) if(ishuman(L)) shake_camera(L, 20, 1) - addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living/carbon, vomit)), 20) + addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living/carbon, vomit)), 2 SECONDS) diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 3c80ad80db1..25214d2ae54 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -120,7 +120,7 @@ if(isturf(user.loc)) user.visible_message(span_hierophant_warning("[user] starts fiddling with [src]'s pommel..."), \ span_notice("You start detaching the hierophant beacon...")) - if(do_after(user, 50, target = user) && !beacon) + if(do_after(user, 5 SECONDS, target = user) && !beacon) var/turf/user_turf = get_turf(user) playsound(user_turf,'sound/magic/blind.ogg', 200, TRUE, -4) new /obj/effect/temp_visual/hierophant/telegraph/teleport(user_turf, user) @@ -149,7 +149,7 @@ beacon.icon_state = "hierophant_tele_on" var/obj/effect/temp_visual/hierophant/telegraph/edge/user_telegraph = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc) var/obj/effect/temp_visual/hierophant/telegraph/edge/beacon_telegraph = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc) - if(do_after(user, 40, target = user) && user && beacon) + if(do_after(user, 4 SECONDS, target = user) && user && beacon) var/turf/destination = get_turf(beacon) var/turf/source = get_turf(user) if(destination.is_blocked_turf(TRUE)) @@ -162,7 +162,7 @@ new /obj/effect/temp_visual/hierophant/telegraph(source, user) playsound(destination,'sound/magic/wand_teleport.ogg', 200, TRUE) playsound(source,'sound/machines/airlockopen.ogg', 200, TRUE) - if(!do_after(user, 3, target = user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord + if(!do_after(user, 0.3 SECONDS, target = user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord teleporting = FALSE if(user) user.update_mob_action_buttons() @@ -424,13 +424,16 @@ using = TRUE balloon_alert(user, "you hold the scythe up...") ADD_TRAIT(src, TRAIT_NODROP, type) - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(on_poll_concluded), user) - AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_POSSESSED_BLADE, \ - job_bans = ROLE_PAI, \ - to_call = to_call, \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + check_jobban = ROLE_PAI, + poll_time = 20 SECONDS, + checked_target = src, + ignore_category = POLL_IGNORE_POSSESSED_BLADE, + alert_pic = src, + role_name_text = "soulscythe soul", + chat_text_border_icon = src, ) + on_poll_concluded(user, chosen_one) /// Ghost poll has concluded and a candidate has been chosen. /obj/item/soulscythe/proc/on_poll_concluded(mob/living/master, mob/dead/observer/ghost) diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 310c12940a7..8e1660f473c 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -105,22 +105,22 @@ return var/failText = span_warning("The snake seems unsatisfied with your incomplete oath and returns to its previous place on the rod, returning to its dormant, wooden state. You must stand still while completing your oath!") to_chat(itemUser, span_notice("The wooden snake that was carved into the rod seems to suddenly come alive and begins to slither down your arm! The compulsion to help others grows abnormally strong...")) - if(do_after(itemUser, 40, target = itemUser)) + if(do_after(itemUser, 4 SECONDS, target = itemUser)) itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:", forced = "hippocratic oath") else to_chat(itemUser, failText) return - if(do_after(itemUser, 20, target = itemUser)) + if(do_after(itemUser, 2 SECONDS, target = itemUser)) itemUser.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.", forced = "hippocratic oath") else to_chat(itemUser, failText) return - if(do_after(itemUser, 30, target = itemUser)) + if(do_after(itemUser, 3 SECONDS, target = itemUser)) itemUser.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.", forced = "hippocratic oath") else to_chat(itemUser, failText) return - if(do_after(itemUser, 30, target = itemUser)) + if(do_after(itemUser, 3 SECONDS, target = itemUser)) itemUser.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.", forced = "hippocratic oath") else to_chat(itemUser, failText) @@ -163,7 +163,7 @@ /obj/item/clothing/neck/necklace/memento_mori/proc/memento(mob/living/carbon/human/user) to_chat(user, span_warning("You feel your life being drained by the pendant...")) - if(do_after(user, 40, target = user)) + if(do_after(user, 4 SECONDS, target = user)) to_chat(user, span_notice("Your lifeforce is now linked to the pendant! You feel like removing it would kill you, and yet you instinctively know that until then, you won't die.")) user.add_traits(list(TRAIT_NODEATH, TRAIT_NOHARDCRIT, TRAIT_NOCRITDAMAGE), CLOTHING_TRAIT) RegisterSignal(user, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(check_health)) @@ -272,7 +272,9 @@ icon = 'icons/obj/lighting.dmi' icon_state = "orb" light_system = OVERLAY_LIGHT - light_range = 7 + light_range = 6 + light_power = 1.2 + light_color = "#79f1ff" light_flags = LIGHT_ATTACHED layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE @@ -799,11 +801,12 @@ icon_state = "godeye" inhand_icon_state = null vision_flags = SEE_TURFS + clothing_traits = list(TRAIT_MADNESS_IMMUNE) // Blue, light blue color_cutoffs = list(15, 30, 40) resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF custom_materials = null - var/datum/action/cooldown/scan/scan_ability + var/datum/action/cooldown/spell/pointed/scan/scan_ability /obj/item/clothing/glasses/godeye/Initialize(mapload) . = ..() @@ -834,49 +837,60 @@ victim.emote("scream") victim.flash_act() -/datum/action/cooldown/scan +/datum/action/cooldown/spell/pointed/scan name = "Scan" - desc = "Scan an enemy, to get their location and stagger them, increasing their time between attacks." + desc = "Scan an enemy, to get their location and rebuke them, increasing their time between attacks." background_icon_state = "bg_clock" overlay_icon_state = "bg_clock_border" button_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "scan" + school = SCHOOL_HOLY + cooldown_time = 35 SECONDS + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + antimagic_flags = MAGIC_RESISTANCE_MIND //Even god cannot penetrate the tin foil hat - click_to_activate = TRUE - cooldown_time = 45 SECONDS ranged_mousepointer = 'icons/effects/mouse_pointers/scan_target.dmi' -/datum/action/cooldown/scan/IsAvailable(feedback = FALSE) - return ..() && isliving(owner) - -/datum/action/cooldown/scan/Activate(atom/scanned) - StartCooldown(15 SECONDS) - - if(owner.stat != CONSCIOUS) +/datum/action/cooldown/spell/pointed/scan/is_valid_target(atom/cast_on) + if(!isliving(cast_on)) + owner.balloon_alert(owner, "not a valid target!") return FALSE - if(!isliving(scanned) || scanned == owner) - owner.balloon_alert(owner, "invalid scanned!") + var/mob/living/living_cast_on = cast_on + if(living_cast_on.stat == DEAD) + owner.balloon_alert(owner, "target is dead!") return FALSE + return TRUE + +/datum/action/cooldown/spell/pointed/scan/cast(mob/living/cast_on) + . = ..() + + if(cast_on.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) + to_chat(owner, span_warning("As we apply our dissecting vision, we are abruptly cut short. \ + They have some kind of enigmatic mental defense. It seems we've been foiled.")) + return + + if(cast_on == owner) + to_chat(owner, span_warning("The last time a god stared too closely into their own reflection, they became transfixed for all of time. Do not let us become like them.")) + return + var/mob/living/living_owner = owner - var/mob/living/living_scanned = scanned - living_scanned.apply_status_effect(/datum/status_effect/stagger) + var/mob/living/living_scanned = cast_on + living_scanned.apply_status_effect(/datum/status_effect/rebuked) var/datum/status_effect/agent_pinpointer/scan_pinpointer = living_owner.apply_status_effect(/datum/status_effect/agent_pinpointer/scan) scan_pinpointer.scan_target = living_scanned - living_scanned.set_jitter_if_lower(100 SECONDS) - to_chat(living_scanned, span_warning("You've been staggered!")) - living_scanned.add_filter("scan", 2, list("type" = "outline", "color" = COLOR_YELLOW, "size" = 1)) + to_chat(living_scanned, span_warning("You briefly see a flash of [living_owner]'s face before being knocked off-balance by an unseen force!")) + living_scanned.add_filter("scan", 2, list("type" = "outline", "color" = COLOR_RED, "size" = 1)) addtimer(CALLBACK(living_scanned, TYPE_PROC_REF(/datum, remove_filter), "scan"), 30 SECONDS) + healthscan(living_owner, living_scanned, 1, TRUE) + owner.playsound_local(get_turf(owner), 'sound/magic/smoke.ogg', 50, TRUE) owner.balloon_alert(owner, "[living_scanned] scanned") addtimer(CALLBACK(src, PROC_REF(send_cooldown_end_message), cooldown_time)) - StartCooldown() - return TRUE - -/datum/action/cooldown/scan/proc/send_cooldown_end_message() +/datum/action/cooldown/spell/pointed/scan/proc/send_cooldown_end_message() owner?.balloon_alert(owner, "scan recharged") /datum/status_effect/agent_pinpointer/scan diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 62458347bf0..11a941c4098 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -147,21 +147,10 @@ /obj/machinery/mineral/processing_unit/Initialize(mapload) . = ..() proximity_monitor = new(src, 1) - var/list/allowed_materials = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/silver, - /datum/material/gold, - /datum/material/diamond, - /datum/material/plasma, - /datum/material/uranium, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/bluespace, - ) + materials = AddComponent( \ /datum/component/material_container, \ - allowed_materials, \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_EXAMINE, \ allowed_items = /obj/item/stack \ diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 9320bc01226..97c3a90b78e 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -18,22 +18,9 @@ /obj/machinery/ore_silo/Initialize(mapload) . = ..() - var/static/list/materials_list = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/silver, - /datum/material/gold, - /datum/material/diamond, - /datum/material/plasma, - /datum/material/uranium, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/bluespace, - /datum/material/plastic, - ) materials = AddComponent( \ /datum/component/material_container, \ - materials_list, \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_EXAMINE, \ container_signals = list( \ diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 0b499f590d6..e94b8d981ff 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -453,7 +453,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ if (!attack_self(user)) user.visible_message(span_suicide("[user] couldn't flip \the [src]!")) return SHAME - addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), 10)//10 = time takes for flip animation + addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), 1 SECONDS)//10 = time takes for flip animation return MANUAL_SUICIDE_NONLETHAL /obj/item/coin/proc/manual_suicide(mob/living/user) @@ -614,7 +614,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/eldritch name = "eldritch coin" - desc = "Everytime it lands it bolts or opens doors, except for you." + 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) sideslist = list("heretic", "blade") diff --git a/code/modules/mining/satchel_ore_box.dm b/code/modules/mining/satchel_ore_box.dm index 3b2a5ce054c..b94796b1614 100644 --- a/code/modules/mining/satchel_ore_box.dm +++ b/code/modules/mining/satchel_ore_box.dm @@ -19,13 +19,11 @@ for(var/obj/item/weapon in src) weapon.forceMove(drop) -/obj/structure/ore_box/deconstruct(disassembled = TRUE) +/obj/structure/ore_box/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/mineral/wood(loc, 4) dump_box_contents() - return ..() - /obj/structure/ore_box/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = NONE if(isnull(held_item)) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 3aae243a3c4..87b5622c533 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -91,16 +91,20 @@ INITIALIZE_IMMEDIATE(/mob/dead) #undef SERVER_HOPPER_TRAIT -/mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister - if (registered_z != new_z) - if (registered_z) - SSmobs.dead_players_by_zlevel[registered_z] -= src - if (client) - if (new_z) - SSmobs.dead_players_by_zlevel[new_z] += src - registered_z = new_z - else - registered_z = null +/** + * updates the Z level for dead players + * If they don't have a new z, we'll keep the old one, preventing bugs from ghosting and re-entering, among others + */ +/mob/dead/proc/update_z(new_z) + if(registered_z == new_z) + return + if(registered_z) + SSmobs.dead_players_by_zlevel[registered_z] -= src + if(isnull(client)) + registered_z = null + return + registered_z = new_z + SSmobs.dead_players_by_zlevel[new_z] += src /mob/dead/Login() . = ..() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 022f6621a31..4c944324606 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -279,7 +279,10 @@ if((job.job_flags & JOB_ASSIGN_QUIRKS) && humanc && CONFIG_GET(flag/roundstart_traits)) SSquirks.AssignQuirks(humanc, humanc.client) - log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) + var/area/station/arrivals = GLOB.areas_by_type[/area/station/hallway/secondary/entry] + if(humanc && arrivals && !arrivals.power_environ) //arrivals depowered + humanc.put_in_hands(new /obj/item/crowbar/large/emergency(get_turf(humanc))) //if hands full then just drops on the floor + log_manifest(character.mind.key, character.mind, character, latejoin = TRUE) // SKYRAT EDIT ADDITION START if(humanc) diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index 4135f8d22fa..c239817a30e 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -14,10 +14,6 @@ preferred_form = client.prefs.read_preference(/datum/preference/choiced/ghost_form) ghost_orbit = client.prefs.read_preference(/datum/preference/choiced/ghost_orbit) - var/turf/T = get_turf(src) - if (isturf(T)) - update_z(T.z) - update_icon(ALL, preferred_form) updateghostimages() client.set_right_click_menu_mode(FALSE) diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm index 4ba701c0ae0..53db92d91e3 100644 --- a/code/modules/mob/dead/observer/logout.dm +++ b/code/modules/mob/dead/observer/logout.dm @@ -1,5 +1,4 @@ /mob/dead/observer/Logout() - update_z(null) if (client) client.images -= (GLOB.ghost_images_default+GLOB.ghost_images_simple) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index dbe215c3228..7e511fcb8eb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -17,8 +17,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) hud_type = /datum/hud/ghost movement_type = GROUND | FLYING light_system = OVERLAY_LIGHT - light_range = 1 - light_power = 2 + light_range = 2.5 + light_power = 0.6 light_on = FALSE shift_to_open_context_menu = FALSE var/can_reenter_corpse @@ -159,9 +159,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) /mob/dead/observer/narsie_act() var/old_color = color - color = "#960000" + color = COLOR_CULT_RED animate(src, color = old_color, time = 10, flags = ANIMATION_PARALLEL) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 10) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 1 SECONDS) /mob/dead/observer/Destroy() if(data_huds_on) @@ -345,7 +345,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set_glide_size(glide_size_override) if(NewLoc) abstract_move(NewLoc) - update_parallax_contents() else var/turf/destination = get_turf(src) @@ -480,7 +479,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return usr.abstract_move(pick(L)) - update_parallax_contents() /mob/dead/observer/verb/follow() set category = "Ghost" @@ -551,7 +549,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(isturf(destination_turf)) source_mob.abstract_move(destination_turf) - source_mob.update_parallax_contents() else to_chat(source_mob, span_danger("This mob is not located in the game world.")) diff --git a/code/modules/mob/dead/observer/observer_movement.dm b/code/modules/mob/dead/observer/observer_movement.dm index 9e156913a98..6972d3b265f 100644 --- a/code/modules/mob/dead/observer/observer_movement.dm +++ b/code/modules/mob/dead/observer/observer_movement.dm @@ -1,11 +1,17 @@ +/mob/dead/observer/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/dead/observer/up() set name = "Move Upwards" set category = "IC" if(zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) - to_chat(src, "You move upwards.") + to_chat(src, span_notice("You move upwards.")) /mob/dead/observer/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) z_move_flags |= ZMOVE_IGNORE_OBSTACLES //observers do not respect these FLOORS you speak so much of. return ..() - diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index e63839b123f..e43086349b3 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -9,7 +9,19 @@ mods[RADIO_EXTENSION] = GLOB.department_radio_keys[mods[RADIO_KEY]] return message -/mob/dead/observer/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/dead/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(), +) message = trim(message) //trim now and sanitize after checking for special admin radio keys var/list/filter_result = CAN_BYPASS_FILTER(src) ? null : is_ooc_filtered(message) @@ -27,7 +39,6 @@ if(!message) return - var/list/message_mods = list() message = get_message_mods(message, message_mods) if(client?.holder && (message_mods[RADIO_EXTENSION] == MODE_ADMIN || message_mods[RADIO_EXTENSION] == MODE_DEADMIN || (message_mods[RADIO_EXTENSION] == MODE_PUPPET && mind?.current))) message = trim_left(copytext_char(message, length(message_mods[RADIO_KEY]) + 2)) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 1bb8e61ef2b..bf9e099e5c9 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -79,7 +79,7 @@ /datum/emote/flip/run_emote(mob/user, params , type_override, intentional) . = ..() if(.) - user.SpinAnimation(7,1) + user.SpinAnimation(FLIP_EMOTE_DURATION,1) /datum/emote/flip/check_cooldown(mob/user, intentional) . = ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index be669aedb2a..f06c16e11de 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,4 +1,4 @@ -//These procs handle putting s tuff in your hands +//These procs handle putting stuff in your hands //as they handle all relevant stuff like adding it to the player's screen and updating their overlays. ///Returns the thing we're currently holding diff --git a/code/modules/mob/living/basic/alien/_alien.dm b/code/modules/mob/living/basic/alien/_alien.dm new file mode 100644 index 00000000000..823ab896c0a --- /dev/null +++ b/code/modules/mob/living/basic/alien/_alien.dm @@ -0,0 +1,84 @@ +/mob/living/basic/alien + name = "alien hunter" + desc = "Hiss!" + icon = 'icons/mob/nonhuman-player/alien.dmi' + icon_state = "alienh" + icon_living = "alienh" + icon_dead = "alienh_dead" + icon_gib = "syndicate_gib" + gender = FEMALE + status_flags = CANPUSH + butcher_results = list( + /obj/item/food/meat/slab/xeno = 4, + /obj/item/stack/sheet/animalhide/xeno = 1, + ) + + maxHealth = 125 + health = 125 + bubble_icon = "alien" + combat_mode = TRUE + faction = list(ROLE_ALIEN) + + // Going for a dark purple here + lighting_cutoff_red = 30 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 50 + unique_name = TRUE + + basic_mob_flags = FLAMMABLE_MOB + speed = 0 + obj_damage = 60 + + speak_emote = list("hisses") + melee_damage_lower = 25 + melee_damage_upper = 25 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + gold_core_spawnable = NO_SPAWN + death_sound = 'sound/voice/hiss6.ogg' + death_message = "lets out a waning guttural screech, green blood bubbling from its maw..." + + habitable_atmos = null + unsuitable_atmos_damage = FALSE + unsuitable_heat_damage = 20 + + ai_controller = /datum/ai_controller/basic_controller/alien + + ///List of loot items to drop when deleted, if this is set then we apply DEL_ON_DEATH + var/list/loot + ///Boolean on whether the xeno can plant weeds. + var/can_plant_weeds = TRUE + ///Boolean on whether the xeno can lay eggs. + var/can_lay_eggs = FALSE + +/mob/living/basic/alien/Initialize(mapload) + . = ..() + if(length(loot)) + basic_mob_flags |= DEL_ON_DEATH + loot = string_list(loot) + AddElement(/datum/element/death_drops, loot) + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) + +/mob/living/basic/alien/get_butt_sprite() + return BUTT_SPRITE_XENOMORPH + +///Places alien weeds on the turf the mob is currently standing on. +/mob/living/basic/alien/proc/place_weeds() + if(!isturf(loc) || isspaceturf(loc)) + return + if(locate(/obj/structure/alien/weeds/node) in get_turf(src)) + return + visible_message(span_alertalien("[src] plants some alien weeds!")) + new /obj/structure/alien/weeds/node(loc) + +///Lays an egg on the turf the mob is currently standing on. +/mob/living/basic/alien/proc/lay_alien_egg() + if(!isturf(loc) || isspaceturf(loc)) + return + if(locate(/obj/structure/alien/egg) in get_turf(src)) + return + visible_message(span_alertalien("[src] lays an egg!")) + new /obj/structure/alien/egg(loc) diff --git a/code/modules/mob/living/basic/alien/alien_ai.dm b/code/modules/mob/living/basic/alien/alien_ai.dm new file mode 100644 index 00000000000..a06ec4ea943 --- /dev/null +++ b/code/modules/mob/living/basic/alien/alien_ai.dm @@ -0,0 +1,73 @@ +/datum/ai_controller/basic_controller/alien + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + + movement_delay = 0.8 SECONDS + +/datum/ai_controller/basic_controller/alien/sentinel + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/alien, + ) + +/datum/ai_controller/basic_controller/alien/drone + idle_behavior = /datum/idle_behavior/idle_random_walk/plant_weeds + +/datum/ai_controller/basic_controller/alien/queen + idle_behavior = /datum/idle_behavior/idle_random_walk/plant_weeds/queen + + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/alien, + ) + +/** + * Alien projectile + * Try to avoid friendly fire, and has a 3 second delay. + */ +/datum/ai_planning_subtree/basic_ranged_attack_subtree/alien + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/alien + +/datum/ai_behavior/basic_ranged_attack/alien + action_cooldown = 3 SECONDS + required_distance = 3 + avoid_friendly_fire = TRUE + +/datum/idle_behavior/idle_random_walk/plant_weeds + var/plant_cooldown = 30 + var/plants_off = 0 + +/datum/idle_behavior/idle_random_walk/plant_weeds/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + . = ..() + if(!.) + return . + plant_cooldown-- + var/mob/living/basic/alien/alien_pawn = controller.pawn + if(alien_pawn.can_plant_weeds && !plants_off && plant_cooldown <= 0) + plant_cooldown = initial(plant_cooldown) + alien_pawn.place_weeds() + +/datum/idle_behavior/idle_random_walk/plant_weeds/queen + var/eggs_off = 0 + var/egg_cooldown = 30 + +/datum/idle_behavior/idle_random_walk/plant_weeds/queen/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + . = ..() + if(!.) + return . + egg_cooldown-- + var/mob/living/basic/alien/alien_pawn = controller.pawn + if(alien_pawn.can_lay_eggs && !eggs_off && egg_cooldown <= 0) + egg_cooldown = initial(egg_cooldown) + alien_pawn.lay_alien_egg() diff --git a/code/modules/mob/living/basic/alien/drone.dm b/code/modules/mob/living/basic/alien/drone.dm new file mode 100644 index 00000000000..80c4c61dddc --- /dev/null +++ b/code/modules/mob/living/basic/alien/drone.dm @@ -0,0 +1,9 @@ +/mob/living/basic/alien/drone + name = "alien drone" + icon_state = "aliend" + icon_living = "aliend" + icon_dead = "aliend_dead" + melee_damage_lower = 15 + melee_damage_upper = 15 + + ai_controller = /datum/ai_controller/basic_controller/alien/drone diff --git a/code/modules/mob/living/basic/alien/maid.dm b/code/modules/mob/living/basic/alien/maid.dm new file mode 100644 index 00000000000..decfe5736ce --- /dev/null +++ b/code/modules/mob/living/basic/alien/maid.dm @@ -0,0 +1,60 @@ +/mob/living/basic/alien/maid + name = "lusty xenomorph maid" + melee_damage_lower = 0 + melee_damage_upper = 0 + combat_mode = FALSE + friendly_verb_continuous = "caresses" + friendly_verb_simple = "caress" + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + gold_core_spawnable = HOSTILE_SPAWN + icon_state = "maid" + icon_living = "maid" + icon_dead = "maid_dead" + +/mob/living/basic/alien/maid/Initialize(mapload) + . = ..() + AddElement(/datum/element/cleaning) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + +///Handles the maid attacking other players, cancelling the attack to clean up instead. +/mob/living/basic/alien/maid/proc/pre_attack(mob/living/puncher, atom/target) + SIGNAL_HANDLER + target.wash(CLEAN_SCRUB) + if(istype(target, /obj/effect/decal/cleanable)) + visible_message(span_notice("[src] cleans up \the [target].")) + else + visible_message(span_notice("[src] polishes \the [target].")) + return COMPONENT_HOSTILE_NO_ATTACK + +/** + * Barmaid special type + * Spawns on emergency shuttles, has access to them and godmode while inside of them. + */ +/mob/living/basic/alien/maid/barmaid + gold_core_spawnable = NO_SPAWN + name = "Barmaid" + desc = "A barmaid, a maiden found in a bar." + pass_flags = PASSTABLE + unique_name = FALSE + initial_language_holder = /datum/language_holder/universal + + ai_controller = null //they don't have their own AI and can uniquely only be controlled by players. + + ///The access card we use to store access to the emergency shuttle. + var/obj/item/card/id/access_card + +/mob/living/basic/alien/maid/barmaid/Initialize(mapload) + . = ..() + // Simple bot ID card that can hold all accesses. Someone turn access into a component at some point, please. + access_card = new /obj/item/card/id/advanced/simple_bot(src) + + var/datum/id_trim/job/cap_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/captain] + access_card.add_access(cap_trim.access + cap_trim.wildcard_access + list(ACCESS_CENT_BAR)) + + ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE) + +/mob/living/basic/alien/maid/barmaid/Destroy() + QDEL_NULL(access_card) + return ..() diff --git a/code/modules/mob/living/basic/alien/queen.dm b/code/modules/mob/living/basic/alien/queen.dm new file mode 100644 index 00000000000..f2d787743a2 --- /dev/null +++ b/code/modules/mob/living/basic/alien/queen.dm @@ -0,0 +1,40 @@ +/mob/living/basic/alien/queen + name = "alien queen" + icon_state = "alienq" + icon_living = "alienq" + icon_dead = "alienq_dead" + health = 250 + maxHealth = 250 + melee_damage_lower = 15 + melee_damage_upper = 15 + status_flags = NONE //can't shove the queen, kiddo. + unique_name = FALSE + + ai_controller = /datum/ai_controller/basic_controller/alien/queen + + ///The type of projectile that fires from attacks. + var/projectiletype = /obj/projectile/neurotoxin/damaging + ///The sound that plays when the projectile is fired. + var/projectilesound = 'sound/weapons/pierce.ogg' + +/mob/living/basic/alien/queen/Initialize(mapload) + . = ..() + AddComponent(/datum/component/ranged_attacks, projectile_type = projectiletype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS) + +/mob/living/basic/alien/queen/large + name = "alien empress" + icon = 'icons/mob/nonhuman-player/alienqueen.dmi' + icon_state = "alienq" + icon_living = "alienq" + icon_dead = "alienq_dead" + health_doll_icon = "alienq" + bubble_icon = "alienroyal" + maxHealth = 400 + health = 400 + butcher_results = list( + /obj/item/food/meat/slab/xeno = 10, + /obj/item/stack/sheet/animalhide/xeno = 2, + ) + mob_size = MOB_SIZE_LARGE + gold_core_spawnable = NO_SPAWN + diff --git a/code/modules/mob/living/basic/alien/sentinel.dm b/code/modules/mob/living/basic/alien/sentinel.dm new file mode 100644 index 00000000000..8f5ae815c5f --- /dev/null +++ b/code/modules/mob/living/basic/alien/sentinel.dm @@ -0,0 +1,20 @@ +/mob/living/basic/alien/sentinel + name = "alien sentinel" + icon_state = "aliens" + icon_living = "aliens" + icon_dead = "aliens_dead" + health = 150 + maxHealth = 150 + melee_damage_lower = 15 + melee_damage_upper = 15 + + ai_controller = /datum/ai_controller/basic_controller/alien/sentinel + + ///The type of projectile that fires from attacks. + var/projectiletype = /obj/projectile/neurotoxin/damaging + ///The sound that plays when the projectile is fired. + var/projectilesound = 'sound/weapons/pierce.ogg' + +/mob/living/basic/alien/sentinel/Initialize(mapload) + . = ..() + AddComponent(/datum/component/ranged_attacks, projectile_type = projectiletype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 1f9d03b645d..8dccd198f26 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -93,9 +93,9 @@ var/minimum_survivable_temperature = NPC_DEFAULT_MIN_TEMP ///Maximal body temperature without receiving damage var/maximum_survivable_temperature = NPC_DEFAULT_MAX_TEMP - ///This damage is taken when the body temp is too cold. Set both this and unsuitable_heat_damage to 0 to avoid adding the basic_body_temp_sensitive element. + ///This damage is taken when the body temp is too cold. Set both this and unsuitable_heat_damage to 0 to avoid adding the body_temp_sensitive element. var/unsuitable_cold_damage = 1 - ///This damage is taken when the body temp is too hot. Set both this and unsuitable_cold_damage to 0 to avoid adding the basic_body_temp_sensitive element. + ///This damage is taken when the body temp is too hot. Set both this and unsuitable_cold_damage to 0 to avoid adding the body_temp_sensitive element. var/unsuitable_heat_damage = 1 /mob/living/basic/Initialize(mapload) @@ -115,23 +115,32 @@ if(speak_emote) speak_emote = string_list(speak_emote) - apply_atmos_requirements() - apply_temperature_requirements() + ///We need to wait for SSair to be initialized before we can check atmos/temp requirements. + if(PERFORM_ALL_TESTS(focus_only/atmos_and_temp_requirements) && mapload && !SSair.initialized) + RegisterSignal(SSair, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(on_ssair_init)) + return + apply_atmos_requirements(mapload) + apply_temperature_requirements(mapload) + +/mob/living/basic/proc/on_ssair_init(datum/source) + SIGNAL_HANDLER + UnregisterSignal(SSair, COMSIG_SUBSYSTEM_POST_INITIALIZE) + apply_atmos_requirements(TRUE) + apply_temperature_requirements(TRUE) /// Ensures this mob can take atmospheric damage if it's supposed to -/mob/living/basic/proc/apply_atmos_requirements() - if(unsuitable_atmos_damage == 0) +/mob/living/basic/proc/apply_atmos_requirements(mapload) + if(unsuitable_atmos_damage == 0 || isnull(habitable_atmos)) return //String assoc list returns a cached list, so this is like a static list to pass into the element below. habitable_atmos = string_assoc_list(habitable_atmos) - AddElement(/datum/element/atmos_requirements, habitable_atmos, unsuitable_atmos_damage) + AddElement(/datum/element/atmos_requirements, habitable_atmos, unsuitable_atmos_damage, mapload) /// Ensures this mob can take temperature damage if it's supposed to -/mob/living/basic/proc/apply_temperature_requirements() - if(unsuitable_cold_damage == 0 && unsuitable_heat_damage == 0) +/mob/living/basic/proc/apply_temperature_requirements(mapload) + if((unsuitable_cold_damage == 0 && unsuitable_heat_damage == 0) || (minimum_survivable_temperature <= 0 && maximum_survivable_temperature >= INFINITY)) return - AddElement(/datum/element/basic_body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage) - + AddElement(/datum/element/body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage, mapload) /mob/living/basic/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() @@ -219,7 +228,7 @@ RemoveElement(/datum/element/atmos_requirements, habitable_atmos, unsuitable_atmos_damage) . = TRUE if(NAMEOF(src, minimum_survivable_temperature), NAMEOF(src, maximum_survivable_temperature), NAMEOF(src, unsuitable_cold_damage), NAMEOF(src, unsuitable_heat_damage)) - RemoveElement(/datum/element/basic_body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage) + RemoveElement(/datum/element/body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage) . = TRUE . = ..() 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 776a977d2df..6c30bdfe16d 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_mob.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_mob.dm @@ -10,7 +10,7 @@ combat_mode = TRUE bubble_icon = "blob" speak_emote = null - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = INFINITY lighting_cutoff_red = 20 diff --git a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm index 3cbce54cf29..50299a38b3f 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm @@ -87,7 +87,7 @@ /mob/living/basic/blob_minion/zombie/controlled/consume_corpse(mob/living/carbon/human/new_corpse) . = ..() - if (!isnull(client)) + if (!isnull(client) || SSticker.current_state == GAME_STATE_FINISHED) return AddComponent(\ /datum/component/ghost_direct_control,\ diff --git a/code/modules/mob/living/basic/blob_minions/blobbernaut.dm b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm index ab3442604db..8b94063ba77 100644 --- a/code/modules/mob/living/basic/blob_minions/blobbernaut.dm +++ b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm @@ -86,7 +86,7 @@ health = maxHealth / 2 // Start out injured to encourage not beelining away from the blob SEND_SOUND(src, sound('sound/effects/blobattack.ogg')) SEND_SOUND(src, sound('sound/effects/attackblob.ogg')) - to_chat(src, span_infoplain("You are powerful, hard to kill, and slowly regenerate near nodes and cores, [span_cultlarge("but will slowly die if not near the blob")] or if the factory that made you is killed.")) + to_chat(src, span_infoplain("You are powerful, hard to kill, and slowly regenerate near nodes and cores, [span_cult_large("but will slowly die if not near the blob")] or if the factory that made you is killed.")) to_chat(src, span_infoplain("You can communicate with other blobbernauts and overminds telepathically by attempting to speak normally")) to_chat(src, span_infoplain("Your overmind's blob reagent is: [blobstrain.name]!")) to_chat(src, span_infoplain("The [blobstrain.name] reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]")) diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 56fdc4fc938..206ba88b317 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -6,7 +6,6 @@ GLOBAL_LIST_INIT(command_strings, list( "home" = "RETURN HOME", )) - /mob/living/basic/bot icon = 'icons/mob/silicon/aibots.dmi' layer = MOB_LAYER @@ -17,7 +16,7 @@ GLOBAL_LIST_INIT(command_strings, list( icon_state = "medibot0" base_icon_state = "medibot" damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) maximum_survivable_temperature = INFINITY minimum_survivable_temperature = 0 @@ -37,10 +36,9 @@ GLOBAL_LIST_INIT(command_strings, list( faction = list(FACTION_NEUTRAL, FACTION_SILICON, FACTION_TURRET) light_system = OVERLAY_LIGHT light_range = 3 - light_power = 0.9 + light_power = 0.6 speed = 3 - ///Access required to access this Bot's maintenance protocols - var/maints_access_required = list(ACCESS_ROBOTICS) + req_one_access = list(ACCESS_ROBOTICS) ///The Robot arm attached to this robot - has a 50% chance to drop on death. var/robot_arm = /obj/item/bodypart/arm/right/robot ///The inserted (if any) pAI in this bot. @@ -51,8 +49,8 @@ GLOBAL_LIST_INIT(command_strings, list( var/list/initial_access = list() ///Bot-related mode flags on the Bot indicating how they will act. BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION var/bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION - ///Bot-related cover flags on the Bot to deal with what has been done to their cover, including emagging. BOT_MAINTS_PANEL_OPEN | BOT_CONTROL_PANEL_OPEN | BOT_COVER_EMAGGED | BOT_COVER_HACKED - var/bot_access_flags = NONE + ///Bot-related cover flags on the Bot to deal with what has been done to their cover, including emagging. BOT_COVER_MAINTS_OPEN | BOT_COVER_LOCKED | BOT_COVER_EMAGGED | BOT_COVER_HACKED + var/bot_access_flags = BOT_COVER_LOCKED ///Small name of what the bot gets messed with when getting hacked/emagged. var/hackables = "system circuits" ///Standardizes the vars that indicate the bot is busy with its function. @@ -74,7 +72,7 @@ GLOBAL_LIST_INIT(command_strings, list( ///state of the path icon var/path_image_icon_state = "path_indicator" ///what color this path icon will use - var/path_image_color = "#FFFFFF" + var/path_image_color = COLOR_WHITE ///list of all layed path icons var/list/current_pathed_turfs = list() @@ -270,26 +268,10 @@ GLOBAL_LIST_INIT(command_strings, list( return fully_replace_character_name(real_name, new_name) -/mob/living/basic/bot/proc/check_access(mob/living/user, obj/item/card/id) - if(user.has_unlimited_silicon_privilege || isAdminGhostAI(user)) // Silicon and Admins always have access. +/mob/living/basic/bot/allowed(mob/living/user) + if(!(bot_access_flags & BOT_COVER_LOCKED)) // Unlocked. return TRUE - if(!istype(user)) // Non-living mobs shouldn't be manipulating bots (like observes using the botkeeper UI). - return FALSE - if(!length(maints_access_required)) // No requirements to access it. - return TRUE - if(bot_access_flags & BOT_CONTROL_PANEL_OPEN) // Unlocked. - return TRUE - - var/obj/item/card/id/used_id = id || user.get_idcard(TRUE) - - if(!used_id || !used_id.access) - return FALSE - - for(var/requested_access in maints_access_required) - if(requested_access in used_id.access) - return TRUE - - return FALSE + return ..() /mob/living/basic/bot/bee_friendly() return TRUE @@ -309,15 +291,15 @@ GLOBAL_LIST_INIT(command_strings, list( /mob/living/basic/bot/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() - if(!(bot_access_flags & BOT_CONTROL_PANEL_OPEN)) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again. - bot_access_flags |= BOT_CONTROL_PANEL_OPEN + if(bot_access_flags & BOT_COVER_LOCKED) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again. + bot_access_flags &= ~BOT_COVER_LOCKED balloon_alert(user, "cover unlocked") return TRUE - if(!(bot_access_flags & BOT_CONTROL_PANEL_OPEN) || !(bot_access_flags & BOT_MAINTS_PANEL_OPEN)) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. + if((bot_access_flags & BOT_COVER_LOCKED) || !(bot_access_flags & BOT_COVER_MAINTS_OPEN)) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. balloon_alert(user, "open maintenance panel first!") return FALSE bot_access_flags |= BOT_COVER_EMAGGED - bot_access_flags &= ~BOT_CONTROL_PANEL_OPEN + bot_access_flags |= BOT_COVER_LOCKED bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED //Manually emagging the bot also locks the AI from controlling it. bot_reset() turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP. @@ -337,17 +319,17 @@ GLOBAL_LIST_INIT(command_strings, list( else . += "[src] is in pristine condition." - . += span_notice("Its maintenance panel is [bot_access_flags & BOT_MAINTS_PANEL_OPEN ? "open" : "closed"].") - . += span_info("You can use a screwdriver to [bot_access_flags & BOT_MAINTS_PANEL_OPEN ? "close" : "open"] it.") + . += span_notice("Its maintenance panel is [bot_access_flags & BOT_COVER_MAINTS_OPEN ? "open" : "closed"].") + . += span_info("You can use a screwdriver to [bot_access_flags & BOT_COVER_MAINTS_OPEN ? "close" : "open"] it.") - if(bot_access_flags & BOT_MAINTS_PANEL_OPEN) - . += span_notice("Its control panel is [bot_access_flags & BOT_CONTROL_PANEL_OPEN ? "unlocked" : "locked"].") + if(bot_access_flags & BOT_COVER_MAINTS_OPEN) + . += span_notice("Its control panel is [bot_access_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"].") if(!(bot_access_flags & BOT_COVER_EMAGGED) && (issilicon(user) || user.Adjacent(src))) - . += span_info("Alt-click [issilicon(user) ? "" : "or use your ID on "]it to [bot_access_flags & BOT_CONTROL_PANEL_OPEN ? "" : "un"]lock its control panel.") + . += span_info("Alt-click [issilicon(user) ? "" : "or use your ID on "]it to [bot_access_flags & BOT_COVER_LOCKED ? "un" : ""]lock its control panel.") if(isnull(paicard)) return . += span_notice("It has a pAI device installed.") - if(!(bot_access_flags & BOT_MAINTS_PANEL_OPEN)) + if(!(bot_access_flags & BOT_COVER_MAINTS_OPEN)) . += span_info("You can use a hemostat to remove it.") /mob/living/basic/bot/updatehealth() @@ -390,25 +372,25 @@ GLOBAL_LIST_INIT(command_strings, list( if(bot_access_flags & BOT_COVER_EMAGGED) balloon_alert(user, "error!") return - if(bot_access_flags & BOT_MAINTS_PANEL_OPEN) + if(bot_access_flags & BOT_COVER_MAINTS_OPEN) balloon_alert(user, "access panel must be closed!") return - if(!check_access(user)) + if(!allowed(user)) balloon_alert(user, "no access") return - bot_access_flags ^= BOT_CONTROL_PANEL_OPEN - to_chat(user, span_notice("Controls are now [bot_access_flags & BOT_CONTROL_PANEL_OPEN ? "unlocked" : "locked"].")) + bot_access_flags ^= BOT_COVER_LOCKED + to_chat(user, span_notice("Controls are now [bot_access_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"].")) return TRUE /mob/living/basic/bot/screwdriver_act(mob/living/user, obj/item/tool) . = ITEM_INTERACT_SUCCESS - if(!(bot_access_flags & BOT_CONTROL_PANEL_OPEN)) + if(bot_access_flags & BOT_COVER_LOCKED) to_chat(user, span_warning("The maintenance panel is locked!")) return tool.play_tool_sound(src) - bot_access_flags ^= BOT_MAINTS_PANEL_OPEN - to_chat(user, span_notice("The maintenance panel is now [bot_access_flags & BOT_MAINTS_PANEL_OPEN ? "opened" : "closed"].")) + bot_access_flags ^= BOT_COVER_MAINTS_OPEN + to_chat(user, span_notice("The maintenance panel is now [bot_access_flags & BOT_COVER_MAINTS_OPEN ? "opened" : "closed"].")) /mob/living/basic/bot/welder_act(mob/living/user, obj/item/tool) user.changeNext_move(CLICK_CD_MELEE) @@ -421,7 +403,7 @@ GLOBAL_LIST_INIT(command_strings, list( user.balloon_alert(user, "no repairs needed!") return - if(!(bot_access_flags & BOT_MAINTS_PANEL_OPEN)) + if(!(bot_access_flags & BOT_COVER_MAINTS_OPEN)) user.balloon_alert(user, "maintenance panel closed!") return @@ -443,7 +425,7 @@ GLOBAL_LIST_INIT(command_strings, list( if(attacking_item.tool_behaviour != TOOL_HEMOSTAT || !paicard) return ..() - if(bot_access_flags & BOT_MAINTS_PANEL_OPEN) + if(bot_access_flags & BOT_COVER_MAINTS_OPEN) balloon_alert(user, "open the access panel!") return @@ -584,18 +566,18 @@ GLOBAL_LIST_INIT(command_strings, list( /mob/living/basic/bot/ui_data(mob/user) var/list/data = list() - data["can_hack"] = (issilicon(user) || isAdminGhostAI(user)) + data["can_hack"] = HAS_SILICON_ACCESS(user) data["custom_controls"] = list() data["emagged"] = bot_access_flags & BOT_COVER_EMAGGED - data["has_access"] = check_access(user) - data["locked"] = !(bot_access_flags & BOT_CONTROL_PANEL_OPEN) + data["has_access"] = allowed(user) + data["locked"] = (bot_access_flags & BOT_COVER_LOCKED) data["settings"] = list() - if((bot_access_flags & BOT_CONTROL_PANEL_OPEN) || issilicon(user) || isAdminGhostAI(user)) + if(!(bot_access_flags & BOT_COVER_LOCKED) || HAS_SILICON_ACCESS(user)) data["settings"]["pai_inserted"] = !isnull(paicard) data["settings"]["allow_possession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT data["settings"]["possession_enabled"] = can_be_possessed data["settings"]["airplane_mode"] = !(bot_mode_flags & BOT_MODE_REMOTE_ENABLED) - data["settings"]["maintenance_lock"] = !(bot_access_flags & BOT_MAINTS_PANEL_OPEN) + data["settings"]["maintenance_lock"] = !(bot_access_flags & BOT_COVER_MAINTS_OPEN) data["settings"]["power"] = bot_mode_flags & BOT_MODE_ON data["settings"]["patrol_station"] = bot_mode_flags & BOT_MODE_AUTOPATROL return data @@ -606,12 +588,12 @@ GLOBAL_LIST_INIT(command_strings, list( if(.) return var/mob/the_user = ui.user - if(!check_access(the_user)) + if(!allowed(the_user)) balloon_alert(the_user, "access denied!") return if(action == "lock") - bot_access_flags ^= BOT_CONTROL_PANEL_OPEN + bot_access_flags ^= BOT_COVER_LOCKED switch(action) if("power") @@ -620,18 +602,17 @@ GLOBAL_LIST_INIT(command_strings, list( else turn_on() if("maintenance") - bot_access_flags ^= BOT_MAINTS_PANEL_OPEN + bot_access_flags ^= BOT_COVER_MAINTS_OPEN if("patrol") bot_mode_flags ^= BOT_MODE_AUTOPATROL bot_reset() if("airplane") bot_mode_flags ^= BOT_MODE_REMOTE_ENABLED if("hack") - if(!(issilicon(the_user) || isAdminGhostAI(the_user))) + if(!HAS_SILICON_ACCESS(the_user)) return if(!(bot_access_flags & BOT_COVER_EMAGGED)) - bot_access_flags |= (BOT_COVER_EMAGGED|BOT_COVER_HACKED) - bot_access_flags &= ~BOT_CONTROL_PANEL_OPEN + bot_access_flags |= (BOT_COVER_LOCKED|BOT_COVER_EMAGGED|BOT_COVER_HACKED) to_chat(the_user, span_warning("You overload [src]'s [hackables].")) message_admins("Safety lock of [ADMIN_LOOKUPFLW(src)] was disabled by [ADMIN_LOOKUPFLW(the_user)] in [ADMIN_VERBOSEJMP(the_user)]") the_user.log_message("disabled safety lock of [the_user]", LOG_GAME) @@ -674,7 +655,7 @@ GLOBAL_LIST_INIT(command_strings, list( return FALSE if(!(bot_access_flags & BOT_COVER_HACKED)) //Manually emagged by a human - access denied to all. return TRUE - if(!issilicon(user) && !isAdminGhostAI(user)) //Bot is hacked, so only silicons and admins are allowed access. + if(!HAS_SILICON_ACCESS(user)) //Bot is hacked, so only silicons and admins are allowed access. return TRUE return FALSE @@ -687,7 +668,7 @@ GLOBAL_LIST_INIT(command_strings, list( if(key) balloon_alert(user, "personality already present!") return - if(!(bot_access_flags & BOT_COVER_OPEN)) + if(!(bot_access_flags & BOT_COVER_MAINTS_OPEN)) balloon_alert(user, "slot inaccessible!") return if(!(bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT)) @@ -744,7 +725,7 @@ GLOBAL_LIST_INIT(command_strings, list( /// Ejects the pAI remotely. /mob/living/basic/bot/proc/eject_pai_remote(mob/user) - if(!check_access(user) || !paicard) + if(!allowed(user) || !paicard) return speak("Ejecting personality chip.", radio_channel) ejectpai(user) diff --git a/code/modules/mob/living/basic/bots/bot_ai.dm b/code/modules/mob/living/basic/bots/bot_ai.dm index 19b7bcbdb5e..706a8b58ba0 100644 --- a/code/modules/mob/living/basic/bots/bot_ai.dm +++ b/code/modules/mob/living/basic/bots/bot_ai.dm @@ -2,9 +2,8 @@ blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_SALUTE_MESSAGES = list( - "salutes", + "performs an elaborate salute for", "nods in appreciation towards", - "fist bumps", ), BB_UNREACHABLE_LIST_COOLDOWN = 45 SECONDS, ) @@ -205,17 +204,13 @@ /datum/ai_behavior/find_and_set/valid_authority behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION - action_cooldown = 30 SECONDS + action_cooldown = BOT_COMMISSIONED_SALUTE_DELAY /datum/ai_behavior/find_and_set/valid_authority/search_tactic(datum/ai_controller/controller, locate_path, search_range) - for(var/mob/living/robot in oview(search_range, controller.pawn)) - if(istype(robot, /mob/living/simple_animal/bot/secbot)) - return robot - if(!istype(robot, /mob/living/basic/bot/cleanbot)) + for(var/mob/living/nearby_mob in oview(search_range, controller.pawn)) + if(!HAS_TRAIT(nearby_mob, TRAIT_COMMISSIONED)) continue - var/mob/living/basic/bot/cleanbot/potential_bot = robot - if(potential_bot.comissioned) - return potential_bot + return nearby_mob return null /datum/ai_behavior/salute_authority @@ -235,7 +230,7 @@ if(our_hat) salute_list += "tips [our_hat] at " - bot_pawn.manual_emote(pick(salute_list) + " [controller.blackboard[target_key]]") + bot_pawn.manual_emote(pick(salute_list) + " [controller.blackboard[target_key]]!") finish_action(controller, TRUE, target_key) return diff --git a/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm b/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm index a81f48c9c95..7cfe7132e15 100644 --- a/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm +++ b/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm @@ -10,8 +10,9 @@ anchored = FALSE health = 25 maxHealth = 25 + light_color = "#99ccff" - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_JANITOR) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_JANITOR) radio_key = /obj/item/encryptionkey/headset_service radio_channel = RADIO_CHANNEL_SERVICE bot_type = CLEAN_BOT @@ -25,8 +26,6 @@ ///Flags indicating what kind of cleanables we should scan for to set as our target to clean. ///Options: CLEANBOT_CLEAN_BLOOD | CLEANBOT_CLEAN_TRASH | CLEANBOT_CLEAN_PESTS | CLEANBOT_CLEAN_DRAWINGS var/janitor_mode_flags = CLEANBOT_CLEAN_BLOOD - ///should other bots salute us? - var/comissioned = FALSE ///the base icon state, used in updating icons. var/base_icon = "cleanbot" /// if we have all the top titles, grant achievements to living mobs that gaze upon our cleanbot god @@ -232,7 +231,7 @@ // Variables sent to TGUI /mob/living/basic/bot/cleanbot/ui_data(mob/user) var/list/data = ..() - if(!(bot_access_flags & BOT_CONTROL_PANEL_OPEN) && !issilicon(user) && !isAdminGhostAI(user)) + if((bot_access_flags & BOT_COVER_LOCKED) && !HAS_SILICON_ACCESS(user)) return data data["custom_controls"]["clean_blood"] = janitor_mode_flags & CLEANBOT_CLEAN_BLOOD data["custom_controls"]["clean_trash"] = janitor_mode_flags & CLEANBOT_CLEAN_TRASH @@ -243,7 +242,7 @@ // Actions received from TGUI /mob/living/basic/bot/cleanbot/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() - if(. || !(bot_access_flags & BOT_CONTROL_PANEL_OPEN) && !ui.user.has_unlimited_silicon_privilege) + if(. || (bot_access_flags & BOT_COVER_LOCKED) && !HAS_SILICON_ACCESS(ui.user)) return switch(action) @@ -298,8 +297,8 @@ return stolen_valor += new_job_title - if(!comissioned && (new_job_title in officers_titles)) - comissioned = TRUE + if(!HAS_TRAIT(src, TRAIT_COMMISSIONED) && (new_job_title in officers_titles)) + ADD_TRAIT(src, TRAIT_COMMISSIONED, INNATE_TRAIT) var/name_to_add = job_titles[new_job_title] name = (new_job_title in suffix_job_titles) ? "[name] " + name_to_add : name_to_add + " [name]" @@ -331,7 +330,7 @@ INVOKE_ASYNC(our_mop, TYPE_PROC_REF(/obj/item, melee_attack_chain), src, target) return COMPONENT_CANCEL_ATTACK_CHAIN - if(!iscarbon(target) && !is_type_in_typecache(target, huntable_trash)) + if(!(iscarbon(target) && (bot_access_flags & BOT_COVER_EMAGGED)) && !is_type_in_typecache(target, huntable_trash)) return NONE visible_message(span_danger("[src] sprays hydrofluoric acid at [target]!")) @@ -352,5 +351,5 @@ /mob/living/basic/bot/cleanbot/medbay name = "Scrubs, MD" - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_JANITOR, ACCESS_MEDICAL) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_JANITOR, ACCESS_MEDICAL) bot_mode_flags = ~(BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED) diff --git a/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm b/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm index 1d802ca9358..8def16692bf 100644 --- a/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm +++ b/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm @@ -13,7 +13,7 @@ health = 100 maxHealth = 100 path_image_color = "#80dae7" - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_JANITOR) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_JANITOR) radio_key = /obj/item/encryptionkey/headset_service radio_channel = RADIO_CHANNEL_SERVICE bot_type = HYGIENE_BOT diff --git a/code/modules/mob/living/basic/bots/medbot/medbot.dm b/code/modules/mob/living/basic/bots/medbot/medbot.dm index 7e801d53798..e784aa6249e 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot.dm @@ -11,11 +11,13 @@ health = 20 maxHealth = 20 speed = 2 + light_power = 0.8 + light_color = "#99ccff" pass_flags = PASSMOB | PASSFLAPS - status_flags = (CANPUSH | CANSTUN) + status_flags = CANSTUN ai_controller = /datum/ai_controller/basic_controller/bot/medbot - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_MEDICAL) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_MEDICAL) radio_key = /obj/item/encryptionkey/headset_med radio_channel = RADIO_CHANNEL_MEDICAL bot_type = MED_BOT @@ -200,7 +202,7 @@ // Variables sent to TGUI /mob/living/basic/bot/medbot/ui_data(mob/user) var/list/data = ..() - if((bot_access_flags & BOT_CONTROL_PANEL_OPEN) || issilicon(user) || isAdminGhostAI(user)) + if(!(bot_access_flags & BOT_COVER_LOCKED) || HAS_SILICON_ACCESS(user)) data["custom_controls"]["heal_threshold"] = heal_threshold data["custom_controls"]["speaker"] = medical_mode_flags & MEDBOT_SPEAK_MODE data["custom_controls"]["crit_alerts"] = medical_mode_flags & MEDBOT_DECLARE_CRIT @@ -211,7 +213,7 @@ // Actions received from TGUI /mob/living/basic/bot/medbot/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() - if(. || !isliving(ui.user) || !(bot_access_flags & BOT_CONTROL_PANEL_OPEN) && !(ui.user.has_unlimited_silicon_privilege)) + if(. || !isliving(ui.user) || (bot_access_flags & BOT_COVER_LOCKED) && !HAS_SILICON_ACCESS(ui.user)) return var/mob/living/our_user = ui.user switch(action) @@ -398,7 +400,7 @@ skin = "bezerk" health = 40 maxHealth = 40 - maints_access_required = list(ACCESS_SYNDICATE) + req_one_access = list(ACCESS_SYNDICATE) bot_mode_flags = parent_type::bot_mode_flags & ~BOT_MODE_REMOTE_ENABLED radio_key = /obj/item/encryptionkey/syndicate radio_channel = RADIO_CHANNEL_SYNDICATE diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm index 88c2b9496a9..a1a7014b263 100644 --- a/code/modules/mob/living/basic/clown/clown.dm +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -403,7 +403,7 @@ GRANT_ACTION(/datum/action/cooldown/regurgitate) AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/cheesiehonkers, /obj/item/food/cornchips), tame_chance = 30, bonus_tame_chance = 0, after_tame = CALLBACK(src, PROC_REF(tamed))) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/cheesiehonkers, /obj/item/food/cornchips), tame_chance = 30, bonus_tame_chance = 0) AddElement(/datum/element/damage_threshold, 10) //lots of fat to cushion blows. /mob/living/basic/clown/mutant/glutton/attacked_by(obj/item/item, mob/living/user) @@ -461,7 +461,7 @@ playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE) flick("glutton_mouth", src) -/mob/living/basic/clown/mutant/glutton/proc/tamed(mob/living/tamer) +/mob/living/basic/clown/mutant/glutton/tamed(mob/living/tamer, atom/food) buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/glutton) diff --git a/code/modules/mob/living/basic/cult/constructs/harvester.dm b/code/modules/mob/living/basic/cult/constructs/harvester.dm index 30b30994872..da8dad827b0 100644 --- a/code/modules/mob/living/basic/cult/constructs/harvester.dm +++ b/code/modules/mob/living/basic/cult/constructs/harvester.dm @@ -50,7 +50,7 @@ carbon_target.Paralyze(6 SECONDS) visible_message(span_danger("[src] knocks [carbon_target] down!")) - to_chat(src, span_cultlarge("\"Bring [carbon_target.p_them()] to me.\"")) + to_chat(src, span_cult_large("\"Bring [carbon_target.p_them()] to me.\"")) /datum/action/innate/seek_master name = "Seek your Master" @@ -80,18 +80,18 @@ the_construct.master = cult_status.cult_team.blood_target if(!the_construct.master) - to_chat(the_construct, span_cultitalic("You have no master to seek!")) + to_chat(the_construct, span_cult_italic("You have no master to seek!")) the_construct.seeking = FALSE return if(tracking) tracking = FALSE the_construct.seeking = FALSE - to_chat(the_construct, span_cultitalic("You are no longer tracking your master.")) + to_chat(the_construct, span_cult_italic("You are no longer tracking your master.")) return else tracking = TRUE the_construct.seeking = TRUE - to_chat(the_construct, span_cultitalic("You are now tracking your master.")) + to_chat(the_construct, span_cult_italic("You are now tracking your master.")) /datum/action/innate/seek_prey @@ -113,16 +113,16 @@ desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!" button_icon_state = "cult_mark" the_construct.seeking = FALSE - to_chat(the_construct, span_cultitalic("You are now tracking Nar'Sie, return to reap the harvest!")) + to_chat(the_construct, span_cult_italic("You are now tracking Nar'Sie, return to reap the harvest!")) return if(!LAZYLEN(GLOB.cult_narsie.souls_needed)) - to_chat(the_construct, span_cultitalic("Nar'Sie has completed her harvest!")) + to_chat(the_construct, span_cult_italic("Nar'Sie has completed her harvest!")) return the_construct.master = pick(GLOB.cult_narsie.souls_needed) var/mob/living/real_target = the_construct.master //We can typecast this way because Narsie only allows /mob/living into the souls list - to_chat(the_construct, span_cultitalic("You are now tracking your prey, [real_target.real_name] - harvest [real_target.p_them()]!")) + to_chat(the_construct, span_cult_italic("You are now tracking your prey, [real_target.real_name] - harvest [real_target.p_them()]!")) desc = "Activate to track Nar'Sie!" button_icon_state = "sintouch" the_construct.seeking = TRUE diff --git a/code/modules/mob/living/basic/cult/shade.dm b/code/modules/mob/living/basic/cult/shade.dm index fac1d347665..bf6fbe13944 100644 --- a/code/modules/mob/living/basic/cult/shade.dm +++ b/code/modules/mob/living/basic/cult/shade.dm @@ -54,6 +54,8 @@ icon_living = icon_state /mob/living/basic/shade/death() + if(IS_CULTIST(src)) + SSblackbox.record_feedback("tally", "cult_shade_killed", 1) if(death_message == initial(death_message)) death_message = "lets out a contented sigh as [p_their()] form unwinds." ..() @@ -63,6 +65,11 @@ return FALSE return ..() +/mob/living/basic/shade/suicide_log(obj/item/suicide_tool) + if(IS_CULTIST(src)) + SSblackbox.record_feedback("tally", "cult_shade_suicided", 1) + ..() + /mob/living/basic/shade/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/soulstone)) var/obj/item/soulstone/stone = item diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm index 9b0729954dc..6432377374e 100644 --- a/code/modules/mob/living/basic/drone/_drone.dm +++ b/code/modules/mob/living/basic/drone/_drone.dm @@ -47,7 +47,6 @@ lighting_cutoff_red = 30 lighting_cutoff_green = 35 lighting_cutoff_blue = 25 - can_be_held = TRUE worn_slot_flags = ITEM_SLOT_HEAD /// `TRUE` if we have picked our visual appearance, `FALSE` otherwise (default) @@ -265,6 +264,9 @@ /mob/living/basic/drone/gib() dust() +/mob/living/basic/drone/get_butt_sprite() + return BUTT_SPRITE_DRONE + /mob/living/basic/drone/examine(mob/user) . = list("This is [icon2html(src, user)] \a [src]!", EXAMINE_SECTION_BREAK) //SKYRAT EDIT CHANGE diff --git a/code/modules/mob/living/basic/drone/interaction.dm b/code/modules/mob/living/basic/drone/interaction.dm index c528dafcbd6..0b0247c1c45 100644 --- a/code/modules/mob/living/basic/drone/interaction.dm +++ b/code/modules/mob/living/basic/drone/interaction.dm @@ -14,7 +14,7 @@ to_chat(drone, span_warning("You're already in perfect condition!")) return 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, 60, 0, target = 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) new /obj/effect/decal/cleanable/oil/streak(get_turf(src)) @@ -67,7 +67,7 @@ to_chat(user, span_warning("You can't seem to find the [pick(faux_gadgets)]! Without it, [src] [pick(faux_problems)].")) return user.visible_message(span_notice("[user] begins to reactivate [src]."), span_notice("You begin to reactivate [src]...")) - if(do_after(user, 30, 1, target = src)) + if(do_after(user, 3 SECONDS, 1, target = src)) revive(HEAL_ALL) user.visible_message(span_notice("[user] reactivates [src]!"), span_notice("You reactivate [src].")) alert_drones(DRONE_NET_CONNECT) 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 89eedd7cb55..3c2aae36bc1 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -39,7 +39,7 @@ can_be_held = TRUE held_w_class = WEIGHT_CLASS_TINY environment_smash = ENVIRONMENT_SMASH_NONE - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null basic_mob_flags = DEL_ON_DEATH ai_controller = /datum/ai_controller/basic_controller/bee ///the reagent the bee has 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 e5d49aa867b..66191c92516 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/_cow.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/_cow.dm @@ -33,6 +33,8 @@ var/tame_message = "lets out a happy moo" /// singular version for player cows var/self_tame_message = "let out a happy moo" + /// What kind of juice do we produce? + var/milked_reagent = /datum/reagent/consumable/milk /mob/living/basic/cow/Initialize(mapload) AddComponent(/datum/component/tippable, \ @@ -42,14 +44,14 @@ post_tipped_callback = CALLBACK(src, PROC_REF(after_cow_tipped))) AddElement(/datum/element/pet_bonus, "moos happily!") AddElement(/datum/element/swabable, CELL_LINE_TABLE_COW, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - udder_component() + setup_udder() setup_eating() . = ..() ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(food_types)) ///wrapper for the udder component addition so you can have uniquely uddered cow subtypes -/mob/living/basic/cow/proc/udder_component() - AddComponent(/datum/component/udder) +/mob/living/basic/cow/proc/setup_udder() + AddComponent(/datum/component/udder, reagent_produced_override = milked_reagent) /* * food related components and elements are set up here for a few reasons: @@ -61,10 +63,10 @@ var/static/list/food_types if(!food_types) food_types = src.food_types.Copy() - AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed))) + AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 15) AddElement(/datum/element/basic_eating, food_types = food_types) -/mob/living/basic/cow/proc/tamed(mob/living/tamer) +/mob/living/basic/cow/tamed(mob/living/tamer, atom/food) buckle_lying = 0 visible_message("[src] [tame_message] as it seems to bond with [tamer].", "You [self_tame_message], recognizing [tamer] as your new pal.") AddElement(/datum/element/ridable, /datum/component/riding/creature/cow) diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm index b3af3c59a12..dc3e09e38f2 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm @@ -21,23 +21,21 @@ food_types = list(/obj/item/food/grown/galaxythistle) tame_message = "nods with respect" self_tame_message = "nod with respect" + milked_reagent = /datum/reagent/drug/mushroomhallucinogen /mob/living/basic/cow/moonicorn/Initialize(mapload) . = ..() AddElement(/datum/element/venomous, /datum/reagent/pax, 5, injection_flags = INJECT_CHECK_PENETRATE_THICK | INJECT_CHECK_IGNORE_SPECIES) AddElement(/datum/element/movement_turf_changer, /turf/open/floor/grass/fairy) -/mob/living/basic/cow/moonicorn/udder_component() - AddComponent(/datum/component/udder, /obj/item/udder, null, null, /datum/reagent/drug/mushroomhallucinogen) - /mob/living/basic/cow/moonicorn/setup_eating() var/static/list/food_types if(!food_types) food_types = src.food_types.Copy() AddElement(/datum/element/basic_eating, food_types = food_types) - AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed))) + AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 15) -/mob/living/basic/cow/moonicorn/tamed(mob/living/tamer) +/mob/living/basic/cow/moonicorn/tamed(mob/living/tamer, atom/food) . = ..() ///stop killing my FRIENDS faction |= tamer.faction diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm index 4e80fd4bcfe..674077dbc28 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm @@ -9,7 +9,8 @@ ///How much experience this cow will grant. var/granted_experience -/mob/living/basic/cow/wisdom/Initialize(mapload, granted_wisdom, granted_experience = 500) +/mob/living/basic/cow/wisdom/Initialize(mapload, granted_wisdom, granted_experience = 500, milked_reagent = null) + src.milked_reagent = milked_reagent . = ..() src.granted_wisdom = granted_wisdom if(!granted_wisdom) @@ -21,6 +22,11 @@ /mob/living/basic/cow/wisdom/setup_eating() return //cannot tame me! and I don't care about eatin' nothing, neither! +/mob/living/basic/cow/wisdom/setup_udder() + if (isnull(milked_reagent)) + milked_reagent = get_random_reagent_id() + return ..() + /datum/ai_controller/basic_controller/cow/wisdom //don't give a targeting strategy blackboard = list( diff --git a/code/modules/mob/living/basic/farm_animals/deer.dm b/code/modules/mob/living/basic/farm_animals/deer.dm index 5b88593f0c6..c51be81b77d 100644 --- a/code/modules/mob/living/basic/farm_animals/deer.dm +++ b/code/modules/mob/living/basic/farm_animals/deer.dm @@ -49,5 +49,5 @@ /// Cold resistent and doesn't need to breathe /mob/living/basic/deer/ice - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 diff --git a/code/modules/mob/living/basic/farm_animals/goat/_goat.dm b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm index 34b92f21882..f2354cc5f14 100644 --- a/code/modules/mob/living/basic/farm_animals/goat/_goat.dm +++ b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm @@ -100,7 +100,7 @@ /// Handles automagically eating a plant when we move into a turf that has one. /mob/living/basic/goat/proc/on_move(datum/source, atom/entering_loc) SIGNAL_HANDLER - if(!isturf(entering_loc)) + if(!isturf(entering_loc) || stat == DEAD) return var/list/edible_plants = list() diff --git a/code/modules/mob/living/basic/farm_animals/pig.dm b/code/modules/mob/living/basic/farm_animals/pig.dm index 94183d044c5..6f732f16844 100644 --- a/code/modules/mob/living/basic/farm_animals/pig.dm +++ b/code/modules/mob/living/basic/farm_animals/pig.dm @@ -37,9 +37,9 @@ ///wrapper for the tameable component addition so you can have non tamable cow subtypes /mob/living/basic/pig/proc/make_tameable() - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/carrot), tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed))) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/carrot), tame_chance = 25, bonus_tame_chance = 15) -/mob/living/basic/pig/proc/tamed(mob/living/tamer) +/mob/living/basic/pig/tamed(mob/living/tamer, atom/food) can_buckle = TRUE buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/pig) diff --git a/code/modules/mob/living/basic/farm_animals/pony.dm b/code/modules/mob/living/basic/farm_animals/pony.dm index 7795ec630e6..9f008d85fcc 100644 --- a/code/modules/mob/living/basic/farm_animals/pony.dm +++ b/code/modules/mob/living/basic/farm_animals/pony.dm @@ -41,9 +41,9 @@ AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed)), unique = unique_tamer) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 25, bonus_tame_chance = 15, unique = unique_tamer) -/mob/living/basic/pony/proc/tamed(mob/living/tamer) +/mob/living/basic/pony/tamed(mob/living/tamer, atom/food) can_buckle = TRUE buckle_lying = 0 playsound(src, 'sound/creatures/pony/snort.ogg', 50) @@ -129,7 +129,7 @@ faction = list(ROLE_SYNDICATE) ponycolors = list("#5d566f", COLOR_RED) pressure_resistance = 200 - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 unique_tamer = TRUE @@ -151,4 +151,4 @@ ponycolors = list("#5d566f", pick_weight(mane_colors)) name = pick("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") // Only one person can tame these fellas, and they only need one apple - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 100, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed)), unique = unique_tamer) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 100, bonus_tame_chance = 15, unique = unique_tamer) diff --git a/code/modules/mob/living/basic/farm_animals/sheep.dm b/code/modules/mob/living/basic/farm_animals/sheep.dm index e32da910ab9..2fdaeda657d 100644 --- a/code/modules/mob/living/basic/farm_animals/sheep.dm +++ b/code/modules/mob/living/basic/farm_animals/sheep.dm @@ -58,11 +58,11 @@ if(cult_converted) for(var/mob/living/cultist as anything in invokers) - to_chat(cultist, span_cultitalic("[src] has already been sacrificed!")) + to_chat(cultist, span_cult_italic("[src] has already been sacrificed!")) return STOP_SACRIFICE for(var/mob/living/cultist as anything in invokers) - to_chat(cultist, span_cultitalic("This feels a bit too cliché, don't you think?")) + to_chat(cultist, span_cult_italic("This feels a bit too cliché, don't you think?")) cult_converted = TRUE INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, say), "BAAAAAAAAH!") diff --git a/code/modules/mob/living/basic/festivus_pole.dm b/code/modules/mob/living/basic/festivus_pole.dm index aec6de74e1e..90eca4b272d 100644 --- a/code/modules/mob/living/basic/festivus_pole.dm +++ b/code/modules/mob/living/basic/festivus_pole.dm @@ -38,7 +38,7 @@ ai_controller = /datum/ai_controller/basic_controller/festivus_pole ///how much charge we give off to cells around us when rubbed - var/recharge_value = 75 + var/recharge_value = 75 KILO JOULES /mob/living/basic/festivus/Initialize(mapload) diff --git a/code/modules/mob/living/basic/guardian/guardian_creator.dm b/code/modules/mob/living/basic/guardian/guardian_creator.dm index 3f1f0927522..441a60124a7 100644 --- a/code/modules/mob/living/basic/guardian/guardian_creator.dm +++ b/code/modules/mob/living/basic/guardian/guardian_creator.dm @@ -87,17 +87,18 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) used = TRUE to_chat(user, use_message) var/guardian_type_name = random ? "Random" : capitalize(initial(guardian_path.creator_name)) - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates( - "Do you want to play as [user.real_name]'s [guardian_type_name] [mob_name]?", + var/mob/chosen_one = SSpolling.poll_ghost_candidates( + "Do you want to play as [span_danger("[user.real_name]'s")] [span_notice("[guardian_type_name] [mob_name]")]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_HOLOPARASITE, - pic_source = src, - role_name_text = "guardian spirit", + alert_pic = guardian_path, + jump_target = src, + role_name_text = guardian_type_name, + amount_to_pick = 1, ) - if(LAZYLEN(candidates)) - var/mob/dead/observer/candidate = pick(candidates) - spawn_guardian(user, candidate, guardian_path) + if(chosen_one) + spawn_guardian(user, chosen_one, guardian_path) used = TRUE SEND_SIGNAL(src, COMSIG_TRAITOR_ITEM_USED(type)) else diff --git a/code/modules/mob/living/basic/guardian/guardian_types/charger.dm b/code/modules/mob/living/basic/guardian/guardian_types/charger.dm index 07c5e31f144..10ef9c34d53 100644 --- a/code/modules/mob/living/basic/guardian/guardian_types/charger.dm +++ b/code/modules/mob/living/basic/guardian/guardian_types/charger.dm @@ -46,7 +46,7 @@ /datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian/do_charge_indicator(atom/charger, atom/charge_target) playsound(charger, 'sound/items/modsuit/loader_launch.ogg', 75, TRUE) var/obj/effect/temp_visual/decoy/decoy_flash = new /obj/effect/temp_visual/decoy(charger.loc, charger) - animate(decoy_flash, alpha = 0, color = "#FF0000", transform = matrix() * 2, time = 3) + animate(decoy_flash, alpha = 0, color = COLOR_RED, transform = matrix() * 2, time = 3) /datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian/can_hit_target(atom/movable/source, atom/target) var/mob/living/living_target = target 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 27ec9cace81..a7a9e718e54 100644 --- a/code/modules/mob/living/basic/guardian/guardian_types/protector.dm +++ b/code/modules/mob/living/basic/guardian/guardian_types/protector.dm @@ -16,7 +16,6 @@ /mob/living/basic/guardian/protector/Initialize(mapload, datum/guardian_fluff/theme) . = ..() shield = new(src) - shield.owner_has_control = FALSE // Hide it from the user, it's integrated with guardian UI shield.Grant(src) /mob/living/basic/guardian/protector/Destroy() @@ -49,6 +48,7 @@ background_icon_state = "base" cooldown_time = 1 SECONDS click_to_activate = FALSE + owner_has_control = FALSE // Hide it from the user, it's integrated with guardian UI /datum/action/cooldown/mob_cooldown/protector_shield/Activate(mob/living/target) if (!isliving(target)) diff --git a/code/modules/mob/living/basic/guardian/guardian_verbs.dm b/code/modules/mob/living/basic/guardian/guardian_verbs.dm index 2f40da369f8..80a2af7db7a 100644 --- a/code/modules/mob/living/basic/guardian/guardian_verbs.dm +++ b/code/modules/mob/living/basic/guardian/guardian_verbs.dm @@ -169,20 +169,18 @@ return FALSE to_chat(owner, span_holoparasite("You attempt to reset [span_bold(chosen_guardian.real_name)]'s personality...")) - var/list/mob/dead/observer/ghost_candidates = SSpolling.poll_ghost_candidates("Do you want to play as [owner.real_name]'s [chosen_guardian.theme.name]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, pic_source = chosen_guardian, role_name_text = chosen_guardian.theme.name) - if (!LAZYLEN(ghost_candidates)) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Do you want to play as [span_danger("[owner.real_name]'s")] [span_notice(chosen_guardian.theme.name)]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, alert_pic = chosen_guardian, jump_target = owner, role_name_text = chosen_guardian.theme.name, amount_to_pick = 1) + if(isnull(chosen_one)) to_chat(owner, span_holoparasite("Your attempt to reset the personality of \ [span_bold(chosen_guardian.real_name)] appears to have failed... \ Looks like you're stuck with it for now.")) StartCooldown() return FALSE - - var/mob/dead/observer/candidate = pick(ghost_candidates) to_chat(chosen_guardian, span_holoparasite("Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.")) to_chat(owner, span_boldholoparasite("The personality of [chosen_guardian.theme.name] has been successfully reset.")) - message_admins("[key_name_admin(candidate)] has taken control of ([ADMIN_LOOKUPFLW(chosen_guardian)])") + message_admins("[key_name_admin(chosen_one)] has taken control of ([ADMIN_LOOKUPFLW(chosen_guardian)])") chosen_guardian.ghostize(FALSE) - chosen_guardian.key = candidate.key + chosen_guardian.key = chosen_one.key COOLDOWN_START(chosen_guardian, resetting_cooldown, 5 MINUTES) chosen_guardian.guardian_rename() //give it a new color and name, to show it's a new person chosen_guardian.guardian_recolour() diff --git a/code/modules/mob/living/basic/heretic/_heretic_summon.dm b/code/modules/mob/living/basic/heretic/_heretic_summon.dm index bdde67179fe..b6336182a22 100644 --- a/code/modules/mob/living/basic/heretic/_heretic_summon.dm +++ b/code/modules/mob/living/basic/heretic/_heretic_summon.dm @@ -8,7 +8,7 @@ gender = NEUTER mob_biotypes = NONE - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) speed = 0 melee_attack_cooldown = CLICK_CD_MELEE diff --git a/code/modules/mob/living/basic/icemoon/wolf/wolf.dm b/code/modules/mob/living/basic/icemoon/wolf/wolf.dm index c657fa42843..e452c156474 100644 --- a/code/modules/mob/living/basic/icemoon/wolf/wolf.dm +++ b/code/modules/mob/living/basic/icemoon/wolf/wolf.dm @@ -65,15 +65,9 @@ make_tameable() /mob/living/basic/mining/wolf/proc/make_tameable() - AddComponent(\ - /datum/component/tameable,\ - food_types = list(/obj/item/food/meat/slab),\ - tame_chance = 15,\ - bonus_tame_chance = 5,\ - after_tame = CALLBACK(src, PROC_REF(tame_wolf)),\ - ) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/meat/slab), tame_chance = 15, bonus_tame_chance = 5) -/mob/living/basic/mining/wolf/proc/tame_wolf() +/mob/living/basic/mining/wolf/tamed(mob/living/tamer, atom/food) new /obj/effect/temp_visual/heart(src.loc) // ride wolf, life good AddElement(/datum/element/ridable, /datum/component/riding/creature/wolf) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm index 3a6ed50db10..62b36a1bbaf 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm @@ -16,7 +16,7 @@ pixel_x = -16 base_pixel_x = -16 - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null faction = list(FACTION_JUNGLE) obj_damage = 30 environment_smash = ENVIRONMENT_SMASH_WALLS 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 f9306afe20e..6c0a6e2f9db 100644 --- a/code/modules/mob/living/basic/jungle/venus_human_trap.dm +++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm @@ -148,7 +148,7 @@ attack_sound = 'sound/creatures/venus_trap_hit.ogg' unsuitable_heat_damage = 5 // heat damage is different from cold damage since coldmos is significantly more common than plasmafires unsuitable_cold_damage = 2 // they now do take cold damage, but this should be sufficiently small that it does not cause major issues - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null unsuitable_atmos_damage = 0 /// copied over from the code from eyeballs (the mob) to make it easier for venus human traps to see in kudzu that doesn't have the transparency mutation sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS @@ -173,7 +173,7 @@ . = ..() AddElement(/datum/element/lifesteal, 5) var/static/list/innate_actions = list( - /datum/action/cooldown/vine_tangle = BB_TARGETED_ACTION, + /datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle = BB_TARGETED_ACTION, ) grant_actions_by_list(innate_actions) @@ -199,14 +199,12 @@ 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 -/datum/action/cooldown/vine_tangle +/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle name = "Tangle" button_icon = 'icons/mob/spacevines.dmi' button_icon_state = "Light1" desc = "Grabs a target with a sticky vine, allowing you to pull it alongside you." cooldown_time = 8 SECONDS - ///how many vines can we handle - var/max_vines = 2 /// An assoc list of all the plant's vines (beam = leash) var/list/datum/beam/vines = list() /// How far away a plant can attach a vine to something @@ -214,17 +212,19 @@ /// how long does a vine attached to something last (and its leash) (lasts twice as long on nonliving things) var/vine_duration = 2 SECONDS -/datum/action/cooldown/vine_tangle/Remove(mob/remove_from) +/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle/Remove(mob/remove_from) QDEL_LIST(vines) return ..() -/datum/action/cooldown/vine_tangle/Activate(atom/target_atom) +/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle/Activate(atom/target_atom) if(isturf(target_atom) || istype(target_atom, /obj/structure/spacevine)) return - if(length(vines) >= max_vines || get_dist(owner, target_atom) > vine_grab_distance) + if(get_dist(owner, target_atom) > vine_grab_distance) + owner.balloon_alert(owner, "too far!") return for(var/turf/blockage in get_line(owner, target_atom)) if(blockage.is_blocked_turf(exclude_mobs = TRUE)) + owner.balloon_alert(owner, "something's in the way!") return var/datum/beam/new_vine = owner.Beam(target_atom, icon_state = "vine", time = vine_duration * (ismob(target_atom) ? 1 : 2), beam_type = /obj/effect/ebeam/vine, emissive = FALSE) @@ -245,7 +245,7 @@ * Arguments: * * datum/beam/vine - The vine to be removed from the list. */ -/datum/action/cooldown/vine_tangle/proc/remove_vine(datum/beam/vine) +/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle/proc/remove_vine(datum/beam/vine) SIGNAL_HANDLER qdel(vines[vine]) diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index f35f78ba80f..ce9f2439358 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -106,15 +106,9 @@ return ..() /mob/living/basic/mining/goldgrub/proc/make_tameable() - AddComponent(\ - /datum/component/tameable,\ - food_types = list(/obj/item/stack/ore),\ - tame_chance = 25,\ - bonus_tame_chance = 5,\ - after_tame = CALLBACK(src, PROC_REF(tame_grub)),\ - ) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/stack/ore), tame_chance = 25, bonus_tame_chance = 5) -/mob/living/basic/mining/goldgrub/proc/tame_grub() +/mob/living/basic/mining/goldgrub/tamed(mob/living/tamer, atom/food) new /obj/effect/temp_visual/heart(src.loc) AddElement(/datum/element/ridable, /datum/component/riding/creature/goldgrub) AddComponent(/datum/component/obeys_commands, pet_commands) diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm index 6d197d8853a..4a28fba6630 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm @@ -68,13 +68,7 @@ AddComponent(/datum/component/basic_mob_attack_telegraph) AddComponentFrom(INNATE_TRAIT, /datum/component/shovel_hands) if (tameable) - AddComponent(\ - /datum/component/tameable,\ - food_types = list(/obj/item/food/grown/ash_flora),\ - tame_chance = 10,\ - bonus_tame_chance = 5,\ - after_tame = CALLBACK(src, PROC_REF(tamed)),\ - ) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/ash_flora), tame_chance = 10, bonus_tame_chance = 5) tentacles = new (src) tentacles.Grant(src) @@ -120,6 +114,9 @@ return balloon_alert(user, "ready to ride") qdel(attacking_item) + make_rideable() + +/mob/living/basic/mining/goliath/proc/make_rideable() saddled = TRUE buckle_lying = 0 add_overlay("goliath_saddled") @@ -149,7 +146,7 @@ icon_state = tentacle_warning_state /// Get ready for mounting -/mob/living/basic/mining/goliath/proc/tamed() +/mob/living/basic/mining/goliath/tamed(mob/living/tamer, atom/food) tamed = TRUE // Copy entire faction rather than just placing user into faction, to avoid tentacle peril on station @@ -163,6 +160,19 @@ /mob/living/basic/mining/goliath/ranged_secondary_attack(atom/atom_target, modifiers) tentacle_line?.Trigger(target = atom_target) +/// Version of the goliath that already starts saddled and doesn't require a lasso to be ridden. +/mob/living/basic/mining/goliath/deathmatch + saddled = TRUE + buckle_lying = 0 + +/mob/living/basic/mining/goliath/deathmatch/Initialize(mapload) + . = ..() + make_rideable() + +/mob/living/basic/mining/goliath/deathmatch/make_rideable() + add_overlay("goliath_saddled") + AddElement(/datum/element/ridable, /datum/component/riding/creature/goliath/deathmatch) + /// Legacy Goliath mob with different sprites, largely the same behaviour /mob/living/basic/mining/goliath/ancient name = "ancient goliath" diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutluncher_foodtrough.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutluncher_foodtrough.dm index 1ac43c13eb4..734d431912f 100644 --- a/code/modules/mob/living/basic/lavaland/gutlunchers/gutluncher_foodtrough.dm +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutluncher_foodtrough.dm @@ -22,11 +22,8 @@ list_of_materials -= mover.type return ..() -/obj/structure/ore_container/gutlunch_trough/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/structure/ore_container/gutlunch_trough/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/mineral/wood(drop_location(), 5) - qdel(src) /obj/structure/ore_container/gutlunch_trough/update_overlays() . = ..() diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_trophy.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_trophy.dm index c018795b20b..4647aab260a 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_trophy.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_trophy.dm @@ -1,4 +1,4 @@ -/// Lobstrosity crusher trophy. Staggers targets, increasing their click cooldown. +/// Lobstrosity crusher trophy. Rebukes targets, increasing their click cooldown. /obj/item/crusher_trophy/lobster_claw name = "lobster claw" icon_state = "lobster_claw" @@ -7,7 +7,7 @@ bonus_value = 1 /obj/item/crusher_trophy/lobster_claw/effect_desc() - return "mark detonation to briefly stagger the target for [bonus_value] seconds" + return "mark detonation to briefly rebuke the target for [bonus_value] seconds" /obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user) - target.apply_status_effect(/datum/status_effect/stagger, bonus_value SECONDS) + target.apply_status_effect(/datum/status_effect/rebuked, bonus_value SECONDS) diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index 5422ab4ee2e..26e549cbcf9 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -9,7 +9,7 @@ status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH mouse_opacity = MOUSE_OPACITY_ICON combat_mode = TRUE - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 health = 125 maxHealth = 125 @@ -25,16 +25,24 @@ death_message = "blows apart!" light_system = OVERLAY_LIGHT light_range = 6 + // I want this to be a bit more dim, for vibes + light_power = 0.6 + light_color = "#ff9933" light_on = FALSE combat_mode = FALSE ai_controller = /datum/ai_controller/basic_controller/minebot - ///the access card we use to access mining - var/obj/item/card/id/access_card ///the gun we use to kill var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun + ///our normal overlay + var/mutable_appearance/neutral_overlay + ///our combat mode overlay + var/mutable_appearance/combat_overlay + ///our current color, if any + var/selected_color ///the commands our owner can give us - var/list/pet_commands = list( + var/static/list/pet_commands = list( /datum/pet_command/idle/minebot, + /datum/pet_command/protect_owner/minebot, /datum/pet_command/minebot_ability/light, /datum/pet_command/minebot_ability/dump, /datum/pet_command/automate_mining, @@ -42,23 +50,27 @@ /datum/pet_command/follow, /datum/pet_command/point_targeting/attack/minebot, ) + ///possible colors the bot can have + var/static/list/possible_colors= list( + "Default" = null, //default color state + "Blue" = "#70d5e7", + "Red" = "#ee7fb9", + "Green" = "#5fea94", + ) /mob/living/basic/mining_drone/Initialize(mapload) . = ..() - + neutral_overlay = mutable_appearance(icon = 'icons/mob/silicon/aibots.dmi', icon_state = "mining_drone_grey") + combat_overlay = mutable_appearance(icon = 'icons/mob/silicon/aibots.dmi', icon_state = "mining_drone_offense_grey") + AddComponent(/datum/component/obeys_commands, pet_commands) var/static/list/death_drops = list(/obj/effect/decal/cleanable/robot_debris/old) AddElement(/datum/element/death_drops, death_drops) add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) - AddComponent(\ - /datum/component/tameable,\ - food_types = list(/obj/item/stack/ore),\ - tame_chance = 100,\ - bonus_tame_chance = 5,\ - after_tame = CALLBACK(src, PROC_REF(activate_bot)),\ - ) var/static/list/innate_actions = list( + /datum/action/cooldown/mob_cooldown/missile_launcher = BB_MINEBOT_MISSILE_ABILITY, + /datum/action/cooldown/mob_cooldown/drop_landmine = BB_MINEBOT_LANDMINE_ABILITY, /datum/action/cooldown/mob_cooldown/minedrone/toggle_light = BB_MINEBOT_LIGHT_ABILITY, /datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision = null, /datum/action/cooldown/mob_cooldown/minedrone/dump_ore = BB_MINEBOT_DUMP_ABILITY, @@ -69,10 +81,11 @@ stored_gun = new(src) var/obj/item/implant/radio/mining/comms = new(src) comms.implant(src) - access_card = new /obj/item/card/id/advanced/gold(src) - SSid_access.apply_trim_to_card(access_card, /datum/id_trim/job/shaft_miner) - - RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access)) + var/static/list/accesses = list( + /datum/id_trim/job/shaft_miner, + ) + AddElement(/datum/element/mob_access, accesses) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) /mob/living/basic/mining_drone/set_combat_mode(new_mode, silent = TRUE) . = ..() @@ -118,8 +131,82 @@ return ..() /mob/living/basic/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers) + if(!user.combat_mode) + ui_interact(user) + return + return ..() + +/mob/living/basic/mining_drone/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MineBot", name) + ui.open() + +/mob/living/basic/mining_drone/ui_data(mob/user) + var/list/data = list() + data["auto_defend"] = ai_controller.blackboard[BB_MINEBOT_AUTO_DEFEND] + data["repair_node_drone"] = ai_controller.blackboard[BB_MINEBOT_REPAIR_DRONE] + data["plant_mines"] = ai_controller.blackboard[BB_MINEBOT_PLANT_MINES] + data["bot_maintain_distance"] = ai_controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE] + data["bot_name"] = name + data["bot_mode"] = combat_mode + data["bot_health"] = health + data["bot_maxhealth"] = maxHealth + data["bot_color"] = "" + var/color_value = neutral_overlay.color + for(var/index in possible_colors) + if(possible_colors[index] == color_value) + data["bot_color"] = index + break + return data + +/mob/living/basic/mining_drone/ui_static_data(mob/user) + var/list/data = list() + data["bot_icon"] = icon2base64(getFlatIcon(src)) + data["possible_colors"] = list() + for(var/color in possible_colors) + data["possible_colors"] += list(list( + "color_name" = color, + "color_value" = possible_colors[color], + )) + return data + +/mob/living/basic/mining_drone/ui_act(action, params, datum/tgui/ui) + . = ..() + switch(action) + if("change_min_distance") + var/new_distance = clamp(params["distance"], 0, 5) + ai_controller.set_blackboard_key(BB_MINIMUM_SHOOTING_DISTANCE, new_distance) + if("toggle_defend") + var/new_toggle = !ai_controller.blackboard[BB_MINEBOT_AUTO_DEFEND] + ai_controller.set_blackboard_key(BB_MINEBOT_AUTO_DEFEND, new_toggle) + if("toggle_repair") + var/new_defend = !ai_controller.blackboard[BB_MINEBOT_REPAIR_DRONE] + ai_controller.set_blackboard_key(BB_MINEBOT_REPAIR_DRONE, new_defend) + if("toggle_mines") + var/new_mines = !ai_controller.blackboard[BB_MINEBOT_PLANT_MINES] + ai_controller.set_blackboard_key(BB_MINEBOT_PLANT_MINES, new_mines) + if("set_name") + var/input_name = sanitize_name(params["chosen_name"], allow_numbers = TRUE) + name = (input_name ? input_name : initial(name)) + if("toggle_mode") + set_combat_mode(!combat_mode) + if("set_color") + change_color(params["chosen_color"]) + update_static_data(ui.user, ui) + return TRUE + +/mob/living/basic/mining_drone/proc/change_color(new_color) + selected_color = new_color + if(!isnull(selected_color)) + neutral_overlay.color = selected_color + combat_overlay.color = selected_color + update_appearance() + +/mob/living/basic/mining_drone/AltClick(mob/living/user) + . = ..() if(user.combat_mode) - return ..() + return set_combat_mode(!combat_mode) balloon_alert(user, "now [combat_mode ? "attacking wildlife" : "collecting loose ore"]") @@ -128,7 +215,6 @@ return stored_gun.afterattack(target, src) - /mob/living/basic/mining_drone/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) . = ..() @@ -144,16 +230,6 @@ for(var/obj/item/stack/ore/dropped_item in contents) dropped_item.forceMove(get_turf(src)) -/mob/living/basic/mining_drone/proc/attempt_access(mob/drone, obj/door_attempt) - SIGNAL_HANDLER - - if(door_attempt.check_access(access_card)) - return ACCESS_ALLOWED - return ACCESS_DISALLOWED - -/mob/living/basic/mining_drone/proc/activate_bot() - AddComponent(/datum/component/obeys_commands, pet_commands) - /mob/living/basic/mining_drone/death(gibbed) drop_ore() @@ -167,6 +243,25 @@ /mob/living/basic/mining_drone/Destroy() QDEL_NULL(stored_gun) - QDEL_NULL(access_card) return ..() +/mob/living/basic/mining_drone/proc/pre_attack(datum/source, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /mob/living/basic/node_drone)) + return NONE + INVOKE_ASYNC(src, PROC_REF(repair_node_drone), target) + return COMPONENT_HOSTILE_NO_ATTACK + +/mob/living/basic/mining_drone/proc/repair_node_drone(mob/living/my_target) + do_sparks(5, FALSE, source = my_target) + if(!do_after(src, 6 SECONDS, my_target)) + return + my_target.heal_overall_damage(brute = 50) + +/mob/living/basic/mining_drone/update_overlays() + . = ..() + if(stat == DEAD || isnull(selected_color)) + return + + . += combat_mode ? combat_overlay : neutral_overlay diff --git a/code/modules/mob/living/basic/minebots/minebot_abilities.dm b/code/modules/mob/living/basic/minebots/minebot_abilities.dm index 4f119fd9b66..8d1a93bd429 100644 --- a/code/modules/mob/living/basic/minebots/minebot_abilities.dm +++ b/code/modules/mob/living/basic/minebots/minebot_abilities.dm @@ -49,3 +49,142 @@ to_chat(owner, span_notice("You toggle your meson vision [(owner.sight & SEE_TURFS) ? "on" : "off"].")) +/datum/action/cooldown/mob_cooldown/missile_launcher + name = "Launch Missile" + button_icon = 'icons/obj/weapons/guns/projectiles.dmi' + button_icon_state = "84mm-heap" + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + desc = "Launch a missile towards the target!" + cooldown_time = 10 SECONDS + shared_cooldown = NONE + melee_cooldown_time = 0 SECONDS + ///how long before we launch said missile + var/wind_up_timer = 1 SECONDS + +/datum/action/cooldown/mob_cooldown/missile_launcher/IsAvailable(feedback = TRUE) + . = ..() + if(!.) + return FALSE + if(lavaland_equipment_pressure_check(get_turf(owner))) + return TRUE + if(feedback) + owner.balloon_alert(owner, "cant be used here!") + return FALSE + +/datum/action/cooldown/mob_cooldown/missile_launcher/Activate(atom/target) + var/turf/target_turf = get_turf(target) + if(isnull(target_turf) || !can_see(owner, target_turf, 7)) + return FALSE + owner.Shake(duration = wind_up_timer) + addtimer(CALLBACK(src, PROC_REF(launch_missile), target_turf), wind_up_timer) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/missile_launcher/proc/launch_missile(turf/target_turf) + new /obj/effect/temp_visual/mook_dust(get_turf(owner)) + var/obj/effect/temp_visual/rising_rocket/new_rocket = new(get_turf(owner)) + addtimer(CALLBACK(src, PROC_REF(drop_missile), target_turf), new_rocket.duration) + +/datum/action/cooldown/mob_cooldown/missile_launcher/proc/drop_missile(turf/target_turf) + new /obj/effect/temp_visual/falling_rocket(target_turf) + var/obj/effect/temp_visual/falling_shadow = new /obj/effect/temp_visual/shadow_telegraph(target_turf) + animate(falling_shadow, transform = matrix().Scale(0.1, 0.1), time = falling_shadow.duration) + +/datum/action/cooldown/mob_cooldown/drop_landmine + name = "Landmine" + desc = "Drop a landmine!" + button_icon = 'icons/obj/weapons/grenade.dmi' + button_icon_state = "landmine" + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + cooldown_time = 10 SECONDS + shared_cooldown = NONE + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/drop_landmine/IsAvailable(feedback = TRUE) + . = ..() + if(!.) + return FALSE + if(lavaland_equipment_pressure_check(get_turf(owner))) + return TRUE + if(feedback) + owner.balloon_alert(owner, "cant be used here!") + return FALSE + +/datum/action/cooldown/mob_cooldown/drop_landmine/Activate(atom/target) + var/turf/my_turf = get_turf(owner) + if(isgroundlessturf(my_turf)) + return FALSE + var/obj/effect/mine/minebot/my_mine = new(my_turf) + my_mine.ignore_list = owner.faction.Copy() + playsound(my_turf, 'sound/weapons/armbomb.ogg', 20) + StartCooldown() + return TRUE + +/obj/effect/temp_visual/rising_rocket + name = "Missile" + icon = 'icons/obj/weapons/guns/projectiles.dmi' + icon_state = "84mm-heap" + layer = ABOVE_ALL_MOB_LAYER + duration = 2 SECONDS + +/obj/effect/temp_visual/rising_rocket/Initialize(mapload) + . = ..() + playsound(src, 'sound/weapons/minebot_rocket.ogg', 100, FALSE) + animate(src, pixel_y = base_pixel_y + 500, time = duration, easing = EASE_IN) + +/obj/effect/temp_visual/falling_rocket + name = "Missile" + icon = 'icons/obj/weapons/guns/projectiles.dmi' + icon_state = "84mm-heap" + layer = ABOVE_ALL_MOB_LAYER + duration = 0.7 SECONDS + pixel_y = 60 + ///the radius of our explosion + var/explosion_radius = 2 + ///damage of our explosion + var/explosion_damage = 100 + +/obj/effect/temp_visual/falling_rocket/Initialize(mapload) + . = ..() + transform = transform.Turn(180) + addtimer(CALLBACK(src, PROC_REF(create_explosion)), duration) + animate(src, pixel_y = 0, time = duration) + +/obj/effect/temp_visual/falling_rocket/proc/create_explosion() + playsound(src, 'sound/weapons/minebot_rocket.ogg', 100, FALSE) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(1, holder = src) + smoke.start() + for(var/mob/living/living_target in oview(explosion_radius, src)) + if(living_target.incorporeal_move) + continue + living_target.apply_damage(explosion_damage) + +/obj/effect/mine/minebot + name = "Landmine" + ///we dont detonate if any of these people step on us + var/list/ignore_list = list() + ///the damage we apply to whoever steps on us + var/damage_to_apply = 50 + +/obj/effect/mine/minebot/mineEffect(mob/living/victim) + if(!istype(victim)) + return + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, holder = src) + smoke.start() + playsound(src, 'sound/effects/explosion3.ogg', 100) + victim.apply_damage(damage_to_apply) + +/obj/effect/mine/minebot/can_trigger(atom/movable/on_who) + if(REF(on_who) in ignore_list) + return FALSE + if(!isliving(on_who)) + return ..() + var/mob/living/stepped_mob = on_who + if(FACTION_NEUTRAL in stepped_mob.faction) + return FALSE + return ..() diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm index 4aba93c4265..059048f761a 100644 --- a/code/modules/mob/living/basic/minebots/minebot_ai.dm +++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm @@ -2,6 +2,11 @@ blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_BASIC_MOB_FLEE_DISTANCE = 3, + BB_MINIMUM_SHOOTING_DISTANCE = 3, + BB_MINEBOT_PLANT_MINES = TRUE, + BB_MINEBOT_REPAIR_DRONE = TRUE, + BB_MINEBOT_AUTO_DEFEND = TRUE, BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite), BB_AUTOMATED_MINING = FALSE, ) @@ -10,12 +15,91 @@ idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/launch_missiles, /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/befriend_miners, + /datum/ai_planning_subtree/defend_node, + /datum/ai_planning_subtree/minebot_maintain_distance, /datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot, /datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/minebot, /datum/ai_planning_subtree/minebot_mining, /datum/ai_planning_subtree/locate_dead_humans, ) + ai_traits = PAUSE_DURING_DO_AFTER + +/datum/ai_planning_subtree/launch_missiles + +/datum/ai_planning_subtree/launch_missiles/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/datum/action/cooldown/missile_ability = controller.blackboard[BB_MINEBOT_MISSILE_ABILITY] + if(!missile_ability?.IsAvailable()) + return + if(!controller.blackboard_key_exists(BB_MINEBOT_MISSILE_TARGET)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/clear_bombing_zone, BB_MINEBOT_MISSILE_TARGET, /obj/effect/temp_visual/minebot_target, 7) + return + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target, BB_MINEBOT_MISSILE_ABILITY, BB_MINEBOT_MISSILE_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +/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) + for(var/obj/effect/temp_visual/minebot_target/target in oview(search_range, controller.pawn)) + if(isclosedturf(get_turf(target))) + continue + return target + return null + +/datum/ai_planning_subtree/befriend_miners/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard_key_exists(BB_MINER_FRIEND)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/miner_to_befriend, BB_MINER_FRIEND) + return + controller.queue_behavior(/datum/ai_behavior/befriend_target, BB_MINER_FRIEND) + +/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) + for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) + if(HAS_TRAIT(target, TRAIT_ROCK_STONER)) + return target + return null + +/datum/ai_planning_subtree/defend_node/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[BB_DRONE_DEFEND] + if(QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_DRONE_DEFEND, /mob/living/basic/node_drone) + return + var/mob/living/living_pawn = controller.pawn + if(!living_pawn.faction.Find(REF(target))) + controller.queue_behavior(/datum/ai_behavior/befriend_target, BB_DRONE_DEFEND) + return + if(target.health < (target.maxHealth * 0.75) && controller.blackboard[BB_MINEBOT_REPAIR_DRONE]) + controller.queue_behavior(/datum/ai_behavior/repair_drone, BB_DRONE_DEFEND) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/repair_drone + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/repair_drone/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/repair_drone/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + var/mob/living/living_pawn = controller.pawn + living_pawn.say("REPAIRING [target]!") + living_pawn.UnarmedAttack(target) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/repair_drone/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + if(!success) + controller.clear_blackboard_key(target_key) ///find dead humans and report their location on the radio /datum/ai_planning_subtree/locate_dead_humans/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) @@ -28,6 +112,7 @@ for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) if(target.stat >= UNCONSCIOUS && target.mind) return target + return null /datum/ai_behavior/send_sos_message behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION @@ -58,16 +143,51 @@ operational_datums = null ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/minebot -/datum/ai_behavior/basic_ranged_attack/minebot - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT - avoid_friendly_fire = TRUE - /datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(target)) + return var/mob/living/living_pawn = controller.pawn if(!living_pawn.combat_mode) //we are not on attack mode return + controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_planning_subtree/minebot_maintain_distance/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(target)) + return + var/mob/living/living_pawn = controller.pawn + if(get_dist(living_pawn, target) <= controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE]) + controller.queue_behavior(/datum/ai_behavior/run_away_from_target/run_and_shoot/minebot, BB_BASIC_MOB_CURRENT_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/run_away_from_target/run_and_shoot/minebot + +/datum/ai_behavior/run_away_from_target/run_and_shoot/minebot/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) + if(!controller.blackboard[BB_MINEBOT_PLANT_MINES]) + return ..() + var/datum/action/cooldown/mine_ability = controller.blackboard[BB_MINEBOT_LANDMINE_ABILITY] + mine_ability?.Trigger() return ..() +/datum/ai_behavior/basic_ranged_attack/minebot + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + avoid_friendly_fire = TRUE + ///if our target is closer than this distance, finish action + var/minimum_distance = 3 + +/datum/ai_behavior/basic_ranged_attack/minebot/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) + . = ..() + minimum_distance = controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE] ? controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE] : initial(minimum_distance) + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + finish_action(controller, target_key, FALSE) + return + var/mob/living/living_pawn = controller.pawn + if(get_dist(living_pawn, target) <= minimum_distance) + finish_action(controller, target_key, TRUE) + ///mine walls if we are on automated mining mode /datum/ai_planning_subtree/minebot_mining/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) if(!controller.blackboard[BB_AUTOMATED_MINING]) @@ -216,3 +336,19 @@ /datum/pet_command/idle/minebot/execute_action(datum/ai_controller/controller) controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE) return ..() + +/datum/pet_command/protect_owner/minebot + +/datum/pet_command/protect_owner/minebot/set_command_target(mob/living/parent, atom/target) + if(!parent.ai_controller.blackboard[BB_MINEBOT_AUTO_DEFEND]) + return + if(!parent.ai_controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET) && !QDELETED(target)) //we are already dealing with something, + parent.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, target) + +/datum/pet_command/protect_owner/minebot/execute_action(datum/ai_controller/controller) + if(controller.blackboard[BB_MINEBOT_AUTO_DEFEND]) + var/mob/living/living_pawn = controller.pawn + living_pawn.set_combat_mode(TRUE) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + + diff --git a/code/modules/mob/living/basic/minebots/minebot_remote_control.dm b/code/modules/mob/living/basic/minebots/minebot_remote_control.dm new file mode 100644 index 00000000000..618edc3d0b6 --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot_remote_control.dm @@ -0,0 +1,72 @@ +#define BOMB_COOLDOWN 20 SECONDS +/obj/item/minebot_remote_control + name = "Remote Control" + desc = "Requesting stratagem!" + icon = 'icons/obj/mining.dmi' + icon_state = "minebot_bomb_control" + item_flags = NOBLUDGEON + ///are we currently primed to drop a bomb? + var/primed = FALSE + ///our last user + var/datum/weakref/last_user + ///cooldown till we can drop the next bomb + COOLDOWN_DECLARE(bomb_timer) + +/obj/item/minebot_remote_control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + clear_priming() + +/obj/item/minebot_remote_control/proc/clear_priming() + var/mob/living/living_user = last_user?.resolve() + last_user = null + primed = FALSE + if(isnull(living_user)) + return + living_user.client?.mouse_override_icon = initial(living_user.client?.mouse_override_icon) + living_user.update_mouse_pointer() + +/obj/item/minebot_remote_control/attack_self(mob/user) + . = ..() + if(.) + return . + + if(!COOLDOWN_FINISHED(src, bomb_timer)) + balloon_alert(user, "on cooldown!") + return TRUE + + prime_bomb(user) + return TRUE + +/obj/item/minebot_remote_control/proc/prime_bomb(mob/user) + primed = TRUE + last_user = WEAKREF(user) + user.client?.mouse_override_icon = 'icons/effects/mouse_pointers/weapon_pointer.dmi' + user.update_mouse_pointer() + +/obj/item/minebot_remote_control/afterattack(atom/attacked_atom, mob/living/user, proximity) + . = ..() + + . |= AFTERATTACK_PROCESSED_ITEM + + if(!primed) + user.balloon_alert(user, "not primed!") + return + var/turf/target_turf = get_turf(attacked_atom) + if(isnull(target_turf) || isclosedturf(target_turf) || isgroundlessturf(target_turf)) + user.balloon_alert(user, "invalid target!") + return + playsound(src, 'sound/machines/beep.ogg', 30) + clear_priming() + new /obj/effect/temp_visual/minebot_target(target_turf) + COOLDOWN_START(src, bomb_timer, BOMB_COOLDOWN) + +/obj/effect/temp_visual/minebot_target + name = "Rocket Target" + icon = 'icons/mob/actions/actions_items.dmi' + icon_state = "sniper_zoom" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + light_range = 2 + duration = 5 SECONDS + +#undef BOMB_COOLDOWN diff --git a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm index d68e3a85081..14c62f7fefc 100644 --- a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm +++ b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm @@ -3,6 +3,7 @@ desc = "A minebot upgrade." icon_state = "door_electronics" icon = 'icons/obj/devices/circuitry_n_data.dmi' + item_flags = NOBLUDGEON /obj/item/mine_bot_upgrade/afterattack(mob/living/basic/mining_drone/minebot, mob/user, proximity) . = ..() @@ -58,3 +59,35 @@ minebot.melee_damage_lower = initial(minebot.melee_damage_lower) + base_damage_add minebot.melee_damage_upper = initial(minebot.melee_damage_upper) + base_damage_add minebot.stored_gun?.recharge_time += base_cooldown_add + +/obj/item/mine_bot_upgrade/regnerative_shield + name = "regenerative shield" + desc = "Allows your minebot to tank many hits before going down!" + +/obj/item/mine_bot_upgrade/regnerative_shield/upgrade_bot(mob/living/basic/mining_drone/minebot, mob/user) + if(HAS_TRAIT(minebot, TRAIT_REGEN_SHIELD)) + user.balloon_alert(minebot, "already has it!") + return + var/static/list/shield_layers = list( + /obj/effect/overlay/minebot_top_shield, + /obj/effect/overlay/minebot_bottom_shield + ) + minebot.AddComponent(/datum/component/regenerative_shield, shield_overlays = shield_layers) + qdel(src) + +/obj/effect/overlay/minebot_top_shield + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "minebot_shield_top_layer" + layer = ABOVE_ALL_MOB_LAYER + +/obj/effect/overlay/minebot_bottom_shield + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "minebot_shield_bottom_layer" + layer = BELOW_MOB_LAYER + diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index dd8a588e915..3c2612d9a62 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -33,6 +33,7 @@ attack_verb_simple = "claw" attack_sound = 'sound/weapons/slash.ogg' attack_vis_effect = ATTACK_EFFECT_CLAW + cult_icon_state = "cat_cult" ///can this cat breed? var/can_breed = TRUE ///can hold items? diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm index f835d7c5e17..f513795e7f6 100644 --- a/code/modules/mob/living/basic/pets/dog/_dog.dm +++ b/code/modules/mob/living/basic/pets/dog/_dog.dm @@ -50,7 +50,7 @@ AddElement(/datum/element/pet_bonus, "woofs happily!") AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) AddElement(/datum/element/unfriend_attacker, untamed_reaction = "%SOURCE% fixes %TARGET% with a look of betrayal.") - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/meat/slab/human/mutant/skeleton, /obj/item/stack/sheet/bone), tame_chance = 30, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed)), unique = FALSE) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/meat/slab/human/mutant/skeleton, /obj/item/stack/sheet/bone), tame_chance = 30, bonus_tame_chance = 15, unique = FALSE) AddComponent(/datum/component/obeys_commands, pet_commands) var/dog_area = get_area(src) for(var/obj/structure/bed/dogbed/dog_bed in dog_area) @@ -64,7 +64,7 @@ speech.emote_see = string_list(list("shakes [p_their()] head.", "chases [p_their()] tail.","shivers.")) ///Proc to run on a successful taming attempt -/mob/living/basic/pet/dog/proc/tamed(mob/living/tamer) +/mob/living/basic/pet/dog/tamed(mob/living/tamer, atom/food) visible_message(span_notice("[src] licks at [tamer] in a friendly manner!")) /// A dog bone fully heals a dog, and befriends it if it's not your friend. diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index 61c18ab5354..2011992da56 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -11,6 +11,7 @@ butcher_results = list(/obj/item/food/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1) gold_core_spawnable = FRIENDLY_SPAWN collar_icon_state = "corgi" + cult_icon_state = "narsian" ai_controller = /datum/ai_controller/basic_controller/dog/corgi ///Access card for the corgi. var/obj/item/card/id/access_card = null @@ -507,7 +508,7 @@ /mob/living/basic/pet/dog/corgi/narsie/narsie_act() if(stat == DEAD) //Nar'Sie loves her doggy visible_message(span_warning("[src] arises again, revived by the dark magicks!"), \ - span_cultlarge("RISE")) + span_cult_large("RISE")) revive(ADMIN_HEAL_ALL) //also means that a dead Nars-Ian can consume a pet and revive adjustBruteLoss(-maxHealth) 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 31c8562ce1e..d05622c35dc 100644 --- a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm +++ b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm @@ -9,6 +9,7 @@ icon_living = "pug" icon_dead = "pug_dead" butcher_results = list(/obj/item/food/meat/slab/pug = 3) + cult_icon_state = "pug_cult" gold_core_spawnable = FRIENDLY_SPAWN collar_icon_state = "pug" held_state = "pug" @@ -37,6 +38,13 @@ collar_icon_state = "bullterrier" held_state = "bullterrier" +/mob/living/basic/pet/dog/bullterrier/lavaland_party + name = "Saint Nick's Helpful Associate" + desc = "Undergraduate in 'Being a Good Boy'." + habitable_atmos = null + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + /mob/living/basic/pet/dog/breaddog //Most of the code originates from Cak name = "Kobun" real_name = "Kobun" diff --git a/code/modules/mob/living/basic/pets/fox.dm b/code/modules/mob/living/basic/pets/fox.dm index 7d74a6a36e4..03ac2be54be 100644 --- a/code/modules/mob/living/basic/pets/fox.dm +++ b/code/modules/mob/living/basic/pets/fox.dm @@ -72,3 +72,10 @@ // A more docile subtype that won't attack other animals. /mob/living/basic/pet/fox/docile ai_controller = /datum/ai_controller/basic_controller/fox/docile + +/mob/living/basic/pet/fox/icemoon + name = "icemoon fox" + desc = "A fox, scraping by the icemoon hostile atmosphere." + gold_core_spawnable = NO_SPAWN + habitable_atmos = null + minimum_survivable_temperature = ICEBOX_MIN_TEMPERATURE diff --git a/code/modules/mob/living/basic/pets/orbie/orbie.dm b/code/modules/mob/living/basic/pets/orbie/orbie.dm index 2c9fb3d815c..735f63977d3 100644 --- a/code/modules/mob/living/basic/pets/orbie/orbie.dm +++ b/code/modules/mob/living/basic/pets/orbie/orbie.dm @@ -13,7 +13,7 @@ light_range = 6 light_color = "#64bee1" health = 100 - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null unsuitable_atmos_damage = 0 can_buckle_to = FALSE density = FALSE diff --git a/code/modules/mob/living/basic/pets/parrot/_parrot.dm b/code/modules/mob/living/basic/pets/parrot/_parrot.dm index 6dd5a9a4051..c23481d85a7 100644 --- a/code/modules/mob/living/basic/pets/parrot/_parrot.dm +++ b/code/modules/mob/living/basic/pets/parrot/_parrot.dm @@ -91,13 +91,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( AddElement(/datum/element/strippable, GLOB.strippable_parrot_items) AddElement(/datum/element/simple_flying) AddComponent(/datum/component/listen_and_repeat, desired_phrases = get_static_list_of_phrases(), blackboard_key = BB_PARROT_REPEAT_STRING) - AddComponent(\ - /datum/component/tameable,\ - food_types = edibles,\ - tame_chance = 100,\ - bonus_tame_chance = 0,\ - after_tame = CALLBACK(src, PROC_REF(tamed)),\ - ) + AddComponent(/datum/component/tameable, food_types = edibles, tame_chance = 100, bonus_tame_chance = 0) RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attacking)) RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click)) @@ -445,7 +439,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( return returnable_list -/mob/living/basic/parrot/proc/tamed() +/mob/living/basic/parrot/tamed(mob/living/tamer, atom/food) new /obj/effect/temp_visual/heart(drop_location()) /mob/living/basic/parrot/proc/drop_item_on_signal(mob/living/user) diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_items.dm b/code/modules/mob/living/basic/pets/parrot/parrot_items.dm index c071bf7fdbe..2c788e9256d 100644 --- a/code/modules/mob/living/basic/pets/parrot/parrot_items.dm +++ b/code/modules/mob/living/basic/pets/parrot/parrot_items.dm @@ -2,7 +2,7 @@ key = STRIPPABLE_ITEM_PARROT_HEADSET /datum/strippable_item/parrot_headset/get_item(atom/source) - var/mob/living/basic/parrot/poly/parrot_source = source + var/mob/living/basic/parrot/parrot_source = source return istype(parrot_source) ? parrot_source.ears : null /datum/strippable_item/parrot_headset/try_equip(atom/source, obj/item/equipping, mob/user) diff --git a/code/modules/mob/living/basic/pets/parrot/poly.dm b/code/modules/mob/living/basic/pets/parrot/poly.dm index f139a43d988..cba3dd6e588 100644 --- a/code/modules/mob/living/basic/pets/parrot/poly.dm +++ b/code/modules/mob/living/basic/pets/parrot/poly.dm @@ -197,6 +197,7 @@ butcher_results = list(/obj/item/ectoplasm = 1) ai_controller = /datum/ai_controller/basic_controller/parrot/ghost speech_probability_rate = 1 + resistance_flags = parent_type::resistance_flags | SHUTTLE_CRUSH_PROOF /mob/living/basic/parrot/poly/ghost/Initialize(mapload) // block anything and everything that could possibly happen with writing memory for ghosts diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm index e8e2a038c0e..1bf3adec557 100644 --- a/code/modules/mob/living/basic/pets/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin.dm @@ -196,4 +196,10 @@ /mob/living/basic/pet/penguin/baby/permanent can_grow_up = FALSE +/mob/living/basic/pet/penguin/emperor/snowdin + minimum_survivable_temperature = ICEBOX_MIN_TEMPERATURE + gold_core_spawnable = NO_SPAWN +/mob/living/basic/pet/penguin/baby/permanent/snowdin + minimum_survivable_temperature = ICEBOX_MIN_TEMPERATURE + gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/basic/pets/pet.dm b/code/modules/mob/living/basic/pets/pet.dm index c8507454f77..de5ad59eb1f 100644 --- a/code/modules/mob/living/basic/pets/pet.dm +++ b/code/modules/mob/living/basic/pets/pet.dm @@ -10,9 +10,12 @@ var/collar_icon_state = null /// We have a seperate _rest collar icon state when the pet is resting. var/has_collar_resting_icon_state = FALSE - /// Our collar var/obj/item/clothing/neck/petcollar/collar + ///can we become cultists? + var/can_cult_convert = TRUE + ///whether we have a custom icon state when we get culted + var/cult_icon_state /mob/living/basic/pet/Initialize(mapload) . = ..() @@ -22,6 +25,8 @@ collar = new(src) update_icon(UPDATE_OVERLAYS) + if(can_cult_convert) + RegisterSignal(src, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(become_cultist)) /mob/living/basic/pet/Destroy() . = ..() @@ -43,6 +48,10 @@ /mob/living/basic/pet/update_overlays() . = ..() + if(isnull(mind) && (FACTION_CULT in faction)) + var/image/cult_indicator = image(icon = 'icons/mob/simple/pets.dmi', icon_state = "pet_cult_indicator", layer = ABOVE_GAME_PLANE) + . += cult_indicator + if(!collar || !collar_icon_state) return @@ -54,6 +63,12 @@ . += mutable_appearance(icon, "[collar_icon_state][stat_tag]collar") . += mutable_appearance(icon, "[collar_icon_state][stat_tag]tag") +/mob/living/basic/pet/update_icon_state() + if(cult_icon_state && (FACTION_CULT in faction)) + icon_state = cult_icon_state + icon_living = cult_icon_state + return ..() + /mob/living/basic/pet/gib() remove_collar(drop_location(), update_visuals = FALSE) return ..() diff --git a/code/modules/mob/living/basic/pets/pet_cult/pet_cult.dm b/code/modules/mob/living/basic/pets/pet_cult/pet_cult.dm new file mode 100644 index 00000000000..438737a1ad2 --- /dev/null +++ b/code/modules/mob/living/basic/pets/pet_cult/pet_cult.dm @@ -0,0 +1,85 @@ +#define PET_CULT_ATTACK 10 +#define PET_CULT_HEALTH 50 + +///turn into terrifying beasts +/mob/living/basic/pet/proc/become_cultist(datum/source, list/invokers, datum/team) + SIGNAL_HANDLER + + if(stat == DEAD || !can_cult_convert) + return + + if(FACTION_CULT in faction) + return STOP_SACRIFICE + + mind?.add_antag_datum(/datum/antagonist/cult, team) + qdel(GetComponent(/datum/component/obeys_commands)) + melee_damage_lower = max(PET_CULT_ATTACK, initial(melee_damage_lower)) + melee_damage_upper = max(PET_CULT_ATTACK + 5, initial(melee_damage_upper)) + maxHealth = max(PET_CULT_HEALTH, initial(maxHealth)) + fully_heal() + + faction = list(FACTION_CULT) //we only serve the cult + + if(isnull(cult_icon_state)) + add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY) + + var/static/list/cult_appetite = list( + /obj/item/organ, + /obj/effect/decal/cleanable/blood, + ) + + var/static/list/death_loot = list( + /obj/effect/gibspawner/generic, + /obj/item/soulstone, + ) + + AddElement(/datum/element/basic_eating, heal_amt = 15, food_types = cult_appetite) + AddElement(/datum/element/death_drops, death_loot) + + basic_mob_flags &= DEL_ON_DEATH + qdel(ai_controller) + ai_controller = new /datum/ai_controller/basic_controller/pet_cult(src) + var/datum/action/cooldown/spell/conjure/revive_rune/rune_ability = new(src) + rune_ability.Grant(src) + ai_controller.set_blackboard_key(BB_RUNE_ABILITY, rune_ability) + ai_controller.set_blackboard_key(BB_CULT_TEAM, team) + + var/static/list/new_pet_commands = list( + /datum/pet_command/point_targeting/attack, + /datum/pet_command/follow, + /datum/pet_command/free, + /datum/pet_command/idle, + /datum/pet_command/untargeted_ability/draw_rune, + ) + AddComponent(/datum/component/obeys_commands, new_pet_commands) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(activate_rune), override = TRUE) + update_appearance() + return STOP_SACRIFICE + + +/mob/living/basic/pet/proc/activate_rune(datum/source, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /obj/effect/rune/raise_dead)) + return NONE + + target.attack_hand(src) + + return COMPONENT_CANCEL_ATTACK_CHAIN + +/mob/living/basic/pet/Login() + . = ..() + if(!. || !client) + return FALSE + + if(!(FACTION_CULT in faction)) + return + var/datum/team/cult_team = locate(/datum/team/cult) in GLOB.antagonist_teams + if(isnull(cult_team)) + return + mind.add_antag_datum(/datum/antagonist/cult, cult_team) + update_appearance(UPDATE_OVERLAYS) + + +#undef PET_CULT_ATTACK +#undef PET_CULT_HEALTH diff --git a/code/modules/mob/living/basic/pets/pet_cult/pet_cult_abilities.dm b/code/modules/mob/living/basic/pets/pet_cult/pet_cult_abilities.dm new file mode 100644 index 00000000000..83d70336f2c --- /dev/null +++ b/code/modules/mob/living/basic/pets/pet_cult/pet_cult_abilities.dm @@ -0,0 +1,14 @@ +/datum/action/cooldown/spell/conjure/revive_rune + name = "Create Revival Rune" + button_icon = 'icons/obj/antags/cult/rune.dmi' + button_icon_state = "1" + background_icon_state = "bg_cult" + overlay_icon_state = "bg_cult_border" + spell_requirements = NONE + cooldown_time = 30 SECONDS + summon_type = list( + /obj/effect/rune/raise_dead, + ) + summon_radius = 0 + create_summon_timer = 5 SECONDS + sound = 'sound/magic/exit_blood.ogg' 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 new file mode 100644 index 00000000000..dc778b5816f --- /dev/null +++ b/code/modules/mob/living/basic/pets/pet_cult/pet_cult_ai.dm @@ -0,0 +1,246 @@ +/datum/ai_controller/basic_controller/pet_cult + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/cultist, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/cultist, + BB_FRIENDLY_MESSAGE = "eagerly awaits your command...", + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/befriend_cultists, + /datum/ai_planning_subtree/find_occupied_rune, + /datum/ai_planning_subtree/find_dead_cultist, + /datum/ai_planning_subtree/drag_target_to_rune, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + ai_traits = PAUSE_DURING_DO_AFTER + +///if target gets pulled away, unset him +/datum/ai_controller/basic_controller/pet_cult/proc/delete_pull_target(datum/source, atom/movable/was_pulling) + SIGNAL_HANDLER + + UnregisterSignal(src, COMSIG_ATOM_NO_LONGER_PULLING) + + if(was_pulling == blackboard[BB_DEAD_CULTIST]) + clear_blackboard_key(BB_DEAD_CULTIST) + +///targeting strat to attack non cultists +/datum/targeting_strategy/basic/cultist + +/datum/targeting_strategy/basic/cultist/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target) + return IS_CULTIST_OR_CULTIST_MOB(the_target) + +///befriend all cultists around us! +/datum/ai_planning_subtree/befriend_cultists + +/datum/ai_planning_subtree/befriend_cultists/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_FRIENDLY_CULTIST)) + controller.queue_behavior(/datum/ai_behavior/befriend_target, BB_FRIENDLY_CULTIST) + return + + controller.queue_behavior(/datum/ai_behavior/find_and_set/friendly_cultist, BB_FRIENDLY_CULTIST, /mob/living/carbon) + +///behavior to find cultists that we befriend +/datum/ai_behavior/find_and_set/friendly_cultist + 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) + 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)))) + return possible_cultist + + return null + +///subtree to find a rune with a viable target on it, so we can go activate it +/datum/ai_planning_subtree/find_occupied_rune + +/datum/ai_planning_subtree/find_occupied_rune/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if((LAZYLEN(GLOB.sacrificed) - SOULS_TO_REVIVE - GLOB.sacrifices_used) < 0) + controller.clear_blackboard_key(BB_OCCUPIED_RUNE) + return + + if(controller.blackboard_key_exists(BB_OCCUPIED_RUNE)) + controller.queue_behavior(/datum/ai_behavior/activate_rune, BB_OCCUPIED_RUNE) + return SUBTREE_RETURN_FINISH_PLANNING + + controller.queue_behavior(/datum/ai_behavior/find_and_set/occupied_rune, BB_OCCUPIED_RUNE, /obj/effect/rune/raise_dead) + +/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) + var/datum/team/cult/cult_team = controller.blackboard[BB_CULT_TEAM] + if(isnull(cult_team)) + return null + + for(var/obj/effect/rune/raise_dead/target_rune in oview(search_range, controller.pawn)) + controller.set_blackboard_key(BB_NEARBY_RUNE, target_rune) + var/mob/living/occupant = locate(/mob/living/carbon/human) in get_turf(target_rune) + if(isnull(occupant)) + continue + if(occupant.stat != DEAD || !IS_CULTIST(occupant)) + continue + return target_rune + + return null + +/datum/ai_behavior/activate_rune + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH + action_cooldown = 3 SECONDS + +/datum/ai_behavior/activate_rune/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/activate_rune/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + var/datum/team/cult/cult_team = controller.blackboard[BB_CULT_TEAM] + var/mob/living/revive_mob = locate(/mob/living) in get_turf(target) + + if(isnull(revive_mob) || revive_mob.stat != DEAD || !(revive_mob.mind in cult_team.members)) + finish_action(controller, FALSE, target_key) + return + + var/mob/living/basic/living_pawn = controller.pawn + living_pawn.melee_attack(target) + + finish_action(controller, TRUE, target_key) + return + +/datum/ai_behavior/activate_rune/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + + +///find targets that we can revive +/datum/ai_planning_subtree/find_dead_cultist + +/datum/ai_planning_subtree/find_dead_cultist/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if((LAZYLEN(GLOB.sacrificed) - SOULS_TO_REVIVE - GLOB.sacrifices_used) < 0) + controller.clear_blackboard_key(BB_DEAD_CULTIST) + return + + var/mob/living/living_pawn = controller.pawn + + if(!isnull(living_pawn.pulling)) + return + + if(controller.blackboard_key_exists(BB_DEAD_CULTIST)) + controller.queue_behavior(/datum/ai_behavior/pull_target/cult_revive, BB_DEAD_CULTIST) + return SUBTREE_RETURN_FINISH_PLANNING + + controller.queue_behavior(/datum/ai_behavior/find_and_set/dead_cultist, BB_DEAD_CULTIST, /mob/living/carbon/human) + +/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) + var/datum/team/cult/cult_team = controller.blackboard[BB_CULT_TEAM] + if(isnull(cult_team)) + return null + var/mob/living/living_pawn = controller.pawn + for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) + if(target.stat != DEAD) + continue + if(!IS_CULTIST(target)) + continue + if(target.buckled || target.move_resist > living_pawn.move_force || target.pulledby) + continue + if(locate(/obj/effect/rune/raise_dead) in target.loc) + continue + return target + return null + +/datum/ai_behavior/pull_target/cult_revive + +/datum/ai_behavior/pull_target/cult_revive/finish_action(datum/ai_controller/basic_controller/controller, succeeded, target_key) + . = ..() + if(!succeeded) + return + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return + controller.RegisterSignal(controller.pawn, COMSIG_ATOM_NO_LONGER_PULLING, TYPE_PROC_REF(/datum/ai_controller/basic_controller/pet_cult, delete_pull_target), override = TRUE) + +/datum/ai_planning_subtree/drag_target_to_rune + +/datum/ai_planning_subtree/drag_target_to_rune/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + + if(!controller.blackboard_key_exists(BB_DEAD_CULTIST)) //no target, we dont need to do anything + return + + var/mob/living/our_pawn = controller.pawn + + if(isnull(our_pawn.pulling)) + return + + var/atom/target_rune = controller.blackboard[BB_NEARBY_RUNE] + + if(QDELETED(target_rune)) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_RUNE_ABILITY) + return SUBTREE_RETURN_FINISH_PLANNING + + if(!can_see(our_pawn, target_rune, 9)) + controller.clear_blackboard_key(BB_NEARBY_RUNE) + return + + controller.queue_behavior(/datum/ai_behavior/drag_target_to_rune, BB_NEARBY_RUNE, BB_DEAD_CULTIST) + +///behavior to drag the target onto the rune +/datum/ai_behavior/drag_target_to_rune + required_distance = 0 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/drag_target_to_rune/setup(datum/ai_controller/controller, target_key, cultist_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/drag_target_to_rune/perform(seconds_per_tick, datum/ai_controller/controller, target_key, cultist_key) + . = ..() + var/mob/living/our_pawn = controller.pawn + var/atom/cultist_target = controller.blackboard[cultist_key] + if(isnull(cultist_target)) + finish_action(controller, FALSE, target_key, cultist_key) + return + var/list/possible_dirs = GLOB.alldirs.Copy() + possible_dirs -= get_dir(our_pawn, cultist_target) + for(var/direction in possible_dirs) + var/turf/possible_turf = get_step(our_pawn, direction) + if(possible_turf.is_blocked_turf(source_atom = our_pawn)) + possible_dirs -= direction + step(our_pawn, pick(possible_dirs)) + our_pawn.stop_pulling() + finish_action(controller, TRUE, target_key, cultist_key) + + +/datum/ai_behavior/drag_target_to_rune/finish_action(datum/ai_controller/controller, success, target_key, cultist_key) + . = ..() + if(success) + var/atom/revival_rune = controller.blackboard[target_key] + controller.set_blackboard_key(BB_OCCUPIED_RUNE, revival_rune) + controller.clear_blackboard_key(cultist_key) + controller.clear_blackboard_key(target_key) + +///command ability to draw runes +/datum/pet_command/untargeted_ability/draw_rune + command_name = "Draw Rune" + command_desc = "Draw a revival rune." + radial_icon = 'icons/obj/antags/cult/rune.dmi' + radial_icon_state = "1" + speech_commands = list("rune", "revival") + ability_key = BB_RUNE_ABILITY diff --git a/code/modules/mob/living/basic/ruin_defender/flesh.dm b/code/modules/mob/living/basic/ruin_defender/flesh.dm index 38e56f84c84..17d625cb591 100644 --- a/code/modules/mob/living/basic/ruin_defender/flesh.dm +++ b/code/modules/mob/living/basic/ruin_defender/flesh.dm @@ -40,7 +40,11 @@ /mob/living/basic/living_limb_flesh/Destroy(force) . = ..() - QDEL_NULL(current_bodypart) + if(current_bodypart) + var/obj/item/bodypart/bodypart = current_bodypart + unregister_from_limb(current_bodypart.owner) + if(!QDELETED(bodypart)) + qdel(bodypart) /mob/living/basic/living_limb_flesh/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() @@ -49,12 +53,12 @@ if(isnull(current_bodypart) || isnull(current_bodypart.owner)) return var/mob/living/carbon/human/victim = current_bodypart.owner - if(prob(SPT_PROB(3, SSMOBS_DT))) + if(SPT_PROB(3, SSMOBS_DT)) to_chat(victim, span_warning("The thing posing as your limb makes you feel funny...")) //warn em //firstly as a sideeffect we drain nutrition from our host victim.adjust_nutrition(-1.5) - if(!prob(SPT_PROB(1.5, SSMOBS_DT))) + if(!SPT_PROB(1.5, SSMOBS_DT)) return if(istype(current_bodypart, /obj/item/bodypart/arm)) @@ -119,16 +123,10 @@ part_type = /obj/item/bodypart/leg/right/flesh target.visible_message(span_danger("[src] [target_part ? "tears off and attaches itself" : "attaches itself"] to where [target][target.p_s()] limb used to be!")) - current_bodypart = new part_type(TRUE) //dont_spawn_flesh, we cant use named arguments here - current_bodypart.replace_limb(target, TRUE) - forceMove(current_bodypart) - register_to_limb(current_bodypart) - -/mob/living/basic/living_limb_flesh/proc/register_to_limb(obj/item/bodypart/part) - ai_controller.set_ai_status(AI_STATUS_OFF) - RegisterSignal(part, COMSIG_BODYPART_REMOVED, PROC_REF(on_limb_lost)) - RegisterSignal(part.owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died)) - RegisterSignal(part.owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(owner_shocked)) //detach if we are shocked, not beneficial for the host but hey its a sideeffect + var/obj/item/bodypart/new_bodypart = new part_type(TRUE) //dont_spawn_flesh, we cant use named arguments here + new_bodypart.replace_limb(target, TRUE) + forceMove(new_bodypart) + register_to_limb(new_bodypart) /mob/living/basic/living_limb_flesh/proc/owner_shocked(datum/source, shock_damage, shock_source, siemens_coeff, flags) SIGNAL_HANDLER @@ -154,15 +152,28 @@ /mob/living/basic/living_limb_flesh/proc/on_limb_lost(atom/movable/source, mob/living/carbon/old_owner, special, dismembered) SIGNAL_HANDLER - UnregisterSignal(source, COMSIG_BODYPART_REMOVED) - UnregisterSignal(old_owner, COMSIG_LIVING_ELECTROCUTE_ACT) - UnregisterSignal(old_owner, COMSIG_LIVING_DEATH) + unregister_from_limb(old_owner) addtimer(CALLBACK(src, PROC_REF(wake_up), source), 2 SECONDS) -/mob/living/basic/living_limb_flesh/proc/wake_up(atom/limb) - ai_controller.set_ai_status(AI_STATUS_ON) - forceMove(limb.drop_location()) +/mob/living/basic/living_limb_flesh/proc/register_to_limb(obj/item/bodypart/part) + current_bodypart = part + ai_controller.set_ai_status(AI_STATUS_OFF) + RegisterSignal(current_bodypart, COMSIG_BODYPART_REMOVED, PROC_REF(on_limb_lost)) + if(current_bodypart.owner) + RegisterSignal(current_bodypart.owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died)) + RegisterSignal(current_bodypart.owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(owner_shocked)) //detach if we are shocked, not beneficial for the host but hey its a sideeffect + +/mob/living/basic/living_limb_flesh/proc/unregister_from_limb(mob/living/carbon/removing_owner) + UnregisterSignal(current_bodypart, COMSIG_BODYPART_REMOVED) + if(removing_owner) + UnregisterSignal(removing_owner, COMSIG_LIVING_ELECTROCUTE_ACT) + UnregisterSignal(removing_owner, COMSIG_LIVING_DEATH) current_bodypart = null - qdel(limb) + +/mob/living/basic/living_limb_flesh/proc/wake_up(atom/limb) visible_message(span_warning("[src] begins flailing around!")) Shake(6, 6, 0.5 SECONDS) + ai_controller.set_ai_status(AI_STATUS_ON) + forceMove(limb.drop_location()) + qdel(limb) + diff --git a/code/modules/mob/living/basic/slime/actions.dm b/code/modules/mob/living/basic/slime/actions.dm new file mode 100644 index 00000000000..c297f48d14e --- /dev/null +++ b/code/modules/mob/living/basic/slime/actions.dm @@ -0,0 +1,142 @@ +/datum/action/innate/slime + check_flags = AB_CHECK_CONSCIOUS + button_icon = 'icons/mob/actions/actions_slime.dmi' + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + ///Does the ability require a specific slime lifestage? + var/life_stage_required + ///Does the ability requires the slime to hit max growth? + var/needs_growth = FALSE + ///Does the ability cost nutrition? + var/nutrition_cost = 0 + +/datum/action/innate/slime/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + + var/mob/living/basic/slime/slime_owner = owner + + if(!isnull(life_stage_required) && slime_owner.life_stage != life_stage_required) + return FALSE + + if(slime_owner.nutrition < nutrition_cost) + return FALSE + + if(needs_growth && slime_owner.amount_grown < SLIME_EVOLUTION_THRESHOLD) + return FALSE + return TRUE + +//Evolving + +/datum/action/innate/slime/evolve + name = "Evolve" + button_icon_state = "slimegrow" + desc = "This will let you evolve from baby to adult slime." + life_stage_required = SLIME_LIFE_STAGE_BABY + needs_growth = TRUE + nutrition_cost = SLIME_EVOLUTION_COST + +///Turns a baby slime into an adult slime +/datum/action/innate/slime/evolve/Activate() + var/mob/living/basic/slime/slime_owner = owner + + if(slime_owner.stat) + slime_owner.balloon_alert(slime_owner, "unconscious!") + return + if(slime_owner.life_stage == SLIME_LIFE_STAGE_ADULT) + slime_owner.balloon_alert(slime_owner, "already adult!") + return + if(slime_owner.amount_grown < SLIME_EVOLUTION_THRESHOLD) + slime_owner.balloon_alert(slime_owner, "need to grow!") + return + if(slime_owner.nutrition < nutrition_cost) + slime_owner.balloon_alert(slime_owner, "need food!") + return + + slime_owner.adjust_nutrition(-nutrition_cost) + + slime_owner.set_life_stage(SLIME_LIFE_STAGE_ADULT) + slime_owner.update_name() + slime_owner.regenerate_icons() + + slime_owner.amount_grown = 0 + +//Reproduction + +/datum/action/innate/slime/reproduce + name = "Reproduce" + button_icon_state = "slimesplit" + desc = "This will make you split into four slimes." + life_stage_required = SLIME_LIFE_STAGE_ADULT + needs_growth = TRUE + +/datum/action/innate/slime/reproduce/Activate() + var/mob/living/basic/slime/slime_owner = owner + slime_owner.reproduce() + +///Splits the slime into multiple children if possible +/mob/living/basic/slime/proc/reproduce() + if(stat != CONSCIOUS) + balloon_alert(src, "not conscious!") + return + + if(!isopenturf(loc)) + balloon_alert(src, "not here!") + + if(life_stage != SLIME_LIFE_STAGE_ADULT) + balloon_alert(src, "not adult!") + return + + if(amount_grown < SLIME_EVOLUTION_THRESHOLD) + balloon_alert(src, "need growth!") + return + + var/list/babies = list() + var/new_nutrition = round(nutrition * 0.9) + var/new_powerlevel = round(powerlevel / 4) + var/turf/drop_loc = drop_location() + + var/list/slime_friends = list() + for(var/faction_member in faction) + var/mob/living/possible_friend = locate(faction_member) in GLOB.mob_living_list + if(QDELETED(possible_friend)) + continue + slime_friends += possible_friend + + for(var/i in 1 to 4) + var/child_colour + + if(mutation_chance >= 100) + child_colour = /datum/slime_type/rainbow + else if(prob(mutation_chance)) + child_colour = pick_weight(slime_type.mutations) + else + child_colour = slime_type.type + + var/mob/living/basic/slime/baby + baby = new(drop_loc, child_colour) + + if(ckey) + baby.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! + + baby.powerlevel = new_powerlevel + if(i != 1) + step_away(baby, src) + + for(var/slime_friend in slime_friends) + baby.befriend(slime_friend) + + babies += baby + baby.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) + SSblackbox.record_feedback("tally", "slime_babies_born", 1, baby.slime_type.colour) + + var/mob/living/basic/slime/new_slime = pick(babies) // slime that the OG slime will move into. + new_slime.set_combat_mode(TRUE) + + if(isnull(mind)) + new_slime.key = key + else + mind.transfer_to(new_slime) + + qdel(src) diff --git a/code/modules/mob/living/basic/slime/ai/behaviours.dm b/code/modules/mob/living/basic/slime/ai/behaviours.dm new file mode 100644 index 00000000000..0db592099bb --- /dev/null +++ b/code/modules/mob/living/basic/slime/ai/behaviours.dm @@ -0,0 +1,71 @@ +/datum/ai_behavior/perform_change_slime_face + +/datum/ai_behavior/perform_change_slime_face/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + var/mob/living/basic/slime/slime_pawn = controller.pawn + if(!istype(slime_pawn)) + return + + var/current_mood = slime_pawn.current_mood + + var/new_mood = SLIME_MOOD_NONE + + if (controller.blackboard[BB_SLIME_RABID] || LAZYLEN(controller.blackboard[BB_BASIC_MOB_RETALIATE_LIST]) > 0) + new_mood = SLIME_MOOD_ANGRY + else if (controller.blackboard[BB_SLIME_HUNGER_DISABLED]) + new_mood = SLIME_MOOD_SMILE + else if (controller.blackboard[BB_CURRENT_HUNTING_TARGET]) + new_mood = SLIME_MOOD_MISCHIEVOUS + else + new_mood = pick(SLIME_MOOD_SAD, SLIME_MOOD_SMILE, SLIME_MOOD_POUT) + + if(current_mood != new_mood) + slime_pawn.current_mood = new_mood + slime_pawn.regenerate_icons() + + finish_action(controller, TRUE) + +/datum/ai_behavior/find_hunt_target/find_slime_food + +// Check if the slime can drain the target +/datum/ai_behavior/find_hunt_target/find_slime_food/valid_dinner(mob/living/basic/slime/hunter, mob/living/dinner, radius, datum/ai_controller/controller, seconds_per_tick) + + if(REF(dinner) in hunter.faction) //Don't eat our friends... + return + + if(!hunter.can_feed_on(dinner, check_adjacent = FALSE)) //Are they tasty to slimes? + return + + //If we are retaliating on someone edible, lets eat them instead + if(dinner == controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]) + return can_see(hunter, dinner, radius) + + //We are so hungry, lets eat them + if(controller.blackboard[BB_SLIME_HUNGER_LEVEL] == SLIME_HUNGER_STARVING && controller.blackboard[BB_SLIME_RABID]) + return can_see(hunter, dinner, radius) + + //A bit pickier + if((islarva(dinner) || ismonkey(dinner)) || (ishuman(dinner) || isalienadult(dinner) && SPT_PROB(2.5, seconds_per_tick))) + return can_see(hunter, dinner, radius) + + //We are not THAT hungry + return FALSE + +/datum/ai_behavior/hunt_target/unarmed_attack_target/slime + +/datum/ai_behavior/hunt_target/unarmed_attack_target/slime/target_caught(mob/living/basic/slime/hunter, mob/living/hunted) + if((hunted.body_position != STANDING_UP) || prob(20)) //Not standing, or we rolled well? Feed. + hunter.start_feeding(hunted) + return + + if(hunted.client && hunted.health >= 20) //If target has a client and is healthy, punch them a bit before feasting + hunter.UnarmedAttack(hunted, TRUE) + return + + hunter.start_feeding(hunted) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/slime/finish_action(datum/ai_controller/controller, succeeded, hunting_target_key, hunting_cooldown_key) + . = ..() + var/mob/living/living_pawn = controller.pawn + if(living_pawn.buckled) + controller.clear_blackboard_key(hunting_target_key) diff --git a/code/modules/mob/living/basic/slime/ai/controller.dm b/code/modules/mob/living/basic/slime/ai/controller.dm new file mode 100644 index 00000000000..9ecf66ad744 --- /dev/null +++ b/code/modules/mob/living/basic/slime/ai/controller.dm @@ -0,0 +1,29 @@ +/datum/ai_controller/basic_controller/slime + blackboard = list( + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_SLIME_RABID = FALSE, + BB_SLIME_HUNGER_DISABLED = FALSE, + BB_CURRENT_HUNTING_TARGET = null, // people whose energy we want to drain + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/change_slime_face, + /datum/ai_planning_subtree/use_mob_ability/evolve, + /datum/ai_planning_subtree/use_mob_ability/reproduce, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/find_and_hunt_target/find_slime_food, + /datum/ai_planning_subtree/basic_melee_attack_subtree/slime, + /datum/ai_planning_subtree/random_speech/slime, + ) + +/datum/ai_controller/basic_controller/slime/CancelActions() + ..() + if(QDELETED(pawn)) + return + + var/mob/living/basic/slime/slime_pawn = pawn + slime_pawn.stop_feeding() diff --git a/code/modules/mob/living/basic/slime/ai/pet_command.dm b/code/modules/mob/living/basic/slime/ai/pet_command.dm new file mode 100644 index 00000000000..42d6b289937 --- /dev/null +++ b/code/modules/mob/living/basic/slime/ai/pet_command.dm @@ -0,0 +1,16 @@ +/datum/pet_command/point_targeting/attack/slime + speech_commands = list("attack", "sic", "kill", "eat", "feed") + command_feedback = "blorbles" + pointed_reaction = "and blorbles" + refuse_reaction = "jiggles sadly" + + var/hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/slime + +/datum/pet_command/point_targeting/attack/slime/execute_action(datum/ai_controller/controller) + + var/mob/living/basic/slime/slime_pawn = controller.pawn + if(isslime(slime_pawn) && slime_pawn.can_feed_on(controller.blackboard[BB_CURRENT_PET_TARGET], check_friendship = TRUE)) + controller.queue_behavior(hunting_behavior, BB_CURRENT_PET_TARGET, BB_HUNTING_COOLDOWN) + return SUBTREE_RETURN_FINISH_PLANNING + + return ..() diff --git a/code/modules/mob/living/basic/slime/ai/subtrees.dm b/code/modules/mob/living/basic/slime/ai/subtrees.dm new file mode 100644 index 00000000000..66c01e6f6c3 --- /dev/null +++ b/code/modules/mob/living/basic/slime/ai/subtrees.dm @@ -0,0 +1,54 @@ +/datum/ai_planning_subtree/use_mob_ability/evolve + ability_key = BB_SLIME_EVOLVE + +/datum/ai_planning_subtree/use_mob_ability/reproduce + ability_key = BB_SLIME_REPRODUCE + +//Handles the slime changing their facial overlays +/datum/ai_planning_subtree/change_slime_face + var/face_change_chance = 5 + +/datum/ai_planning_subtree/change_slime_face/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!SPT_PROB(face_change_chance, seconds_per_tick)) + return + + var/mob/living/basic/slime/slime_pawn = controller.pawn + if(!istype(slime_pawn)) + return + + if(slime_pawn.stat) //dead slimes make no smiles + return + + controller.queue_behavior(/datum/ai_behavior/perform_change_slime_face) + +// Slime subtree for hunting down people to drain +/datum/ai_planning_subtree/find_and_hunt_target/find_slime_food + finding_behavior = /datum/ai_behavior/find_hunt_target/find_slime_food + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/slime + hunt_targets = list(/mob/living) + hunt_range = 7 + +/datum/ai_planning_subtree/find_and_hunt_target/find_slime_food/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(living_pawn.buckled) + return FALSE + + //Slimes don't want to hunt if they are neither rabid, hungry or feeling attack right now + if( (controller.blackboard[BB_SLIME_HUNGER_LEVEL] == SLIME_HUNGER_NONE) && !controller.blackboard[BB_SLIME_RABID] && isnull(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET])) + return FALSE + + return ..() + +/datum/ai_planning_subtree/basic_melee_attack_subtree/slime + +/datum/ai_planning_subtree/basic_melee_attack_subtree/slime/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(living_pawn.buckled) + return + return ..() + +/datum/ai_planning_subtree/random_speech/slime + speech_chance = 1 + speak = list("Blorble...","Bzzt...","") + emote_hear = list("blorbles.") + emote_see = list("lights up for a bit, then stops.","bounces in place.", "jiggles!","vibrates!") diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/basic/slime/death.dm similarity index 64% rename from code/modules/mob/living/simple_animal/slime/death.dm rename to code/modules/mob/living/basic/slime/death.dm index a072299d663..3ce7758cf16 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/basic/slime/death.dm @@ -1,9 +1,10 @@ -/mob/living/simple_animal/slime/death(gibbed) +/mob/living/basic/slime/death(gibbed) if(stat == DEAD) return if(!gibbed && life_stage == SLIME_LIFE_STAGE_ADULT) - var/mob/living/simple_animal/slime/new_slime = new(drop_location(), slime_type.type) - new_slime.rabid = TRUE + var/mob/living/basic/slime/new_slime = new(drop_location(), slime_type.type) + + new_slime.ai_controller?.set_blackboard_key(BB_SLIME_RABID, TRUE) new_slime.regenerate_icons() //revives us as a baby @@ -20,6 +21,6 @@ return ..(gibbed) -/mob/living/simple_animal/slime/gib() +/mob/living/basic/slime/gib() death(TRUE) qdel(src) diff --git a/code/modules/mob/living/basic/slime/defense.dm b/code/modules/mob/living/basic/slime/defense.dm new file mode 100644 index 00000000000..b747c242019 --- /dev/null +++ b/code/modules/mob/living/basic/slime/defense.dm @@ -0,0 +1,117 @@ + +/mob/living/basic/slime/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + powerlevel = 0 // oh no, the power! + +///If a slime is attack with an empty hand, shoves included, try to wrestle them off the mob they are on +/mob/living/basic/slime/proc/on_attack_hand(mob/living/basic/slime/defender_slime, mob/living/attacker) + SIGNAL_HANDLER + + if(isnull(buckled)) + return + + if(buckled == attacker ? prob(60) : prob(30)) //its easier to remove the slime from yourself + attacker.visible_message(span_warning("[attacker] attempts to wrestle \the [defender_slime.name] off [buckled == attacker ? "" : buckled] !"), \ + span_danger("[buckled == attacker ? "You attempt" : "[attacker] attempts" ] to wrestle \the [defender_slime.name] off [buckled == attacker ? "" : buckled]!")) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + return + + attacker.visible_message(span_warning("[attacker] manages to wrestle \the [defender_slime.name] off!"), span_notice("You manage to wrestle \the [defender_slime.name] off!")) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + defender_slime.discipline_slime() + +/mob/living/basic/slime/attackby(obj/item/attacking_item, mob/living/user, params) + + //Lets you feed slimes plasma. Checks before the passthrough force check + if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma) && stat == CONSCIOUS) + use_sheet(attacking_item, user) + return + + //Checks if the item passes through the slime first. Safe items can be used simply + if(check_item_passthrough(attacking_item, user)) + return + + try_discipline_slime(attacking_item) + + if(!istype(attacking_item, /obj/item/storage/bag/xeno)) + return ..() + + use_xeno_bag(attacking_item, user) + + +///Checks if an item harmlessly passes through the slime +/mob/living/basic/slime/proc/check_item_passthrough(obj/item/attacking_item, mob/living/user) + if(attacking_item.force <= 0) + return FALSE + + if(!prob(25)) + return FALSE + + user.do_attack_animation(src) + user.changeNext_move(CLICK_CD_MELEE) + to_chat(user, span_danger("[attacking_item] passes right through [src]!")) + return TRUE + +///Attempts to use the item to discipline the unruly slime +/mob/living/basic/slime/proc/try_discipline_slime(obj/item/attacking_item) + if(attacking_item.force < 3) + return + + var/force_effect = attacking_item.force * (life_stage == SLIME_LIFE_STAGE_BABY ? 2 : 1) + if(prob(10 + force_effect)) + discipline_slime() + +///Handles feeding a sheet of plasma to a slime +/mob/living/basic/slime/proc/use_sheet(obj/item/stack/sheet/mineral/plasma/delicious_sheet, mob/living/user) + befriend(user) + to_chat(user, span_notice("You feed the slime the plasma. It chirps happily.")) + delicious_sheet.use(1) + new /obj/effect/temp_visual/heart(loc) + return + +///Handles feeding a slim with a bag full of extracts +/mob/living/basic/slime/proc/use_xeno_bag(obj/item/storage/bag/xeno/xeno_bag, mob/living/user) + if(!crossbreed_modification) + to_chat(user, span_warning("The slime is not currently being mutated.")) + return + var/has_output = FALSE //Have we outputted text? + var/has_found = FALSE //Have we found an extract to be added? + for(var/obj/item/slime_extract/extract in xeno_bag.contents) + if(extract.crossbreed_modification == crossbreed_modification) + xeno_bag.atom_storage.attempt_remove(extract, get_turf(src), silent = TRUE) + qdel(extract) + applied_crossbreed_amount++ + has_found = TRUE + if(applied_crossbreed_amount >= SLIME_EXTRACT_CROSSING_REQUIRED) + to_chat(user, span_notice("You feed the slime as many of the extracts from the bag as you can, and it mutates!")) + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + spawn_corecross() + has_output = TRUE + break + + if(has_output) + return + + if(!has_found) + to_chat(user, span_warning("There are no extracts in the bag that this slime will accept!")) + else + to_chat(user, span_notice("You feed the slime some extracts from the bag.")) + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + +///Handles the adverse effects of water on slimes +/mob/living/basic/slime/proc/apply_water() + adjustBruteLoss(rand(15,20)) + discipline_slime() + +///Stops the slime from feeding, and might remove rabidity and targets +/mob/living/basic/slime/proc/discipline_slime() + stop_feeding(silent = TRUE) + if(life_stage == SLIME_LIFE_STAGE_BABY && prob(80)) + ai_controller?.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + ai_controller?.clear_blackboard_key(BB_CURRENT_HUNTING_TARGET) + + if(prob(10)) + ai_controller?.set_blackboard_key(BB_SLIME_RABID, FALSE) diff --git a/code/modules/mob/living/simple_animal/slime/emote.dm b/code/modules/mob/living/basic/slime/emote.dm similarity index 90% rename from code/modules/mob/living/simple_animal/slime/emote.dm rename to code/modules/mob/living/basic/slime/emote.dm index e8305a29f55..93b889a07a4 100644 --- a/code/modules/mob/living/simple_animal/slime/emote.dm +++ b/code/modules/mob/living/basic/slime/emote.dm @@ -1,5 +1,5 @@ /datum/emote/slime - mob_type_allowed_typecache = /mob/living/simple_animal/slime + mob_type_allowed_typecache = /mob/living/basic/slime mob_type_blacklist_typecache = list() /datum/emote/slime/bounce @@ -31,7 +31,7 @@ . = ..() if(!.) return - var/mob/living/simple_animal/slime/slime_user = user + var/mob/living/basic/slime/slime_user = user slime_user.current_mood = mood_key slime_user.regenerate_icons() diff --git a/code/modules/mob/living/basic/slime/feeding.dm b/code/modules/mob/living/basic/slime/feeding.dm new file mode 100644 index 00000000000..2c69aad8001 --- /dev/null +++ b/code/modules/mob/living/basic/slime/feeding.dm @@ -0,0 +1,79 @@ + +//Feeding + +///Can the slime leech life energy from the target? +/mob/living/basic/slime/proc/can_feed_on(mob/living/meal, silent = FALSE, check_adjacent = FALSE, check_friendship = FALSE) + + if(!isliving(meal)) //sanity check + return FALSE + + if(stat != CONSCIOUS) + if(!silent) + balloon_alert(src, "unconscious!") + return FALSE + + if(hunger_disabled) + if(!silent) + balloon_alert(src, "not hungry!") + return FALSE + + if(check_friendship && (REF(meal) in faction)) + return FALSE + + if(check_adjacent && !Adjacent(meal)) + return FALSE + + if(meal.stat == DEAD) + if(!silent) + balloon_alert(src, "no life energy!") + return FALSE + + if(locate(/mob/living/basic/slime) in meal.buckled_mobs) + if(!silent) + balloon_alert(src, "another slime in the way!") + return FALSE + + if(issilicon(meal) || meal.mob_biotypes & MOB_ROBOTIC || meal.flags_1 & HOLOGRAM_1) + balloon_alert(src, "no life energy!") + return FALSE + + if(isslime(meal)) + if(!silent) + balloon_alert(src, "can't eat slime!") + return FALSE + + if(isanimal(meal)) + var/mob/living/simple_animal/simple_meal = meal + if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[BRUTE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. + if(!silent) + balloon_alert(src, "not food!") + return FALSE + else if(isbasicmob(meal)) + var/mob/living/basic/basic_meal = meal + if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[BRUTE] <= 0) + if (!silent) + balloon_alert(src, "not food!") + return FALSE + + return TRUE + +///The slime will start feeding on the target +/mob/living/basic/slime/proc/start_feeding(mob/living/target_mob) + target_mob.unbuckle_all_mobs(force=TRUE) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in can_feed_on()) + if(target_mob.buckle_mob(src, force=TRUE)) + layer = MOB_ABOVE_PIGGYBACK_LAYER //always appear above the target mob, no matter the direction + target_mob.visible_message(span_danger("[name] latches onto [target_mob]!"), \ + span_userdanger("[name] latches onto [target_mob]!")) + target_mob.apply_status_effect(/datum/status_effect/slime_leech, src) + else + balloon_alert(src, "latch failed!") + +///The slime will stop feeding +/mob/living/basic/slime/proc/stop_feeding(silent = FALSE) + if(!buckled) + return + + if(!silent) + visible_message(span_warning("[src] lets go of [buckled]!"), span_notice("You let go of [buckled]")) + layer = initial(layer) + buckled.unbuckle_mob(src,force=TRUE) diff --git a/code/modules/mob/living/basic/slime/life.dm b/code/modules/mob/living/basic/slime/life.dm new file mode 100644 index 00000000000..68cd33ce775 --- /dev/null +++ b/code/modules/mob/living/basic/slime/life.dm @@ -0,0 +1,75 @@ + +/mob/living/basic/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired) + ..() + + if(!HAS_TRAIT(src, TRAIT_STASIS)) //No hunger in stasis + handle_nutrition(seconds_per_tick) + + handle_slime_stasis(seconds_per_tick) + +/mob/living/basic/slime/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired) + ..() + if(bodytemperature <= (T0C - 40)) // stun temperature + apply_status_effect(/datum/status_effect/freon, SLIME_COLD) + else + remove_status_effect(/datum/status_effect/freon, SLIME_COLD) + +///Handles if a slime's environment would cause it to enter stasis. Ignores TRAIT_STASIS +/mob/living/basic/slime/proc/handle_slime_stasis(seconds_per_tick) + var/datum/gas_mixture/environment = loc.return_air() + + var/bz_percentage = 0 + + if(environment.gases[/datum/gas/bz]) + bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.total_moles() + + if(bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) //Check if we should be in stasis + if(!has_status_effect(/datum/status_effect/grouped/stasis)) //Check if we don't have the status effect yet + to_chat(src, span_danger("Nerve gas in the air has put you in stasis!")) + apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_SLIME_BZ) + powerlevel = 0 + ai_controller?.clear_blackboard_key(BB_SLIME_RABID) + else if(has_status_effect(/datum/status_effect/grouped/stasis)) //Check if we still have the status effect + to_chat(src, span_notice("You wake up from the stasis.")) + remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_SLIME_BZ) + +///Handles the consumption of nutrition, and growth +/mob/living/basic/slime/proc/handle_nutrition(seconds_per_tick = SSMOBS_DT) + if(hunger_disabled) //God as my witness, I will never go hungry again + set_nutrition(700) + return + + if(SPT_PROB(7.5, seconds_per_tick)) + adjust_nutrition((life_stage == SLIME_LIFE_STAGE_ADULT ? -1 : -0.5) * seconds_per_tick) + + if(nutrition < SLIME_STARVE_NUTRITION) + ai_controller?.set_blackboard_key(BB_SLIME_HUNGER_LEVEL, SLIME_HUNGER_STARVING) + + if(SPT_PROB(0.5, seconds_per_tick) && LAZYLEN(ai_controller?.blackboard[BB_FRIENDS_LIST])) + var/your_fault = pick(ai_controller?.blackboard[BB_FRIENDS_LIST]) + unfriend(your_fault) + + else if(nutrition < SLIME_HUNGER_NUTRITION || (nutrition < SLIME_GROW_NUTRITION && SPT_PROB(25, seconds_per_tick)) ) + ai_controller?.set_blackboard_key(BB_SLIME_HUNGER_LEVEL, SLIME_HUNGER_HUNGRY) + + else + ai_controller?.set_blackboard_key(BB_SLIME_HUNGER_LEVEL, SLIME_HUNGER_NONE) + + if(nutrition == 0) //adjust nutrition ensures it can't go below 0 + if(SPT_PROB(50, seconds_per_tick)) + adjustBruteLoss(rand(0,5)) + return + + if (SLIME_GROW_NUTRITION <= nutrition) + + if(amount_grown < SLIME_EVOLUTION_THRESHOLD) + adjust_nutrition(-10 * seconds_per_tick) + amount_grown++ + + if(powerlevel < SLIME_MAX_POWER && SPT_PROB(30-powerlevel*2, seconds_per_tick)) + powerlevel++ + + else if (powerlevel < SLIME_MEDIUM_POWER && SLIME_HUNGER_NUTRITION <= nutrition && SPT_PROB(25-powerlevel*5, seconds_per_tick)) + powerlevel++ + + update_mob_action_buttons() diff --git a/code/modules/mob/living/basic/slime/slime.dm b/code/modules/mob/living/basic/slime/slime.dm new file mode 100644 index 00000000000..63c738b9652 --- /dev/null +++ b/code/modules/mob/living/basic/slime/slime.dm @@ -0,0 +1,389 @@ +#define SLIME_EXTRA_SHOCK_COST 3 +#define SLIME_EXTRA_SHOCK_THRESHOLD 8 +#define SLIME_BASE_SHOCK_PERCENTAGE 10 +#define SLIME_SHOCK_PERCENTAGE_PER_LEVEL 7 + +/mob/living/basic/slime + name = "grey baby slime (123)" + icon = 'icons/mob/simple/slimes.dmi' + icon_state = "grey baby slime" + pass_flags = PASSTABLE | PASSGRILLE + gender = NEUTER + faction = list(FACTION_SLIME, FACTION_NEUTRAL) + + icon_living = "grey baby slime" + icon_dead = "grey baby slime dead" + + attack_sound = 'sound/weapons/bite.ogg' + + //Base physiology + + maxHealth = 150 + health = 150 + mob_biotypes = MOB_SLIME + melee_damage_lower = 5 + melee_damage_upper = 25 + wound_bonus = -45 + can_buckle_to = FALSE + + damage_coeff = list(BRUTE = 1, BURN = -1, TOX = 1, STAMINA = 0, OXY = 1) //Healed by fire + unsuitable_cold_damage = 15 + unsuitable_heat_damage = 0 + maximum_survivable_temperature = INFINITY + habitable_atmos = null + + //Messages + + attack_verb_simple = "glomp" + attack_verb_continuous = "glomps" + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "stomps on" + response_harm_simple = "stomp on" + + //Speech + + speak_emote = list("blorbles") + bubble_icon = "slime" + initial_language_holder = /datum/language_holder/slime + + verb_say = "blorbles" + verb_ask = "inquisitively blorbles" + verb_exclaim = "loudly blorbles" + verb_yell = "loudly blorbles" + + //AI controller + + ai_controller = /datum/ai_controller/basic_controller/slime + + //Slime physiology + ///What is our current lifestage? + var/life_stage = SLIME_LIFE_STAGE_BABY + + ///Our slime's current mood + var/current_mood = SLIME_MOOD_NONE + + ///The number of /obj/item/slime_extract's the slime has left inside + var/cores = 1 + ///Chance of mutating, should be between 25 and 35 + var/mutation_chance = 30 + ///1-10 controls how much electricity they are generating + var/powerlevel = SLIME_MIN_POWER + ///Controls how long the slime has been overfed, if 10, grows or reproduces + var/amount_grown = 0 + /// No hunger + var/hunger_disabled = FALSE + + ///Has a mutator been used on the slime? Only one is allowed + var/mutator_used = FALSE + + //The datum that handles the slime colour's core and possible mutations + var/datum/slime_type/slime_type + + //CORE-CROSSING CODE + + ///What cross core modification is being used. + var/crossbreed_modification + ///How many extracts of the modtype have been applied. + var/applied_crossbreed_amount = 0 + + //AI related traits + + /// Instructions you can give to slimes + var/static/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/follow, + /datum/pet_command/point_targeting/attack/slime, + ) + + /// Our evolve action + var/datum/action/innate/slime/evolve/evolve_action + /// Our reproduction action + var/datum/action/innate/slime/reproduce/reproduce_action + +/mob/living/basic/slime/Initialize(mapload, new_type=/datum/slime_type/grey, new_life_stage=SLIME_LIFE_STAGE_BABY) + + . = ..() + + evolve_action = new (src) + evolve_action.Grant(src) + + reproduce_action = new (src) + reproduce_action.Grant(src) + + set_slime_type(new_type) + set_life_stage(new_life_stage) + update_name() + regenerate_icons() + + set_nutrition(SLIME_STARTING_NUTRITION) + + AddComponent(/datum/component/health_scaling_effects, min_health_slowdown = 2) + AddComponent(/datum/component/obeys_commands, pet_commands) + + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/basic_health_examine, light_damage_message = "It has some punctures in its flesh!", heavy_damage_message = span_bold("It has severe punctures and tears in its flesh!"), heavy_threshold = 0.4) + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SLIME) + AddElement(/datum/element/soft_landing) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLIME, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + + add_traits(list(TRAIT_CANT_RIDE, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_slime_pre_attack)) + RegisterSignal(src, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand) ) + + ai_controller.set_blackboard_key(BB_SLIME_EVOLVE, evolve_action) + ai_controller.set_blackboard_key(BB_SLIME_REPRODUCE, reproduce_action) + +/mob/living/basic/slime/Destroy() + + QDEL_NULL(evolve_action) + QDEL_NULL(reproduce_action) + + return ..() + +///Random slime subtype +/mob/living/basic/slime/random + +/mob/living/basic/slime/random/Initialize(mapload, new_colour, new_life_stage) + return ..(mapload, pick(subtypesof(/datum/slime_type)), prob(50) ? SLIME_LIFE_STAGE_ADULT : SLIME_LIFE_STAGE_BABY) + +///Friendly docile subtype +/mob/living/basic/slime/pet + hunger_disabled = TRUE + +/mob/living/basic/slime/pet/Initialize(mapload, new_colour, new_life_stage) + . = ..() + set_pacified_behaviour() + +//Hilbert subtype +/mob/living/basic/slime/hilbert + +/mob/living/basic/slime/hilbert/Initialize(mapload, new_colour, new_life_stage) + . = ..(mapload, /datum/slime_type/bluespace) + ai_controller?.set_blackboard_key(BB_SLIME_RABID, TRUE) + +/mob/living/basic/slime/adjust_nutrition(change, forced) + . = ..() + nutrition = min(nutrition, SLIME_MAX_NUTRITION) + +/mob/living/basic/slime/set_nutrition(set_to, forced = FALSE) + . = ..() + nutrition = min(nutrition, SLIME_MAX_NUTRITION) + + +/mob/living/basic/slime/update_name() + ///Checks if the slime has a generic name, in the format of baby/adult slime (123) + var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") + if(slime_name_regex.Find(name)) + var/slime_id = rand(1, 1000) + name = "[slime_type.colour] [life_stage] slime ([slime_id])" + real_name = name + return ..() + +/mob/living/basic/slime/regenerate_icons() + cut_overlays() + var/icon_text = "[slime_type.colour] [life_stage] slime" + icon_dead = "[icon_text] dead" + if(stat != DEAD) + icon_state = icon_text + if(current_mood && current_mood != SLIME_MOOD_NONE && !stat) + add_overlay("aslime-[current_mood]") + else + icon_state = icon_dead + ..() + +/mob/living/basic/slime/get_status_tab_items() + . = ..() + if(!hunger_disabled) + . += "Nutrition: [nutrition]/[SLIME_MAX_NUTRITION]" + . += "Growth: [amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" + . += "Power Level: [powerlevel]/[SLIME_MAX_POWER]" + +/mob/living/basic/slime/MouseDrop(atom/movable/target_atom as mob|obj) + if(isliving(target_atom) && target_atom != src && usr == src) + var/mob/living/food = target_atom + if(can_feed_on(food)) + start_feeding(food) + return ..() + +///Slimes can hop off mobs they have latched onto +/mob/living/basic/slime/resist_buckle() + if(isliving(buckled)) + buckled.unbuckle_mob(src,force=TRUE) + +//slimes can not pull +/mob/living/basic/slime/start_pulling(atom/movable/moveable_atom, state, force = move_force, supress_message = FALSE) + return + +/mob/living/basic/slime/get_mob_buckling_height(mob/seat) + if(..() != 0) + return 3 + +/mob/living/basic/slime/examine(mob/user) + . = ..() + + switch(powerlevel) + if(SLIME_MIN_POWER to SLIME_EXTRA_SHOCK_COST) + . += "It is flickering gently with harmless levels of electrical activity." + + if(SLIME_EXTRA_SHOCK_COST to SLIME_MEDIUM_POWER) + . += "It is glowing brightly with medium levels electrical activity." + + + if(SLIME_MEDIUM_POWER to SLIME_MAX_POWER) + . += "It is glowing alarmingly with high levels of electrical activity." + + if(SLIME_MAX_POWER) + . += span_boldwarning("It is radiating with massive levels of electrical activity!") + +///Changes the slime's current life state +/mob/living/basic/slime/proc/set_life_stage(new_life_stage = SLIME_LIFE_STAGE_BABY) + life_stage = new_life_stage + + switch(life_stage) + if(SLIME_LIFE_STAGE_BABY) + + health = initial(health) + maxHealth = initial(maxHealth) + + obj_damage = initial(obj_damage) + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + wound_bonus = initial(wound_bonus) + + if(SLIME_LIFE_STAGE_ADULT) + + health = 200 + maxHealth = 200 + + obj_damage = 15 + melee_damage_lower += 10 + melee_damage_upper += 10 + wound_bonus = -90 + + ai_controller.set_blackboard_key(BB_SLIME_LIFE_STAGE, life_stage) + update_mob_action_buttons() + +///Sets the slime's type, name and its icons +/mob/living/basic/slime/proc/set_slime_type(new_type) + slime_type = new new_type + +///randomizes the colour of a slime +/mob/living/basic/slime/proc/random_colour() + set_slime_type(pick(subtypesof(/datum/slime_type))) + update_name() + regenerate_icons() + +///Handles slime attacking restrictions, and any extra effects that would trigger +/mob/living/basic/slime/proc/on_slime_pre_attack(mob/living/basic/slime/our_slime, atom/target, proximity, modifiers) + SIGNAL_HANDLER + + if(LAZYACCESS(modifiers, RIGHT_CLICK) && isliving(target) && target != src && usr == src) + if(our_slime.can_feed_on(target)) + our_slime.start_feeding(target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(isAI(target)) //The aI is not tasty! + target.balloon_alert(our_slime, "not tasty!") + return COMPONENT_HOSTILE_NO_ATTACK + + if(our_slime.buckled == target) //If you try to attack the creature you are latched on, you instead cancel feeding + our_slime.stop_feeding() + return COMPONENT_HOSTILE_NO_ATTACK + + if(iscyborg(target)) + var/mob/living/silicon/robot/borg_target = target + borg_target.flash_act() + do_sparks(5, TRUE, borg_target) + var/stunprob = our_slime.powerlevel * SLIME_SHOCK_PERCENTAGE_PER_LEVEL + SLIME_BASE_SHOCK_PERCENTAGE + if(prob(stunprob) && our_slime.powerlevel >= SLIME_EXTRA_SHOCK_COST) + our_slime.powerlevel = clamp(our_slime.powerlevel - SLIME_EXTRA_SHOCK_COST, SLIME_MIN_POWER, SLIME_MAX_POWER) + borg_target.apply_damage(our_slime.powerlevel * rand(6, 10), BRUTE, spread_damage = TRUE, wound_bonus = CANT_WOUND) + borg_target.visible_message(span_danger("The [our_slime.name] shocks [borg_target]!"), span_userdanger("The [our_slime.name] shocks you!")) + else + borg_target.visible_message(span_danger("The [our_slime.name] fails to hurt [borg_target]!"), span_userdanger("The [our_slime.name] failed to hurt you!")) + + return COMPONENT_HOSTILE_NO_ATTACK + + if(iscarbon(target) && our_slime.powerlevel > SLIME_MIN_POWER) + var/mob/living/carbon/carbon_target = target + var/stunprob = our_slime.powerlevel * SLIME_SHOCK_PERCENTAGE_PER_LEVEL + SLIME_BASE_SHOCK_PERCENTAGE // 17 at level 1, 80 at level 10 + if(!prob(stunprob)) + return NONE // normal attack + + carbon_target.visible_message(span_danger("The [our_slime.name] shocks [carbon_target]!"), span_userdanger("The [our_slime.name] shocks you!")) + + do_sparks(5, TRUE, carbon_target) + var/power = our_slime.powerlevel + rand(0,3) + carbon_target.Paralyze(2 SECONDS) + carbon_target.Knockdown(power * 2 SECONDS) + carbon_target.set_stutter_if_lower(power * 2 SECONDS) + if (prob(stunprob) && our_slime.powerlevel >= SLIME_EXTRA_SHOCK_COST) + our_slime.powerlevel = clamp(our_slime.powerlevel - SLIME_EXTRA_SHOCK_COST, SLIME_MIN_POWER, SLIME_MAX_POWER) + carbon_target.apply_damage(our_slime.powerlevel * rand(6, 10), BURN, spread_damage = TRUE, wound_bonus = CANT_WOUND) + + if(isslime(target)) + if(target == our_slime) + return COMPONENT_HOSTILE_NO_ATTACK + var/mob/living/basic/slime/target_slime = target + if(target_slime.buckled) + target_slime.stop_feeding(silent = TRUE) + visible_message(span_danger("[our_slime] pulls [target_slime] off!"), \ + span_danger("You pull [target_slime] off!")) + return NONE // normal attack + + var/is_adult_slime = our_slime.life_stage == SLIME_LIFE_STAGE_ADULT + if(target_slime.nutrition >= 100) //steal some nutrition. negval handled in life() + var/stolen_nutrition = min(is_adult_slime ? 90 : 50, target_slime.nutrition) + 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) + + +///Spawns a crossed slimecore item +/mob/living/basic/slime/proc/spawn_corecross() + var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) + visible_message(span_danger("[src] shudders, its mutated core consuming the rest of its body!")) + playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) + var/selected_crossbreed_path + for(var/crossbreed_path in crossbreeds) + var/obj/item/slimecross/cross_item = crossbreed_path + if(initial(cross_item.colour) == slime_type.colour && initial(cross_item.effect) == crossbreed_modification) + selected_crossbreed_path = cross_item + break + if(selected_crossbreed_path) + new selected_crossbreed_path(loc) + else + visible_message(span_warning("The mutated core shudders, and collapses into a puddle, unable to maintain its form.")) + qdel(src) + + +///Makes the slime peaceful and content +/mob/living/basic/slime/proc/set_pacified_behaviour() + hunger_disabled = TRUE + ai_controller?.set_blackboard_key(BB_SLIME_RABID, FALSE) + ai_controller?.set_blackboard_key(BB_SLIME_HUNGER_DISABLED, TRUE) + set_nutrition(SLIME_STARTING_NUTRITION) + +///Makes the slime angry and hungry +/mob/living/basic/slime/proc/set_enraged_behaviour() + hunger_disabled = FALSE + ai_controller?.set_blackboard_key(BB_SLIME_HUNGER_DISABLED, FALSE) + ai_controller?.set_blackboard_key(BB_SLIME_RABID, TRUE) + +///Makes the slime hungry but mostly friendly +/mob/living/basic/slime/proc/set_default_behaviour() + hunger_disabled = FALSE + ai_controller?.set_blackboard_key(BB_SLIME_HUNGER_DISABLED, FALSE) + ai_controller?.set_blackboard_key(BB_SLIME_RABID, FALSE) + +#undef SLIME_EXTRA_SHOCK_COST +#undef SLIME_EXTRA_SHOCK_THRESHOLD +#undef SLIME_BASE_SHOCK_PERCENTAGE +#undef SLIME_SHOCK_PERCENTAGE_PER_LEVEL diff --git a/code/modules/mob/living/simple_animal/slime/slime_type.dm b/code/modules/mob/living/basic/slime/slime_type.dm similarity index 100% rename from code/modules/mob/living/simple_animal/slime/slime_type.dm rename to code/modules/mob/living/basic/slime/slime_type.dm diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm index e23e022d00e..c528819b5bb 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -33,7 +33,7 @@ faction = list(FACTION_RUSSIAN) - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = TCMB maximum_survivable_temperature = T0C + 1500 ai_controller = /datum/ai_controller/basic_controller/bear @@ -82,6 +82,12 @@ icon_dead = "snowbear_dead" desc = "It's a polar bear, in space, but not actually in space." +/mob/living/basic/bear/snow/ancient + name = "ancient polar bear" + desc = "A grizzled old polar bear, its hide thick enough to make it impervious to almost all weapons." + status_flags = CANPUSH | GODMODE + gold_core_spawnable = NO_SPAWN + /mob/living/basic/bear/snow/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SNOWSTORM_IMMUNE, INNATE_TRAIT) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index ebb6f1d23f7..cf905de5dbf 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -41,7 +41,7 @@ butcher_results = list(/obj/item/food/fishmeat/carp = 2, /obj/item/stack/sheet/animalhide/carp = 1) greyscale_config = /datum/greyscale_config/carp ai_controller = /datum/ai_controller/basic_controller/carp - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 @@ -95,10 +95,10 @@ AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("gnashes"))) AddComponent(/datum/component/regenerator, outline_colour = regenerate_colour) if (tamer) - on_tamed(tamer, feedback = FALSE) + tamed(tamer, feedback = FALSE) befriend(tamer) else - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/meat), tame_chance = 10, bonus_tame_chance = 5, after_tame = CALLBACK(src, PROC_REF(on_tamed))) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/meat), tame_chance = 10, bonus_tame_chance = 5) teleport = new(src) teleport.Grant(src) @@ -119,7 +119,7 @@ set_greyscale(colors = list(pick_weight(GLOB.carp_colors))) /// Called when another mob has forged a bond of friendship with this one, passed the taming mob as 'tamer' -/mob/living/basic/carp/proc/on_tamed(mob/tamer, feedback = TRUE) +/mob/living/basic/carp/tamed(mob/living/tamer, atom/food, feedback = TRUE) buckle_lying = 0 AddElement(/datum/element/ridable, ridable_data) AddComponent(/datum/component/obeys_commands, tamed_commands) diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon.dm b/code/modules/mob/living/basic/space_fauna/demon/demon.dm index 741ac27712f..21eaf66a3e8 100644 --- a/code/modules/mob/living/basic/space_fauna/demon/demon.dm +++ b/code/modules/mob/living/basic/space_fauna/demon/demon.dm @@ -36,7 +36,7 @@ death_message = "screams in agony as it sublimates into a sulfurous smoke." death_sound = 'sound/magic/demon_dies.ogg' - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = T0C - 25 //Weak to cold maximum_survivable_temperature = INFINITY @@ -61,8 +61,9 @@ return list() /// Proc that just sets up the demon's antagonism status. -/mob/living/basic/demon/proc/generate_antagonist_status() - if(isnull(antag_type)) +/mob/living/basic/demon/mind_initialize() + . = ..() + if(isnull(antag_type) || mind.has_antag_datum(antag_type)) return // we weren't built for this proc to run mind.set_assigned_role(SSjob.GetJobType(/datum/job/slaughter_demon)) 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 f05ea779763..a8073fa8329 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 @@ -66,7 +66,7 @@ /// Performs the classic slaughter demon bodyslam on the attack_target. Yeets them a screen away. /mob/living/basic/demon/slaughter/proc/bodyslam(atom/attack_target) - if(!isliving(attack_target)) + if(!isliving(attack_target) || attack_target == src) return if(!Adjacent(attack_target)) 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 b72815d8325..6ad7ff77f1d 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm @@ -30,7 +30,7 @@ faction = list(FACTION_SPOOKY) speak_emote = list("telepathically cries") - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = T0C maximum_survivable_temperature = T0C + 1500 sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS @@ -58,7 +58,7 @@ grant_actions_by_list(innate_actions) AddElement(/datum/element/simple_flying) - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/carrot), tame_chance = 100, after_tame = CALLBACK(src, PROC_REF(on_tame))) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/carrot), tame_chance = 100) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) on_hit_overlay = mutable_appearance(icon, "[icon_state]_crying") @@ -119,7 +119,7 @@ befriend(target) COOLDOWN_START(src, eye_healing, 15 SECONDS) -/mob/living/basic/eyeball/proc/on_tame(mob/tamer) +/mob/living/basic/eyeball/tamed(mob/living/tamer, atom/food) spin(spintime = 2 SECONDS, speed = 1) //become passive to the humens faction |= tamer.faction diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm index 406d2ecefdd..7545f9cfea3 100644 --- a/code/modules/mob/living/basic/space_fauna/ghost.dm +++ b/code/modules/mob/living/basic/space_fauna/ghost.dm @@ -23,8 +23,8 @@ death_message = "wails, disintegrating into a pile of ectoplasm!" gold_core_spawnable = NO_SPAWN //too spooky for science light_system = OVERLAY_LIGHT - light_range = 1 // same glowing as visible player ghosts - light_power = 2 + light_range = 2.5 // same glowing as visible player ghosts + light_power = 0.6 ai_controller = /datum/ai_controller/basic_controller/ghost ///What hairstyle will this ghost have diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm index d914e0589c4..c9e155d2bda 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm @@ -29,7 +29,7 @@ speech_span = SPAN_ROBOT death_message = "blows apart!" - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = TCMB ai_controller = /datum/ai_controller/basic_controller/hivebot ///does this type do range attacks? diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm index 72f2001011c..7a46e844355 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm @@ -22,7 +22,7 @@ response_disarm_simple = "gently push" faction = list() ai_controller = /datum/ai_controller/basic_controller/meteor_heart - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 combat_mode = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/morph.dm b/code/modules/mob/living/basic/space_fauna/morph.dm index 22cce322b13..8b4fe3802d7 100644 --- a/code/modules/mob/living/basic/space_fauna/morph.dm +++ b/code/modules/mob/living/basic/space_fauna/morph.dm @@ -15,7 +15,7 @@ maxHealth = 150 health = 150 - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = TCMB obj_damage = 50 diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm index 1be2a870de3..d5fd008a186 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm @@ -36,6 +36,11 @@ /mob/living/basic/migo/Initialize(mapload) . = ..() migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_alert.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/footstep/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/runtime/hyperspace/hyperspace_begin.ogg', 'sound/runtime/hyperspace/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gun/pistol/shot_suppressed.ogg', 'sound/weapons/gun/pistol/shot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kinetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/default/outbreak5.ogg', 'sound/ai/default/outbreak7.ogg', 'sound/ai/default/poweroff.ogg', 'sound/ai/default/radiation.ogg', 'sound/ai/default/shuttlecalled.ogg', 'sound/ai/default/shuttledock.ogg', 'sound/ai/default/shuttlerecalled.ogg', 'sound/ai/default/aimalf.ogg') //hahahaha fuck you code divers + + if(!istype(src, /mob/living/basic/migo/hatsune) && prob(0.1)) // chance on-load mi-gos will spawn with a miku wig on (shiny variant) + new /mob/living/basic/migo/hatsune(get_turf(loc), mapload) + return INITIALIZE_HINT_QDEL + AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 0) AddComponent(/datum/component/health_scaling_effects, min_health_slowdown = -1.5, additional_status_callback = CALLBACK(src, PROC_REF(update_dodge_chance))) @@ -43,20 +48,21 @@ /mob/living/basic/migo/proc/update_dodge_chance(health_ratio) dodge_prob = LERP(50, 10, health_ratio) -/mob/living/basic/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) - ..() - if(stat) +/mob/living/basic/migo/proc/make_migo_sound() + playsound(src, pick(migo_sounds), 50, TRUE) + +/mob/living/basic/migo/send_speech(message_raw, message_range, obj/source, bubble_type, list/spans, datum/language/message_language, list/message_mods, forced, tts_message, list/tts_filter) + . = ..() + if(stat != CONSCIOUS) return - var/chosen_sound = pick(migo_sounds) - playsound(src, chosen_sound, 50, TRUE) + make_migo_sound() /mob/living/basic/migo/Life(seconds_per_tick = SSMOBS_DT, times_fired) ..() if(stat) return if(SPT_PROB(5, seconds_per_tick)) - var/chosen_sound = pick(migo_sounds) - playsound(src, chosen_sound, 50, TRUE) + make_migo_sound() /mob/living/basic/migo/Move(atom/newloc, dir, step_x, step_y) if(!ckey && prob(dodge_prob) && moving_diagonally == 0 && isturf(loc) && isturf(newloc)) @@ -71,3 +77,22 @@ . = Move(get_step(loc,pick(cdir, ccdir))) if(!.)//Can't dodge there so we just carry on . = Move(moving_to, move_direction) + +/// The special hatsune miku themed mi-go. +/mob/living/basic/migo/hatsune + name = "hatsune mi-go" + desc = parent_type::desc + " This one is wearing a bright blue wig." + icon_state = "mi-go-h" + icon_living = "mi-go-h" + + gender = FEMALE + gold_core_spawnable = FRIENDLY_SPAWN + faction = list(FACTION_NEUTRAL) + +/mob/living/basic/migo/hatsune/make_migo_sound() + playsound(src, 'sound/creatures/tourist/tourist_talk_japanese1.ogg', 50, TRUE) + +/mob/living/basic/migo/hatsune/Initialize(mapload) + . = ..() + var/static/list/death_loot = list(/obj/item/instrument/piano_synth) + AddElement(/datum/element/death_drops, death_loot) 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 be83d3e058f..51379ce88a0 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 @@ -62,6 +62,7 @@ poll_ignore_key = POLL_IGNORE_REGAL_RAT,\ assumed_control_message = "You are an independent, invasive force on the station! Hoard coins, trash, cheese, and the like from the safety of darkness!",\ after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ + poll_chat_border_icon = /obj/item/food/cheese/wedge,\ ) var/static/list/innate_actions = list( 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 5a901fa2c79..266e7b5b414 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm @@ -33,7 +33,7 @@ response_harm_simple = "punch through" unsuitable_atmos_damage = 0 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) //I don't know how you'd apply those, but revenants no-sell them anyway. - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = INFINITY @@ -168,7 +168,19 @@ essencecolor = "#1D2953" //oh jeez you're dying hud_used.healths.maptext = MAPTEXT("
[essence]E
") -/mob/living/basic/revenant/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/living/basic/revenant/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(), +) if(!message) 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 63f4bbb9dbc..7dd7f13f5ee 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 @@ -123,7 +123,7 @@ light_sparks.set_up(4, 0, light) light_sparks.start() new /obj/effect/temp_visual/revenant(get_turf(light)) - addtimer(CALLBACK(src, PROC_REF(overload_shock), light, caster), 20) + addtimer(CALLBACK(src, PROC_REF(overload_shock), light, caster), 2 SECONDS) /datum/action/cooldown/spell/aoe/revenant/overload/proc/overload_shock(obj/machinery/light/to_shock, mob/living/basic/revenant/caster) flick("[to_shock.base_state]2", to_shock) @@ -204,7 +204,13 @@ if(!(bot.bot_cover_flags & BOT_COVER_EMAGGED)) new /obj/effect/temp_visual/revenant(bot.loc) bot.bot_cover_flags &= ~BOT_COVER_LOCKED - bot.bot_cover_flags |= BOT_COVER_OPEN + bot.bot_cover_flags |= BOT_COVER_MAINTS_OPEN + bot.emag_act(caster) + for(var/mob/living/basic/bot/bot in victim) + if(!(bot.bot_access_flags & BOT_COVER_EMAGGED)) + new /obj/effect/temp_visual/revenant(bot.loc) + bot.bot_access_flags &= ~BOT_COVER_LOCKED + bot.bot_access_flags |= BOT_COVER_MAINTS_OPEN bot.emag_act(caster) for(var/mob/living/carbon/human/human in victim) if(human == caster) diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm index ea153b03c06..f8a3db0202a 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm @@ -86,21 +86,11 @@ /// Handles giving the revenant a new client to control it /obj/item/ectoplasm/revenant/proc/get_new_user() message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to be [revenant.name] (reforming)?", check_jobban = ROLE_REVENANT, role = ROLE_REVENANT, poll_time = 5 SECONDS, target_mob = revenant, pic_source = revenant) - - if(!LAZYLEN(candidates)) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to be [span_notice(revenant.name)] (reforming)?", check_jobban = ROLE_REVENANT, role = ROLE_REVENANT, poll_time = 5 SECONDS, checked_target = revenant, alert_pic = revenant, role_name_text = "reforming revenant", chat_text_border_icon = revenant) + if(isnull(chosen_one)) message_admins("No candidates were found for the new revenant.") inert = TRUE visible_message(span_revenwarning("[src] settles down and seems lifeless.")) qdel(revenant) return null - - var/mob/dead/observer/potential_client = pick(candidates) - if(isnull(potential_client)) - qdel(revenant) - message_admins("No candidate was found for the new revenant. Oh well!") - inert = TRUE - visible_message(span_revenwarning("[src] settles down and seems lifeless.")) - return null - - return potential_client + return chosen_one 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 c9505321b37..bbefe37606b 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 @@ -17,6 +17,7 @@ icon_dead = "spacedragon_dead" health_doll_icon = "spacedragon" faction = list(FACTION_CARP) + mob_biotypes = MOB_SPECIAL flags_1 = PREVENT_CONTENTS_EXPLOSION_1 gender = NEUTER maxHealth = 400 diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm index 56aacb11a96..8682c8028e3 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm @@ -22,7 +22,7 @@ controller.clear_blackboard_key(target_key) var/turf/our_turf = get_turf(spider) - if (is_valid_web_turf(our_turf)) + if (is_valid_web_turf(our_turf, spider)) controller.set_blackboard_key(target_key, our_turf) finish_action(controller, succeeded = TRUE) return @@ -31,7 +31,7 @@ for (var/i in 1 to scan_range) turfs_by_range["[i]"] = list() for (var/turf/turf_in_view in oview(scan_range, our_turf)) - if (!is_valid_web_turf(turf_in_view)) + if (!is_valid_web_turf(turf_in_view, spider)) continue turfs_by_range["[get_dist(our_turf, turf_in_view)]"] += turf_in_view 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 71fd357fd98..f0df8749a51 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 @@ -111,6 +111,11 @@ /mob/living/basic/spider/giant/hunter/mold //skyrat edit: exists to make molds not spam the world with simple mobs basic_mob_flags = DEL_ON_DEATH + +///Used in the caves away mission. +/mob/living/basic/spider/giant/hunter/away_caves + minimum_survivable_temperature = 0 + gold_core_spawnable = NO_SPAWN /** * ### Scout Spider @@ -169,6 +174,11 @@ ///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 + minimum_survivable_temperature = 0 + gold_core_spawnable = NO_SPAWN + /mob/living/basic/spider/giant/nurse/Initialize(mapload) . = ..() var/datum/atom_hud/datahud = GLOB.huds[health_hud] @@ -467,7 +477,7 @@ */ /mob/living/basic/spider/giant/ice name = "giant ice spider" - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 color = rgb(114,228,250) @@ -481,7 +491,7 @@ */ /mob/living/basic/spider/giant/nurse/ice name = "giant ice spider" - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 poison_type = /datum/reagent/consumable/frostoil @@ -495,7 +505,7 @@ */ /mob/living/basic/spider/giant/hunter/ice name = "giant ice spider" - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 poison_type = /datum/reagent/consumable/frostoil diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm index fa44cb35b2d..5bb27b5109c 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm @@ -3,7 +3,7 @@ name = "Spin Web" desc = "Spin a web to slow down potential prey." button_icon = 'icons/mob/actions/actions_animal.dmi' - button_icon_state = "lay_web" + button_icon_state = "spider_web" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" cooldown_time = 0 SECONDS @@ -17,10 +17,12 @@ . = ..() if (!owner) return + ADD_TRAIT(owner, TRAIT_WEB_WEAVER, REF(src)) RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) /datum/action/cooldown/mob_cooldown/lay_web/Remove(mob/removed_from) . = ..() + REMOVE_TRAIT(removed_from, TRAIT_WEB_WEAVER, REF(src)) UnregisterSignal(removed_from, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) /datum/action/cooldown/mob_cooldown/lay_web/IsAvailable(feedback = FALSE) @@ -72,7 +74,7 @@ /// Variant for genetics, created webs only allow the creator passage /datum/action/cooldown/mob_cooldown/lay_web/genetic desc = "Spin a web. Only you will be able to traverse your web easily." - cooldown_time = 4 SECONDS //the same time to lay a web + cooldown_time = 4 SECONDS /datum/action/cooldown/mob_cooldown/lay_web/genetic/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/stickyweb/genetic(target_turf, owner) @@ -94,20 +96,20 @@ /datum/action/cooldown/mob_cooldown/lay_web/solid_web name = "Spin Solid Web" desc = "Spin a web to obstruct potential prey." - button_icon_state = "lay_solid_web" + button_icon_state = "spider_wall" cooldown_time = 0 SECONDS webbing_time = 5 SECONDS /datum/action/cooldown/mob_cooldown/lay_web/solid_web/obstructed_by_other_web() - return !!(locate(/obj/structure/spider/solid) in get_turf(owner)) + return !!(locate(/obj/structure/spider/stickyweb/sealed/tough) in get_turf(owner)) /datum/action/cooldown/mob_cooldown/lay_web/solid_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) - new /obj/structure/spider/solid(target_turf) + new /obj/structure/spider/stickyweb/sealed/tough(target_turf) /datum/action/cooldown/mob_cooldown/lay_web/web_passage name = "Spin Web Passage" desc = "Spin a web passage to hide the nest from prey view." - button_icon_state = "lay_web_passage" + button_icon_state = "spider_roof" cooldown_time = 0 SECONDS webbing_time = 4 SECONDS @@ -120,20 +122,20 @@ /datum/action/cooldown/mob_cooldown/lay_web/sticky_web name = "Spin Sticky Web" desc = "Spin a sticky web to trap intruders." - button_icon_state = "lay_sticky_web" + button_icon_state = "spider_ropes" cooldown_time = 20 SECONDS webbing_time = 3 SECONDS /datum/action/cooldown/mob_cooldown/lay_web/sticky_web/obstructed_by_other_web() - return !!(locate(/obj/structure/spider/sticky) in get_turf(owner)) + return !!(locate(/obj/structure/spider/stickyweb/very_sticky) in get_turf(owner)) /datum/action/cooldown/mob_cooldown/lay_web/sticky_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) - new /obj/structure/spider/sticky(target_turf) + new /obj/structure/spider/stickyweb/very_sticky(target_turf) /datum/action/cooldown/mob_cooldown/lay_web/web_spikes name = "Spin Web Spikes" desc = "Extrude silk spikes to dissuade invaders." - button_icon_state = "lay_web_spikes" + button_icon_state = "spider_spikes" cooldown_time = 40 SECONDS webbing_time = 3 SECONDS @@ -174,12 +176,12 @@ /datum/action/cooldown/mob_cooldown/lay_web/web_reflector name = "Spin reflective silk screen" desc = "Spin a web to reflect missiles from the nest." - button_icon_state = "lay_web_reflector" + button_icon_state = "spider_mirror" cooldown_time = 30 SECONDS webbing_time = 4 SECONDS /datum/action/cooldown/mob_cooldown/lay_web/web_reflector/obstructed_by_other_web() - return !!(locate(/obj/structure/spider/reflector) in get_turf(owner)) + return !!(locate(/obj/structure/spider/stickyweb/sealed/reflector) in get_turf(owner)) /datum/action/cooldown/mob_cooldown/lay_web/web_reflector/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) - new /obj/structure/spider/reflector(target_turf) + new /obj/structure/spider/stickyweb/sealed/reflector(target_turf) 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 814500674fc..3ddbc2364e8 100644 --- a/code/modules/mob/living/basic/space_fauna/statue/statue.dm +++ b/code/modules/mob/living/basic/space_fauna/statue/statue.dm @@ -54,7 +54,7 @@ /mob/living/basic/statue/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_UNOBSERVANT, INNATE_TRAIT) + add_traits(list(TRAIT_MUTE, TRAIT_UNOBSERVANT), INNATE_TRAIT) AddComponent(/datum/component/unobserved_actor, unobserved_flags = NO_OBSERVED_MOVEMENT | NO_OBSERVED_ATTACKS) var/static/list/innate_actions = list( @@ -69,14 +69,8 @@ /mob/living/basic/statue/med_hud_set_status() return //we're a statue we're invincible -/mob/living/basic/statue/can_speak(allow_mimes = FALSE) - return FALSE // We're a statue, of course we can't talk. - // Cannot talk -/mob/living/basic/statue/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) - return - // Turn to dust when gibbed /mob/living/basic/statue/gib() 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 02fd9ed1bcf..a094e20ec35 100644 --- a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm @@ -22,7 +22,7 @@ health = 10 minimum_survivable_temperature = TCMB maximum_survivable_temperature = T0C + 1250 - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null death_message = "falls to the ground, its shard dulling to a miserable grey!" faction = list(FACTION_HOSTILE) diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm index bf8be2051d8..675b32c84b5 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm @@ -41,7 +41,7 @@ lighting_cutoff_red = 20 lighting_cutoff_green = 10 lighting_cutoff_blue = 40 - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null minimum_survivable_temperature = 0 maximum_survivable_temperature = INFINITY ai_controller = /datum/ai_controller/basic_controller/wumborian_fugu diff --git a/code/modules/mob/living/basic/trooper/nanotrasen.dm b/code/modules/mob/living/basic/trooper/nanotrasen.dm index bcbc5e647eb..af32edde7e3 100644 --- a/code/modules/mob/living/basic/trooper/nanotrasen.dm +++ b/code/modules/mob/living/basic/trooper/nanotrasen.dm @@ -64,7 +64,7 @@ desc = "Pray for your life, syndicate. Run while you can." maxHealth = 150 health = 150 - habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = null unsuitable_cold_damage = 0 casingtype = /obj/item/ammo_casing/energy/laser burst_shots = 3 diff --git a/code/modules/mob/living/basic/trooper/pirate.dm b/code/modules/mob/living/basic/trooper/pirate.dm index 208a113e5d4..6a51b901ebc 100644 --- a/code/modules/mob/living/basic/trooper/pirate.dm +++ b/code/modules/mob/living/basic/trooper/pirate.dm @@ -55,7 +55,7 @@ r_hand = /obj/item/gun/energy/laser ai_controller = /datum/ai_controller/basic_controller/trooper/ranged /// Type of bullet we use - var/casingtype = /obj/item/ammo_casing/energy/laser + var/projectiletype = /obj/projectile/beam/laser /// Sound to play when firing weapon var/projectilesound = 'sound/weapons/laser.ogg' /// number of burst shots @@ -67,7 +67,7 @@ . = ..() AddComponent(\ /datum/component/ranged_attacks,\ - casing_type = casingtype,\ + projectile_type = projectiletype,\ projectile_sound = projectilesound,\ cooldown_time = ranged_cooldown,\ burst_shots = burst_shots,\ diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 595ef0b37d7..224c7161539 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -36,11 +36,17 @@ var/cockroach_cell_line = CELL_LINE_TABLE_COCKROACH /mob/living/basic/cockroach/Initialize(mapload) + var/turf/our_turf = get_turf(src) + if(SSmapping.level_trait(our_turf.z, ZTRAIT_SNOWSTORM) || SSmapping.level_trait(our_turf.z, ZTRAIT_ICE_RUINS) || SSmapping.level_trait(our_turf.z, ZTRAIT_ICE_RUINS_UNDERGROUND)) + name = "ice-[name]" + real_name = name + desc += "
This one seems to have a blue tint and has adapted to the cold." + minimum_survivable_temperature = 140 // 40kelvin below icebox temp + add_atom_colour("#66ccff", FIXED_COLOUR_PRIORITY) . = ..() var/static/list/roach_drops = list(/obj/effect/decal/cleanable/insectguts) AddElement(/datum/element/death_drops, roach_drops) AddElement(/datum/element/swabable, cockroach_cell_line, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 7) - AddElement(/datum/element/basic_body_temp_sensitive, 270, INFINITY) AddComponent( \ /datum/component/squashable, \ squash_chance = 50, \ diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index 162848d062a..8e73537328a 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -52,13 +52,7 @@ ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) if(prob(1)) - name = "rare frog" - desc = "They seem a little smug." - icon_state = "rare_frog" - icon_living = "rare_frog" - icon_dead = "rare_frog_dead" - butcher_results = list(/obj/item/food/nugget = 5) - poison_type = /datum/reagent/drug/mushroomhallucinogen + make_rare() var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), @@ -68,6 +62,15 @@ AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/swabable, CELL_LINE_TABLE_FROG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) +/mob/living/basic/frog/proc/make_rare() + name = "rare frog" + desc = "They seem a little smug." + icon_state = "rare_[icon_state]" + icon_living = "rare_[icon_living]" + icon_dead = "rare_[icon_dead]" + butcher_results = list(/obj/item/food/nugget = 5) + poison_type = /datum/reagent/drug/mushroomhallucinogen + /mob/living/basic/frog/proc/on_entered(datum/source, AM as mob|obj) SIGNAL_HANDLER if(!stat && isliving(AM)) @@ -75,6 +78,17 @@ if(L.mob_size > MOB_SIZE_TINY) playsound(src, stepped_sound, 50, TRUE) +/mob/living/basic/frog/icemoon_facility + name = "Peter Jr." + desc = "They seem a little cold." + minimum_survivable_temperature = ICEBOX_MIN_TEMPERATURE + habitable_atmos = null + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/frog/icemoon_facility/make_rare() + . = ..() + name = "Peter Sr." //make him senior. + /mob/living/basic/frog/frog_suicide name = "suicide frog" desc = "Driven by sheer will." diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index c1ba3c12e36..cf12c2b4083 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -63,7 +63,7 @@ if (tame) faction |= FACTION_NEUTRAL else - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/cheese), tame_chance = 100, after_tame = CALLBACK(src, PROC_REF(tamed))) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/cheese), tame_chance = 100) /mob/living/basic/mouse/Destroy() SSmobs.cheeserats -= src @@ -148,7 +148,7 @@ to_chat(entered, span_notice("[icon2html(src, entered)] Squeak!")) /// Called when a mouse is hand-fed some cheese, it will stop being afraid of humans -/mob/living/basic/mouse/proc/tamed(mob/living/tamer, obj/item/food/cheese/cheese) +/mob/living/basic/mouse/tamed(mob/living/tamer, obj/item/food/cheese/cheese) new /obj/effect/temp_visual/heart(loc) faction |= FACTION_NEUTRAL tame = TRUE diff --git a/code/modules/mob/living/basic/vermin/space_bat.dm b/code/modules/mob/living/basic/vermin/space_bat.dm index 24718c8481a..53f367f4487 100644 --- a/code/modules/mob/living/basic/vermin/space_bat.dm +++ b/code/modules/mob/living/basic/vermin/space_bat.dm @@ -53,3 +53,10 @@ /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/basic_melee_attack_subtree, ) + +///Subtype used in the caves away mission +/mob/living/basic/bat/away_caves + name = "cave bat" + desc = "A rare breed of bat which roosts deep in caves." + minimum_survivable_temperature = 0 + gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 4caa7dd1966..349f14d83a3 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -8,70 +8,56 @@ // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood(seconds_per_tick, times_fired) - - if(HAS_TRAIT(src, TRAIT_NOBLOOD) || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + // Under these circumstances blood handling is not necessary + if(bodytemperature < BLOOD_STOP_TEMP || HAS_TRAIT(src, TRAIT_FAKEDEATH) || HAS_TRAIT(src, TRAIT_HUSK)) return - - if(bodytemperature < BLOOD_STOP_TEMP || (HAS_TRAIT(src, TRAIT_HUSK))) //cold or husked people do not pump the blood. + // 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)) return //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) - var/nutrition_ratio = 0 - switch(nutrition) - if(0 to NUTRITION_LEVEL_STARVING) - nutrition_ratio = 0.2 - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - nutrition_ratio = 0.4 - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - nutrition_ratio = 0.6 - if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - nutrition_ratio = 0.8 - else - nutrition_ratio = 1 - if(satiety > 80) - nutrition_ratio *= 1.25 - adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR * seconds_per_tick) - blood_volume = min(blood_volume + (BLOOD_REGEN_FACTOR * nutrition_ratio * seconds_per_tick), BLOOD_VOLUME_NORMAL) - - // we call lose_blood() here rather than quirk/process() to make sure that the blood loss happens in sync with life() - if(HAS_TRAIT(src, TRAIT_BLOOD_DEFICIENCY)) - var/datum/quirk/blooddeficiency/blooddeficiency = get_quirk(/datum/quirk/blooddeficiency) - if(!isnull(blooddeficiency)) - blooddeficiency.lose_blood(seconds_per_tick) + 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 * nutrition_ratio * seconds_per_tick), BLOOD_VOLUME_NORMAL) //Effects of bloodloss - var/word = pick("dizzy","woozy","faint") - switch(blood_volume) - if(BLOOD_VOLUME_MAX_LETHAL to INFINITY) - 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() - 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.")) - if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS) - if(SPT_PROB(5, seconds_per_tick)) - to_chat(src, span_warning("You feel terribly bloated.")) - if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) - if(SPT_PROB(2.5, seconds_per_tick)) - to_chat(src, span_warning("You feel [word].")) - adjustOxyLoss(round(0.005 * (BLOOD_VOLUME_NORMAL - blood_volume) * seconds_per_tick, 1)) - if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - adjustOxyLoss(round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume) * seconds_per_tick, 1)) - if(SPT_PROB(2.5, seconds_per_tick)) - set_eye_blur_if_lower(12 SECONDS) - to_chat(src, span_warning("You feel very [word].")) - if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) - adjustOxyLoss(2.5 * seconds_per_tick) - if(SPT_PROB(7.5, seconds_per_tick)) - Unconscious(rand(20,60)) - to_chat(src, span_warning("You feel extremely [word].")) - if(-INFINITY to BLOOD_VOLUME_SURVIVE) - if(!HAS_TRAIT(src, TRAIT_NODEATH)) - investigate_log("has died of bloodloss.", INVESTIGATE_DEATHS) - death() + if(!(sigreturn & HANDLE_BLOOD_NO_EFFECTS)) + var/word = pick("dizzy","woozy","faint") + switch(blood_volume) + if(BLOOD_VOLUME_MAX_LETHAL to INFINITY) + 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() + 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.")) + if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS) + if(SPT_PROB(5, seconds_per_tick)) + to_chat(src, span_warning("You feel terribly bloated.")) + if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) + if(SPT_PROB(2.5, seconds_per_tick)) + to_chat(src, span_warning("You feel [word].")) + adjustOxyLoss(round(0.005 * (BLOOD_VOLUME_NORMAL - blood_volume) * seconds_per_tick, 1)) + if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) + adjustOxyLoss(round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume) * seconds_per_tick, 1)) + if(SPT_PROB(2.5, seconds_per_tick)) + set_eye_blur_if_lower(12 SECONDS) + to_chat(src, span_warning("You feel very [word].")) + if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) + adjustOxyLoss(2.5 * seconds_per_tick) + if(SPT_PROB(7.5, seconds_per_tick)) + Unconscious(rand(20,60)) + to_chat(src, span_warning("You feel extremely [word].")) + if(-INFINITY to BLOOD_VOLUME_SURVIVE) + if(!HAS_TRAIT(src, TRAIT_NODEATH)) + investigate_log("has died of bloodloss.", INVESTIGATE_DEATHS) + death() var/temp_bleed = 0 //Bleeding out diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 74e5931163b..56693b20b36 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -289,10 +289,9 @@ brainmob.emp_damage = min(brainmob.emp_damage + rand(0,10), 30) brainmob.emote("alarm") -/obj/item/mmi/deconstruct(disassembled = TRUE) +/obj/item/mmi/atom_deconstruct(disassembled = TRUE) if(brain) eject_brain() - qdel(src) /obj/item/mmi/examine(mob/user) . = ..() diff --git a/code/modules/mob/living/brain/brain_say.dm b/code/modules/mob/living/brain/brain_say.dm index c9109795271..6781325b9ba 100644 --- a/code/modules/mob/living/brain/brain_say.dm +++ b/code/modules/mob/living/brain/brain_say.dm @@ -1,7 +1,21 @@ -/mob/living/brain/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterpoof = null, message_range = 7, datum/saymode/saymode = null) +/mob/living/brain/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(), +) + if(prob(emp_damage * 4)) + if(prob(10)) //10% chance to drop the message entirely + return + message = Gibberish(message, emp_damage >= 12)//scrambles the message, gets worse when emp_damage is higher // BUBBER CHANGE: funny talking head - if(stat == DEAD) // lets you talk in deadchat - return ..() var/datum/antagonist/bloodsucker/spooky_vampire_head = mind?.has_antag_datum(/datum/antagonist/bloodsucker) if(!container && spooky_vampire_head) var/obj/head = spooky_vampire_head.is_head(src) @@ -11,16 +25,11 @@ head.Shake(duration = animation_time) ..() // BUBBER CHANGE END - if(!(container && istype(container, /obj/item/mmi))) - return //No MMI, can't speak, bucko./N - else - if(prob(emp_damage*4)) - if(prob(10))//10% chane to drop the message entirely - return - else - message = Gibberish(message, emp_damage >= 12)//scrambles the message, gets worse when emp_damage is higher - ..() + return ..() + +/mob/living/brain/can_speak(allow_mimes) + return istype(container, /obj/item/mmi) && ..() /mob/living/brain/radio(message, list/message_mods = list(), list/spans, language) if(message_mods[MODE_HEADSET] && istype(container, /obj/item/mmi)) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index d705394cc12..038763e0360 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -222,3 +222,10 @@ GLOBAL_VAR(posibrain_notify_cooldown) /obj/item/mmi/posibrain/add_mmi_overlay() return + +/obj/item/mmi/posibrain/display + name = "display positronic brain" + desc = "A small positronic brain that doesn't allow the downloading of personalities." + +/obj/item/mmi/posibrain/display/is_occupied() + return TRUE diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index 2cab03d670e..d2ee7432b3c 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -69,11 +69,6 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, FALSE, -5) return ..() -/mob/living/carbon/alien/adult/set_name() - if(numba) - name = "[name] ([numba])" - real_name = name - /mob/living/carbon/alien/adult/setGrabState(newstate) if(newstate == grab_state) return @@ -143,6 +138,9 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( melting_pot.consume_thing(lucky_winner) return TRUE +/mob/living/carbon/alien/adult/get_butt_sprite() + return BUTT_SPRITE_XENOMORPH + // Aliens can touch acid /mob/living/carbon/alien/can_touch_acid(atom/acided_atom, acid_power, acid_volume) return TRUE diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 93937adaeaf..7aeb94d448f 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -13,6 +13,7 @@ span_notice("[owner] slowly peeks up from the ground..."), span_noticealien("You stop hiding."), ) + ADD_TRAIT(owner, TRAIT_IGNORE_ELEVATION, ACTION_TRAIT) else owner.layer = hide_layer @@ -20,6 +21,7 @@ span_name("[owner] scurries to the ground!"), span_noticealien("You are now hiding."), ) + REMOVE_TRAIT(owner, TRAIT_IGNORE_ELEVATION, ACTION_TRAIT) return TRUE 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 19434d888a1..528ec595ced 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -90,15 +90,18 @@ return bursting = TRUE - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(on_poll_concluded), gib_on_success) - owner.AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_ALIEN_LARVA, \ - job_bans = ROLE_ALIEN, \ - to_call = to_call, \ - custom_message = "An alien is bursting out of [owner.real_name]", \ - title = "alien larva" \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + question = "An [span_notice("alien")] is bursting out of [span_danger(owner.real_name)]!", + role = ROLE_ALIEN, + check_jobban = ROLE_ALIEN, + poll_time = 20 SECONDS, + checked_target = src, + ignore_category = POLL_IGNORE_ALIEN_LARVA, + alert_pic = owner, + role_name_text = "alien larva", + chat_text_border_icon = /mob/living/carbon/alien/larva, ) + on_poll_concluded(gib_on_success, chosen_one) /// Poll has concluded with a suitor /obj/item/organ/internal/body_egg/alien_embryo/proc/on_poll_concluded(gib_on_success, mob/dead/observer/ghost) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index db0ad4c145c..1c1d181444a 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -111,7 +111,7 @@ return if(stat == CONSCIOUS) icon_state = "[base_icon_state]_thrown" - addtimer(CALLBACK(src, PROC_REF(clear_throw_icon_state)), 15) + addtimer(CALLBACK(src, PROC_REF(clear_throw_icon_state)), 1.5 SECONDS) /obj/item/clothing/mask/facehugger/proc/clear_throw_icon_state() if(icon_state == "[base_icon_state]_thrown") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 52141019c09..982613f331c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -815,8 +815,7 @@ hud_used.stamina.icon_state = "stamina_full" /mob/living/carbon/proc/update_spacesuit_hud_icon(cell_state = "empty") - if(hud_used?.spacesuit) - hud_used.spacesuit.icon_state = "spacesuit_[cell_state]" + hud_used?.spacesuit?.icon_state = "spacesuit_[cell_state]" /mob/living/carbon/set_health(new_value) . = ..() @@ -896,7 +895,11 @@ if(!HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM) && !isnull(dna?.species.mutantliver) && !get_organ_slot(ORGAN_SLOT_LIVER)) return FALSE - return ..() + . = ..() + if(.) // if revived successfully + set_heartattack(FALSE) + + return . /mob/living/carbon/fully_heal(heal_flags = HEAL_ALL) @@ -934,6 +937,10 @@ return ..() +/mob/living/carbon/do_strange_reagent_revival(healing_amount) + set_heartattack(FALSE) + return ..() + /mob/living/carbon/can_be_revived() if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK)) return FALSE @@ -1471,3 +1478,10 @@ if(!unwagged) return FALSE return unwagged.stop_wag(src) + +/mob/living/carbon/itch(obj/item/bodypart/target_part = null, damage = 0.5, can_scratch = TRUE, silent = FALSE) + if (isnull(target_part)) + target_part = get_bodypart(get_random_valid_zone(even_weights = TRUE)) + if (!IS_ORGANIC_LIMB(target_part) || (target_part.bodypart_flags & BODYPART_PSEUDOPART)) + return FALSE + return ..() diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index d900706f102..cb35aebfb07 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -8,14 +8,14 @@ /mob/living/carbon/Move(NewLoc, direct) . = ..() - if(. && !(movement_type & FLOATING)) //floating is easy - if(HAS_TRAIT(src, TRAIT_NOHUNGER)) - set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous - else if(nutrition && stat != DEAD) - adjust_nutrition(-(HUNGER_FACTOR/10)) - if(move_intent == MOVE_INTENT_RUN) - adjust_nutrition(-(HUNGER_FACTOR/10)) - + if(!. || (movement_type & FLOATING)) //floating is easy + return + if(nutrition <= 0 || stat == DEAD) + return + var/hunger_loss = HUNGER_FACTOR / 10 + if(move_intent == MOVE_INTENT_RUN) + hunger_loss *= 2 + adjust_nutrition(-1 * hunger_loss) /mob/living/carbon/set_usable_legs(new_value) . = ..() diff --git a/code/modules/mob/living/carbon/carbon_stripping.dm b/code/modules/mob/living/carbon/carbon_stripping.dm index 4ec93377164..054444c4815 100644 --- a/code/modules/mob/living/carbon/carbon_stripping.dm +++ b/code/modules/mob/living/carbon/carbon_stripping.dm @@ -6,13 +6,14 @@ key = STRIPPABLE_ITEM_BACK item_slot = ITEM_SLOT_BACK -/datum/strippable_item/mob_item_slot/back/get_alternate_action(atom/source, mob/user) +/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/alternate_action(atom/source, mob/user) +/datum/strippable_item/mob_item_slot/back/perform_alternate_action(atom/source, mob/user, action_key) if(!..()) return - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) + strippable_alternate_action_internals(get_item(source), source, user) /datum/strippable_item/mob_item_slot/mask key = STRIPPABLE_ITEM_MASK diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index eafb6f8ba22..f74c2c1ca21 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -1,5 +1,5 @@ /mob/living/carbon/death(gibbed) - if(stat == DEAD) + if(stat == DEAD || HAS_TRAIT(src, TRAIT_NODEATH) && !gibbed) return losebreath = 0 @@ -19,7 +19,7 @@ BT.on_death() /mob/living/carbon/proc/inflate_gib() // Plays an animation that makes mobs appear to inflate before finally gibbing - addtimer(CALLBACK(src, PROC_REF(gib), DROP_BRAIN|DROP_ORGANS|DROP_ITEMS), 25) + addtimer(CALLBACK(src, PROC_REF(gib), DROP_BRAIN|DROP_ORGANS|DROP_ITEMS), 2.5 SECONDS) var/matrix/M = matrix() M.Scale(1.8, 1.2) animate(src, time = 40, transform = M, easing = SINE_EASING) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 03a29ae1f21..c534372d04c 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -44,7 +44,7 @@ GLOBAL_LIST_EMPTY(features_by_species) ///If your race bleeds something other than bog standard blood, change this to reagent id. For example, ethereals bleed liquid electricity. var/datum/reagent/exotic_blood ///If your race uses a non standard bloodtype (A+, O-, AB-, etc). For example, lizards have L type blood. - var/exotic_bloodtype = "" + var/exotic_bloodtype ///The rate at which blood is passively drained by having the blood deficiency quirk. Some races such as slimepeople can regen their blood at different rates so this is to account for that var/blood_deficiency_drain_rate = BLOOD_REGEN_FACTOR + BLOOD_DEFICIENCY_MODIFIER // slightly above the regen rate so it slowly drains instead of regenerates. ///What the species drops when gibbed by a gibber machine. @@ -167,9 +167,6 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Unique cookie given by admins through prayers var/species_cookie = /obj/item/food/cookie - ///For custom overrides for species ass images - var/icon/ass_image - /// List of family heirlooms this species can get with the family heirloom quirk. List of types. var/list/family_heirlooms @@ -1220,25 +1217,12 @@ GLOBAL_LIST_EMPTY(features_by_species) target.force_say() log_combat(user, target, grappled ? "grapple punched" : "kicked") target.apply_damage(damage, attack_type, affecting, armor_block - limb_accuracy, attack_direction = attack_direction) - target.apply_damage(damage*1.5, STAMINA, affecting, armor_block - limb_accuracy) else // Normal attacks do not gain the benefit of armor penetration. target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction, sharpness = unarmed_sharpness) //SKYRAT EDIT - Applies sharpness if it does - ORIGINAL: target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) - target.apply_damage(damage*1.5, STAMINA, affecting, armor_block) if(damage >= 9) target.force_say() log_combat(user, target, "punched") - //If we rolled a punch high enough to hit our stun threshold, or our target is staggered and they have at least 40 damage+stamina loss, we knock them down - //This does not work against opponents who are knockdown immune, such as from wearing riot armor. - if(!HAS_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) - if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && staggered && (target.getStaminaLoss() + user.getBruteLoss()) >= 40) - target.visible_message(span_danger("[user] knocks [target] down!"), \ - span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You knock [target] down!")) - var/knockdown_duration = 4 SECONDS + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 4 second base stun + 4 second stun modifier = 8 second knockdown duration - target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) - log_combat(user, target, "got a stun punch with their previous punch") - /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(user.body_position != STANDING_UP) return FALSE @@ -1423,7 +1407,7 @@ GLOBAL_LIST_EMPTY(features_by_species) humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 3) // Body temperature is too cold, and we do not have resist traits - else if(bodytemp < bodytemp_cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD)) + else if(bodytemp < bodytemp_cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD) && !humi.has_status_effect(/datum/status_effect/inebriated)) // clear any hot moods and apply cold mood humi.clear_mood_event("hot") humi.add_mood_event("cold", /datum/mood_event/cold) @@ -2074,6 +2058,9 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/create_pref_liver_perks() RETURN_TYPE(/list) + if(isnull(mutantliver) || (TRAIT_LIVERLESS_METABOLISM in inherent_traits)) + return null + var/list/to_add = list() var/alcohol_tolerance = initial(mutantliver.alcohol_tolerance) @@ -2114,6 +2101,9 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/create_pref_lung_perks() RETURN_TYPE(/list) + if(isnull(mutantlungs) || (TRAIT_NOBREATH in inherent_traits)) + return null + var/list/to_add = list() if (breathid != GAS_O2) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 6a207f7afa9..cf843c43b00 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -20,11 +20,12 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) new /obj/effect/decal/remains/human(loc) /mob/living/carbon/human/death(gibbed) - if(stat == DEAD) + if(stat == DEAD || HAS_TRAIT(src, TRAIT_NODEATH) && !gibbed) return stop_sound_channel(CHANNEL_HEARTBEAT) var/obj/item/organ/internal/heart/human_heart = get_organ_slot(ORGAN_SLOT_HEART) human_heart?.beat = BEAT_NONE + human_heart?.Stop() . = ..() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8e90e8d4320..ae67a379368 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -450,16 +450,13 @@ "\[Add note\]"), "") // SKYRAT EDIT ADDITION BEGIN - EXAMINE RECORDS if(target_record && length(target_record.past_security_records) > RECORDS_INVISIBLE_THRESHOLD) - . += "Past security records: \[View past security records\]" + . += "\[View past security records\]" if (target_record && length(target_record.past_general_records) > RECORDS_INVISIBLE_THRESHOLD) . += "\[View general records\]" - //SKYRAT EDIT ADDITION END - else if(isobserver(user)) - . += span_info("Quirks: [get_quirk_string(FALSE, CAT_QUIRK_ALL)]") - . += "
" + if(isobserver(user)) + . += span_info("\nQuirks: [get_quirk_string(FALSE, CAT_QUIRK_ALL)]") - //SKYRAT EDIT ADDITION BEGIN - EXAMINE RECORDS if(isobserver(user) || user.mind?.can_see_exploitables || user.mind?.has_exploitables_override) var/datum/record/crew/target_records = find_record(perpname) if(target_records) @@ -469,6 +466,8 @@ . += "\[View background info\]" if((length(exploitable_text) > RECORDS_INVISIBLE_THRESHOLD) && ((exploitable_text) != EXPLOITABLE_DEFAULT_TEXT)) . += "\[View exploitable info\]" + + . += EXAMINE_SECTION_BREAK //SKYRAT EDIT END //SKYRAT EDIT ADDITION BEGIN - GUNPOINT if(gunpointing) @@ -501,18 +500,19 @@ if (flavor_text_link) . += flavor_text_link - if(client) - var/erp_status_pref = client.prefs.read_preference(/datum/preference/choiced/erp_status) - if(erp_status_pref && !CONFIG_GET(flag/disable_erp_preferences)) - . += span_notice("ERP STATUS: [erp_status_pref]") - //Temporary flavor text addition: if(temporary_flavor_text) if(length_char(temporary_flavor_text) < TEMPORARY_FLAVOR_PREVIEW_LIMIT) - . += span_notice("They look different than usual: [temporary_flavor_text]") + . += span_revennotice("
They look different than usual: [temporary_flavor_text]") else - . += span_notice("They look different than usual: [copytext_char(temporary_flavor_text, 1, TEMPORARY_FLAVOR_PREVIEW_LIMIT)]... More...") - . += "" + . += span_revennotice("
They look different than usual: [copytext_char(temporary_flavor_text, 1, TEMPORARY_FLAVOR_PREVIEW_LIMIT)]... More...") + + if(client) + var/erp_status_pref = client.prefs.read_preference(/datum/preference/choiced/erp_status) + if(erp_status_pref && !CONFIG_GET(flag/disable_erp_preferences)) + . += EXAMINE_SECTION_BREAK + . += span_info("ERP Status: [span_revenboldnotice(erp_status_pref)]") + SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE, user, .) /** diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4d5f9bfc234..767c09bfa68 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -42,10 +42,11 @@ /mob/living/carbon/human/proc/setup_mood() if (CONFIG_GET(flag/disable_human_mood)) return - if (isdummy(src)) - return mob_mood = new /datum/mood(src) +/mob/living/carbon/human/dummy/setup_mood() + return + /// This proc is for holding effects applied when a mob is missing certain organs /// It is called very, very early in human init because all humans innately spawn with no organs and gain them during init /// Gaining said organs removes these effects @@ -60,8 +61,6 @@ /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) - if(biowares) - QDEL_LIST(biowares) GLOB.human_list -= src if (mob_mood) @@ -381,6 +380,10 @@ var/obj/item/bodypart/the_part = isbodypart(target_zone) ? target_zone : get_bodypart(check_zone(target_zone)) //keep these synced to_chat(user, span_alert("There is no exposed flesh or thin material on [p_their()] [the_part.name].")) +/mob/living/carbon/human/get_butt_sprite() + var/obj/item/bodypart/chest/chest = get_bodypart(BODY_ZONE_CHEST) + return chest?.get_butt_sprite() + /mob/living/carbon/human/get_footprint_sprite() var/obj/item/bodypart/leg/L = get_bodypart(BODY_ZONE_R_LEG) || get_bodypart(BODY_ZONE_L_LEG) return shoes?.footprint_sprite || L?.footprint_sprite @@ -391,7 +394,7 @@ if(judgement_criteria & JUDGE_EMAGGED || HAS_TRAIT(src, TRAIT_ALWAYS_WANTED)) return 10 //Everyone is a criminal! - var/threatcount = 0 + var/threatcount = judgement_criteria & JUDGE_CHILLOUT ? -THREAT_ASSESS_DANGEROUS : 0 //Lasertag bullshit if(lasercolor) @@ -637,7 +640,7 @@ // If we have a species, we need to handle mutant parts and stuff if(dna?.species) - add_atom_colour("#000000", TEMPORARY_COLOUR_PRIORITY) + add_atom_colour(COLOR_BLACK, TEMPORARY_COLOUR_PRIORITY) var/static/mutable_appearance/shock_animation_dna if(!shock_animation_dna) shock_animation_dna = mutable_appearance(icon, "electrocuted_base") @@ -656,7 +659,7 @@ addtimer(CALLBACK(src, PROC_REF(end_electrocution_animation), zap_appearance), anim_duration) /mob/living/carbon/human/proc/end_electrocution_animation(mutable_appearance/MA) - remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000") + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLACK) cut_overlay(MA) /mob/living/carbon/human/resist_restraints() @@ -740,7 +743,7 @@ /mob/living/carbon/human/fully_heal(heal_flags = HEAL_ALL) if(heal_flags & HEAL_NEGATIVE_MUTATIONS) for(var/datum/mutation/human/existing_mutation in dna.mutations) - if(existing_mutation.quality != POSITIVE) + if(existing_mutation.quality != POSITIVE && existing_mutation.remove_on_aheal) dna.remove_mutation(existing_mutation) if(heal_flags & HEAL_TEMP) @@ -1056,16 +1059,6 @@ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) -/mob/living/carbon/human/adjust_nutrition(change) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks - if(HAS_TRAIT(src, TRAIT_NOHUNGER)) - return FALSE - return ..() - -/mob/living/carbon/human/set_nutrition(change) //Seriously fuck you oldcoders. - if(HAS_TRAIT(src, TRAIT_NOHUNGER)) - return FALSE - return ..() - /mob/living/carbon/human/is_bleeding() if(HAS_TRAIT(src, TRAIT_NOBLOOD)) return FALSE diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 33e478c6ee1..7569ddbe240 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -19,7 +19,7 @@ health = HUMAN_MAXHEALTH //SKYRAT EDIT ADDITION //Hair colour and style - var/hair_color = "#000000" + var/hair_color = COLOR_BLACK var/hairstyle = "Bald" ///Colours used for hair and facial hair gradients. @@ -28,12 +28,12 @@ var/list/grad_style //Facial hair colour and style - var/facial_hair_color = "#000000" + var/facial_hair_color = COLOR_BLACK var/facial_hairstyle = "Shaved" //Eye colour - var/eye_color_left = "#000000" - var/eye_color_right = "#000000" + var/eye_color_left = COLOR_BLACK + var/eye_color_right = COLOR_BLACK /// Var used to keep track of a human mob having a heterochromatic right eye. To ensure prefs don't overwrite shit var/eye_color_heterochromatic = FALSE @@ -49,7 +49,7 @@ //consider updating /mob/living/carbon/human/copy_clothing_prefs() if adding more of these var/underwear = "Nude" //Which underwear the player wants - var/underwear_color = "#000000" + var/underwear_color = COLOR_BLACK var/undershirt = "Nude" //Which undershirt the player wants var/socks = "Nude" //Which socks the player wants var/backpack = DBACKPACK //Which backpack type the player has chosen. @@ -71,13 +71,11 @@ var/datum/physiology/physiology - var/list/datum/bioware/biowares - /// What types of mobs are allowed to ride/buckle to this mob var/static/list/can_ride_typecache = typecacheof(list( /mob/living/basic/parrot, /mob/living/carbon/human, - /mob/living/simple_animal/slime, + /mob/living/basic/slime, )) var/lastpuke = 0 var/account_id diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 7b250ef7a03..ae41bad2cf3 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -1,6 +1,18 @@ -/mob/living/carbon/human/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced, filterproof, message_range, datum/saymode/saymode) +/mob/living/carbon/human/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(), +) if(!HAS_TRAIT(src, TRAIT_SPEAKS_CLEARLY)) var/static/regex/tongueless_lower = new("\[gdntke]+", "g") var/static/regex/tongueless_upper = new("\[GDNTKE]+", "g") diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm index 30377225b78..fadca82ab11 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -45,22 +45,39 @@ 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_action(atom/source, mob/user) +/datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_actions(atom/source, mob/user) var/obj/item/clothing/under/jumpsuit = get_item(source) if (!istype(jumpsuit)) return null - return jumpsuit?.can_adjust ? "adjust_jumpsuit" : null -/datum/strippable_item/mob_item_slot/jumpsuit/alternate_action(atom/source, mob/user) + var/list/actions = list() + if(jumpsuit.has_sensor == HAS_SENSORS) + actions += "adjust_sensor" + if(jumpsuit.can_adjust) + actions += "adjust_jumpsuit" + + return actions + +/datum/strippable_item/mob_item_slot/jumpsuit/perform_alternate_action(atom/source, mob/user, action_key) if (!..()) return var/obj/item/clothing/under/jumpsuit = get_item(source) if (!istype(jumpsuit)) return null - to_chat(source, "[user] is trying to adjust your [jumpsuit.name].") + + switch(action_key) + if("adjust_jumpsuit") + do_adjust_jumpsuit(source, user, jumpsuit) + if("adjust_sensor") + do_adjust_sensor(source, user, jumpsuit) + else + stack_trace("Unknown action key: [action_key] for [type]") + +/datum/strippable_item/mob_item_slot/jumpsuit/proc/do_adjust_jumpsuit(atom/source, mob/user, obj/item/clothing/under/jumpsuit) + to_chat(source, span_notice("[user] is trying to adjust your [jumpsuit].")) if (!do_after(user, (jumpsuit.strip_delay * 0.5), source)) return - to_chat(source, "[user] successfully adjusted your [jumpsuit.name].") + to_chat(source, span_notice("[user] successfully adjusted your [jumpsuit].")) jumpsuit.toggle_jumpsuit_adjust() if (!ismob(source)) @@ -70,6 +87,43 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( mob_source.update_worn_undersuit() mob_source.update_body() +/datum/strippable_item/mob_item_slot/jumpsuit/proc/do_adjust_sensor(atom/source, mob/user, obj/item/clothing/under/jumpsuit) + if(jumpsuit.has_sensor != HAS_SENSORS) + return + + var/static/list/sensor_mode_text_to_num = list( + "Off" = SENSOR_OFF, + "Living" = SENSOR_LIVING, + "Vitals" = SENSOR_VITALS, + "Tracking" = SENSOR_COORDS, + ) + var/static/list/senor_mode_num_to_text = list( // keep this as the inverse of the above list + "[SENSOR_OFF]" = "Off", + "[SENSOR_LIVING]" = "Living", + "[SENSOR_VITALS]" = "Vitals", + "[SENSOR_COORDS]" = "Tracking", + ) + + var/new_mode = tgui_input_list(user, "Adjust suit sensors", "Adjust Sensors", sensor_mode_text_to_num, senor_mode_num_to_text["[jumpsuit.sensor_mode]"]) + new_mode = sensor_mode_text_to_num[new_mode] + if(isnull(new_mode)) // also catches returning null + return + + if(!user.Adjacent(source)) + source.balloon_alert(user, "can't reach!") + 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 + 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/suit key = STRIPPABLE_ITEM_SUIT item_slot = ITEM_SLOT_OCLOTHING @@ -82,39 +136,44 @@ 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_action(atom/source, mob/user) +/datum/strippable_item/mob_item_slot/feet/get_alternate_actions(atom/source, mob/user) var/obj/item/clothing/shoes/shoes = get_item(source) if (!istype(shoes) || !shoes.can_be_tied) return null switch (shoes.tied) if (SHOES_UNTIED) - return "knot" + return list("knot") if (SHOES_TIED) - return "untie" + return list("untie") if (SHOES_KNOTTED) - return "unknot" + return list("unknot") -/datum/strippable_item/mob_item_slot/feet/alternate_action(atom/source, mob/user) +/datum/strippable_item/mob_item_slot/feet/perform_alternate_action(atom/source, mob/user, action_key) if(!..()) return + var/obj/item/clothing/shoes/shoes = get_item(source) if (!istype(shoes)) return - - shoes.handle_tying(user) + switch(action_key) + if("knot", "untie", "unknot") + shoes.handle_tying(user) + else + stack_trace("Unknown action key: [action_key] for [type]") /datum/strippable_item/mob_item_slot/suit_storage key = STRIPPABLE_ITEM_SUIT_STORAGE item_slot = ITEM_SLOT_SUITSTORE -/datum/strippable_item/mob_item_slot/suit_storage/get_alternate_action(atom/source, mob/user) +/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/alternate_action(atom/source, mob/user) - if (!..()) +/datum/strippable_item/mob_item_slot/suit_storage/perform_alternate_action(atom/source, mob/user, action_key) + if(!..()) return - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) + strippable_alternate_action_internals(get_item(source), source, user) /datum/strippable_item/mob_item_slot/id key = STRIPPABLE_ITEM_ID @@ -125,13 +184,14 @@ 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_action(atom/source, mob/user) +/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/alternate_action(atom/source, mob/user) +/datum/strippable_item/mob_item_slot/belt/perform_alternate_action(atom/source, mob/user, action_key) if (!..()) return - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) + strippable_alternate_action_internals(get_item(source), source, user) /datum/strippable_item/mob_item_slot/pocket /// Which pocket we're referencing. Used for visible text. @@ -189,9 +249,9 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( var/mob/living/carbon/carbon_source = source if (carbon_source.can_breathe_internals() && istype(item, /obj/item/tank)) if(carbon_source.internal != item) - return "enable_internals" + return list("enable_internals") else - return "disable_internals" + return list("disable_internals") /proc/strippable_alternate_action_internals(obj/item/item, atom/source, mob/user) var/obj/item/tank/tank = item 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 508571190d7..bfb22804ddf 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -115,7 +115,7 @@ There are several things that need to be remembered: icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform, src) // Might have to refactor how this works eventually, maybe. // SKYRAT EDIT END //Female sprites have lower priority than digitigrade sprites - if(dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(female_sprite_flags & NO_FEMALE_UNIFORM)) // SKYRAT EDIT CHANGE - ORIGINAL: else if(dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh + if(!dna.species.no_gender_shaping && dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(female_sprite_flags & NO_FEMALE_UNIFORM)) // SKYRAT EDIT CHANGE - ORIGINAL: else if(dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh woman = TRUE // SKYRAT EDIT ADDITION START - Digi female gender shaping if(digi) diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 9a4a55bb7ac..6e16781a59e 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -5,6 +5,9 @@ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_DWARF), SIGNAL_REMOVETRAIT(TRAIT_DWARF)), PROC_REF(on_dwarf_trait)) RegisterSignal(src, COMSIG_MOVABLE_MESSAGE_GET_NAME_PART, PROC_REF(get_name_part)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT)), PROC_REF(on_fat)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NOHUNGER), SIGNAL_REMOVETRAIT(TRAIT_NOHUNGER)), PROC_REF(on_nohunger)) + /// Gaining or losing [TRAIT_UNKNOWN] updates our name and our sechud /mob/living/carbon/human/proc/on_unknown_trait(datum/source) SIGNAL_HANDLER @@ -38,3 +41,25 @@ if(name != voice_name) voice_name += " (as [get_id_name("Unknown")])" stored_name[NAME_PART_INDEX] = voice_name + +/mob/living/carbon/human/proc/on_fat(datum/source) + SIGNAL_HANDLER + hud_used?.hunger?.update_appearance() + mob_mood?.update_nutrition_moodlets() + + if(HAS_TRAIT(src, TRAIT_FAT)) + add_movespeed_modifier(/datum/movespeed_modifier/obesity) + else + remove_movespeed_modifier(/datum/movespeed_modifier/obesity) + +/mob/living/carbon/human/proc/on_nohunger(datum/source) + SIGNAL_HANDLER + // When gaining NOHUNGER, we restore nutrition to normal levels, since we no longer interact with the hunger system + if(HAS_TRAIT(src, TRAIT_NOHUNGER)) + set_nutrition(NUTRITION_LEVEL_FED, forced = TRUE) + satiety = 0 + overeatduration = 0 + remove_traits(list(TRAIT_FAT, TRAIT_OFF_BALANCE_TACKLER), OBESITY) + else + hud_used?.hunger?.update_appearance() + mob_mood?.update_nutrition_moodlets() 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 74d2bedf3a7..04df6a70588 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -10,7 +10,6 @@ TRAIT_NODISMEMBER, TRAIT_NOHUNGER, TRAIT_NO_UNDERWEAR, - TRAIT_REMOTE_TASTING, TRAIT_VIRUSIMMUNE, ) mutanttongue = /obj/item/organ/internal/tongue/abductor @@ -19,7 +18,6 @@ mutantlungs = null mutantbrain = /obj/item/organ/internal/brain/abductor changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - ass_image = 'icons/ass/assgrey.png' bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/abductor, @@ -30,7 +28,6 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/abductor, ) - /datum/species/abductor/get_physical_attributes() 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." @@ -40,9 +37,66 @@ var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] abductor_hud.show_to(C) - C.set_safe_hunger_level() - /datum/species/abductor/on_species_loss(mob/living/carbon/C) . = ..() var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] abductor_hud.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." + +/datum/species/abductor/get_species_lore() + return list( + "Little are known about Abductors. \ + While they (as a species) have been known to abduct other species of 'lesser intellect' for experimentation, \ + some have been known to - on rare occasions - work with the very species they abduct, for reasons unknown.", + ) + +/datum/species/abductor/create_pref_traits_perks() + var/list/perks = list() + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_WIND, + SPECIES_PERK_NAME = "Lungs Optional", + SPECIES_PERK_DESC = "Abductors don't need to breathe, though exposure to a vacuum is still a hazard.", + )) + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_SHIELD, + SPECIES_PERK_NAME = "Resilient Skin", + SPECIES_PERK_DESC = "The grey (or gray) skin of an Abductor is tough and resistant. \ + They cannot be wounded or dismembered by conventional means.", + )) + return perks + +/datum/species/abductor/create_pref_unique_perks() + var/list/perks = list() + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_SYRINGE, + SPECIES_PERK_NAME = "Disease Immunity", + SPECIES_PERK_DESC = "Abductors are immune to all viral infections found naturally on the station.", + )) + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, // It may be a stretch to call nohunger a neutral perk but the Abductor's tongue describes it as much, so. + SPECIES_PERK_ICON = FA_ICON_UTENSILS, + SPECIES_PERK_NAME = "Hungry for Knowledge", + SPECIES_PERK_DESC = "Abductors have a greater hunger for knowledge than food, and as such don't need to eat. \ + Which is fortunate, as their speech matrix prevents them from consuming food.", + )) + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_VOLUME_XMARK, + SPECIES_PERK_NAME = "Superlingual Matrix", + SPECIES_PERK_DESC = "Abductors cannot physically speak with their natural tongue. \ + They intead naturally communicate telepathically to other Abductors, a process which all other species cannot hear. \ + Great for secret conversations, not so great for ordering something from the bar.", + )) + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_HANDSHAKE_SLASH, + SPECIES_PERK_NAME = "Tridactyl Hands", + SPECIES_PERK_DESC = "Abductor hands are not designed for human equipment. Utilizing the station's equipment is difficult for them.", + )) + return perks diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 2c006d2e936..86f745bb8be 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -47,12 +47,56 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/android, ) -/datum/species/android/on_species_gain(mob/living/carbon/C) - . = ..() - // Androids don't eat, hunger or metabolise foods. Let's do some cleanup. - C.set_safe_hunger_level() - /datum/species/android/get_physical_attributes() return "Androids are almost, but not quite, identical to fully augmented humans. \ Unlike those, though, they're completely immune to toxin damage, don't have blood or organs (besides their head), don't get hungry, and can reattach their limbs! \ That said, an EMP will devastate them and they cannot process any chemicals." + +/datum/species/android/get_species_description() + return "Androids are an entirely synthetic species." + +/datum/species/android/get_species_lore() + return list( + "Androids are a synthetic species created by Nanotrasen as an intermediary between humans and cyborgs." + ) + +/datum/species/android/create_pref_traits_perks() + var/list/perks = list() + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_SHIELD_ALT, + SPECIES_PERK_NAME = "Android Aptitude", + SPECIES_PERK_DESC = "As a synthetic lifeform, Androids are immune to many forms of damage humans are susceptible to. \ + Fire, cold, heat, pressure, radiation, and toxins are all ineffective against them. \ + They also can't overdose on drugs, don't need to breathe or eat, can't catch on fire, and are immune to being pierced.", + )) + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_COGS, + SPECIES_PERK_NAME = "Modular Lifeform", + SPECIES_PERK_DESC = "Android limbs are modular, allowing them to easily reattach severed bodyparts.", + )) + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_DNA, + SPECIES_PERK_NAME = "Not Human After All", + SPECIES_PERK_DESC = "There is no humanity behind the eyes of the Android, and as such, they have no DNA to genetically alter.", + )) + return perks + +/datum/species/android/create_pref_unique_perks() + var/list/perks = list() + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_SHIELD_HEART, + SPECIES_PERK_NAME = "Some Components Optional", + SPECIES_PERK_DESC = "Androids have very few internal organs. While they can survive without many of them, \ + they don't have any benefits from them either.", + )) + perks += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_ROBOT, + SPECIES_PERK_NAME = "Synthetic", + SPECIES_PERK_DESC = "Being synthetic, Androids are vulnernable to EMPs.", + )) + return perks 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 ce720e66789..85dda19024c 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -58,7 +58,6 @@ eyes.bodypart_insert(my_head) human.update_body() head.update_icon_dropped() - human.set_safe_hunger_level() RegisterSignal(head, COMSIG_QDELETING, PROC_REF(on_head_destroyed)) /// If we gained a new body part, it had better not be a head diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 0a92d858f96..af4cfd398fa 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -62,7 +62,6 @@ RegisterSignal(new_ethereal, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(refresh_light_color)) ethereal_light = new_ethereal.mob_light(light_type = /obj/effect/dummy/lighting_obj/moblight/species) refresh_light_color(new_ethereal) - new_ethereal.set_safe_hunger_level() update_mail_goodies(new_ethereal) var/obj/item/organ/internal/heart/ethereal/ethereal_heart = new_ethereal.get_organ_slot(ORGAN_SLOT_HEART) @@ -83,13 +82,6 @@ QDEL_NULL(ethereal_light) return ..() -/datum/species/ethereal/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list()) - if(istype(quirk, /datum/quirk/blooddeficiency)) - mail_goodies += list( - /obj/item/reagent_containers/blood/ethereal - ) - return ..() - /datum/species/ethereal/random_name(gender,unique,lastname) if(unique) return random_unique_ethereal_name() 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 3823c61ab03..0b5bc2d5c46 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -20,7 +20,6 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/felinid payday_modifier = 1.0 - ass_image = 'icons/ass/asscat.png' family_heirlooms = list(/obj/item/toy/cattoy) /// When false, this is a felinid created by mass-purrbation var/original_felinid = TRUE @@ -41,11 +40,19 @@ target_human.dna.features["tail_cat"] = "Cat" if(target_human.dna.features["ears"] == "None") target_human.dna.features["ears"] = "Cat" + /* SKYRAT EDIT -- START -- ORIGINAL + if(target_human.dna.features["ears"] == "None") + mutantears = /obj/item/organ/internal/ears + else + var/obj/item/organ/internal/ears/cat/ears = new(FALSE, target_human.dna.features["ears"]) + ears.Insert(target_human, movement_flags = DELETE_IF_REPLACED) + */ if(target_human.dna.features["ears"] == "Cat") var/obj/item/organ/internal/ears/cat/ears = new ears.Insert(target_human, movement_flags = DELETE_IF_REPLACED) else mutantears = /obj/item/organ/internal/ears + // SKYRAT EDIT -- END return ..() /datum/species/human/felinid/randomize_features(mob/living/carbon/human/human_mob) 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 612328e749e..8f2e1c964f4 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -65,6 +65,16 @@ 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." +/datum/species/golem/get_species_description() + return "Golems are lithoid creatures who eat rocks and minerals to survive and adapt." + +/datum/species/golem/get_species_lore() + return list( + "While Golems have long been commonly found on frontier worlds, peacefully mining and otherwise living in harmony with the environment, \ + it is believed they were originally constructed in Nanotrasen laboratories as a form of cheap labor. Whatever happened up to this point is unknown, \ + but they have since gained freedom and are now a rare sight in the galaxy.", + ) + /datum/species/golem/create_pref_unique_perks() var/list/to_add = list() 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 96f91f6a379..a1c3a245034 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -30,8 +30,9 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT inherent_factions = list(FACTION_SLIME) species_language_holder = /datum/language_holder/jelly - ass_image = 'icons/ass/assslime.png' - + hair_color = "mutcolor" + hair_alpha = 150 + facial_hair_alpha = 150 bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/jelly, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/jelly, @@ -49,61 +50,49 @@ regenerate_limbs = new regenerate_limbs.Grant(new_jellyperson) update_mail_goodies(new_jellyperson) - //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION - alter_form = new - alter_form.Grant(new_jellyperson) - //SKYRAT EDIT ADDITION END + alter_form = new //SKYRAT EDIT CUSTOMIZATION + alter_form.Grant(new_jellyperson) //SKYRAT EDIT CUSTOMIZATION + new_jellyperson.AddElement(/datum/element/soft_landing) + RegisterSignal(new_jellyperson, COMSIG_HUMAN_ON_HANDLE_BLOOD, PROC_REF(slime_blood)) /datum/species/jelly/on_species_loss(mob/living/carbon/former_jellyperson, datum/species/new_species, pref_load) if(regenerate_limbs) regenerate_limbs.Remove(former_jellyperson) - //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION - if(alter_form) - alter_form.Remove(former_jellyperson) - //SKYRAT EDIT ADDITION END + + if(alter_form) //SKYRAT EDIT CUSTOMIZATION + alter_form.Remove(former_jellyperson) //SKYRAT EDIT CUSTOMIZATION + former_jellyperson.RemoveElement(/datum/element/soft_landing) - + UnregisterSignal(former_jellyperson, COMSIG_HUMAN_ON_HANDLE_BLOOD) return ..() -/datum/species/jelly/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list()) - if(istype(quirk, /datum/quirk/blooddeficiency)) - mail_goodies += list( - /obj/item/reagent_containers/blood/toxin - ) - return ..() +/datum/species/jelly/proc/slime_blood(mob/living/carbon/human/slime, seconds_per_tick, times_fired) + SIGNAL_HANDLER -/datum/species/jelly/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) - . = ..() - if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely - return + if(slime.stat == DEAD) + return HANDLE_BLOOD_HANDLED - if(!H.blood_volume) - H.blood_volume += JELLY_REGEN_RATE_EMPTY * seconds_per_tick - H.adjustBruteLoss(2.5 * seconds_per_tick) - to_chat(H, span_danger("You feel empty!")) + if(slime.blood_volume <= 0) + slime.blood_volume += JELLY_REGEN_RATE_EMPTY * seconds_per_tick + slime.adjustBruteLoss(2.5 * seconds_per_tick) + to_chat(slime, span_danger("You feel empty!")) - if(H.blood_volume < BLOOD_VOLUME_NORMAL) - if(H.nutrition >= NUTRITION_LEVEL_STARVING) - H.blood_volume += JELLY_REGEN_RATE * seconds_per_tick - if(H.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 - H.adjust_nutrition(-1.25 * seconds_per_tick) + if(slime.blood_volume < BLOOD_VOLUME_NORMAL) + if(slime.nutrition >= NUTRITION_LEVEL_STARVING) + slime.blood_volume += JELLY_REGEN_RATE * 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_nutrition(-1.25 * seconds_per_tick) - // we call lose_blood() here rather than quirk/process() to make sure that the blood loss happens in sync with life() - if(HAS_TRAIT(H, TRAIT_BLOOD_DEFICIENCY)) - var/datum/quirk/blooddeficiency/blooddeficiency = H.get_quirk(/datum/quirk/blooddeficiency) - if(!isnull(blooddeficiency)) - blooddeficiency.lose_blood(seconds_per_tick) - - if(H.blood_volume < BLOOD_VOLUME_OKAY) + if(slime.blood_volume < BLOOD_VOLUME_OKAY) if(SPT_PROB(2.5, seconds_per_tick)) - to_chat(H, span_danger("You feel drained!")) + to_chat(slime, span_danger("You feel drained!")) - if(H.blood_volume < BLOOD_VOLUME_BAD) - Cannibalize_Body(H) + if(slime.blood_volume < BLOOD_VOLUME_BAD) + Cannibalize_Body(slime) - if(regenerate_limbs) - regenerate_limbs.build_all_button_icons() + regenerate_limbs?.build_all_button_icons(UPDATE_BUTTON_STATUS) + return HANDLE_BLOOD_NO_NUTRITION_DRAIN|HANDLE_BLOOD_NO_EFFECTS /datum/species/jelly/proc/Cannibalize_Body(mob/living/carbon/human/H) var/list/limbs_to_consume = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - H.get_missing_limbs() @@ -119,6 +108,20 @@ qdel(consumed_limb) H.blood_volume += 20 +/datum/species/jelly/get_species_description() + return "Jellypeople are a strange and alien species with three eyes, made entirely out of gel." + +/datum/species/jelly/get_species_lore() + return list( + "Jellypeople are actively being experimented on my Nanotrasen scientists, who are trying to unlock the secrets of their unique biology.", + ) + +/datum/species/jelly/prepare_human_for_preview(mob/living/carbon/human/human) + human.dna.features["mcolor"] = COLOR_PINK + human.hairstyle = "Bob Hair 2" + human.hair_color = COLOR_PINK + human.update_body(is_creating = TRUE) + // Slimes have both TRAIT_NOBLOOD and an exotic bloodtype set, so they need to be handled uniquely here. // They may not be roundstart but in the unlikely event they become one might as well not leave a glaring issue open. /datum/species/jelly/create_pref_blood_perks() @@ -183,9 +186,6 @@ name = "\improper Slimeperson" plural_form = "Slimepeople" id = SPECIES_SLIMEPERSON - hair_color = "mutcolor" - hair_alpha = 150 - facial_hair_alpha = 150 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT mutanteyes = /obj/item/organ/internal/eyes var/datum/action/innate/split_body/slime_split @@ -193,12 +193,12 @@ var/datum/action/innate/swap_body/swap_body bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/slime, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/slime, - BODY_ZONE_HEAD = /obj/item/bodypart/head/slime, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/slime, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/slime, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/slime, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/jelly/slime, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/jelly/slime, + BODY_ZONE_HEAD = /obj/item/bodypart/head/jelly/slime, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/jelly/slime, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/jelly/slime, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly/slime, ) /datum/species/jelly/slime/get_physical_attributes() @@ -493,12 +493,12 @@ id = SPECIES_LUMINESCENT examine_limb_id = SPECIES_LUMINESCENT bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/luminescent, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/luminescent, - BODY_ZONE_HEAD = /obj/item/bodypart/head/luminescent, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/luminescent, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/luminescent, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/luminescent, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/jelly/luminescent, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/jelly/luminescent, + BODY_ZONE_HEAD = /obj/item/bodypart/head/jelly/luminescent, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/jelly/luminescent, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/jelly/luminescent, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly/luminescent, ) mutanteyes = /obj/item/organ/internal/eyes /// How strong is our glow 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 81b7d5d79f5..94dbe677949 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -34,8 +34,6 @@ bodytemp_heat_damage_limit = BODYTEMP_HEAT_LAVALAND_SAFE bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 10) - ass_image = 'icons/ass/asslizard.png' - bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/lizard, BODY_ZONE_CHEST = /obj/item/bodypart/chest/lizard, @@ -45,18 +43,6 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/lizard, ) -/datum/species/lizard/on_species_gain(mob/living/carbon/new_lizard, datum/species/old_species, pref_load) - . = ..() - if(ishuman(new_lizard)) - update_mail_goodies(new_lizard) - -/datum/species/lizard/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list()) - if(istype(quirk, /datum/quirk/blooddeficiency)) - mail_goodies += list( - /obj/item/reagent_containers/blood/lizard - ) - return ..() - /// Lizards are cold blooded and do not stabilize body temperature naturally /datum/species/lizard/body_temperature_core(mob/living/carbon/human/humi, seconds_per_tick, times_fired) return diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index b6fe0234bac..ba6e9619a2f 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -51,22 +51,23 @@ // This effects how fast body temp stabilizes, also if cold resit is lost on the mob bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 50) // about -50c - ass_image = 'icons/ass/assplasma.png' - outfit_override_registry = list( /datum/outfit/syndicate = /datum/outfit/syndicate/plasmaman, /datum/outfit/syndicate/full = /datum/outfit/syndicate/full/plasmaman, /datum/outfit/syndicate/leader = /datum/outfit/syndicate/leader/plasmaman, /datum/outfit/syndicate/reinforcement = /datum/outfit/syndicate/reinforcement/plasmaman, + /datum/outfit/syndicate/reinforcement/cybersun = /datum/outfit/syndicate/reinforcement/plasmaman, + /datum/outfit/syndicate/reinforcement/donk = /datum/outfit/syndicate/reinforcement/plasmaman, + /datum/outfit/syndicate/reinforcement/gorlex = /datum/outfit/syndicate/reinforcement/plasmaman, + /datum/outfit/syndicate/reinforcement/interdyne = /datum/outfit/syndicate/reinforcement/plasmaman, + /datum/outfit/syndicate/reinforcement/mi13 = /datum/outfit/syndicate/reinforcement/plasmaman, + /datum/outfit/syndicate/reinforcement/waffle = /datum/outfit/syndicate/reinforcement/plasmaman, + /datum/outfit/syndicate/support = /datum/outfit/syndicate/support/plasmaman, ) /// If the bones themselves are burning clothes won't help you much var/internal_fire = FALSE -/datum/species/plasmaman/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - . = ..() - C.set_safe_hunger_level() - /datum/species/plasmaman/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) . = ..() var/atmos_sealed = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 5cf2355c86c..38e75704795 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -29,20 +29,6 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/pod, ) - ass_image = 'icons/ass/asspodperson.png' - -/datum/species/pod/on_species_gain(mob/living/carbon/new_podperson, datum/species/old_species, pref_load) - . = ..() - if(ishuman(new_podperson)) - update_mail_goodies(new_podperson) - -/datum/species/pod/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list()) - if(istype(quirk, /datum/quirk/blooddeficiency)) - mail_goodies += list( - /obj/item/reagent_containers/blood/podperson - ) - return ..() - /datum/species/pod/spec_life(mob/living/carbon/human/podperson, seconds_per_tick, times_fired) . = ..() if(podperson.stat == DEAD) @@ -74,10 +60,26 @@ if(chem.type == /datum/reagent/toxin/plantbgone) affected.adjustToxLoss(3 * REM * seconds_per_tick) +/datum/species/pod/prepare_human_for_preview(mob/living/carbon/human/human) + human.dna.features["mcolor"] = "#886600" + human.dna.features["pod_hair"] = "Rose" + human.update_body(is_creating = TRUE) + /datum/species/pod/get_physical_attributes() return "Podpeople are in many ways the inverse of shadows, healing in light and starving with the dark. \ Their bodies are like tinder and easy to char." +/datum/species/pod/get_species_description() + return "Podpeople are largely peaceful plant based lifeforms, resembling a humanoid figure made of leaves, flowers, and vines." + +/datum/species/pod/get_species_lore() + return list( + "Not much is known about the origins of the Podpeople. \ + Many assume them to be the result of a long forgotten botanical experiment, slowly mutating for years on years until they became the beings they are today. \ + Ever since they were uncovered long ago, their kind have been found on board stations and planets across the galaxy, \ + often working in hydroponics bays, kitchens, or science departments, working with plants and other botanical lifeforms.", + ) + /datum/species/pod/create_pref_unique_perks() var/list/to_add = list() 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 8160ba6a901..f5c849cc215 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -45,10 +45,6 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/skeleton, ) -/datum/species/skeleton/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - . = ..() - C.set_safe_hunger_level() - /datum/species/skeleton/check_roundstart_eligible() if(check_holidays(HALLOWEEN)) return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 6f2f12ebe03..4c754702f6d 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -1,5 +1,6 @@ /datum/species/snail - name = "Snailperson" + name = "\improper Snailperson" + plural_form = "Snailpeople" id = SPECIES_SNAIL inherent_traits = list( TRAIT_MUTANT_COLORS, @@ -26,11 +27,52 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/snail ) +/datum/species/snail/prepare_human_for_preview(mob/living/carbon/human/human) + human.dna.features["mcolor"] = COLOR_BEIGE + human.update_body(is_creating = TRUE) /datum/species/snail/get_physical_attributes() return "Snailpeople emit a viscous, slippery ooze when crawling along the ground, which they are somewhat faster at than other species. \ They are almost purely made of water, making them extremely susceptible to shocks, and salt will scour them heavily." +/datum/species/snail/get_species_description() + return "Snailpeople are viscous, slimy beings with a shell on their back." + +/datum/species/snail/get_species_lore() + return list( + "Normally, Snailpeople are a result of a genetic experiment gone wrong, but they have since become recognized species in their own right, \ + similar to the Felinid.", + ) + +/datum/species/snail/create_pref_unique_perks() + var/list/to_add = list() + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_RUNNING, + SPECIES_PERK_NAME = "Turbo", + SPECIES_PERK_DESC = "Snailpeople walk and run very slow, but crawl around very fast. While crawling, they leave a trail of slippery slime behind them.", + )) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_SHRIMP, + SPECIES_PERK_NAME = "Shelled", + SPECIES_PERK_DESC = "The back of a Snailperson is covered in an armored shell, which is effectively an unremovable backpack. \ + Good for keeping your things from being stolen, but bad for needing to wear a MODsuit, or disguising.", + )) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_SKULL_CROSSBONES, + SPECIES_PERK_NAME = "Salty", + SPECIES_PERK_DESC = "Being evolved from Snails, Snailpeople are extremely susceptible to salt, which burns them.", + )) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_HAND_FIST, + SPECIES_PERK_NAME = "Squishy", + SPECIES_PERK_DESC = "Snailpeople are squishy and slimy, making their punches and kicks far less effective than other species.", + )) + return to_add + /datum/species/snail/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) . = ..() if(. & COMSIG_MOB_STOP_REAGENT_CHECK) @@ -48,8 +90,6 @@ if(new_snailperson.dropItemToGround(bag)) //returns TRUE even if its null new_snailperson.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(new_snailperson), ITEM_SLOT_BACK) new_snailperson.AddElement(/datum/element/snailcrawl) - if(ishuman(new_snailperson)) - update_mail_goodies(new_snailperson) /datum/species/snail/on_species_loss(mob/living/carbon/former_snailperson, datum/species/new_species, pref_load) . = ..() @@ -60,13 +100,6 @@ former_snailperson.temporarilyRemoveItemFromInventory(bag, TRUE) qdel(bag) -/datum/species/snail/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list()) - if(istype(quirk, /datum/quirk/blooddeficiency)) - mail_goodies += list( - /obj/item/reagent_containers/blood/snail - ) - return ..() - /obj/item/storage/backpack/snail name = "snail shell" desc = "Worn by snails as armor and storage compartment." @@ -94,4 +127,4 @@ /obj/item/storage/backpack/snail/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_NODROP, "snailshell") + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) 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 427f1f5f71b..111b35cb7f7 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -39,7 +39,6 @@ to_chat(new_vampire, "[info_text]") new_vampire.skin_tone = "albino" new_vampire.update_body(0) - new_vampire.set_safe_hunger_level() RegisterSignal(new_vampire, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(damage_weakness)) /datum/species/vampire/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) @@ -152,7 +151,7 @@ /obj/item/organ/internal/tongue/vampire name = "vampire tongue" actions_types = list(/datum/action/item_action/organ_action/vampire) - color = "#1C1C1C" + color = COLOR_CRAYON_BLACK COOLDOWN_DECLARE(drain_cooldown) /datum/action/item_action/organ_action/vampire @@ -187,7 +186,7 @@ victim.show_message(span_warning("[H] tries to bite you, but recoils in disgust!")) to_chat(H, span_warning("[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.")) return - if(!do_after(H, 3 SECONDS, target = victim)) + if(!do_after(H, 3 SECONDS, target = victim, hidden = TRUE)) return var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood var/drained_blood = min(victim.blood_volume, VAMP_DRAIN_AMOUNT, blood_volume_difference) @@ -201,7 +200,7 @@ /obj/item/organ/internal/heart/vampire name = "vampire heart" - color = "#1C1C1C" + color = COLOR_CRAYON_BLACK /obj/item/organ/internal/heart/vampire/on_mob_insert(mob/living/carbon/receiver) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 39903878ec4..b685e18b018 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -14,6 +14,7 @@ TRAIT_LIVERLESS_METABOLISM, TRAIT_NOBREATH, TRAIT_NODEATH, + TRAIT_NOCRITDAMAGE, TRAIT_NOHUNGER, TRAIT_NO_DNA_COPY, TRAIT_NO_ZOMBIFY, @@ -106,6 +107,7 @@ TRAIT_LIMBATTACHMENT, TRAIT_LIVERLESS_METABOLISM, TRAIT_NOBREATH, + TRAIT_NOCRITDAMAGE, TRAIT_NODEATH, TRAIT_NOHUNGER, TRAIT_NO_DNA_COPY, diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index b9b5fd0b365..fd9bd8f2c5a 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -10,6 +10,7 @@ return if(check_stun_immunity(CANKNOCKDOWN)) return + SEND_SIGNAL(src, COMSIG_CARBON_ENTER_STAMCRIT) to_chat(src, span_notice("You're too exhausted to keep going...")) add_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_FLOORED), STAMINA) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 93373d2bf0d..b62aa1cde9d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -425,10 +425,6 @@ span_warning("[src] grabs you passively!"), null, null, src) to_chat(src, span_notice("You grab [M] passively!")) - if(!iscarbon(src)) - M.LAssailant = null - else - M.LAssailant = WEAKREF(usr) if(isliving(M)) var/mob/living/L = M @@ -524,7 +520,7 @@ log_message("points at [pointing_at]", LOG_EMOTE) visible_message("[span_name("[src]")] points at [pointing_at].", span_notice("You point at [pointing_at].")) -/mob/living/verb/succumb(whispered as null) +/mob/living/verb/succumb(whispered as num|null) set hidden = TRUE if (!CAN_SUCCUMB(src)) if(HAS_TRAIT(src, TRAIT_SUCCUMB_OVERRIDE)) @@ -976,6 +972,8 @@ // I don't really care to keep this under a flag set_nutrition(NUTRITION_LEVEL_FED + 50) + overeatduration = 0 + satiety = 0 // These should be tracked by status effects losebreath = 0 @@ -1127,6 +1125,20 @@ else return pick("trails_1", "trails_2") +/// Print a message about an annoying sensation you are feeling. Returns TRUE if successful. +/mob/living/proc/itch(obj/item/bodypart/target_part = null, damage = 0.5, can_scratch = TRUE, silent = FALSE) + if ((mob_biotypes & (MOB_ROBOTIC | MOB_SPIRIT))) + return FALSE + var/will_scratch = can_scratch && !incapacitated() + var/applied_damage = 0 + if (will_scratch && damage) + applied_damage = apply_damage(damage, damagetype = BRUTE, def_zone = target_part) + if (silent) + return applied_damage > 0 + var/visible_part = isnull(target_part) ? "side" : target_part.plaintext_zone + visible_message("[can_scratch ? span_warning("[src] scratches [p_their()] [visible_part].") : ""]", span_warning("Your [visible_part] itches. [can_scratch ? "You scratch it." : ""]")) + return TRUE + /mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE) if(buckled || mob_negates_gravity()) @@ -1342,19 +1354,19 @@ //basic fast checks go first. When overriding this proc, I recommend calling ..() at the end. if(SEND_SIGNAL(src, COMSIG_LIVING_CAN_TRACK, user) & COMPONENT_CANT_TRACK) return FALSE - var/turf/T = get_turf(src) - if(!T) + if(!isnull(user) && src == user) return FALSE + if(invisibility || alpha <= 50)//cloaked + return FALSE + if(!isturf(src.loc)) //The reason why we don't just use get_turf is because they could be in a closet, disposals, or a vehicle. + return FALSE + var/turf/T = src.loc if(is_centcom_level(T.z)) //dont detect mobs on centcom return FALSE if(is_away_level(T.z)) return FALSE if(onSyndieBase() && !(ROLE_SYNDICATE in user?.faction)) return FALSE - if(!isnull(user) && src == user) - return FALSE - if(invisibility || alpha == 0)//cloaked - return FALSE // Now, are they viewable by a camera? (This is last because it's the most intensive check) if(!GLOB.cameranet.checkCameraVis(src)) return FALSE @@ -1384,7 +1396,7 @@ return FALSE if(!Adjacent(target) && (target.loc != src) && !recursive_loc_check(src, target)) - if(issilicon(src) && !ispAI(src)) + if(HAS_SILICON_ACCESS(src) && !ispAI(src)) if(!(action_bitflags & ALLOW_SILICON_REACH)) // silicons can ignore range checks (except pAIs) to_chat(src, span_warning("You are too far away!")) return FALSE @@ -1514,7 +1526,7 @@ created_robot.clear_zeroth_law(announce = FALSE) if(WABBAJACK_SLIME) - new_mob = new /mob/living/simple_animal/slime/random(loc) + new_mob = new /mob/living/basic/slime/random(loc) if(WABBAJACK_XENO) var/picked_xeno_type @@ -1527,7 +1539,7 @@ else picked_xeno_type = pick( /mob/living/carbon/alien/adult/hunter, - /mob/living/simple_animal/hostile/alien/sentinel, + /mob/living/basic/alien/sentinel, ) new_mob = new picked_xeno_type(loc) @@ -1826,32 +1838,34 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/update_z(new_z) // 1+ to register, null to unregister - if (registered_z != new_z) - if (registered_z) - SSmobs.clients_by_zlevel[registered_z] -= src - if (client) - if (new_z) - //Figure out how many clients were here before - var/oldlen = SSmobs.clients_by_zlevel[new_z].len - SSmobs.clients_by_zlevel[new_z] += src - for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511 - var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I] - if (SA) - if(oldlen == 0) - //Start AI idle if nobody else was on this z level before (mobs will switch off when this is the case) - SA.toggle_ai(AI_IDLE) + if(registered_z == new_z) + return + if(registered_z) + SSmobs.clients_by_zlevel[registered_z] -= src + if(isnull(client)) + registered_z = null + return - //If they are also within a close distance ask the AI if it wants to wake up - if(get_dist(get_turf(src), get_turf(SA)) < MAX_SIMPLEMOB_WAKEUP_RANGE) - SA.consider_wakeup() // Ask the mob if it wants to turn on it's AI - //They should clean up in destroy, but often don't so we get them here - else - SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA + //Check the amount of clients exists on the Z level we're leaving from, + //this excludes us as we haven't added ourselves to the new z level yet. + var/old_level_new_clients = (registered_z ? SSmobs.clients_by_zlevel[registered_z].len : null) + //No one is left after we're gone, shut off inactive ones + if(registered_z && old_level_new_clients == 0) + for(var/datum/ai_controller/controller as anything in SSai_controllers.ai_controllers_by_zlevel[registered_z]) + controller.set_ai_status(AI_STATUS_OFF) + + //Check the amount of clients exists on the Z level we're moving towards, excluding ourselves. + var/new_level_old_clients = SSmobs.clients_by_zlevel[new_z].len + registered_z = new_z + //We'll add ourselves to the list now so get_expected_ai_status() will know we're on the z level. + SSmobs.clients_by_zlevel[registered_z] += src - registered_z = new_z - else - registered_z = null + if(new_level_old_clients == 0) //No one was here before, wake up all the AIs. + for (var/datum/ai_controller/controller as anything in SSai_controllers.ai_controllers_by_zlevel[new_z]) + //We don't set them directly on, for instances like AIs acting while dead and other cases that may exist in the future. + //This isn't a problem for AIs with a client since the client will prevent this from being called anyway. + controller.set_ai_status(controller.get_expected_ai_status()) /mob/living/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) ..() @@ -1863,7 +1877,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) var/mob/living/M = dropping if(M.can_be_held && U.pulling == M) return M.mob_try_pickup(U) //SKYRAT EDIT CHANGE //blame kevinz dont open the mobs inventory if you are picking them up - . = ..() + return ..() /mob/living/proc/mob_pickup(mob/living/user) var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags) @@ -1871,7 +1885,8 @@ GLOBAL_LIST_EMPTY(fire_appearances) user.put_in_hands(holder) /mob/living/proc/set_name() - numba = rand(1, 1000) + if(!numba) + numba = rand(1, 1000) name = "[name] ([numba])" real_name = name @@ -2332,6 +2347,9 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/is_face_visible() return TRUE +/// Sprite to show for photocopying mob butts +/mob/living/proc/get_butt_sprite() + return null ///Proc to modify the value of num_legs and hook behavior associated to this event. /mob/living/proc/set_num_legs(new_value) @@ -2399,27 +2417,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/carbon/human/will_escape_storage() return TRUE -/// Sets the mob's hunger levels to a safe overall level. Useful for TRAIT_NOHUNGER species changes. -/mob/living/proc/set_safe_hunger_level() - // Nutrition reset and alert clearing. - nutrition = NUTRITION_LEVEL_FED - clear_alert(ALERT_NUTRITION) - satiety = 0 - - // Trait removal if obese - if(HAS_TRAIT_FROM(src, TRAIT_FAT, OBESITY)) - if(overeatduration >= (200 SECONDS)) - to_chat(src, span_notice("Your transformation restores your body's natural fitness!")) - - REMOVE_TRAIT(src, TRAIT_FAT, OBESITY) - remove_movespeed_modifier(/datum/movespeed_modifier/obesity) - update_worn_undersuit() - update_worn_oversuit() - - // Reset overeat duration. - overeatduration = 0 - - /// Changes the value of the [living/body_position] variable. Call this before set_lying_angle() /mob/living/proc/set_body_position(new_value) if(body_position == new_value) @@ -2633,6 +2630,26 @@ GLOBAL_LIST_EMPTY(fire_appearances) SEND_SIGNAL(src, COMSIG_LIVING_UNFRIENDED, old_friend) return TRUE +/** + * Common proc used to deduct money from cargo, announce the kidnapping and add src to the black market. + * Returns the black market item, for extra stuff like signals that need to be registered. + */ +/mob/living/proc/process_capture(ransom_price, black_market_price) + if(ransom_price > 0) + var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) + + if(cargo_account) //Just in case + cargo_account.adjust_money(-min(ransom_price, cargo_account.account_balance)) //Not so much, especially for competent cargo. Plus this can't be mass-triggered like it has been done with contractors + priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. As is policy we've taken a portion of the station's funds to offset the overall cost.", "Nanotrasen Asset Protection", has_important_message = TRUE) + + ///The price should be high enough that the contractor can't just buy 'em back with their cut alone. + var/datum/market_item/hostage/market_item = new(src, black_market_price || ransom_price) + SSblackmarket.markets[/datum/market/blackmarket].add_item(market_item) + + if(mind) + ADD_TRAIT(mind, TRAIT_HAS_BEEN_KIDNAPPED, TRAIT_GENERIC) + return market_item + /// Admin only proc for making the mob hallucinate a certain thing /mob/living/proc/admin_give_hallucination(mob/admin) if(!admin || !check_rights(NONE)) @@ -2674,10 +2691,9 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(isnull(guardian_client)) return else if(guardian_client == "Poll Ghosts") - var/list/candidates = SSpolling.poll_ghost_candidates("Do you want to play as an admin created Guardian Spirit of [real_name]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_HOLOPARASITE, pic_source = src, role_name_text = "guardian spirit") - if(LAZYLEN(candidates)) - var/mob/dead/observer/candidate = pick(candidates) - guardian_client = candidate.client + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Do you want to play as an admin created [span_notice("Guardian Spirit")] of [span_danger(real_name)]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_HOLOPARASITE, alert_pic = mutable_appearance('icons/mob/nonhuman-player/guardian.dmi', "magicexample"), jump_target = src, role_name_text = "guardian spirit", amount_to_pick = 1) + if(chosen_one) + guardian_client = chosen_one.client else tgui_alert(admin, "No ghost candidates.", "Guardian Controller") return @@ -2724,3 +2740,20 @@ GLOBAL_LIST_EMPTY(fire_appearances) end_look_down() else look_down() + +/** + * Totals the physical cash on the mob and returns the total. + */ +/mob/living/verb/tally_physical_credits() + //Here is all the possible non-ID payment methods. + var/list/counted_money = list() + var/physical_cash_total = 0 + for(var/obj/item/credit as anything in typecache_filter_list(get_all_contents(), GLOB.allowed_money)) //Coins, cash, and credits. + physical_cash_total += credit.get_item_credit_value() + counted_money += credit + + if(is_type_in_typecache(pulling, GLOB.allowed_money)) //Coins(Pulled). + var/obj/item/counted_credit = pulling + physical_cash_total += counted_credit.get_item_credit_value() + counted_money += counted_credit + return round(physical_cash_total) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 262df8c99b5..5746799e5f8 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -512,7 +512,8 @@ ///As the name suggests, this should be called to apply electric shocks. /mob/living/proc/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage, source, siemens_coeff, flags) + if(SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage, source, siemens_coeff, flags) & COMPONENT_LIVING_BLOCK_SHOCK) + return FALSE shock_damage *= siemens_coeff if((flags & SHOCK_TESLA) && HAS_TRAIT(src, TRAIT_TESLA_SHOCKIMMUNE)) return FALSE @@ -556,8 +557,8 @@ if((GLOB.cult_narsie.souls == GLOB.cult_narsie.soul_goal) && (GLOB.cult_narsie.resolved == FALSE)) GLOB.cult_narsie.resolved = TRUE sound_to_playing_players('sound/machines/alarm.ogg') - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), CULT_VICTORY_MASS_CONVERSION), 120) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)), 270) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), CULT_VICTORY_MASS_CONVERSION), 12 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)), 27 SECONDS) if(client) make_new_construct(/mob/living/basic/construct/harvester, src, cultoverride = TRUE) else diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 6a3da367ebc..a364c5691de 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -99,17 +99,28 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return new_msg -/mob/living/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/living/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(), +) if(sanitize) message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) if(!message || message == "") return - var/list/message_mods = list() var/original_message = message message = get_message_mods(message, message_mods) saymode = SSradio.saymodes[message_mods[RADIO_KEY]] - if (!forced) + if (!forced && !saymode) message = check_for_custom_say_emote(message, message_mods) if(!message) @@ -211,7 +222,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( message = "[randomnote] [message] [randomnote]" spans |= SPAN_SINGING - if(LAZYACCESS(message_mods,WHISPER_MODE)) // whisper away + if(message_mods[WHISPER_MODE]) // whisper away spans |= SPAN_ITALICS if(!message) @@ -232,6 +243,9 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return var/radio_return = radio(message, message_mods, spans, language)//roughly 27% of living/say()'s total cost + if(radio_return & NOPASS) + return TRUE + if(radio_return & ITALICS) spans |= SPAN_ITALICS if(radio_return & REDUCE_RANGE) @@ -239,8 +253,6 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(!message_mods[WHISPER_MODE]) message_mods[WHISPER_MODE] = MODE_WHISPER message_mods[SAY_MOD_VERB] = say_mod(message, message_mods) - if(radio_return & NOPASS) - return TRUE //No screams in space, unless you're next to someone. var/turf/T = get_turf(src) @@ -436,38 +448,6 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( /mob/proc/binarycheck() return FALSE -/mob/living/try_speak(message, ignore_spam = FALSE, forced = null, filterproof = FALSE) - if(!..()) - return FALSE - var/sigreturn = SEND_SIGNAL(src, COMSIG_LIVING_TRY_SPEECH, message, ignore_spam, forced) - if(sigreturn & COMPONENT_CAN_ALWAYS_SPEAK) - return TRUE - - if(sigreturn & COMPONENT_CANNOT_SPEAK) - return FALSE - - if(!can_speak()) - if(HAS_MIND_TRAIT(src, TRAIT_MIMING)) - to_chat(src, span_green("Your vow of silence prevents you from speaking!")) - else - to_chat(src, span_warning("You find yourself unable to speak!")) - return FALSE - - return TRUE - -/mob/living/can_speak(allow_mimes = FALSE) - if(!allow_mimes && HAS_MIND_TRAIT(src, TRAIT_MIMING)) - return FALSE - - if(HAS_TRAIT(src, TRAIT_MUTE)) - return FALSE - - if(is_muzzled()) - return FALSE - - return TRUE - - /** * Treats the passed message with things that may modify speech (stuttering, slurring etc). * diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 46d30b893de..5f7571186be 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -30,7 +30,7 @@ radio = /obj/item/radio/headset/silicon/ai can_buckle_to = FALSE var/battery = 200 //emergency power if the AI's APC is off - var/list/network = list("ss13") + var/list/network = list(CAMERANET_NETWORK_SS13) var/obj/machinery/camera/current var/list/connected_robots = list() var/aiRestorePowerRoutine = POWER_RESTORATION_OFF @@ -188,7 +188,7 @@ GLOB.shuttle_caller_list += src builtInCamera = new (src) - builtInCamera.network = list("ss13") + builtInCamera.network = list(CAMERANET_NETWORK_SS13) ai_tracking_tool = new(src) RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) @@ -655,13 +655,14 @@ var/mob/living/silicon/ai/U = usr for (var/obj/machinery/camera/C in GLOB.cameranet.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 - if(!(is_station_level(C.z) || is_mining_level(C.z) || ("ss13" in tempnetwork))) + if(!camera_turf || !(is_station_level(camera_turf.z) || is_mining_level(camera_turf.z) || (CAMERANET_NETWORK_SS13 in tempnetwork))) continue if(!C.can_use()) continue - - tempnetwork.Remove("rd", "ordnance", "prison") + tempnetwork.Remove(CAMERANET_NETWORK_RD, CAMERANET_NETWORK_ORDNANCE, CAMERANET_NETWORK_PRISON) if(length(tempnetwork)) for(var/i in C.network) cameralist[i] = i diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index 78519109101..d655ce03a33 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -1,5 +1,17 @@ -/mob/living/silicon/ai/say(message, bubble_type,list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) - if(parent && istype(parent) && parent.stat != DEAD) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead. +/mob/living/silicon/ai/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(), +) + if(istype(parent) && parent.stat != DEAD) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead. return parent.say(arglist(args)) return ..() @@ -47,7 +59,7 @@ else padloc = "(UNKNOWN)" src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]") - ai_holo.say(message, language = language) + ai_holo.say(message, sanitize = FALSE, language = language) else to_chat(src, span_alert("No holopad connected.")) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 966db2b7697..76f5c2eec93 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -31,7 +31,7 @@ if(!lacks_power()) var/area/home = get_area(src) if(home.powered(AREA_USAGE_EQUIP)) - home.use_power(500 * seconds_per_tick, AREA_USAGE_EQUIP) + home.apc?.terminal?.use_energy(500 WATTS * seconds_per_tick, channel = AREA_USAGE_EQUIP) if(aiRestorePowerRoutine >= POWER_RESTORATION_SEARCH_APC) ai_restore_power() @@ -164,4 +164,4 @@ adjust_temp_blindness(2 SECONDS) update_sight() to_chat(src, span_alert("You've lost power!")) - addtimer(CALLBACK(src, PROC_REF(start_RestorePowerRoutine)), 20) + addtimer(CALLBACK(src, PROC_REF(start_RestorePowerRoutine)), 2 SECONDS) diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 45924e2fe98..8980a1017f2 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -172,15 +172,13 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) add = visible - cameras_telegraphed remove = cameras_telegraphed - visible - for (var/V in remove) - var/obj/machinery/camera/C = V + for (var/obj/machinery/camera/C as anything in remove) if(QDELETED(C)) continue cameras_telegraphed -= C C.in_use_lights-- C.update_appearance() - for (var/V in add) - var/obj/machinery/camera/C = V + for (var/obj/machinery/camera/C as anything in add) if(QDELETED(C)) continue cameras_telegraphed |= C @@ -189,8 +187,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) /mob/camera/ai_eye/pic_in_pic/proc/disable_camera_telegraphing() telegraph_cameras = FALSE - for (var/V in cameras_telegraphed) - var/obj/machinery/camera/C = V + for (var/obj/machinery/camera/C as anything in cameras_telegraphed) if(QDELETED(C)) continue C.in_use_lights-- diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 81026bf11b9..3a8cec66efd 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -25,7 +25,7 @@ locked = FALSE //unlock cover - if(!QDELETED(builtInCamera) && builtInCamera.status) + if(!QDELETED(builtInCamera) && builtInCamera.camera_enabled) builtInCamera.toggle_cam(src,0) toggle_headlamp(TRUE) //So borg lights are disabled when killed. diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index be713b429a6..a28718c8c83 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -157,7 +157,7 @@ audible_message(span_warning("[src] sounds an alarm! \"CRITICAL ERROR: ALL modules OFFLINE.\"")) if(builtInCamera) - builtInCamera.status = FALSE + builtInCamera.camera_enabled = FALSE to_chat(src, span_userdanger("CRITICAL ERROR: Built in security camera OFFLINE.")) to_chat(src, span_userdanger("CRITICAL ERROR: ALL modules OFFLINE.")) @@ -211,7 +211,7 @@ inv1.icon_state = initial(inv1.icon_state) disabled_modules &= ~BORG_MODULE_ALL_DISABLED if(builtInCamera) - builtInCamera.status = TRUE + builtInCamera.camera_enabled = TRUE to_chat(src, span_notice("You hear your built in security camera focus adjust as it comes back online!")) if(BORG_CHOOSE_MODULE_TWO) if(!(disabled_modules & BORG_MODULE_TWO_DISABLED)) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index ae56f65b0cd..2a9631339fc 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -14,14 +14,14 @@ if(cell?.charge) low_power_mode = FALSE else if(stat == CONSCIOUS) - use_power(seconds_per_tick, times_fired) + use_energy(seconds_per_tick, times_fired) -/mob/living/silicon/robot/proc/use_power(seconds_per_tick, times_fired) +/mob/living/silicon/robot/proc/use_energy(seconds_per_tick, times_fired) if(cell?.charge) - if(cell.charge <= 100) + if(cell.charge <= (10 KILO JOULES)) drop_all_held_items() - var/amt = clamp(lamp_enabled * lamp_intensity * seconds_per_tick, 0.5 * seconds_per_tick, cell.charge) //Lamp will use a max of 5 charge, depending on brightness of lamp. If lamp is off, borg systems consume 1 point of charge, or the rest of the cell if it's lower than that. - cell.use(amt) //Usage table: 0.5/second if off/lowest setting, 4 = 2/second, 6 = 4/second, 8 = 6/second, 10 = 8/second + var/energy_consumption = max(lamp_power_consumption * lamp_enabled * lamp_intensity * seconds_per_tick, BORG_MINIMUM_POWER_CONSUMPTION * seconds_per_tick) //Lamp will use a max of 5 * [BORG_LAMP_POWER_CONSUMPTION], depending on brightness of lamp. If lamp is off, borg systems consume [BORG_MINIMUM_POWER_CONSUMPTION], or the rest of the cell if it's lower than that. + cell.use(energy_consumption, force = TRUE) else drop_all_held_items() low_power_mode = TRUE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 01dbafd4f61..9272e63e7ff 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), INNATE_TRAIT) + add_traits(list(TRAIT_CAN_STRIP, TRAIT_FORCED_STANDING, TRAIT_KNOW_ENGI_WIRES), INNATE_TRAIT) AddComponent(/datum/component/tippable, \ tip_time = 3 SECONDS, \ untip_time = 2 SECONDS, \ @@ -51,10 +51,10 @@ if(!scrambledcodes && !builtInCamera) builtInCamera = new (src) builtInCamera.c_tag = real_name - builtInCamera.network = list("ss13") + builtInCamera.network = list(CAMERANET_NETWORK_SS13) builtInCamera.internal_light = FALSE if(wires.is_cut(WIRE_CAMERA)) - builtInCamera.status = 0 + builtInCamera.camera_enabled = 0 update_icons() . = ..() @@ -234,11 +234,9 @@ if(!ionpulse_on) return - if(cell.charge <= 10) + if(!cell.use(10 KILO JOULES)) toggle_ionpulse() return - - cell.charge -= 10 return TRUE /mob/living/silicon/robot/proc/toggle_ionpulse() @@ -260,7 +258,7 @@ /mob/living/silicon/robot/get_status_tab_items() . = ..() if(cell) - . += "Charge Left: [cell.charge]/[cell.maxcharge]" + . += "Charge Left: [display_energy(cell.charge)]/[display_energy(cell.maxcharge)]" else . += "No Cell Inserted!" @@ -293,40 +291,6 @@ /mob/living/silicon/robot/proc/after_righted(mob/user) return -/mob/living/silicon/robot/proc/allowed(mob/M) - //check if it doesn't require any access at all - if(check_access(null)) - return TRUE - if(ishuman(M)) - var/mob/living/carbon/human/H = M - //if they are holding or wearing a card that has access, that works - if(check_access(H.get_active_held_item()) || check_access(H.wear_id)) - return TRUE - else if(isalien(M)) - var/mob/living/carbon/george = M - //they can only hold things :( - if(isitem(george.get_active_held_item())) - return check_access(george.get_active_held_item()) - return FALSE - -/mob/living/silicon/robot/proc/check_access(obj/item/card/id/I) - if(!istype(req_access, /list)) //something's very wrong - return TRUE - - var/list/L = req_access - if(!L.len) //no requirements - return TRUE - - if(!isidcard(I) && isitem(I)) - I = I.GetID() - - if(!I || !I.access) //not ID or no access - return FALSE - for(var/req in req_access) - if(!(req in I.access)) //doesn't have this access - return FALSE - return TRUE - /mob/living/silicon/robot/regenerate_icons() return update_icons() @@ -478,7 +442,7 @@ SIGNAL_HANDLER if(lamp_enabled) toggle_headlamp(TRUE) - to_chat(src, span_warning("Your headlamp was forcibly turned off. Restarting it should fix it, though.")) + balloon_alert(src, "headlamp off!") return COMSIG_SABOTEUR_SUCCESS /** @@ -972,6 +936,12 @@ buckle_mob_flags= RIDER_NEEDS_ARM // just in case return ..() +/mob/living/silicon/robot/can_resist() + if(lockcharge) + balloon_alert(src, "locked down!") + return FALSE + return ..() + /mob/living/silicon/robot/execute_resist() . = ..() if(!has_buckled_mobs()) @@ -979,7 +949,6 @@ for(var/mob/unbuckle_me_now as anything in buckled_mobs) unbuckle_mob(unbuckle_me_now, FALSE) - /mob/living/silicon/robot/proc/TryConnectToAI() set_connected_ai(select_active_ai_with_fewest_borgs(z)) if(connected_ai) @@ -996,14 +965,13 @@ for(var/i in connected_ai.aicamera.stored) aicamera.stored[i] = TRUE -/mob/living/silicon/robot/proc/charge(datum/source, amount, repairs, sendmats) +/mob/living/silicon/robot/proc/charge(datum/source, datum/callback/charge_cell, seconds_per_tick, repairs, sendmats) SIGNAL_HANDLER + charge_cell.Invoke(cell, seconds_per_tick) if(model) - model.respawn_consumable(src, amount * 0.005) + model.respawn_consumable(src, cell.use(cell.chargerate * 0.005)) if(sendmats) model.restock_consumable() - if(cell) - cell.charge = min(cell.charge + amount, cell.maxcharge) if(repairs) heal_bodypart_damage(repairs, repairs) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 722b92835c8..70e7d8b34ab 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if (getFireLoss() > 0 || getToxLoss() > 0) if(src == user) to_chat(user, span_notice("You start fixing yourself...")) - if(!do_after(user, 50, target = src)) + if(!do_after(user, 5 SECONDS, target = src)) return if (coil.use(1)) adjustFireLoss(-30) @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return to_chat(user, span_notice("You begin to place [W] on [src]'s head...")) to_chat(src, span_notice("[user] is placing [W] on your head...")) - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) if (user.temporarilyRemoveItemFromInventory(W, TRUE)) place_on_head(W) return @@ -227,7 +227,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return spark_system.start() step_away(src, user, 15) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_step_away), src, get_turf(user), 15), 3) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_step_away), src, get_turf(user), 15), 0.3 SECONDS) /mob/living/silicon/robot/get_shove_flags(mob/living/shover, obj/item/weapon) . = ..() diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index d0c47141ffe..1a0e0325821 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -4,7 +4,6 @@ * Definitions for /mob/living/silicon/robot and its children, including AI shells. * */ - /mob/living/silicon/robot name = "Cyborg" real_name = "Cyborg" @@ -53,6 +52,8 @@ var/lamp_doom = FALSE ///Lamp brightness. Starts at 3, but can be 1 - 5. var/lamp_intensity = 3 + ////Power consumption of the light per lamp_intensity. + var/lamp_power_consumption = BORG_LAMP_POWER_CONSUMPTION var/mutable_appearance/eye_lights @@ -105,7 +106,7 @@ ///Random serial number generated for each cyborg upon its initialization var/ident = 0 var/locked = TRUE - var/list/req_access = list(ACCESS_ROBOTICS) + req_one_access = list(ACCESS_ROBOTICS) ///Whether the robot has no charge left. var/low_power_mode = FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index d31e041baa3..2f4f2d70f26 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -626,7 +626,7 @@ reagents.expose(our_turf, TOUCH, min(1, 10 / reagents.total_volume)) // We use more water doing this then mopping - reagents.remove_any(2) //reaction() doesn't use up the reagents + reagents.remove_all(2) //reaction() doesn't use up the reagents /datum/action/toggle_buffer/update_button_name(atom/movable/screen/movable/action_button/current_button, force) if(buffer_on) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 14f3bb4ba3d..fb201faeeee 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -79,6 +79,7 @@ ) add_traits(traits_to_apply, ROUNDSTART_TRAIT) + RegisterSignal(src, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_silicon_shocked)) /mob/living/silicon/Destroy() QDEL_NULL(radio) @@ -90,6 +91,14 @@ GLOB.silicon_mobs -= src return ..() +/mob/living/silicon/proc/on_silicon_shocked(datum/source, shock_damage, shock_source, siemens_coeff, flags) + SIGNAL_HANDLER + for(var/mob/living/living_mob in buckled_mobs) + unbuckle_mob(living_mob) + living_mob.electrocute_act(shock_damage/100, shock_source, siemens_coeff, flags) //Hard metal shell conducts! + + return COMPONENT_LIVING_BLOCK_SHOCK //So borgs don't die trying to fix wiring + /mob/living/silicon/proc/create_modularInterface() if(!modularInterface) modularInterface = new /obj/item/modular_computer/pda/silicon(src) @@ -432,6 +441,9 @@ /mob/living/silicon/on_standing_up() return // Silicons are always standing by default. +/mob/living/silicon/get_butt_sprite() + return BUTT_SPRITE_QR_CODE + /** * Records an IC event log entry in the cyborg's internal tablet. * diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 98e99e7f0fc..bccde4f862f 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -106,13 +106,6 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return ..() -/mob/living/silicon/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if(buckled_mobs) - for(var/mob/living/M in buckled_mobs) - unbuckle_mob(M) - M.electrocute_act(shock_damage/100, source, siemens_coeff, flags) //Hard metal shell conducts! - return 0 //So borgs they don't die trying to fix wiring - /mob/living/silicon/emp_act(severity) . = ..() to_chat(src, span_danger("Warning: Electromagnetic pulse detected.")) diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index 54c4a4f82d1..b1b8b4bc880 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -8,6 +8,9 @@ var/mob/living/silicon/player = src designation = trim_left(player.designation + " " + player.job) + if(HAS_TRAIT(mind, DISPLAYS_JOB_IN_BINARY)) + designation = mind.assigned_role.title + if(isAI(src)) // AIs are loud and ugly spans |= SPAN_COMMAND @@ -17,6 +20,11 @@ spans ) + var/namepart = name + // If carbon, use voice to account for voice changers + if(iscarbon(src)) + namepart = GetVoice() + for(var/mob/M in GLOB.player_list) if(M.binarycheck()) if(isAI(M)) @@ -24,7 +32,7 @@ M, span_binarysay("\ Robotic Talk, \ - [span_name("[name] ([designation])")] \ + [span_name("[namepart] ([designation])")] \ [quoted_message]\ "), avoid_highlighting = src == M @@ -34,7 +42,7 @@ M, span_binarysay("\ Robotic Talk, \ - [span_name("[name]")] [quoted_message]\ + [span_name("[namepart]")] [quoted_message]\ "), avoid_highlighting = src == M ) @@ -56,7 +64,7 @@ span_binarysay("\ [follow_link] \ Robotic Talk, \ - [span_name("[name]")] [quoted_message]\ + [span_name("[namepart]")] [quoted_message]\ "), avoid_highlighting = src == M ) diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 8bf51bbffd4..a0c9a964fb3 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -61,7 +61,7 @@ weapon.attack(C, src) playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE, -1) if(C.stat == DEAD) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_appearance)), 2) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_appearance)), 0.2 SECONDS) back_to_idle() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index ff304332c8d..27bbec88292 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -7,7 +7,8 @@ stop_automated_movement = TRUE wander = FALSE damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null + unsuitable_atmos_damage = 0 hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) maxbodytemp = INFINITY minbodytemp = 0 @@ -25,16 +26,13 @@ faction = list(FACTION_NEUTRAL, FACTION_SILICON, FACTION_TURRET) light_system = OVERLAY_LIGHT light_range = 3 - light_power = 0.9 + light_power = 0.6 del_on_death = TRUE + req_one_access = list(ACCESS_ROBOTICS) - ///Will other (noncommissioned) bots salute this bot? - var/commissioned = FALSE ///Cooldown between salutations for commissioned bots COOLDOWN_DECLARE(next_salute_check) - ///Access required to access this Bot's maintenance protocols - var/maints_access_required = list(ACCESS_ROBOTICS) ///The Robot arm attached to this robot - has a 50% chance to drop on death. var/robot_arm = /obj/item/bodypart/arm/right/robot ///The inserted (if any) pAI in this bot. @@ -50,7 +48,7 @@ ///Bot-related mode flags on the Bot indicating how they will act. BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION var/bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION - ///Bot-related cover flags on the Bot to deal with what has been done to their cover, including emagging. BOT_COVER_OPEN | BOT_COVER_LOCKED | BOT_COVER_EMAGGED | BOT_COVER_HACKED + ///Bot-related cover flags on the Bot to deal with what has been done to their cover, including emagging. BOT_COVER_MAINTS_OPEN | BOT_COVER_LOCKED | BOT_COVER_EMAGGED | BOT_COVER_HACKED var/bot_cover_flags = BOT_COVER_LOCKED ///Small name of what the bot gets messed with when getting hacked/emagged. @@ -100,7 +98,7 @@ var/datum/atom_hud/data/bot_path/path_hud var/path_image_icon = 'icons/mob/silicon/aibots.dmi' var/path_image_icon_state = "path_indicator" - var/path_image_color = "#FFFFFF" + var/path_image_color = COLOR_WHITE var/reset_access_timer_id var/ignorelistcleanuptimer = 1 // This ticks up every automated action, at 300 we clean the ignore list @@ -285,25 +283,10 @@ return fully_replace_character_name(real_name, new_name) -/mob/living/simple_animal/bot/proc/check_access(mob/living/user, obj/item/card/id) - if(user.has_unlimited_silicon_privilege || isAdminGhostAI(user)) // Silicon and Admins always have access. - return TRUE - if(!maints_access_required) // No requirements to access it. - return TRUE +/mob/living/simple_animal/bot/allowed(mob/living/user) if(!(bot_cover_flags & BOT_COVER_LOCKED)) // Unlocked. return TRUE - if(!istype(user)) // Non-living mobs shouldn't be manipulating bots (like observes using the botkeeper UI). - return FALSE - - var/obj/item/card/id/used_id = id || user.get_idcard(TRUE) - - if(!used_id || !used_id.access) - return FALSE - - for(var/requested_access in maints_access_required) - if(requested_access in used_id.access) - return TRUE - return FALSE + return ..() /mob/living/simple_animal/bot/bee_friendly() return TRUE @@ -327,7 +310,7 @@ bot_cover_flags &= ~BOT_COVER_LOCKED balloon_alert(user, "cover unlocked") return TRUE - if(!(bot_cover_flags & BOT_COVER_LOCKED) && bot_cover_flags & BOT_COVER_OPEN) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. + if(!(bot_cover_flags & BOT_COVER_LOCKED) && bot_cover_flags & BOT_COVER_MAINTS_OPEN) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. bot_cover_flags |= BOT_COVER_EMAGGED bot_cover_flags &= ~BOT_COVER_LOCKED //Manually emagging the bot locks out the panel. bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED //Manually emagging the bot also locks the AI from controlling it. @@ -351,16 +334,16 @@ . += "[src]'s parts look very loose!" else . += "[src] is in pristine condition." - . += span_notice("Its maintenance panel is [bot_cover_flags & BOT_COVER_OPEN ? "open" : "closed"].") - . += span_info("You can use a screwdriver to [bot_cover_flags & BOT_COVER_OPEN ? "close" : "open"] it.") - if(bot_cover_flags & BOT_COVER_OPEN) + . += span_notice("Its maintenance panel is [bot_cover_flags & BOT_COVER_MAINTS_OPEN ? "open" : "closed"].") + . += span_info("You can use a screwdriver to [bot_cover_flags & BOT_COVER_MAINTS_OPEN ? "close" : "open"] it.") + if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) . += span_notice("Its control panel is [bot_cover_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"].") - var/is_sillycone = issilicon(user) + var/is_sillycone = HAS_SILICON_ACCESS(user) if(!(bot_cover_flags & BOT_COVER_EMAGGED) && (is_sillycone || user.Adjacent(src))) . += span_info("Alt-click [is_sillycone ? "" : "or use your ID on "]it to [bot_cover_flags & BOT_COVER_LOCKED ? "un" : ""]lock its control panel.") if(paicard) . += span_notice("It has a pAI device installed.") - if(!(bot_cover_flags & BOT_COVER_OPEN)) + if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) . += span_info("You can use a hemostat to remove it.") /mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE, forced = FALSE) @@ -393,11 +376,11 @@ if(!(bot_mode_flags & BOT_MODE_ON) || client) return FALSE - if(commissioned && COOLDOWN_FINISHED(src, next_salute_check)) + if(HAS_TRAIT(src, TRAIT_COMMISSIONED) && COOLDOWN_FINISHED(src, next_salute_check)) COOLDOWN_START(src, next_salute_check, BOT_COMMISSIONED_SALUTE_DELAY) for(var/mob/living/simple_animal/bot/B in view(5, src)) - if(!B.commissioned && B.bot_mode_flags & BOT_MODE_ON) - visible_message("[B] performs an elaborate salute for [src]!") + if(!HAS_TRAIT(B, TRAIT_COMMISSIONED) && B.bot_mode_flags & BOT_MODE_ON) + manual_emote("performs an elaborate salute for [src]!") break switch(mode) //High-priority overrides are processed first. Bots can do nothing else while under direct command. @@ -440,10 +423,10 @@ if(bot_cover_flags & BOT_COVER_EMAGGED) to_chat(user, span_danger("ERROR")) return - if(bot_cover_flags & BOT_COVER_OPEN) + if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) to_chat(user, span_warning("Please close the access panel before [bot_cover_flags & BOT_COVER_LOCKED ? "un" : ""]locking it.")) return - if(!check_access(user)) + if(!allowed(user)) to_chat(user, span_warning("Access denied.")) return bot_cover_flags ^= BOT_COVER_LOCKED @@ -456,8 +439,8 @@ return ITEM_INTERACT_SUCCESS tool.play_tool_sound(src) - bot_cover_flags ^= BOT_COVER_OPEN - to_chat(user, span_notice("The maintenance panel is now [bot_cover_flags & BOT_COVER_OPEN ? "opened" : "closed"].")) + bot_cover_flags ^= BOT_COVER_MAINTS_OPEN + to_chat(user, span_notice("The maintenance panel is now [bot_cover_flags & BOT_COVER_MAINTS_OPEN ? "opened" : "closed"].")) return ITEM_INTERACT_SUCCESS /mob/living/simple_animal/bot/welder_act(mob/living/user, obj/item/tool) @@ -468,7 +451,7 @@ if(health >= maxHealth) to_chat(user, span_warning("[src] does not need a repair!")) return ITEM_INTERACT_SUCCESS - if(!(bot_cover_flags & BOT_COVER_OPEN)) + if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) to_chat(user, span_warning("Unable to repair with the maintenance panel closed!")) return ITEM_INTERACT_SUCCESS @@ -485,7 +468,7 @@ insertpai(user, attacking_item) return if(attacking_item.tool_behaviour == TOOL_HEMOSTAT && paicard) - if(bot_cover_flags & BOT_COVER_OPEN) + if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) balloon_alert(user, "open the access panel!") else balloon_alert(user, "removing pAI...") @@ -777,7 +760,7 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/proc/bot_patrol() patrol_step() - addtimer(CALLBACK(src, PROC_REF(do_patrol)), 5) + addtimer(CALLBACK(src, PROC_REF(do_patrol)), 0.5 SECONDS) /mob/living/simple_animal/bot/proc/do_patrol() if(mode == BOT_PATROL) @@ -831,7 +814,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/moved = bot_move(patrol_target)//step_towards(src, next) // attempt to move if(!moved) //Couldn't proceed the next step of the path BOT_STEP_MAX_RETRIES times - addtimer(CALLBACK(src, PROC_REF(patrol_step_not_moved)), 2) + addtimer(CALLBACK(src, PROC_REF(patrol_step_not_moved)), 0.2 SECONDS) else // no path, so calculate new one mode = BOT_START_PATROL @@ -962,7 +945,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/moved = bot_move(summon_target, 3) // Move attempt if(!moved) - addtimer(CALLBACK(src, PROC_REF(summon_step_not_moved)), 2) + addtimer(CALLBACK(src, PROC_REF(summon_step_not_moved)), 0.2 SECONDS) else // no path, so calculate new one calc_summon_path() @@ -981,18 +964,18 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/ui_data(mob/user) var/list/data = list() - data["can_hack"] = (issilicon(user) || isAdminGhostAI(user)) + data["can_hack"] = HAS_SILICON_ACCESS(user) data["custom_controls"] = list() data["emagged"] = bot_cover_flags & BOT_COVER_EMAGGED - data["has_access"] = check_access(user) + data["has_access"] = allowed(user) data["locked"] = bot_cover_flags & BOT_COVER_LOCKED data["settings"] = list() - if(!(bot_cover_flags & BOT_COVER_LOCKED) || issilicon(user) || isAdminGhostAI(user)) + if(!(bot_cover_flags & BOT_COVER_LOCKED) || HAS_SILICON_ACCESS(user)) data["settings"]["pai_inserted"] = !!paicard data["settings"]["allow_possession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT data["settings"]["possession_enabled"] = can_be_possessed data["settings"]["airplane_mode"] = !(bot_mode_flags & BOT_MODE_REMOTE_ENABLED) - data["settings"]["maintenance_lock"] = !(bot_cover_flags & BOT_COVER_OPEN) + data["settings"]["maintenance_lock"] = !(bot_cover_flags & BOT_COVER_MAINTS_OPEN) data["settings"]["power"] = bot_mode_flags & BOT_MODE_ON data["settings"]["patrol_station"] = bot_mode_flags & BOT_MODE_AUTOPATROL return data @@ -1002,7 +985,8 @@ Pass a positive integer as an argument to override a bot's default speed. . = ..() if(.) return - if(!check_access(usr)) + var/mob/user = usr + if(!allowed(user)) to_chat(usr, span_warning("Access denied.")) return @@ -1016,14 +1000,14 @@ Pass a positive integer as an argument to override a bot's default speed. else turn_on() if("maintenance") - bot_cover_flags ^= BOT_COVER_OPEN + bot_cover_flags ^= BOT_COVER_MAINTS_OPEN if("patrol") bot_mode_flags ^= BOT_MODE_AUTOPATROL bot_reset() if("airplane") bot_mode_flags ^= BOT_MODE_REMOTE_ENABLED if("hack") - if(!(issilicon(usr) || isAdminGhostAI(usr))) + if(!HAS_SILICON_ACCESS(usr)) return if(!(bot_cover_flags & BOT_COVER_EMAGGED)) bot_cover_flags |= (BOT_COVER_EMAGGED|BOT_COVER_HACKED|BOT_COVER_LOCKED) @@ -1068,7 +1052,7 @@ Pass a positive integer as an argument to override a bot's default speed. if(bot_cover_flags & BOT_COVER_EMAGGED) //An emagged bot cannot be controlled by humans, silicons can if one hacked it. if(!(bot_cover_flags & BOT_COVER_HACKED)) //Manually emagged by a human - access denied to all. return TRUE - else if(!issilicon(user) && !isAdminGhostAI(user)) //Bot is hacked, so only silicons and admins are allowed access. + else if(!HAS_SILICON_ACCESS(user)) //Bot is hacked, so only silicons and admins are allowed access. return TRUE return FALSE @@ -1080,7 +1064,7 @@ Pass a positive integer as an argument to override a bot's default speed. if(key) balloon_alert(user, "personality already present!") return - if(bot_cover_flags & BOT_COVER_LOCKED || !(bot_cover_flags & BOT_COVER_OPEN)) + if(bot_cover_flags & BOT_COVER_LOCKED || !(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) balloon_alert(user, "slot inaccessible!") return if(!(bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT)) @@ -1137,7 +1121,7 @@ Pass a positive integer as an argument to override a bot's default speed. /// Ejects the pAI remotely. /mob/living/simple_animal/bot/proc/ejectpairemote(mob/user) - if(!check_access(user) || !paicard) + if(!allowed(user) || !paicard) return speak("Ejecting personality chip.", radio_channel) ejectpai(user) diff --git a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm index 30a30b81fd2..eade5a291c4 100644 --- a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm +++ b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm @@ -4,7 +4,7 @@ desc = "Play a prerecorded message for the benefit of those around you." background_icon_state = "bg_tech_blue" overlay_icon_state = "bg_tech_blue_border" - button_icon = 'icons/mob/actions/actions_AI.dmi' + button_icon = 'icons/obj/machines/wallmounts.dmi' button_icon_state = "intercom" cooldown_time = 10 SECONDS melee_cooldown_time = 0 SECONDS diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 9591aaed69c..a05a1c5eeb9 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -163,7 +163,7 @@ to_chat(user, span_warning("You need one length of cable to wire the ED-209!")) return to_chat(user, span_notice("You start to wire [src]...")) - if(do_after(user, 40, target = src)) + if(do_after(user, 4 SECONDS, target = src)) if(coil.get_amount() >= 1 && build_step == ASSEMBLY_SEVENTH_STEP) coil.use(1) to_chat(user, span_notice("You wire [src].")) @@ -550,7 +550,7 @@ to_chat(user, span_warning("You need one fluid duct to finish [src]")) return to_chat(user, span_notice("You start to pipe up [src]...")) - if(do_after(user, 40, target = src) && D.use(1)) + if(do_after(user, 4 SECONDS, target = src) && D.use(1)) to_chat(user, span_notice("You pipe up [src].")) var/mob/living/basic/bot/hygienebot/new_bot = new(drop_location()) new_bot.name = created_name diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index e91b532d96c..6c0cd6d16ab 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -2,6 +2,7 @@ name = "\improper ED-209 Security Robot" desc = "A security robot. He looks less than thrilled." icon_state = "ed209" + light_color = "#f84e4e" density = TRUE health = 100 maxHealth = 100 diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index da07d6f0efd..f4487bfc9d9 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -9,12 +9,14 @@ desc = "A little fire extinguishing bot. He looks rather anxious." icon = 'icons/mob/silicon/aibots.dmi' icon_state = "firebot1" + light_color = "#8cffc9" + light_power = 0.8 density = FALSE anchored = FALSE health = 25 maxHealth = 25 - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_CONSTRUCTION) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_CONSTRUCTION) radio_key = /obj/item/encryptionkey/headset_eng radio_channel = RADIO_CHANNEL_ENGINEERING bot_type = FIRE_BOT @@ -140,7 +142,7 @@ // Variables sent to TGUI /mob/living/simple_animal/bot/firebot/ui_data(mob/user) var/list/data = ..() - if(!(bot_cover_flags & BOT_COVER_LOCKED) || issilicon(user) || isAdminGhostAI(user)) + if(!(bot_cover_flags & BOT_COVER_LOCKED) || HAS_SILICON_ACCESS(user)) data["custom_controls"]["extinguish_fires"] = extinguish_fires data["custom_controls"]["extinguish_people"] = extinguish_people data["custom_controls"]["stationary_mode"] = stationary_mode @@ -149,7 +151,7 @@ // Actions received from TGUI /mob/living/simple_animal/bot/firebot/ui_act(action, params) . = ..() - if(. || (bot_cover_flags & BOT_COVER_LOCKED && !usr.has_unlimited_silicon_privilege)) + if(. || (bot_cover_flags & BOT_COVER_LOCKED && !HAS_SILICON_ACCESS(usr))) return switch(action) diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index e6554b4caea..faa7d3a9edb 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -16,7 +16,7 @@ health = 25 maxHealth = 25 - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_CONSTRUCTION) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_CONSTRUCTION) radio_key = /obj/item/encryptionkey/headset_eng radio_channel = RADIO_CHANNEL_ENGINEERING bot_type = FLOOR_BOT @@ -125,7 +125,7 @@ // Variables sent to TGUI /mob/living/simple_animal/bot/floorbot/ui_data(mob/user) var/list/data = ..() - if(!(bot_cover_flags & BOT_COVER_LOCKED) || issilicon(user) || isAdminGhostAI(user)) + if(!(bot_cover_flags & BOT_COVER_LOCKED) || HAS_SILICON_ACCESS(user)) data["custom_controls"]["tile_hull"] = autotile data["custom_controls"]["place_tiles"] = placetiles data["custom_controls"]["place_custom"] = replacetiles @@ -142,7 +142,7 @@ // Actions received from TGUI /mob/living/simple_animal/bot/floorbot/ui_act(action, params) . = ..() - if(. || (bot_cover_flags & BOT_COVER_LOCKED && !usr.has_unlimited_silicon_privilege)) + if(. || (bot_cover_flags & BOT_COVER_LOCKED && !HAS_SILICON_ACCESS(usr))) return switch(action) @@ -326,7 +326,7 @@ toggle_magnet() visible_message(span_notice("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] ")) mode = BOT_REPAIRING - if(do_after(src, 50, target = target_turf) && mode == BOT_REPAIRING) + if(do_after(src, 5 SECONDS, target = target_turf) && mode == BOT_REPAIRING) if(autotile) //Build the floor and include a tile. if(replacetiles && tilestack) target_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) //make sure a hull is actually below the floor tile @@ -348,14 +348,14 @@ toggle_magnet() mode = BOT_REPAIRING visible_message(span_notice("[src] begins [(F.broken || F.burnt) ? "repairing the floor" : "placing a floor tile"].")) - if(do_after(src, 50, target = F) && mode == BOT_REPAIRING) + if(do_after(src, 5 SECONDS, target = F) && mode == BOT_REPAIRING) success = TRUE else if(replacetiles && tilestack && F.type != tilestack.turf_type) toggle_magnet() mode = BOT_REPAIRING visible_message(span_notice("[src] begins replacing the floor tiles.")) - if(do_after(src, 50, target = target_turf) && mode == BOT_REPAIRING && tilestack) + if(do_after(src, 5 SECONDS, target = target_turf) && mode == BOT_REPAIRING && tilestack) success = TRUE if(success) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 1c77043eb1f..71199583317 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -2,10 +2,12 @@ name = "\improper Honkbot" desc = "A little robot. It looks happy with its bike horn." icon_state = "honkbot" + light_color = "#e084f7" + light_power = 1 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) combat_mode = FALSE - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_THEATRE) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_THEATRE) radio_key = /obj/item/encryptionkey/headset_service //doesn't have security key radio_channel = RADIO_CHANNEL_SERVICE //Doesn't even use the radio anyway. bot_type = HONK_BOT diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 7f13a1954ab..71292405faa 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -13,6 +13,8 @@ name = "\improper MULEbot" desc = "A Multiple Utility Load Effector bot." icon_state = "mulebot0" + light_color = "#ffcc99" + light_power = 0.8 density = TRUE move_resist = MOVE_FORCE_STRONG animate_movement = SLIDE_STEPS @@ -26,7 +28,7 @@ buckle_prevents_pull = TRUE // No pulling loaded shit bot_mode_flags = ~BOT_MODE_ROUNDSTART_POSSESSION - maints_access_required = list(ACCESS_ROBOTICS, ACCESS_CARGO) + req_one_access = list(ACCESS_ROBOTICS, ACCESS_CARGO) radio_key = /obj/item/encryptionkey/headset_cargo radio_channel = RADIO_CHANNEL_SUPPLY bot_type = MULE_BOT @@ -99,7 +101,7 @@ /mob/living/simple_animal/bot/mulebot/examine(mob/user) . = ..() - if(bot_cover_flags & BOT_COVER_OPEN) + if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) if(cell) . += span_notice("It has \a [cell] installed.") . += span_info("You can use a crowbar to remove it.") @@ -129,13 +131,13 @@ return cell && cell.charge > 0 && (!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) /mob/living/simple_animal/bot/mulebot/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(bot_cover_flags & BOT_COVER_OPEN && !isAI(user)) + if(bot_cover_flags & BOT_COVER_MAINTS_OPEN && !HAS_AI_ACCESS(user)) wires.interact(user) return - if(wires.is_cut(WIRE_RX) && isAI(user)) + if(wires.is_cut(WIRE_RX) && HAS_AI_ACCESS(user)) return - . = ..() + return ..() /mob/living/simple_animal/bot/mulebot/proc/set_id(new_id) id = new_id @@ -161,7 +163,7 @@ update_appearance() /mob/living/simple_animal/bot/mulebot/crowbar_act(mob/living/user, obj/item/tool) - if(!(bot_cover_flags & BOT_COVER_OPEN) || user.combat_mode) + if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN) || user.combat_mode) return if(!cell) to_chat(user, span_warning("[src] doesn't have a power cell!")) @@ -180,7 +182,7 @@ return ITEM_INTERACT_SUCCESS /mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/stock_parts/cell) && bot_cover_flags & BOT_COVER_OPEN) + if(istype(I, /obj/item/stock_parts/cell) && bot_cover_flags & BOT_COVER_MAINTS_OPEN) if(cell) to_chat(user, span_warning("[src] already has a power cell!")) return TRUE @@ -193,7 +195,7 @@ span_notice("You insert [cell] into [src]."), ) return TRUE - else if(is_wire_tool(I) && bot_cover_flags & BOT_COVER_OPEN) + 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)) @@ -209,7 +211,7 @@ /mob/living/simple_animal/bot/mulebot/emag_act(mob/user, obj/item/card/emag/emag_card) if(!(bot_cover_flags & BOT_COVER_EMAGGED)) bot_cover_flags |= BOT_COVER_EMAGGED - if(!(bot_cover_flags & BOT_COVER_OPEN)) + if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) bot_cover_flags ^= BOT_COVER_LOCKED balloon_alert(user, "controls [bot_cover_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"]") flick("[base_icon]-emagged", src) @@ -222,7 +224,7 @@ /mob/living/simple_animal/bot/mulebot/update_overlays() . = ..() - if(bot_cover_flags & BOT_COVER_OPEN) + if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) . += "[base_icon]-hatch" if(!load || ismob(load)) //mob offsets and such are handled by the riding component / buckling return @@ -263,7 +265,7 @@ var/list/data = list() data["on"] = bot_mode_flags & BOT_MODE_ON data["locked"] = bot_cover_flags & BOT_COVER_LOCKED - data["siliconUser"] = user.has_unlimited_silicon_privilege + data["siliconUser"] = HAS_SILICON_ACCESS(user) data["mode"] = mode ? "[mode]" : "Ready" data["modeStatus"] = "" switch(mode) @@ -290,18 +292,18 @@ /mob/living/simple_animal/bot/mulebot/ui_act(action, params) . = ..() - if(. || (bot_cover_flags & BOT_COVER_LOCKED && !usr.has_unlimited_silicon_privilege)) + if(. || (bot_cover_flags & BOT_COVER_LOCKED && !HAS_SILICON_ACCESS(usr))) return switch(action) if("lock") - if(usr.has_unlimited_silicon_privilege) + if(HAS_SILICON_ACCESS(usr)) bot_cover_flags ^= BOT_COVER_LOCKED return TRUE if("on") if(bot_mode_flags & BOT_MODE_ON) turn_off() - else if(bot_cover_flags & BOT_COVER_OPEN) + else if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) to_chat(usr, span_warning("[name]'s maintenance panel is open!")) return else if(cell) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index f4241809b33..45c9802a8f3 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -3,6 +3,8 @@ desc = "A little security robot. He looks less than thrilled." icon = 'icons/mob/silicon/aibots.dmi' icon_state = "secbot" + light_color = "#f56275" + light_power = 0.8 density = FALSE anchored = FALSE health = 25 @@ -10,15 +12,16 @@ damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, STAMINA = 0, OXY = 0) pass_flags = PASSMOB | PASSFLAPS combat_mode = TRUE + can_buckle_to = FALSE - maints_access_required = list(ACCESS_SECURITY) + req_one_access = list(ACCESS_SECURITY) radio_key = /obj/item/encryptionkey/secbot //AI Priv + Security radio_channel = RADIO_CHANNEL_SECURITY //Security channel bot_type = SEC_BOT bot_mode_flags = ~BOT_MODE_CAN_BE_SAPIENT data_hud_type = DATA_HUD_SECURITY_ADVANCED hackables = "target identification systems" - path_image_color = "#FF0000" + path_image_color = COLOR_RED possessed_message = "You are a securitron! Guard the station to the best of your ability!" automated_announcements = list( @@ -30,6 +33,8 @@ BEEPSKY_VOICED_SECURE_DAY = 'sound/voice/beepsky/secureday.ogg', ) + ///Whether this secbot is considered 'commissioned' and given the trait on Initialize. + var/commissioned = FALSE ///The type of baton this Secbot will use var/baton_type = /obj/item/melee/baton/security ///The type of cuffs we use on criminals after making arrests @@ -66,11 +71,17 @@ bot_mode_flags = BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED commissioned = TRUE + /mob/living/simple_animal/bot/secbot/beepsky/officer name = "Officer Beepsky" desc = "It's Officer Beepsky! Powered by a potato and a shot of whiskey, and with a sturdier reinforced chassis, too." health = 45 +/mob/living/simple_animal/bot/secbot/beepsky/officer/Initialize(mapload) + . = ..() + // Beepsky hates people scanning them + RegisterSignal(src, COMSIG_MOVABLE_SPY_STEALING, PROC_REF(retaliate_async)) + /mob/living/simple_animal/bot/secbot/beepsky/ofitser name = "Prison Ofitser" desc = "Powered by the tears and sweat of laborers." @@ -95,6 +106,7 @@ /mob/living/simple_animal/bot/secbot/pingsky name = "Officer Pingsky" desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." + light_color = "#62baf5" radio_channel = RADIO_CHANNEL_AI_PRIVATE bot_mode_flags = ~(BOT_MODE_CAN_BE_SAPIENT|BOT_MODE_AUTOPATROL) security_mode_flags = SECBOT_DECLARE_ARRESTS | SECBOT_CHECK_IDS | SECBOT_CHECK_RECORDS @@ -118,6 +130,8 @@ . = ..() weapon = new baton_type() update_appearance(UPDATE_ICON) + if(commissioned) + ADD_TRAIT(src, TRAIT_COMMISSIONED, INNATE_TRAIT) // Doing this hurts my soul, but simplebot access reworks are for another day. var/datum/id_trim/job/det_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/detective] @@ -129,6 +143,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) AddComponent(/datum/component/security_vision, judgement_criteria = NONE, update_judgement_criteria = CALLBACK(src, PROC_REF(judgement_criteria))) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /mob/living/simple_animal/bot/secbot/Destroy() QDEL_NULL(weapon) @@ -152,10 +167,20 @@ SSmove_manager.stop_looping(src) last_found = world.time +/mob/living/simple_animal/bot/secbot/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(!(security_mode_flags & SECBOT_SABOTEUR_AFFECTED)) + security_mode_flags |= SECBOT_SABOTEUR_AFFECTED + addtimer(CALLBACK(src, PROC_REF(remove_saboteur_effect)), disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS + +/mob/living/simple_animal/bot/secbot/proc/remove_saboteur_effect() + security_mode_flags &= ~SECBOT_SABOTEUR_AFFECTED + /mob/living/simple_animal/bot/secbot/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)//shocks only make him angry if(base_speed < initial(base_speed) + 3) base_speed += 3 - addtimer(VARSET_CALLBACK(src, base_speed, base_speed - 3), 60) + addtimer(VARSET_CALLBACK(src, base_speed, base_speed - 3), 6 SECONDS) playsound(src, 'sound/machines/defib_zap.ogg', 50) visible_message(span_warning("[src] shakes and speeds up!")) @@ -168,7 +193,7 @@ // Variables sent to TGUI /mob/living/simple_animal/bot/secbot/ui_data(mob/user) var/list/data = ..() - if(!(bot_cover_flags & BOT_COVER_LOCKED) || issilicon(user) || isAdminGhostAI(user)) + if(!(bot_cover_flags & BOT_COVER_LOCKED) || HAS_SILICON_ACCESS(user)) data["custom_controls"]["check_id"] = security_mode_flags & SECBOT_CHECK_IDS data["custom_controls"]["check_weapons"] = security_mode_flags & SECBOT_CHECK_WEAPONS data["custom_controls"]["check_warrants"] = security_mode_flags & SECBOT_CHECK_RECORDS @@ -179,7 +204,7 @@ // Actions received from TGUI /mob/living/simple_animal/bot/secbot/ui_act(action, params) . = ..() - if(. || (bot_cover_flags & BOT_COVER_LOCKED && !usr.has_unlimited_silicon_privilege)) + if(. || (bot_cover_flags & BOT_COVER_LOCKED && !HAS_SILICON_ACCESS(usr))) return switch(action) @@ -194,6 +219,11 @@ if("arrest_alert") security_mode_flags ^= SECBOT_DECLARE_ARRESTS +/mob/living/simple_animal/bot/secbot/proc/retaliate_async(datum/source, mob/user, ...) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(retaliate), user) + /mob/living/simple_animal/bot/secbot/proc/retaliate(mob/living/carbon/human/attacking_human) var/judgement_criteria = judgement_criteria() threatlevel = attacking_human.assess_threat(judgement_criteria) @@ -215,6 +245,8 @@ final |= JUDGE_RECORDCHECK if(security_mode_flags & SECBOT_CHECK_WEAPONS) final |= JUDGE_WEAPONCHECK + if(security_mode_flags & SECBOT_SABOTEUR_AFFECTED) + final |= JUDGE_CHILLOUT return final /mob/living/simple_animal/bot/secbot/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked. diff --git a/code/modules/mob/living/simple_animal/bot/vibebot.dm b/code/modules/mob/living/simple_animal/bot/vibebot.dm index d0d550f7737..582b1b5371d 100644 --- a/code/modules/mob/living/simple_animal/bot/vibebot.dm +++ b/code/modules/mob/living/simple_animal/bot/vibebot.dm @@ -10,8 +10,8 @@ maxHealth = 25 pass_flags = PASSMOB | PASSFLAPS light_system = OVERLAY_LIGHT - light_range = 7 - light_power = 3 + light_range = 6 + light_power = 2 hackables = "vibing scanners" radio_key = /obj/item/encryptionkey/headset_service diff --git a/code/modules/mob/living/simple_animal/friendly/gondola.dm b/code/modules/mob/living/simple_animal/friendly/gondola.dm index 80e89dd08d7..a914178d08a 100644 --- a/code/modules/mob/living/simple_animal/friendly/gondola.dm +++ b/code/modules/mob/living/simple_animal/friendly/gondola.dm @@ -22,7 +22,7 @@ icon_living = "gondola" loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 1, /obj/item/food/meat/slab/gondola = 1) //Gondolas aren't affected by cold. - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 maxHealth = 200 diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm deleted file mode 100644 index 593bf29535e..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ /dev/null @@ -1,170 +0,0 @@ -/mob/living/simple_animal/hostile/alien - name = "alien hunter" - desc = "Hiss!" - icon = 'icons/mob/nonhuman-player/alien.dmi' - icon_state = "alienh" - icon_living = "alienh" - icon_dead = "alienh_dead" - icon_gib = "syndicate_gib" - gender = FEMALE - speed = 0 - butcher_results = list(/obj/item/food/meat/slab/xeno = 4, - /obj/item/stack/sheet/animalhide/xeno = 1) - maxHealth = 125 - health = 125 - harm_intent_damage = 5 - obj_damage = 60 - melee_damage_lower = 25 - melee_damage_upper = 25 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - speak_emote = list("hisses") - bubble_icon = "alien" - combat_mode = TRUE - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - faction = list(ROLE_ALIEN) - status_flags = CANPUSH - minbodytemp = 0 - unsuitable_heat_damage = 20 - // Going for a dark purple here - lighting_cutoff_red = 30 - lighting_cutoff_green = 15 - lighting_cutoff_blue = 50 - unique_name = TRUE - gold_core_spawnable = NO_SPAWN - death_sound = 'sound/voice/hiss6.ogg' - death_message = "lets out a waning guttural screech, green blood bubbling from its maw..." - footstep_type = FOOTSTEP_MOB_CLAW - -/mob/living/simple_animal/hostile/alien/drone - name = "alien drone" - icon_state = "aliend" - icon_living = "aliend" - icon_dead = "aliend_dead" - melee_damage_lower = 15 - melee_damage_upper = 15 - var/plant_cooldown = 30 - var/plants_off = 0 - -/mob/living/simple_animal/hostile/alien/drone/handle_automated_action() - if(!..()) //AIStatus is off - return - plant_cooldown-- - if(AIStatus == AI_IDLE) - if(!plants_off && prob(10) && plant_cooldown <= 0) - plant_cooldown = initial(plant_cooldown) - SpreadPlants() - -/mob/living/simple_animal/hostile/alien/sentinel - name = "alien sentinel" - icon_state = "aliens" - icon_living = "aliens" - icon_dead = "aliens_dead" - health = 150 - maxHealth = 150 - melee_damage_lower = 15 - melee_damage_upper = 15 - ranged = 1 - retreat_distance = 5 - minimum_distance = 5 - projectiletype = /obj/projectile/neurotoxin/damaging - projectilesound = 'sound/weapons/pierce.ogg' - - -/mob/living/simple_animal/hostile/alien/queen - name = "alien queen" - icon_state = "alienq" - icon_living = "alienq" - icon_dead = "alienq_dead" - health = 250 - maxHealth = 250 - melee_damage_lower = 15 - melee_damage_upper = 15 - ranged = 1 - retreat_distance = 5 - minimum_distance = 5 - move_to_delay = 4 - butcher_results = list(/obj/item/food/meat/slab/xeno = 4, - /obj/item/stack/sheet/animalhide/xeno = 1) - projectiletype = /obj/projectile/neurotoxin/damaging - projectilesound = 'sound/weapons/pierce.ogg' - status_flags = 0 - unique_name = FALSE - var/sterile = 1 - var/plants_off = 0 - var/egg_cooldown = 30 - var/plant_cooldown = 30 - -/mob/living/simple_animal/hostile/alien/queen/handle_automated_action() - if(!..()) //AIStatus is off - return - egg_cooldown-- - plant_cooldown-- - if(AIStatus == AI_IDLE) - if(!plants_off && prob(10) && plant_cooldown <= 0) - plant_cooldown = initial(plant_cooldown) - SpreadPlants() - if(!sterile && prob(10) && egg_cooldown <= 0) - egg_cooldown = initial(egg_cooldown) - LayEggs() - -/mob/living/simple_animal/hostile/alien/proc/SpreadPlants() - if(!isturf(loc) || isspaceturf(loc)) - return - if(locate(/obj/structure/alien/weeds/node) in get_turf(src)) - return - visible_message(span_alertalien("[src] plants some alien weeds!")) - new /obj/structure/alien/weeds/node(loc) - -/mob/living/simple_animal/hostile/alien/proc/LayEggs() - if(!isturf(loc) || isspaceturf(loc)) - return - if(locate(/obj/structure/alien/egg) in get_turf(src)) - return - visible_message(span_alertalien("[src] lays an egg!")) - new /obj/structure/alien/egg(loc) - -/mob/living/simple_animal/hostile/alien/queen/large - name = "alien empress" - icon = 'icons/mob/nonhuman-player/alienqueen.dmi' - icon_state = "alienq" - icon_living = "alienq" - icon_dead = "alienq_dead" - health_doll_icon = "alienq" - bubble_icon = "alienroyal" - move_to_delay = 4 - maxHealth = 400 - health = 400 - butcher_results = list(/obj/item/food/meat/slab/xeno = 10, - /obj/item/stack/sheet/animalhide/xeno = 2) - mob_size = MOB_SIZE_LARGE - gold_core_spawnable = NO_SPAWN - -/mob/living/simple_animal/hostile/alien/maid - name = "lusty xenomorph maid" - melee_damage_lower = 0 - melee_damage_upper = 0 - combat_mode = FALSE - friendly_verb_continuous = "caresses" - friendly_verb_simple = "caress" - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - gold_core_spawnable = HOSTILE_SPAWN - icon_state = "maid" - icon_living = "maid" - icon_dead = "maid_dead" - -/mob/living/simple_animal/hostile/alien/maid/Initialize(mapload) - . = ..() - AddElement(/datum/element/cleaning) - -/mob/living/simple_animal/hostile/alien/maid/AttackingTarget(atom/attacked_target) - if(ismovable(target)) - target.wash(CLEAN_SCRUB) - if(istype(target, /obj/effect/decal/cleanable)) - visible_message(span_notice("[src] cleans up \the [target].")) - else - visible_message(span_notice("[src] polishes \the [target].")) - return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm index e8a8822a4d3..ca1ae3b70d6 100644 --- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm @@ -29,7 +29,7 @@ weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) minbodytemp = 0 maxbodytemp = INFINITY - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null loot = list(/obj/effect/decal/remains/human) del_on_death = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index e8d2fd6be50..3ff8f04fb92 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -616,29 +616,6 @@ value = initial(search_objects) search_objects = value -/mob/living/simple_animal/hostile/consider_wakeup() - ..() - var/list/tlist - var/turf/T = get_turf(src) - - if (!T) - return - - if (!length(SSmobs.clients_by_zlevel[T.z])) // It's fine to use .len here but doesn't compile on 511 - toggle_ai(AI_Z_OFF) - return - - var/cheap_search = isturf(T) && !is_station_level(T.z) - if (cheap_search) - tlist = ListTargetsLazy(T.z) - else - tlist = ListTargets() - - if(AIStatus == AI_IDLE && FindTarget(tlist)) - if(cheap_search) //Try again with full effort - FindTarget() - toggle_ai(AI_ON) - /mob/living/simple_animal/hostile/proc/ListTargetsLazy(_Z)//Step 1, find out what we can see var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha)) . = list() 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 1096784b43f..cebdfc99de1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -14,7 +14,7 @@ robust_searching = TRUE ranged_ignores_vision = TRUE stat_attack = DEAD - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, STAMINA = 0, OXY = 1) minbodytemp = 0 maxbodytemp = INFINITY @@ -186,7 +186,7 @@ /// Sets/adds the next time the megafauna can use a melee or ranged attack, in deciseconds. It is a list to allow using named args. Use the ignore_staggered var if youre setting the cooldown to ranged_cooldown_time. /mob/living/simple_animal/hostile/megafauna/proc/update_cooldowns(list/cooldown_updates, ignore_staggered = FALSE) - if(!ignore_staggered && has_status_effect(/datum/status_effect/stagger)) + if(!ignore_staggered && has_status_effect(/datum/status_effect/rebuked)) for(var/update in cooldown_updates) cooldown_updates[update] *= 2 if(cooldown_updates[COOLDOWN_UPDATE_SET_MELEE]) 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 91cf152acb0..00cc37fe618 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -225,7 +225,7 @@ Difficulty: Hard var/turf/targetturf = get_step(src, dir) L.forceMove(targetturf) playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, TRUE, -1) - addtimer(CALLBACK(src, PROC_REF(devour), L), 2) + addtimer(CALLBACK(src, PROC_REF(devour), L), 0.2 SECONDS) SLEEP_CHECK_DEATH(1, src) /mob/living/simple_animal/hostile/megafauna/bubblegum/devour(mob/living/yummy_food) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 6d90e88f839..d0a5a4df954 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -171,7 +171,9 @@ layer = FLY_LAYER plane = ABOVE_GAME_PLANE light_system = OVERLAY_LIGHT - light_range = 2 + light_range = 2.5 + light_power = 1.2 + light_color = "#ffff66" duration = 8 var/target @@ -303,6 +305,7 @@ charge_animation() COOLDOWN_START(src, cooldown_timer, cooldown_add) playsound(user, activation_sound, 100, TRUE) + log_game("[src] activated by [key_name(user)] in [AREACOORD(src)]. The last fingerprints on the [src] was [fingerprintslast].") return TRUE /obj/machinery/anomalous_crystal/proc/charge_animation() @@ -326,9 +329,9 @@ ActivationReaction(null, ACTIVATE_BOMB) return TRUE -/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing - observer_desc = "This crystal strips and equips its targets as clowns." - possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH) +/obj/machinery/anomalous_crystal/honk //Revives the dead, but strips and equips them as a clown + observer_desc = "This crystal revives targets around it as clowns. Oh, that's horrible...." + activation_method = ACTIVATE_TOUCH activation_sound = 'sound/items/bikehorn.ogg' use_time = 3 SECONDS /// List of REFs to mobs that have been turned into a clown @@ -338,20 +341,31 @@ . = ..() if(!.) return FALSE + + for(var/atom/thing as anything in range(1, src)) + if(isturf(thing)) + new /obj/effect/decal/cleanable/confetti(thing) + continue - if(!ishuman(user)) - return FALSE - if(!(user in viewers(src))) - return FALSE - var/clown_ref = REF(user) - if(clown_ref in clowned_mob_refs) - return FALSE + if(!ishuman(thing)) + continue - var/mob/living/carbon/human/new_clown = user - for(var/obj/item/to_strip in new_clown.get_equipped_items()) - new_clown.dropItemToGround(to_strip) - new_clown.dress_up_as_job(SSjob.GetJobType(/datum/job/clown)) - clowned_mob_refs += clown_ref + var/mob/living/carbon/human/new_clown = thing + + if(new_clown.stat != DEAD) + continue + + new_clown.revive(ADMIN_HEAL_ALL, force_grab_ghost = TRUE) + + var/clown_ref = REF(new_clown) + if(clown_ref in clowned_mob_refs) //one clowning per person + continue + + for(var/obj/item/to_strip in new_clown.get_equipped_items()) + new_clown.dropItemToGround(to_strip) + new_clown.dress_up_as_job(SSjob.GetJobType(/datum/job/clown)) + clowned_mob_refs += clown_ref + return TRUE /// Transforms the area to look like a new one @@ -411,21 +425,28 @@ /obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method) . = ..() if(!.) - return + return FALSE + for(var/atom/thing as anything in range(1, src)) if(isturf(thing)) new /obj/effect/temp_visual/cult/sparks(thing) continue - if(ishuman(thing)) - var/mob/living/carbon/human/to_revive = thing - if(to_revive.stat != DEAD) - continue - to_revive.set_species(/datum/species/shadow, TRUE) - to_revive.revive(ADMIN_HEAL_ALL, force_grab_ghost = TRUE) - //Free revives, but significantly limits your options for reviving except via the crystal - //except JK who cares about BADDNA anymore. this even heals suicides. - ADD_TRAIT(to_revive, TRAIT_BADDNA, MAGIC_TRAIT) + if(!ishuman(thing)) + continue + + var/mob/living/carbon/human/to_revive = thing + + if(to_revive.stat != DEAD) + continue + + to_revive.set_species(/datum/species/shadow, TRUE) + to_revive.revive(ADMIN_HEAL_ALL, force_grab_ghost = TRUE) + //Free revives, but significantly limits your options for reviving except via the crystal + //except JK who cares about BADDNA anymore. this even heals suicides. + ADD_TRAIT(to_revive, TRAIT_BADDNA, MAGIC_TRAIT) + + return TRUE /obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans observer_desc = "This crystal allows ghosts to turn into a fragile creature that can heal people." @@ -507,6 +528,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) /obj/structure/closet/stasis/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() @@ -535,9 +557,6 @@ return ..() return ..() -/obj/structure/closet/stasis/emp_act() - return - /obj/structure/closet/stasis/ex_act() return FALSE 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 375d4993cfd..b4cafdb6d53 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -231,7 +231,7 @@ Difficulty: Hard blinking = TRUE SLEEP_CHECK_DEATH(4 + target_slowness, src) animate(src, color = oldcolor, time = 8) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 0.8 SECONDS) SLEEP_CHECK_DEATH(8, src) blinking = FALSE else @@ -252,7 +252,7 @@ Difficulty: Hard INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.diagonals) SLEEP_CHECK_DEATH(6 + target_slowness, src) animate(src, color = oldcolor, time = 8) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 0.8 SECONDS) SLEEP_CHECK_DEATH(8, src) blinking = FALSE @@ -280,7 +280,7 @@ Difficulty: Hard SLEEP_CHECK_DEATH(8 + target_slowness, src) update_cooldowns(list(COOLDOWN_UPDATE_SET_CHASER = chaser_cooldown_time)) animate(src, color = oldcolor, time = 8) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 0.8 SECONDS) SLEEP_CHECK_DEATH(8, src) blinking = FALSE @@ -582,7 +582,7 @@ Difficulty: Hard friendly_fire_check = is_friendly_fire if(new_speed) speed = new_speed - addtimer(CALLBACK(src, PROC_REF(seek_target)), 1) + addtimer(CALLBACK(src, PROC_REF(seek_target)), 0.1 SECONDS) /obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir() . = get_cardinal_dir(src, targetturf) @@ -618,6 +618,7 @@ Difficulty: Hard moving-- sleep(speed) targetturf = get_turf(target) + /obj/effect/temp_visual/hierophant/chaser/proc/make_blast() var/obj/effect/temp_visual/hierophant/blast/damaging/B = new(loc, caster, friendly_fire_check) B.damage = damage @@ -752,7 +753,7 @@ Difficulty: Hard var/obj/item/hierophant_club/club = attacking_item if(club.beacon == src) to_chat(user, span_notice("You start removing your hierophant beacon...")) - if(do_after(user, 50, target = src)) + if(do_after(user, 5 SECONDS, target = src)) playsound(src,'sound/magic/blind.ogg', 100, TRUE, -4) new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user) to_chat(user, span_hierophant_warning("You collect [src], reattaching it to the club!")) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index a1f77098152..78bd8a9c5b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( speak_emote = list("creaks") taunt_chance = 30 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 faction = list(FACTION_MIMIC) 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 6386fa272b7..71801a44c95 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 @@ -56,11 +56,8 @@ M.take_damage(50, BRUTE, MELEE, 1) //Elites can't talk (normally)! -/mob/living/simple_animal/hostile/asteroid/elite/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) - if(can_talk) - . = ..() - return TRUE - return FALSE +/mob/living/simple_animal/hostile/asteroid/elite/can_speak(allow_mimes) + return can_talk && ..() /*Basic setup for elite attacks, based on Whoneedspace's megafauna attack setup. While using this makes the system rely on OnFire, it still gives options for timers not tied to OnFire, and it makes using attacks consistent accross the board for player-controlled elites.*/ @@ -127,7 +124,7 @@ While using this makes the system rely on OnFire, it still gives options for tim icon_state = "tumor" pixel_x = -16 base_pixel_x = -16 - light_color = COLOR_SOFT_RED + light_color = "#FA8282" light_range = 3 anchored = TRUE density = FALSE @@ -172,7 +169,7 @@ While using this makes the system rely on OnFire, it still gives options for tim if(boosted) mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) to_chat(mychild, "Someone has activated your tumor. You will be returned to fight shortly, get ready!") - addtimer(CALLBACK(src, PROC_REF(return_elite)), 30) + addtimer(CALLBACK(src, PROC_REF(return_elite)), 3 SECONDS) INVOKE_ASYNC(src, PROC_REF(arena_checks)) if(TUMOR_INACTIVE) if(HAS_TRAIT(user, TRAIT_ELITE_CHALLENGER)) @@ -184,20 +181,20 @@ While using this makes the system rely on OnFire, it still gives options for tim visible_message(span_boldwarning("[src] begins to convulse. Your instincts tell you to step back.")) make_activator(user) if(!boosted) - addtimer(CALLBACK(src, PROC_REF(spawn_elite)), 30) + addtimer(CALLBACK(src, PROC_REF(spawn_elite)), 3 SECONDS) return visible_message(span_boldwarning("Something within [src] stirs...")) - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a lavaland elite?", check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, poll_time = 5 SECONDS, target_mob = src, ignore_category = POLL_IGNORE_LAVALAND_ELITE, pic_source = src, role_name_text = "lavaland elite") - if(candidates.len) + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, poll_time = 5 SECONDS, checked_target = src, ignore_category = POLL_IGNORE_LAVALAND_ELITE, alert_pic = src, role_name_text = "lavaland elite") + if(chosen_one) audible_message(span_boldwarning("The stirring sounds increase in volume!")) - elitemind = pick(candidates) + elitemind = chosen_one elitemind.playsound_local(get_turf(elitemind), 'sound/effects/magic.ogg', 40, 0) to_chat(elitemind, "You have been chosen to play as a Lavaland Elite.\nIn a few seconds, you will be summoned on Lavaland as a monster to fight your activator, in a fight to the death.\n\ Your attacks can be switched using the buttons on the top left of the HUD, and used by clicking on targets or tiles similar to a gun.\n\ While the opponent might have an upper hand with powerful mining equipment and tools, you have great power normally limited by AI mobs.\n\ If you want to win, you'll have to use your powers in creative ways to ensure the kill. It's suggested you try using them all as soon as possible.\n\ Should you win, you'll receive extra information regarding what to do after. Good luck!") - addtimer(CALLBACK(src, PROC_REF(spawn_elite), elitemind), 100) + addtimer(CALLBACK(src, PROC_REF(spawn_elite), elitemind), 10 SECONDS) else visible_message(span_boldwarning("The stirring stops, and nothing emerges. Perhaps try again later.")) activity = TUMOR_INACTIVE @@ -273,7 +270,7 @@ While using this makes the system rely on OnFire, it still gives options for tim if(elitehere == mychild && activity == TUMOR_PASSIVE) mychild.adjustHealth(-mychild.maxHealth * 0.025*seconds_per_tick) var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild)) - H.color = "#FF0000" + H.color = COLOR_RED /obj/structure/elite_tumor/attackby(obj/item/attacking_item, mob/user, params) . = ..() @@ -294,7 +291,7 @@ While using this makes the system rely on OnFire, it still gives options for tim INVOKE_ASYNC(src, PROC_REF(arena_trap)) //Gets another arena trap queued up for when this one runs out. INVOKE_ASYNC(src, PROC_REF(border_check)) //Checks to see if our fighters got out of the arena somehow. if(!QDELETED(src)) - addtimer(CALLBACK(src, PROC_REF(arena_checks)), 50) + addtimer(CALLBACK(src, PROC_REF(arena_checks)), 5 SECONDS) /obj/structure/elite_tumor/proc/fighters_check() if(QDELETED(mychild) || mychild.stat == DEAD) @@ -386,7 +383,7 @@ While using this makes the system rely on OnFire, it still gives options for tim to_chat(E, "Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") E.maxHealth = E.maxHealth * 0.4 E.health = E.maxHealth - E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people." + E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people." E.sentience_type = SENTIENCE_ORGANIC qdel(src) else @@ -405,7 +402,7 @@ While using this makes the system rely on OnFire, it still gives options for tim plane = GAME_PLANE color = rgb(255,0,0) light_range = MINIMUM_USEFUL_LIGHT_RANGE - light_color = COLOR_SOFT_RED + light_color = "#FA8282" var/datum/weakref/activator_ref var/datum/weakref/ourelite_ref diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index d91f312b454..f7d86c350de 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -143,13 +143,13 @@ ranged_cooldown = world.time + 100 playsound(src,'sound/voice/insane_low_laugh.ogg', 200, 1) visible_message(span_warning("[src] starts picking up speed!")) - color = "#FF0000" + color = COLOR_RED set_varspeed(0) move_to_delay = 3 - addtimer(CALLBACK(src, PROC_REF(reset_rage)), 65) + addtimer(CALLBACK(src, PROC_REF(reset_rage)), 6.5 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/reset_rage() - color = "#FFFFFF" + color = COLOR_WHITE set_varspeed(2) move_to_delay = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 9517bce4f92..9f162e0cfdc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -56,16 +56,18 @@ /mob/living/simple_animal/hostile/asteroid/elite/herald/death() . = ..() if(!is_mirror) - addtimer(CALLBACK(src, PROC_REF(become_ghost)), 8) + addtimer(CALLBACK(src, PROC_REF(become_ghost)), 0.8 SECONDS) if(my_mirror != null) qdel(my_mirror) /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/become_ghost() icon_state = "herald_ghost" -/mob/living/simple_animal/hostile/asteroid/elite/herald/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/living/simple_animal/hostile/asteroid/elite/herald/send_speech(message_raw, message_range, obj/source, bubble_type, list/spans, datum/language/message_language, list/message_mods, forced, tts_message, list/tts_filter) . = ..() - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + if(stat != CONSCIOUS) + return + playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) /datum/action/innate/elite_attack/herald_trishot name = "Triple Shot" @@ -148,13 +150,13 @@ var/target_turf = get_turf(target) var/angle_to_target = get_angle(src, target_turf) shoot_projectile(target_turf, angle_to_target, FALSE, TRUE) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 2) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 4) + addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 0.2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 0.4 SECONDS) if(health < maxHealth * 0.5 && !is_mirror) playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 10) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 12) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 14) + addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 1.2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 1.4 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_circleshot(offset) var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) @@ -171,11 +173,11 @@ if(!is_mirror) icon_state = "herald_enraged" playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(herald_circleshot), 0), 5) + addtimer(CALLBACK(src, PROC_REF(herald_circleshot), 0), 0.5 SECONDS) if(health < maxHealth * 0.5 && !is_mirror) playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(herald_circleshot), 22.5), 15) - addtimer(CALLBACK(src, PROC_REF(unenrage)), 20) + addtimer(CALLBACK(src, PROC_REF(herald_circleshot), 22.5), 1.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(unenrage)), 2 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_teleshot(target) ranged_cooldown = world.time + 30 @@ -281,7 +283,7 @@ owner.visible_message(span_danger("[owner]'s [src] emits a loud noise as [owner] is struck!")) var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(reactionshot), owner), 10) + addtimer(CALLBACK(src, PROC_REF(reactionshot), owner), 1 SECONDS) #undef HERALD_TRISHOT #undef HERALD_DIRECTIONALSHOT 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 926f4e96baa..1ec573dbd6c 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 @@ -123,7 +123,7 @@ T = get_step(T, dir_to_target) playsound(src,'sound/magic/demon_attack1.ogg', 200, 1) visible_message(span_boldwarning("[src] prepares to charge!")) - addtimer(CALLBACK(src, PROC_REF(legionnaire_charge_2), dir_to_target, 0), 4) + addtimer(CALLBACK(src, PROC_REF(legionnaire_charge_2), dir_to_target, 0), 0.4 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge_2(move_dir, times_ran) if(times_ran >= 6) @@ -183,7 +183,7 @@ /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/onHeadDeath() myhead = null - addtimer(CALLBACK(src, PROC_REF(regain_head)), 50) + addtimer(CALLBACK(src, PROC_REF(regain_head)), 5 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/regain_head() has_head = TRUE 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 2d6cdb39da0..a9babf2ecca 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 @@ -136,7 +136,7 @@ new /obj/effect/temp_visual/hierophant/telegraph(turf_target, src) new /obj/effect/temp_visual/hierophant/telegraph(source, src) playsound(source,'sound/machines/airlockopen.ogg', 200, 1) - addtimer(CALLBACK(src, PROC_REF(pandora_teleport_2), turf_target, source), 2) + addtimer(CALLBACK(src, PROC_REF(pandora_teleport_2), turf_target, source), 0.2 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(turf/T, turf/source) new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) @@ -148,7 +148,7 @@ animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out visible_message(span_hierophant_warning("[src] fades out!")) ADD_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) - addtimer(CALLBACK(src, PROC_REF(pandora_teleport_3), T), 2) + addtimer(CALLBACK(src, PROC_REF(pandora_teleport_3), T), 0.2 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(turf/T) forceMove(T) @@ -161,7 +161,7 @@ var/turf/T = get_turf(target) new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(T, src) var/max_size = 3 - addtimer(CALLBACK(src, PROC_REF(aoe_squares_2), T, 0, max_size), 2) + addtimer(CALLBACK(src, PROC_REF(aoe_squares_2), T, 0, max_size), 0.2 SECONDS) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(turf/T, ring, max_size) if(ring > max_size) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index bf70d660f5a..9999736abf7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -1,7 +1,7 @@ //the base mining mob /mob/living/simple_animal/hostile/asteroid vision_range = 2 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null faction = list(FACTION_MINING) weather_immunities = list(TRAIT_LAVA_IMMUNE,TRAIT_ASHSTORM_IMMUNE) obj_damage = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm deleted file mode 100644 index 56a8c77e2fd..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm +++ /dev/null @@ -1,72 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/wolf - name = "white wolf" - desc = "A beast that survives by feasting on weaker opponents, they're much stronger with numbers." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "whitewolf" - icon_living = "whitewolf" - icon_dead = "whitewolf_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - friendly_verb_continuous = "howls at" - friendly_verb_simple = "howl at" - speak_emote = list("howls") - speed = 5 - move_to_delay = 5 - maxHealth = 130 - health = 130 - obj_damage = 15 - melee_damage_lower = 7.5 - melee_damage_upper = 7.5 - rapid_melee = 2 // every second attack - dodging = TRUE - dodge_prob = 50 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - vision_range = 7 - aggro_vision_range = 7 - move_force = MOVE_FORCE_WEAK - move_resist = MOVE_FORCE_WEAK - pull_force = MOVE_FORCE_WEAK - butcher_results = list(/obj/item/food/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2) - loot = list() - crusher_loot = /obj/item/crusher_trophy/wolf_ear - stat_attack = HARD_CRIT - robust_searching = TRUE - footstep_type = FOOTSTEP_MOB_CLAW - /// Message for when the wolf decides to start running away - var/retreat_message_said = FALSE - -/mob/living/simple_animal/hostile/asteroid/wolf/Move(atom/newloc) - if(newloc && newloc.z == z && (islava(newloc) || ischasm(newloc))) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/wolf/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(stat == DEAD || health > maxHealth*0.1) - retreat_distance = initial(retreat_distance) - return - if(!retreat_message_said && target) - visible_message(span_danger("The [name] tries to flee from [target]!")) - retreat_message_said = TRUE - retreat_distance = 30 - -/mob/living/simple_animal/hostile/asteroid/wolf/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(!. || target) - return - retreat_message_said = FALSE - -/obj/item/crusher_trophy/wolf_ear - name = "wolf ear" - desc = "It's a wolf ear." - icon_state = "wolf_ear" - denied_type = /obj/item/crusher_trophy/wolf_ear - -/obj/item/crusher_trophy/wolf_ear/effect_desc() - return "mark detonation to gain a slight speed boost temporarily" - -/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user) - user.apply_status_effect(/datum/status_effect/speed_boost, 1 SECONDS) diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 7e523fdf475..e2a9d7659d5 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -10,7 +10,7 @@ gender = NEUTER emote_see = list("jiggles", "bounces in place") speak_emote = list("blorbles") - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null hud_type = /datum/hud/ooze minbodytemp = 250 maxbodytemp = INFINITY @@ -223,7 +223,7 @@ to_chat(src, span_warning("You are already consuming another creature!")) return FALSE owner.visible_message(span_warning("[ooze] starts attempting to devour [target]!"), span_notice("You start attempting to devour [target].")) - if(!do_after(ooze, 15, target = ooze.pulling)) + if(!do_after(ooze, 1.5 SECONDS, target = ooze.pulling)) return FALSE var/mob/living/eat_target = ooze.pulling diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm index e4b07470c58..30afc69c8b3 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -144,7 +144,7 @@ /mob/living/simple_animal/hostile/retaliate/goose/proc/choke(obj/item/food/plastic) if(stat == DEAD || choking) return - addtimer(CALLBACK(src, PROC_REF(suffocate)), 300) + addtimer(CALLBACK(src, PROC_REF(suffocate)), 30 SECONDS) /mob/living/simple_animal/hostile/retaliate/goose/vomit/choke(obj/item/food/plastic) if(stat == DEAD || choking) @@ -152,9 +152,9 @@ if(prob(25)) visible_message(span_warning("[src] is gagging on \the [plastic]!")) manual_emote("gags!") - addtimer(CALLBACK(src, PROC_REF(vomit)), 300) + addtimer(CALLBACK(src, PROC_REF(vomit)), 30 SECONDS) else - addtimer(CALLBACK(src, PROC_REF(suffocate)), 300) + addtimer(CALLBACK(src, PROC_REF(suffocate)), 30 SECONDS) /mob/living/simple_animal/hostile/retaliate/goose/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm index f5184a85434..fb7ac24da65 100644 --- a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm +++ b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm @@ -11,7 +11,7 @@ gender = NEUTER environment_smash = ENVIRONMENT_SMASH_STRUCTURES speak_emote = list("roars") - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null health = 250 maxHealth = 250 damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 1, STAMINA = 0, OXY = 1) @@ -31,9 +31,9 @@ GRANT_ACTION(/datum/action/cooldown/tentacle_slap) add_cell_sample() - AddComponent(/datum/component/tameable, list(/obj/item/food/fries, /obj/item/food/cheesyfries, /obj/item/food/cornchips, /obj/item/food/carrotfries), tame_chance = 30, bonus_tame_chance = 0, after_tame = CALLBACK(src, PROC_REF(tamed))) + AddComponent(/datum/component/tameable, list(/obj/item/food/fries, /obj/item/food/cheesyfries, /obj/item/food/cornchips, /obj/item/food/carrotfries), tame_chance = 30, bonus_tame_chance = 0) -/mob/living/simple_animal/hostile/vatbeast/proc/tamed(mob/living/tamer) +/mob/living/simple_animal/hostile/vatbeast/tamed(mob/living/tamer, obj/item/food) buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/vatbeast) faction = list(FACTION_NEUTRAL) diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index f16449764de..6bcb7afbd54 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -16,7 +16,7 @@ attack_sound = 'sound/hallucinations/growl1.ogg' attack_vis_effect = ATTACK_EFFECT_BITE combat_mode = TRUE - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 status_flags = CANPUSH death_message = "collapses, flesh gone in a pile of bones!" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 9f79c8a680c..23e27ca7707 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -131,7 +131,7 @@ ///Played when someone punches the creature. var/attacked_sound = SFX_PUNCH - ///The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever), AI_Z_OFF (Temporarily off due to nonpresence of players). + ///The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever). var/AIStatus = AI_ON ///once we have become sentient, we can never go back. var/can_have_ai = TRUE @@ -176,7 +176,6 @@ add_traits(weather_immunities, ROUNDSTART_TRAIT) if (environment_smash >= ENVIRONMENT_SMASH_WALLS) AddElement(/datum/element/wall_smasher, strength_flag = environment_smash) - if(speak) speak = string_list(speak) if(speak_emote) @@ -185,8 +184,6 @@ emote_hear = string_list(emote_hear) if(emote_see) emote_see = string_list(emote_hear) - if(atmos_requirements) - atmos_requirements = string_assoc_list(atmos_requirements) if(damage_coeff) damage_coeff = string_assoc_list(damage_coeff) if(footstep_type) @@ -196,6 +193,24 @@ if(isnull(unsuitable_heat_damage)) unsuitable_heat_damage = unsuitable_atmos_damage + ///We need to wait for SSair to be initialized before we can check atmos/temp requirements. + if(PERFORM_ALL_TESTS(focus_only/atmos_and_temp_requirements) && mapload && !SSair.initialized) + RegisterSignal(SSair, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(on_ssair_init)) + return + init_atmos_temp_requirement(mapload) + +/mob/living/simple_animal/proc/on_ssair_init(datum/source) + SIGNAL_HANDLER + UnregisterSignal(SSair, COMSIG_SUBSYSTEM_POST_INITIALIZE) + init_atmos_temp_requirement(TRUE) + +/mob/living/simple_animal/proc/init_atmos_temp_requirement(mapload) + if(atmos_requirements && unsuitable_atmos_damage) + atmos_requirements = string_assoc_list(atmos_requirements) + AddElement(/datum/element/atmos_requirements, atmos_requirements, unsuitable_atmos_damage, mapload) + if((unsuitable_cold_damage || unsuitable_heat_damage) && (minbodytemp > 0 || maxbodytemp < INFINITY)) + AddElement(/datum/element/body_temp_sensitive, minbodytemp, maxbodytemp, unsuitable_cold_damage, unsuitable_heat_damage, mapload) + /mob/living/simple_animal/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() if(staminaloss > 0) @@ -206,10 +221,6 @@ GLOB.simple_animals[AIStatus] -= src SSnpcpool.currentrun -= src - var/turf/T = get_turf(src) - if (T && AIStatus == AI_Z_OFF) - SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src - return ..() /mob/living/simple_animal/examine(mob/user) @@ -302,51 +313,6 @@ else manual_emote(pick(emote_hear)) -/mob/living/simple_animal/proc/environment_air_is_safe() - . = TRUE - - if(pulledby && pulledby.grab_state >= GRAB_KILL && atmos_requirements["min_oxy"]) - . = FALSE //getting choked - - if(isturf(loc) && isopenturf(loc)) - var/turf/open/ST = loc - if(ST.air) - var/ST_gases = ST.air.gases - ST.air.assert_gases(/datum/gas/oxygen, /datum/gas/pluoxium, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma) - - var/plas = ST_gases[/datum/gas/plasma][MOLES] - var/oxy = ST_gases[/datum/gas/oxygen][MOLES] + (ST_gases[/datum/gas/pluoxium][MOLES] * PLUOXIUM_PROPORTION) - var/n2 = ST_gases[/datum/gas/nitrogen][MOLES] - var/co2 = ST_gases[/datum/gas/carbon_dioxide][MOLES] - - ST.air.garbage_collect() - - if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) - . = FALSE - else if(atmos_requirements["max_oxy"] && oxy > atmos_requirements["max_oxy"]) - . = FALSE - else if(atmos_requirements["min_plas"] && plas < atmos_requirements["min_plas"]) - . = FALSE - else if(atmos_requirements["max_plas"] && plas > atmos_requirements["max_plas"]) - . = FALSE - else if(atmos_requirements["min_n2"] && n2 < atmos_requirements["min_n2"]) - . = FALSE - else if(atmos_requirements["max_n2"] && n2 > atmos_requirements["max_n2"]) - . = FALSE - else if(atmos_requirements["min_co2"] && co2 < atmos_requirements["min_co2"]) - . = FALSE - else if(atmos_requirements["max_co2"] && co2 > atmos_requirements["max_co2"]) - . = FALSE - else - if(atmos_requirements["min_oxy"] || atmos_requirements["min_plas"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"]) - . = FALSE - -/mob/living/simple_animal/proc/environment_temperature_is_safe(datum/gas_mixture/environment) - . = TRUE - var/areatemp = get_temperature(environment) - if((areatemp < minbodytemp) || (areatemp > maxbodytemp)) - . = FALSE - /mob/living/simple_animal/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired) var/atom/A = loc if(isturf(A)) @@ -359,42 +325,6 @@ else adjust_bodytemperature(clamp(temp_delta * seconds_per_tick / temperature_normalization_speed, 0, temp_delta)) - if(!environment_air_is_safe() && unsuitable_atmos_damage) - adjustHealth(unsuitable_atmos_damage * seconds_per_tick) - if(unsuitable_atmos_damage > 0) - throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) - else - clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - - handle_temperature_damage(seconds_per_tick, times_fired) - -/mob/living/simple_animal/proc/handle_temperature_damage(seconds_per_tick, times_fired) - . = FALSE - if((bodytemperature < minbodytemp) && unsuitable_cold_damage) - adjustHealth(unsuitable_cold_damage * seconds_per_tick) - switch(unsuitable_cold_damage) - if(1 to 5) - throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) - if(5 to 10) - throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) - if(10 to INFINITY) - throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) - . = TRUE - - if((bodytemperature > maxbodytemp) && unsuitable_heat_damage) - adjustHealth(unsuitable_heat_damage * seconds_per_tick) - switch(unsuitable_heat_damage) - if(1 to 5) - throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 1) - if(5 to 10) - throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 2) - if(10 to INFINITY) - throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 3) - . = TRUE - - if(!.) - clear_alert(ALERT_TEMPERATURE) - /mob/living/simple_animal/gib() if(butcher_results || guaranteed_butcher_results) var/list/butcher = list() @@ -580,29 +510,12 @@ return if (AIStatus != togglestatus) if (togglestatus > 0 && togglestatus < 5) - if (togglestatus == AI_Z_OFF || AIStatus == AI_Z_OFF) - var/turf/T = get_turf(src) - if (T) - if (AIStatus == AI_Z_OFF) - SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src - else - SSidlenpcpool.idle_mobs_by_zlevel[T.z] += src GLOB.simple_animals[AIStatus] -= src GLOB.simple_animals[togglestatus] += src AIStatus = togglestatus else stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") -/mob/living/simple_animal/proc/consider_wakeup() - if (pulledby || shouldwakeup) - toggle_ai(AI_ON) - -/mob/living/simple_animal/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - ..() - if (old_turf && AIStatus == AI_Z_OFF) - SSidlenpcpool.idle_mobs_by_zlevel[old_turf.z] -= src - toggle_ai(initial(AIStatus)) - ///This proc is used for adding the swabbale element to mobs so that they are able to be biopsied and making sure holograpic and butter-based creatures don't yield viable cells samples. /mob/living/simple_animal/proc/add_cell_sample() return diff --git a/code/modules/mob/living/simple_animal/slime/ai.dm b/code/modules/mob/living/simple_animal/slime/ai.dm deleted file mode 100644 index 0272a4e467b..00000000000 --- a/code/modules/mob/living/simple_animal/slime/ai.dm +++ /dev/null @@ -1,494 +0,0 @@ -#define SLIME_CARES_ABOUT(to_check) (to_check && (to_check == Target || to_check == Leader || (to_check in Friends))) -#define SLIME_HUNGER_NONE 0 -#define SLIME_HUNGER_HUNGRY 1 -#define SLIME_HUNGER_STARVING 2 - -/mob/living/simple_animal/slime/handle_automated_movement() - return //slime random movement is currently handled in handle_targets() - -/mob/living/simple_animal/slime/handle_automated_speech() - return //slime random speech is currently handled in handle_speech() - -///Handles slime mood -/mob/living/simple_animal/slime/proc/handle_mood(seconds_per_tick, times_fired) - #define SLIME_MOOD_NONE "" - #define SLIME_MOOD_ANGRY "angry" - #define SLIME_MOOD_MISCHIEVOUS "mischievous" - #define SLIME_MOOD_POUT "pout" - #define SLIME_MOOD_SAD "sad" - #define SLIME_MOOD_SMILE ":3" - - var/newmood = SLIME_MOOD_NONE - if (rabid || attacked_stacks) - newmood = SLIME_MOOD_ANGRY - else if (docile) - newmood = SLIME_MOOD_SMILE - else if (Target) - newmood = SLIME_MOOD_MISCHIEVOUS - - if (!newmood) - if (discipline_stacks && SPT_PROB(13, seconds_per_tick)) - newmood = SLIME_MOOD_POUT - else if (SPT_PROB(0.5, seconds_per_tick)) - newmood = pick(SLIME_MOOD_SAD, ":3", SLIME_MOOD_POUT) - - if ((current_mood == SLIME_MOOD_SAD || current_mood == SLIME_MOOD_SMILE || current_mood == SLIME_MOOD_POUT) && !newmood) - if(SPT_PROB(50, seconds_per_tick)) - newmood = current_mood - - if (newmood != current_mood) // This is so we don't redraw them every time - current_mood = newmood - regenerate_icons() - - #undef SLIME_MOOD_NONE - #undef SLIME_MOOD_ANGRY - #undef SLIME_MOOD_MISCHIEVOUS - #undef SLIME_MOOD_POUT - #undef SLIME_MOOD_SAD - #undef SLIME_MOOD_SMILE - -///Handles the slime understanding commends spoken to it -/mob/living/simple_animal/slime/proc/handle_speech(seconds_per_tick, times_fired) - //Speech understanding starts here - var/to_say - if (speech_buffer.len > 0) - var/who = speech_buffer[1] // Who said it? - var/phrase = speech_buffer[2] // What did they say? - if ((findtext(phrase, num2text(slime_id)) || findtext(phrase, "slimes"))) // Talking to us - if (findtext(phrase, "hello") || findtext(phrase, "hi")) - to_say = pick("Hello...", "Hi...") - else if (findtext(phrase, "follow")) - if (Leader) - if (Leader == who) // Already following him - to_say = pick("Yes...", "Lead...", "Follow...") - else if (Friends[who] > Friends[Leader]) // VIVA - set_leader(who) - to_say = "Yes... I follow [who]..." - else - to_say = "No... I follow [Leader]..." - else - if (Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) - set_leader(who) - to_say = "I follow..." - else // Not friendly enough - to_say = pick("No...", "I no follow...") - else if (findtext(phrase, "stop")) - if (buckled) // We are asked to stop feeding - if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) - stop_feeding() - set_target(null) - if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) - add_friendship(who, -1) - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Target) // We are asked to stop chasing - if (Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) - set_target(null) - if (Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) - add_friendship(who, -1) - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Leader) // We are asked to stop following - if (Leader == who) - to_say = "Yes... I stay..." - set_leader(null) - else - if (Friends[who] > Friends[Leader]) - set_leader(null) - to_say = "Yes... I stop..." - else - to_say = "No... keep follow..." - else if (findtext(phrase, "stay")) - if (Leader) - if (Leader == who) - holding_still = Friends[who] * 10 - to_say = "Yes... stay..." - else if (Friends[who] > Friends[Leader]) - holding_still = (Friends[who] - Friends[Leader]) * 10 - to_say = "Yes... stay..." - else - to_say = "No... keep follow..." - else - if (Friends[who] >= SLIME_FRIENDSHIP_STAY) - holding_still = Friends[who] * 10 - to_say = "Yes... stay..." - else - to_say = "No... won't stay..." - else if (findtext(phrase, "attack")) - if (rabid && prob(20)) - set_target(who) - process_slime_ai() //Wake up the slime's Target AI, needed otherwise this doesn't work - to_say = "ATTACK!?!?" - else if (Friends[who] >= SLIME_FRIENDSHIP_ATTACK) - for (var/mob/living/possible_target in view(7,src)-list(src,who)) - if (findtext(phrase, lowertext(possible_target.name))) - if (isslime(possible_target)) - to_say = "NO... [possible_target] slime friend" - add_friendship(who, -1) //Don't ask a slime to attack its friend - else if(!Friends[possible_target] || Friends[possible_target] < 1) - set_target(possible_target) - process_slime_ai()//Wake up the slime's Target AI, needed otherwise this doesn't work - to_say = "Ok... I attack [Target]" - else - to_say = "No... like [possible_target] ..." - add_friendship(who, -1) //Don't ask a slime to attack its friend - break - else - to_say = "No... no listen" - - speech_buffer = list() - - //Speech starts here - if (to_say) - say (to_say) - else if(SPT_PROB(0.5, seconds_per_tick)) - emote(pick("bounce","sway","light","vibrate","jiggle")) - else - var/speech_chance = 10 - var/slimes_near = 0 - var/dead_slimes = 0 - var/friends_near = list() - for (var/mob/living/seen_mob in view(7,src)) - if(isslime(seen_mob) && seen_mob != src) - ++slimes_near - if (seen_mob.stat == DEAD) - ++dead_slimes - if (seen_mob in Friends) - speech_chance += 20 - friends_near += seen_mob - if (nutrition < hunger_nutrition) - speech_chance += 10 - if (nutrition < starve_nutrition) - speech_chance += 10 - if (SPT_PROB(1, seconds_per_tick) && prob(speech_chance)) - var/phrases = list() - if (Target) - phrases += "[Target]... look yummy..." - if (nutrition < starve_nutrition) - phrases += "So... hungry..." - phrases += "Very... hungry..." - phrases += "Need... food..." - phrases += "Must... eat..." - else if (nutrition < hunger_nutrition) - phrases += "Hungry..." - phrases += "Where food?" - phrases += "I want to eat..." - phrases += "Rawr..." - phrases += "Blop..." - phrases += "Blorble..." - if (rabid || attacked_stacks) - phrases += "Hrr..." - phrases += "Nhuu..." - phrases += "Unn..." - if (current_mood == ":3") - phrases += "Purr..." - if (attacked_stacks) - phrases += "Grrr..." - if (bodytemperature < T0C) - phrases += "Cold..." - if (bodytemperature < T0C - 30) - phrases += "So... cold..." - phrases += "Very... cold..." - if (bodytemperature < T0C - 50) - phrases += "..." - phrases += "C... c..." - if (buckled) - phrases += "Nom..." - phrases += "Yummy..." - if (powerlevel > 3) - phrases += "Bzzz..." - if (powerlevel > 5) - phrases += "Zap..." - if (powerlevel > 8) - phrases += "Zap... Bzz..." - if (current_mood == "sad") - phrases += "Bored..." - if (slimes_near) - phrases += "Slime friend..." - if (slimes_near > 1) - phrases += "Slime friends..." - if (dead_slimes) - phrases += "What happened?" - if (!slimes_near) - phrases += "Lonely..." - for (var/friend in friends_near) - phrases += "[friend]... friend..." - if (nutrition < hunger_nutrition) - phrases += "[friend]... feed me..." - if(!stat) - say (pick(phrases)) - -///Sets the slime's current attack target -/mob/living/simple_animal/slime/proc/set_target(new_target) - var/old_target = Target - Target = new_target - if(old_target && !SLIME_CARES_ABOUT(old_target)) - UnregisterSignal(old_target, COMSIG_QDELETING) - if(Target) - RegisterSignal(Target, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Sets the person the slime is following around -/mob/living/simple_animal/slime/proc/set_leader(new_leader) - var/old_leader = Leader - Leader = new_leader - if(old_leader && !SLIME_CARES_ABOUT(old_leader)) - UnregisterSignal(old_leader, COMSIG_QDELETING) - if(Leader) - RegisterSignal(Leader, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Alters the friendship value of the target -/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1) - if(!Friends[new_friend]) - Friends[new_friend] = 0 - Friends[new_friend] += amount - if(new_friend) - RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Sets the friendship value of the target -/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1) - Friends[new_friend] = amount - if(new_friend) - RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Removes someone from the friendlist -/mob/living/simple_animal/slime/proc/remove_friend(friend) - Friends -= friend - if(friend && !SLIME_CARES_ABOUT(friend)) - UnregisterSignal(friend, COMSIG_QDELETING) - -///Adds someone to the friend list -/mob/living/simple_animal/slime/proc/set_friends(new_buds) - clear_friends() - for(var/mob/friend as anything in new_buds) - set_friendship(friend, new_buds[friend]) - -///Removes everyone from the friend list -/mob/living/simple_animal/slime/proc/clear_friends() - for(var/mob/friend as anything in Friends) - remove_friend(friend) - -///The passed source will be no longer be the slime's target, leader, or one of its friends -/mob/living/simple_animal/slime/proc/clear_memories_of(datum/source) - SIGNAL_HANDLER - if(source == Target) - set_target(null) - if(source == Leader) - set_leader(null) - remove_friend(source) - -///Handles selecting targets -/mob/living/simple_animal/slime/proc/handle_targets(seconds_per_tick, times_fired) - if(attacked_stacks > 50) - attacked_stacks = 50 - - if(attacked_stacks > 0) - attacked_stacks-- - - if(discipline_stacks > 0) - - if(discipline_stacks >= 5 && rabid) - if(SPT_PROB(37, seconds_per_tick)) - rabid = FALSE - - if(SPT_PROB(5, seconds_per_tick)) - discipline_stacks-- - - if(client) //player controlled slimes can decide for themselves - return - - if(!(mobility_flags & MOBILITY_MOVE)) - return - - if(buckled) - return // if it's eating someone already, continue eating! - - if(Target) - --target_patience - if (target_patience <= 0 || stunned_until > world.time || discipline_stacks || attacked_stacks || docile) // Tired of chasing or something draws out attention - target_patience = 0 - set_target(null) - - if(slime_ai_processing && stunned_until > world.time) - return - - var/hungry = SLIME_HUNGER_NONE // determines if the slime is hungry - - if (nutrition < starve_nutrition) - hungry = SLIME_HUNGER_STARVING - else if (nutrition < grow_nutrition && SPT_PROB(13, seconds_per_tick) || nutrition < hunger_nutrition) - hungry = SLIME_HUNGER_HUNGRY - - if(hungry == SLIME_HUNGER_STARVING && !client) // if a slime is starving, it starts losing its friends - if(Friends.len > 0 && SPT_PROB(0.5, seconds_per_tick)) - var/mob/nofriend = pick(Friends) - add_friendship(nofriend, -1) - - if(!Target) //If we have no target, try to add a target - if(will_hunt() && hungry || attacked_stacks || rabid) // Only add to the list if we need to - var/list/targets = list() - - for(var/mob/living/L in view(7,src)) - - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs - continue - - if(L in Friends) // No eating friends! - continue - - var/ally = FALSE - for(var/F in faction) - if(F == FACTION_NEUTRAL) //slimes are neutral so other mobs not target them, but they can target neutral mobs - continue - if(F in L.faction) - ally = TRUE - break - if(ally) - continue - - if(issilicon(L) && (rabid || attacked_stacks)) // They can't eat silicons, but they can glomp them in defence - targets += L // Possible target found! - - if(locate(/mob/living/simple_animal/slime) in L.buckled_mobs) // Only one slime can latch on at a time. - continue - - targets += L // Possible target found! - - if(targets.len > 0) - if(attacked_stacks || rabid || hungry == SLIME_HUNGER_STARVING) - set_target(targets[1]) // I am attacked and am fighting back or so hungry I don't even care - else - for(var/mob/living/carbon/C in targets) - if(!discipline_stacks && SPT_PROB(2.5, seconds_per_tick)) - if(ishuman(C) || isalienadult(C)) - set_target(C) - break - - if(islarva(C) || ismonkey(C)) - set_target(C) - break - - if (Target) - target_patience = rand(5, 7) - if (life_stage == SLIME_LIFE_STAGE_ADULT) - target_patience += 3 - - if(!Target) // If we have no target, we are wandering or following orders - if (Leader) - if(holding_still) - holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc)) - step_to(src, Leader) - - else if(hungry) - if (holding_still) - holding_still = max(holding_still - (0.5 * hungry * seconds_per_tick), 0) - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(50)) - step(src, pick(GLOB.cardinals)) - - else - if(holding_still) - holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) - else if (docile && pulledby) - holding_still = 10 - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(33)) - step(src, pick(GLOB.cardinals)) - else if(!slime_ai_processing) - INVOKE_ASYNC(src, PROC_REF(process_slime_ai)) - -/// Check for being stopped from feeding and chasing -/mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) - if (docile) - return FALSE - if (hunger == SLIME_HUNGER_STARVING || rabid || attacked_stacks) - return TRUE - if (Leader) - return FALSE - if (holding_still) - return FALSE - return TRUE - -/// the master AI process -/mob/living/simple_animal/slime/proc/process_slime_ai() - - if(slime_ai_processing || stat || client) - return - - var/hungry = SLIME_HUNGER_NONE - if (nutrition < starve_nutrition) - hungry = SLIME_HUNGER_STARVING - else if (nutrition < grow_nutrition && prob(25) || nutrition < hunger_nutrition) - hungry = SLIME_HUNGER_HUNGRY - - slime_ai_processing = TRUE - - while(slime_ai_processing && stat != DEAD && (attacked_stacks || hungry || rabid || buckled)) - if(!(mobility_flags & MOBILITY_MOVE)) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly - break - - if(!Target || client) - break - - if(Target.health <= -70 || Target.stat == DEAD) - set_target(null) - slime_ai_processing = FALSE - break - - if(Target) - if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs) - set_target(null) - slime_ai_processing = FALSE - break - if(!slime_ai_processing) - break - - if(Target in view(1,src)) - if(!can_feed_on(Target)) //If they're not able to be fed upon, ignore them. - if(!is_attack_on_cooldown) - is_attack_on_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) - - if(Target.Adjacent(src)) - Target.attack_animal(src) - break - if((Target.body_position == STANDING_UP) && prob(80)) - - if(Target.client && Target.health >= 20) - if(!is_attack_on_cooldown) - is_attack_on_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) - - if(Target.Adjacent(src)) - Target.attack_animal(src) - - else - if(!is_attack_on_cooldown && Target.Adjacent(src)) - start_feeding(Target) - - else - if(!is_attack_on_cooldown && Target.Adjacent(src)) - start_feeding(Target) - - else if(Target in view(7, src)) - if(!Target.Adjacent(src)) - // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them - step_to(src, Target) - else - set_target(null) - slime_ai_processing = FALSE - break - - var/sleeptime = cached_multiplicative_slowdown - if(sleeptime <= 0) - sleeptime = 1 - - sleep(sleeptime + 2) // this is about as fast as a player slime can go - - slime_ai_processing = FALSE - -#undef SLIME_CARES_ABOUT - -#undef SLIME_HUNGER_NONE -#undef SLIME_HUNGER_HUNGRY -#undef SLIME_HUNGER_STARVING diff --git a/code/modules/mob/living/simple_animal/slime/defense.dm b/code/modules/mob/living/simple_animal/slime/defense.dm deleted file mode 100644 index dd94e4e2bab..00000000000 --- a/code/modules/mob/living/simple_animal/slime/defense.dm +++ /dev/null @@ -1,131 +0,0 @@ - -/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - if(!forced) - amount = -abs(amount) - return ..() //Heals them - -/mob/living/simple_animal/slime/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - powerlevel = 0 // oh no, the power! - -/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/user, list/modifiers) - . = ..() - if(.) - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/human/user, list/modifiers) - if(..()) //successful monkey bite. - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L, list/modifiers) - if(..()) //successful larva bite. - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(!.) - return - discipline_slime(user) - -/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(buckled) - user.do_attack_animation(src, ATTACK_EFFECT_DISARM) - if(buckled == user) - if(prob(60)) - user.visible_message(span_warning("[user] attempts to wrestle \the [name] off!"), \ - span_danger("You attempt to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - - else - user.visible_message(span_warning("[user] manages to wrestle \the [name] off!"), \ - span_notice("You manage to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - - discipline_slime(user) - - else - if(prob(30)) - buckled.visible_message(span_warning("[user] attempts to wrestle \the [name] off of [buckled]!"), \ - span_warning("[user] attempts to wrestle \the [name] off of you!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - - else - buckled.visible_message(span_warning("[user] manages to wrestle \the [name] off of [buckled]!"), \ - span_notice("[user] manage to wrestle \the [name] off of you!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - - discipline_slime(user) - else - if(stat == DEAD && surgeries.len) - if(!user.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK)) - for(var/datum/surgery/operations as anything in surgeries) - if(operations.next_step(user, modifiers)) - return TRUE - if(..()) //successful attack - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) - if(..()) //if harm or disarm intent. - attacked_stacks += 10 - discipline_slime(user) - -/mob/living/simple_animal/slime/attackby(obj/item/attacking_item, mob/living/user, params) - if(stat == DEAD && surgeries.len) - var/list/modifiers = params2list(params) - if(!user.combat_mode || (LAZYACCESS(modifiers, RIGHT_CLICK))) - for(var/datum/surgery/operations as anything in surgeries) - if(operations.next_step(user, modifiers)) - return TRUE - if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma) && !stat) //Lets you feed slimes plasma. - add_friendship(user, 1) - to_chat(user, span_notice("You feed the slime the plasma. It chirps happily.")) - var/obj/item/stack/sheet/mineral/plasma/sheet = attacking_item - sheet.use(1) - return - if(attacking_item.force > 0) - attacked_stacks += 10 - if(prob(25)) - user.do_attack_animation(src) - user.changeNext_move(CLICK_CD_MELEE) - to_chat(user, span_danger("[attacking_item] passes right through [src]!")) - return - if(discipline_stacks && prob(50)) // wow, buddy, why am I getting attacked?? - discipline_stacks = 0 - if(attacking_item.force >= 3) - var/force_effect = attacking_item.force * (life_stage == SLIME_LIFE_STAGE_BABY ? 2 : 1) - if(prob(10 + force_effect)) - discipline_slime(user) - - if(!istype(attacking_item, /obj/item/storage/bag/xeno)) - return ..() - - var/obj/item/storage/xeno_bag = attacking_item - if(!crossbreed_modification) - to_chat(user, span_warning("The slime is not currently being mutated.")) - return - var/has_output = FALSE //Have we outputted text? - var/has_found = FALSE //Have we found an extract to be added? - for(var/obj/item/slime_extract/extract in xeno_bag.contents) - if(extract.crossbreed_modification == crossbreed_modification) - xeno_bag.atom_storage.attempt_remove(extract, get_turf(src), silent = TRUE) - qdel(extract) - applied_crossbreed_amount++ - has_found = TRUE - if(applied_crossbreed_amount >= SLIME_EXTRACT_CROSSING_REQUIRED) - to_chat(user, span_notice("You feed the slime as many of the extracts from the bag as you can, and it mutates!")) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - spawn_corecross() - has_output = TRUE - break - - if(has_output) - return - - if(!has_found) - to_chat(user, span_warning("There are no extracts in the bag that this slime will accept!")) - else - to_chat(user, span_notice("You feed the slime some extracts from the bag.")) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - return diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm deleted file mode 100644 index be158abaed5..00000000000 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ /dev/null @@ -1,181 +0,0 @@ - - -/mob/living/simple_animal/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) - return - . = ..() - if(!.) - return - - // We get some passive bruteloss healing if we're not dead - if(stat != DEAD && SPT_PROB(16, seconds_per_tick)) - adjustBruteLoss(-0.5 * seconds_per_tick) - if(ismob(buckled)) - handle_feeding(seconds_per_tick, times_fired) - if(stat != CONSCIOUS) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech - return - handle_nutrition(seconds_per_tick, times_fired) - if(QDELETED(src)) // Stop if the slime split during handle_nutrition() - return - handle_targets(seconds_per_tick, times_fired) - if(ckey) - return - handle_mood(seconds_per_tick, times_fired) - handle_speech(seconds_per_tick, times_fired) - - -// Unlike most of the simple animals, slimes support UNCONSCIOUS. This is an ugly hack. -/mob/living/simple_animal/slime/update_stat() - switch(stat) - if(UNCONSCIOUS, HARD_CRIT) - if(health > 0) - return - return ..() - -/mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired) - var/loc_temp = get_temperature(environment) - var/divisor = 10 /// The divisor controls how fast body temperature changes, lower causes faster changes - - var/temp_delta = loc_temp - bodytemperature - if(abs(temp_delta) > 50) // If the difference is great, reduce the divisor for faster stabilization - divisor = 5 - - if(temp_delta < 0) // It is cold here - if(!on_fire) // Do not reduce body temp when on fire - adjust_bodytemperature(clamp((temp_delta / divisor) * seconds_per_tick, temp_delta, 0)) - else // This is a hot place - adjust_bodytemperature(clamp((temp_delta / divisor) * seconds_per_tick, 0, temp_delta)) - - if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc - if(bodytemperature <= (T0C - 40)) // stun temperature - ADD_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - else - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - - if(bodytemperature <= (T0C - 50)) // hurt temperature - if(bodytemperature <= 50) // sqrting negative numbers is bad - adjustBruteLoss(100 * seconds_per_tick) - else - adjustBruteLoss(round(sqrt(bodytemperature)) * seconds_per_tick) - else - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - - if(stat != DEAD) - var/bz_percentage =0 - if(environment.gases[/datum/gas/bz]) - bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.total_moles() - var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis - - switch(stat) - if(CONSCIOUS) - if(stasis) - to_chat(src, span_danger("Nerve gas in the air has put you in stasis!")) - set_stat(UNCONSCIOUS) - powerlevel = 0 - rabid = FALSE - regenerate_icons() - if(UNCONSCIOUS, HARD_CRIT) - if(!stasis) - to_chat(src, span_notice("You wake up from the stasis.")) - set_stat(CONSCIOUS) - regenerate_icons() - - updatehealth() - -///Handles the slime draining the target it is attached to -/mob/living/simple_animal/slime/proc/handle_feeding(seconds_per_tick, times_fired) - var/mob/living/prey = buckled - - if(stat) - stop_feeding(silent = TRUE) - - if(prey.stat == DEAD) // our victim died - if(!client) - if(!rabid && !attacked_stacks) - var/mob/last_to_hurt = prey.LAssailant?.resolve() - if(last_to_hurt && last_to_hurt != prey) - if(SPT_PROB(30, seconds_per_tick)) - add_friendship(last_to_hurt, 1) - else - to_chat(src, "This subject does not have a strong enough life energy anymore...") - - if(prey.client && ishuman(prey)) - if(SPT_PROB(61, seconds_per_tick)) - rabid = TRUE //we go rabid after finishing to feed on a human with a client. - - stop_feeding() - return - - if(iscarbon(prey)) - prey.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick) - prey.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick) - - if(SPT_PROB(5, seconds_per_tick) && prey.client) - to_chat(prey, "[pick("You can feel your body becoming weak!", \ - "You feel like you're about to die!", \ - "You feel every part of your body screaming in agony!", \ - "A low, rolling pain passes through your body!", \ - "Your body feels as if it's falling apart!", \ - "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]") - - else if(isanimal_or_basicmob(prey)) - var/mob/living/animal_victim = prey - - var/totaldamage = 0 //total damage done to this unfortunate animal - var/need_mob_update - need_mob_update = totaldamage += animal_victim.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick, updating_health = FALSE) - need_mob_update += totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick, updating_health = FALSE) - if(need_mob_update) - animal_victim.updatehealth() - - if(totaldamage >= 0) // AdjustBruteLoss returns a negative value on succesful damage adjustment - stop_feeding(FALSE, FALSE) - return - - else - stop_feeding(FALSE, FALSE) - return - - add_nutrition((rand(7, 15) * 0.5 * seconds_per_tick * CONFIG_GET(number/damage_multiplier))) - - //Heal yourself. - adjustBruteLoss(-1.5 * seconds_per_tick) - -///Handles the slime's nutirion level -/mob/living/simple_animal/slime/proc/handle_nutrition(seconds_per_tick, times_fired) - - if(docile) //God as my witness, I will never go hungry again - set_nutrition(700) //fuck you for using the base nutrition var - return - - if(SPT_PROB(7.5, seconds_per_tick)) - adjust_nutrition((life_stage == SLIME_LIFE_STAGE_ADULT ? -1 : -0.5) * seconds_per_tick) - - if(nutrition <= 0) - set_nutrition(0) - if(SPT_PROB(50, seconds_per_tick)) - adjustBruteLoss(rand(0,5)) - - else if (nutrition >= grow_nutrition && amount_grown < SLIME_EVOLUTION_THRESHOLD) - adjust_nutrition(-10 * seconds_per_tick) - amount_grown++ - update_mob_action_buttons() - - if(amount_grown >= SLIME_EVOLUTION_THRESHOLD && !buckled && !Target && !ckey) - if(life_stage == SLIME_LIFE_STAGE_ADULT && loc.AllowDrop()) - Reproduce() - else - Evolve() - -///Adds nutrition to the slime's nutrition level. Has a chance to increase its electric levels. -/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0) - set_nutrition(min((nutrition + nutrition_to_add), max_nutrition)) - if(nutrition >= grow_nutrition) - if(powerlevel= hunger_nutrition + 100) //can't get power levels unless you're a bit above hunger level. - if(powerlevel= SLIME_EVOLUTION_THRESHOLD) - return TRUE - return FALSE - return TRUE - -/mob/living/simple_animal/slime/verb/Feed() - set category = "Slime" - set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." - - if(stat) - return FALSE - - if(buckled) - stop_feeding() - return TRUE - - var/list/choices = list() - for(var/mob/living/nearby_mob in view(1,src)) - if(nearby_mob != src && Adjacent(nearby_mob) && nearby_mob.appears_alive()) - choices += nearby_mob - - if(length(choices) == 1) - start_feeding(choices[1]) - return TRUE - - var/choice = tgui_input_list(src, "Who do you wish to feed on?", "Slime Feed", sort_names(choices)) - if(isnull(choice)) - return FALSE - var/mob/living/victim = choice - if(can_feed_on(victim)) - start_feeding(victim) - return TRUE - return FALSE - -/datum/action/innate/slime/feed - name = "Feed" - button_icon_state = "slimeeat" - - -/datum/action/innate/slime/feed/Activate() - var/mob/living/simple_animal/slime/slime_owner = owner - slime_owner.Feed() - -///Can the slime leech life energy from the target? -/mob/living/simple_animal/slime/proc/can_feed_on(mob/living/meal, silent = FALSE) - if(!Adjacent(meal)) - return FALSE - - if(buckled) - stop_feeding() - return FALSE - - if(issilicon(meal) || meal.mob_biotypes & MOB_ROBOTIC) - return FALSE - - if(meal.flags_1 & HOLOGRAM_1) - meal.balloon_alert(src, "no life energy!") - return FALSE - - if(isanimal(meal)) - var/mob/living/simple_animal/simple_meal = meal - if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[BRUTE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. - if(silent) - return FALSE - to_chat(src, "[pick("This subject is incompatible", \ - "This subject does not have life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]!") - return FALSE - else if(isbasicmob(meal)) - var/mob/living/basic/basic_meal = meal - if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[BRUTE] <= 0) - if (silent) - return FALSE - to_chat(src, "[pick("This subject is incompatible", \ - "This subject does not have life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]!") - return FALSE - - if(isslime(meal)) - if(silent) - return FALSE - to_chat(src, span_warning("I can't latch onto another slime...")) - return FALSE - - if(docile) - if(silent) - return FALSE - to_chat(src, span_notice("I'm not hungry anymore...")) - return FALSE - - if(stat) - if(silent) - return FALSE - to_chat(src, span_warning("I must be conscious to do this...")) - return FALSE - - if(meal.stat == DEAD) - if(silent) - return FALSE - to_chat(src, span_warning("This subject does not have a strong enough life energy...")) - return FALSE - - if(locate(/mob/living/simple_animal/slime) in meal.buckled_mobs) - if(silent) - return FALSE - to_chat(src, span_warning("Another slime is already feeding on this subject...")) - return FALSE - return TRUE - -///The slime will start feeding on the target -/mob/living/simple_animal/slime/proc/start_feeding(mob/living/target_mob) - target_mob.unbuckle_all_mobs(force=TRUE) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in can_feed_on()) - if(target_mob.buckle_mob(src, force=TRUE)) - layer = target_mob.layer+0.01 //appear above the target mob - target_mob.visible_message(span_danger("[name] latches onto [target_mob]!"), \ - span_userdanger("[name] latches onto [target_mob]!")) - else - to_chat(src, span_warning("I have failed to latch onto the subject!")) - -///The slime will stop feeding -/mob/living/simple_animal/slime/proc/stop_feeding(silent = FALSE, living=TRUE) - if(!buckled) - return - - if(!living) - to_chat(src, "[pick("This subject is incompatible", \ - "This subject does not have life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]!") - - var/mob/living/victim = buckled - - if(istype(victim)) - var/bio_protection = 100 - victim.getarmor(null, BIO) - if(prob(bio_protection)) - victim.apply_status_effect(/datum/status_effect/slimed, slime_type.rgb_code, slime_type.colour == SLIME_TYPE_RAINBOW) - - if(!silent) - visible_message(span_warning("[src] lets go of [buckled]!"), \ - span_notice("I stopped feeding.")) - layer = initial(layer) - buckled.unbuckle_mob(src,force=TRUE) - -/mob/living/simple_animal/slime/verb/Evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - - if(stat) - to_chat(src, "I must be conscious to do this...") - return - if(life_stage == SLIME_LIFE_STAGE_ADULT) - to_chat(src, "I have already evolved...") - return - if(amount_grown < SLIME_EVOLUTION_THRESHOLD) - to_chat(src, "I am not ready to evolve yet...") - return - - set_life_stage(SLIME_LIFE_STAGE_ADULT) - amount_grown = 0 - - regenerate_icons() - update_name() - -/datum/action/innate/slime/evolve - name = "Evolve" - button_icon_state = "slimegrow" - needs_growth = GROWTH_NEEDED - -/datum/action/innate/slime/evolve/Activate() - var/mob/living/simple_animal/slime/slime_owner = owner - slime_owner.Evolve() - -/mob/living/simple_animal/slime/verb/Reproduce() - set category = "Slime" - set desc = "This will make you split into four slimes." - - if(stat != CONSCIOUS) - balloon_alert(src, "need to be conscious to split!") - return - - if(!isopenturf(loc)) - balloon_alert(src, "can't reproduce here!") - - if(life_stage != SLIME_LIFE_STAGE_ADULT) - balloon_alert(src, "not old enough to reproduce!") - return - - if(amount_grown < SLIME_EVOLUTION_THRESHOLD) - to_chat(src, "I need to grow myself more before I can reproduce...") - return - - var/list/babies = list() - var/new_nutrition = round(nutrition * 0.9) - var/new_powerlevel = round(powerlevel / 4) - var/turf/drop_loc = drop_location() - - for(var/i in 1 to 4) - var/child_colour - - if(mutation_chance >= 100) - child_colour = /datum/slime_type/rainbow - else if(prob(mutation_chance)) - child_colour = pick_weight(slime_type.mutations) - else - child_colour = slime_type.type - - var/mob/living/simple_animal/slime/baby - baby = new(drop_loc, child_colour) - - if(ckey) - baby.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! - - baby.powerlevel = new_powerlevel - if(i != 1) - step_away(baby, src) - - baby.set_friends(Friends) - babies += baby - baby.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) - SSblackbox.record_feedback("tally", "slime_babies_born", 1, baby.slime_type.colour) - - var/mob/living/simple_animal/slime/new_slime = pick(babies) // slime that the OG slime will move into. - new_slime.set_combat_mode(TRUE) - - if(isnull(src.mind)) - new_slime.key = src.key - else - src.mind.transfer_to(new_slime) - - qdel(src) - -/datum/action/innate/slime/reproduce - name = "Reproduce" - button_icon_state = "slimesplit" - needs_growth = GROWTH_NEEDED - -/datum/action/innate/slime/reproduce/Activate() - var/mob/living/simple_animal/slime/slime_owner = owner - slime_owner.Reproduce() - -#undef SIZE_DOESNT_MATTER -#undef BABIES_ONLY -#undef ADULTS_ONLY -#undef NO_GROWTH_NEEDED -#undef GROWTH_NEEDED diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm deleted file mode 100644 index 4903827a55d..00000000000 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ /dev/null @@ -1,473 +0,0 @@ -#define SLIME_EXTRA_SHOCK_COST 3 -#define SLIME_EXTRA_SHOCK_THRESHOLD 8 -#define SLIME_BASE_SHOCK_PERCENTAGE 10 -#define SLIME_SHOCK_PERCENTAGE_PER_LEVEL 7 - -/mob/living/simple_animal/slime - name = "grey baby slime (123)" - icon = 'icons/mob/simple/slimes.dmi' - icon_state = "grey baby slime" - pass_flags = PASSTABLE | PASSGRILLE - gender = NEUTER - faction = list(FACTION_SLIME, FACTION_NEUTRAL) - - harm_intent_damage = 5 - icon_living = "grey baby slime" - icon_dead = "grey baby slime dead" - attack_verb_simple = "glomp" - attack_verb_continuous = "glomps" - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "shoos" - response_disarm_simple = "shoo" - response_harm_continuous = "stomps on" - response_harm_simple = "stomp on" - emote_see = list("jiggles", "bounces in place") - speak_emote = list("blorbles") - bubble_icon = "slime" - initial_language_holder = /datum/language_holder/slime - - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - - maxHealth = 150 - health = 150 - mob_biotypes = MOB_SLIME - melee_damage_lower = 5 - melee_damage_upper = 25 - wound_bonus = -45 - can_buckle_to = FALSE - - verb_say = "blorbles" - verb_ask = "inquisitively blorbles" - verb_exclaim = "loudly blorbles" - verb_yell = "loudly blorbles" - - // canstun and canknockdown don't affect slimes because they ignore stun and knockdown variables - // for the sake of cleanliness, though, here they are. - status_flags = CANUNCONSCIOUS|CANPUSH - - footstep_type = FOOTSTEP_MOB_SLIME - - //Physiology - - ///What is our current lifestage? - var/life_stage = SLIME_LIFE_STAGE_BABY - - ///The number of /obj/item/slime_extract's the slime has left inside - var/cores = 1 - ///Chance of mutating, should be between 25 and 35 - var/mutation_chance = 30 - ///1-10 controls how much electricity they are generating - var/powerlevel = SLIME_MIN_POWER - ///Controls how long the slime has been overfed, if 10, grows or reproduces - var/amount_grown = 0 - ///The maximum amount of nutrition a slime can contain - var/max_nutrition = 1000 - /// Above it we grow our amount_grown and our power_level, below it we can eat - var/grow_nutrition = 800 - /// Below this, we feel hungry - var/hunger_nutrition = 500 - /// Below this, we feel starving - var/starve_nutrition = 200 - - ///Has a mutator been used on the slime? Only one is allowed - var/mutator_used = FALSE - ///Is the slime forced into being immobile, despite the gases present? - var/force_stasis = FALSE - - //The datum that handles the slime colour's core and possible mutations - var/datum/slime_type/slime_type - - //CORE-CROSSING CODE - - ///What cross core modification is being used. - var/crossbreed_modification - ///How many extracts of the modtype have been applied. - var/applied_crossbreed_amount = 0 - - //AI related traits - - ///The current mood of the slime, set randomly or through emotes (if sentient). - var/current_mood - - ///Determines if the AI loop is activated - var/slime_ai_processing = FALSE - ///Attack cooldown - var/is_attack_on_cooldown = FALSE - ///If a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while - var/discipline_stacks = 0 - ///Stored the world time when the slime's stun wears off - var/stunned_until = 0 - - ///Is the slime docile? - var/docile = FALSE - - ///Used to understand when someone is talking to it - var/slime_id = 0 - ///AI variable - tells the slime to hunt this down - var/mob/living/Target = null - ///AI variable - tells the slime to follow this person - var/mob/living/Leader = null - - ///Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable - var/attacked_stacks = 0 - ///If set to 1, the slime will attack and eat anything it comes in contact with - var/rabid = FALSE - ///AI variable, cooloff-ish for how long it's going to stay in one place - var/holding_still = 0 - ///AI variable, cooloff-ish for how long it's going to follow its target - var/target_patience = 0 - ///A list of friends; they are not considered targets for feeding; passed down after splitting - var/list/Friends = list() - ///Last phrase said near it and person who said it - var/list/speech_buffer = list() - -/mob/living/simple_animal/slime/Initialize(mapload, new_type=/datum/slime_type/grey, new_life_stage=SLIME_LIFE_STAGE_BABY) - var/datum/action/innate/slime/feed/feeding_action = new - feeding_action.Grant(src) - - set_life_stage(new_life_stage) - - set_slime_type(new_type) - . = ..() - set_nutrition(700) - - AddElement(/datum/element/soft_landing) - AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLIME, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - ADD_TRAIT(src, TRAIT_CANT_RIDE, INNATE_TRAIT) - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - - RegisterSignal(src, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(slime_pre_attack)) - -/mob/living/simple_animal/slime/Destroy() - for (var/A in actions) - var/datum/action/AC = A - AC.Remove(src) - set_target(null) - set_leader(null) - clear_friends() - return ..() - -///Random slime subtype -/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_life_stage) - . = ..(mapload, pick(subtypesof(/datum/slime_type)), prob(50) ? SLIME_LIFE_STAGE_ADULT : SLIME_LIFE_STAGE_BABY) - -///Friendly docile subtype -/mob/living/simple_animal/slime/pet - docile = TRUE - -/mob/living/simple_animal/slime/update_name() - ///Checks if the slime has a generic name, in the format of baby/adult slime (123) - var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") - if(slime_name_regex.Find(name)) - slime_id = rand(1, 1000) - name = "[slime_type.colour] [life_stage] slime ([slime_id])" - real_name = name - return ..() - -/mob/living/simple_animal/slime/regenerate_icons() - cut_overlays() - var/icon_text = "[slime_type.colour] [life_stage] slime" - icon_dead = "[icon_text] dead" - if(stat != DEAD) - icon_state = icon_text - if(current_mood && !stat) - add_overlay("aslime-[current_mood]") - else - icon_state = icon_dead - ..() - -/mob/living/simple_animal/slime/updatehealth() - . = ..() - var/mod = 0 - if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) - var/health_deficiency = (maxHealth - health) - if(health_deficiency >= 45) - mod += (health_deficiency / 25) - if(health <= 0) - mod += 2 - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, multiplicative_slowdown = mod) - -/mob/living/simple_animal/slime/adjust_bodytemperature() - . = ..() - var/mod = 0 - if(bodytemperature >= 330.23) // 135 F or 57.08 C - mod = -1 // slimes become supercharged at high temperatures - else if(bodytemperature < 283.222) - mod = ((283.222 - bodytemperature) / 10) * 1.75 - if(mod) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod) - -/mob/living/simple_animal/slime/ObjBump(obj/bumped_object) - if(client || powerlevel <= SLIME_MIN_POWER) // slimes with people in control can't accidentally attack - return - - if (life_stage != SLIME_LIFE_STAGE_ADULT && !prob(5)) //its rare for baby slimes to actually damage windows - return - - var/accidental_attack_probability = 10 - switch(powerlevel) - if(1 to 2) - accidental_attack_probability = 20 - if(3 to 4) - accidental_attack_probability = 30 - if(5 to 6) - accidental_attack_probability = 40 - if(7 to 8) - accidental_attack_probability = 60 - if(9) - accidental_attack_probability = 70 - if(10) - accidental_attack_probability = 95 - if(!prob(accidental_attack_probability)) - return - - if(!istype(bumped_object, /obj/structure/window) && !istype(bumped_object, /obj/structure/grille)) - return - - if(nutrition > hunger_nutrition || is_attack_on_cooldown) //hungry slimes and slimes on cooldown will not attack - return - - bumped_object.attack_animal(src) - is_attack_on_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) - -/mob/living/simple_animal/slime/get_status_tab_items() - . = ..() - if(!docile) - . += "Nutrition: [nutrition]/[max_nutrition]" - if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) - if(life_stage == SLIME_LIFE_STAGE_ADULT) - . += "You can reproduce!" - else - . += "You can evolve!" - - switch(stat) - if(HARD_CRIT, UNCONSCIOUS) - . += "You are knocked out by high levels of BZ!" - else - . += "Power Level: [powerlevel]" - - -/mob/living/simple_animal/slime/MouseDrop(atom/movable/target_atom as mob|obj) - if(isliving(target_atom) && target_atom != src && usr == src) - var/mob/living/Food = target_atom - if(can_feed_on(Food)) - start_feeding(Food) - return ..() - -/mob/living/simple_animal/slime/doUnEquip(obj/item/unequipped_item, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - return - -/mob/living/simple_animal/slime/start_pulling(atom/movable/moveable_atom, state, force = move_force, supress_message = FALSE) - return - -/mob/living/simple_animal/slime/attack_ui(slot, params) - return - -/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat) - if(..()) - return 3 - -/mob/living/simple_animal/slime/examine(mob/user) - . = list("This is [icon2html(src, user)] \a [src]!", EXAMINE_SECTION_BREAK) //SKYRAT EDIT CHANGE - if (stat == DEAD) - . += span_deadsay("It is limp and unresponsive.") - else - if (stat == UNCONSCIOUS || stat == HARD_CRIT) // Slime stasis - . += span_deadsay("It appears to be alive but unresponsive.") - if (getBruteLoss()) - . += "" - if (getBruteLoss() < 40) - . += "It has some punctures in its flesh!" - else - . += "It has severe punctures and tears in its flesh!" - . += "\n" - - switch(powerlevel) - if(2 to 3) - . += "It is flickering gently with a little electrical activity." - - if(4 to 5) - . += "It is glowing gently with moderate levels of electrical activity." - - if(6 to 9) - . += span_warning("It is glowing brightly with high levels of electrical activity.") - - if(10) - . += span_warning("It is radiating with massive levels of electrical activity!") - - . += "" - -/mob/living/simple_animal/slime/proc/apply_water() - adjustBruteLoss(rand(15,20)) - if(client) - return - - if(Target) // Like cats - set_target(null) - ++discipline_stacks - return - -///Changes the slime's current life state -/mob/living/simple_animal/slime/proc/set_life_stage(new_life_stage = SLIME_LIFE_STAGE_BABY) - life_stage = new_life_stage - - switch(life_stage) - if(SLIME_LIFE_STAGE_BABY) - for(var/datum/action/innate/slime/reproduce/reproduce_action in actions) - reproduce_action.Remove(src) - - GRANT_ACTION(/datum/action/innate/slime/evolve) - - health = initial(health) - maxHealth = initial(maxHealth) - - obj_damage = initial(obj_damage) - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - wound_bonus = initial(wound_bonus) - - max_nutrition = initial(max_nutrition) - grow_nutrition = initial(grow_nutrition) - hunger_nutrition = initial(hunger_nutrition) - starve_nutrition = initial(starve_nutrition) - - if(SLIME_LIFE_STAGE_ADULT) - - for(var/datum/action/innate/slime/evolve/evolve_action in actions) - evolve_action.Remove(src) - - GRANT_ACTION(/datum/action/innate/slime/reproduce) - - health = 200 - maxHealth = 200 - - obj_damage = 15 - melee_damage_lower += 10 - melee_damage_upper += 10 - wound_bonus = -90 - - max_nutrition += 200 - grow_nutrition += 200 - hunger_nutrition += 100 - starve_nutrition += 100 - -///Sets the slime's type, name and its icons -/mob/living/simple_animal/slime/proc/set_slime_type(new_type) - slime_type = new new_type - update_name() - regenerate_icons() - -///randomizes the colour of a slime -/mob/living/simple_animal/slime/proc/random_colour() - set_slime_type(pick(subtypesof(/datum/slime_type))) - -///Makes a slime not attack people for a while -/mob/living/simple_animal/slime/proc/discipline_slime(mob/user) - if(stat) - return - - if(prob(80) && !client) - discipline_stacks++ - - if(life_stage == SLIME_LIFE_STAGE_BABY && discipline_stacks == 1) //if the slime is a baby and has not been overly disciplined, it will give up its grudge - attacked_stacks = 0 - - set_target(null) - if(buckled) - stop_feeding(silent = TRUE) //we unbuckle the slime from the mob it latched onto. - - stunned_until = world.time + rand(2 SECONDS, 6 SECONDS) - - Stun(3) - if(user) - step_away(src,user,15) - - addtimer(CALLBACK(src, PROC_REF(slime_move), user), 0.3 SECONDS) - -///Makes a slime move away, used for a timed callback -/mob/living/simple_animal/slime/proc/slime_move(mob/user) - if(user) - step_away(src,user,15) - -///Spawns a crossed slimecore item -/mob/living/simple_animal/slime/proc/spawn_corecross() - var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) - visible_message(span_danger("[src] shudders, its mutated core consuming the rest of its body!")) - playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) - var/selected_crossbreed_path - for(var/crossbreed_path in crossbreeds) - var/obj/item/slimecross/cross_item = crossbreed_path - if(initial(cross_item.colour) == slime_type.colour && initial(cross_item.effect) == crossbreed_modification) - selected_crossbreed_path = cross_item - break - if(selected_crossbreed_path) - new selected_crossbreed_path(loc) - else - visible_message(span_warning("The mutated core shudders, and collapses into a puddle, unable to maintain its form.")) - qdel(src) - -///Handles slime attacking restrictions, and any extra effects that would trigger -/mob/living/simple_animal/slime/proc/slime_pre_attack(mob/living/simple_animal/slime/our_slime, atom/target, proximity, modifiers) - SIGNAL_HANDLER - if(isAI(target)) //The aI is not tasty! - target.balloon_alert(our_slime, "not tasty!") - return COMPONENT_CANCEL_ATTACK_CHAIN - - if(our_slime.buckled == target) //If you try to attack the creature you are latched on, you instead cancel feeding - our_slime.stop_feeding() - return COMPONENT_CANCEL_ATTACK_CHAIN - - if(iscyborg(target)) - var/mob/living/silicon/robot/borg_target = target - borg_target.flash_act() - do_sparks(5, TRUE, borg_target) - var/stunprob = our_slime.powerlevel * SLIME_SHOCK_PERCENTAGE_PER_LEVEL + SLIME_BASE_SHOCK_PERCENTAGE - if(prob(stunprob) && our_slime.powerlevel >= SLIME_EXTRA_SHOCK_COST) - our_slime.powerlevel = clamp(our_slime.powerlevel - SLIME_EXTRA_SHOCK_COST, SLIME_MIN_POWER, SLIME_MAX_POWER) - borg_target.apply_damage(our_slime.powerlevel * rand(6, 10), BRUTE, spread_damage = TRUE, wound_bonus = CANT_WOUND) - borg_target.visible_message(span_danger("The [our_slime.name] shocks [borg_target]!"), span_userdanger("The [our_slime.name] shocks you!")) - else - borg_target.visible_message(span_danger("The [our_slime.name] fails to hurt [borg_target]!"), span_userdanger("The [our_slime.name] failed to hurt you!")) - - return COMPONENT_CANCEL_ATTACK_CHAIN - - if(iscarbon(target) && our_slime.powerlevel > SLIME_MIN_POWER) - var/mob/living/carbon/carbon_target = target - var/stunprob = our_slime.powerlevel * SLIME_SHOCK_PERCENTAGE_PER_LEVEL + SLIME_BASE_SHOCK_PERCENTAGE // 17 at level 1, 80 at level 10 - if(!prob(stunprob)) - return NONE // normal attack - - carbon_target.visible_message(span_danger("The [our_slime.name] shocks [carbon_target]!"), span_userdanger("The [our_slime.name] shocks you!")) - - do_sparks(5, TRUE, carbon_target) - var/power = our_slime.powerlevel + rand(0,3) - carbon_target.Paralyze(power * 2 SECONDS) - carbon_target.set_stutter_if_lower(power * 2 SECONDS) - if (prob(stunprob) && our_slime.powerlevel >= SLIME_EXTRA_SHOCK_COST) - our_slime.powerlevel = clamp(our_slime.powerlevel - SLIME_EXTRA_SHOCK_COST, SLIME_MIN_POWER, SLIME_MAX_POWER) - carbon_target.apply_damage(our_slime.powerlevel * rand(6, 10), BURN, spread_damage = TRUE, wound_bonus = CANT_WOUND) - - if(isslime(target)) - if(target == our_slime) - return COMPONENT_CANCEL_ATTACK_CHAIN - var/mob/living/simple_animal/slime/target_slime = target - if(target_slime.buckled) - target_slime.stop_feeding(silent = TRUE) - visible_message(span_danger("[our_slime] pulls [target_slime] off!"), \ - span_danger("You pull [target_slime] off!")) - return NONE // normal attack - target_slime.attacked_stacks += 5 - var/is_adult_slime = our_slime.life_stage == SLIME_LIFE_STAGE_ADULT - if(target_slime.nutrition >= 100) //steal some nutrition. negval handled in life() - var/stolen_nutrition = is_adult_slime ? 90 : 50 - target_slime.adjust_nutrition(-stolen_nutrition) - our_slime.add_nutrition(stolen_nutrition) - if(target_slime.health > 0) - our_slime.adjustBruteLoss(is_adult_slime ? -20 : -10) - -#undef SLIME_EXTRA_SHOCK_COST -#undef SLIME_EXTRA_SHOCK_THRESHOLD -#undef SLIME_BASE_SHOCK_PERCENTAGE -#undef SLIME_SHOCK_PERCENTAGE_PER_LEVEL diff --git a/code/modules/mob/living/simple_animal/slime/slime_say.dm b/code/modules/mob/living/simple_animal/slime/slime_say.dm deleted file mode 100644 index 1a2540c447f..00000000000 --- a/code/modules/mob/living/simple_animal/slime/slime_say.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), message_range) - . = ..() - if(speaker == src || radio_freq || stat || !(speaker in Friends)) - return - - speech_buffer = list() - speech_buffer += speaker - speech_buffer += lowertext(raw_message) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 96beb024fe9..c0e2058f23e 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -303,6 +303,7 @@ Knockdown(amount) Stun(amount) Immobilize(amount) + Unconscious(amount) /mob/living/proc/SetAllImmobility(amount) @@ -310,6 +311,7 @@ SetKnockdown(amount) SetStun(amount) SetImmobilized(amount) + SetUnconscious(amount) /mob/living/proc/AdjustAllImmobility(amount) @@ -317,6 +319,7 @@ AdjustKnockdown(amount) AdjustStun(amount) AdjustImmobilized(amount) + AdjustUnconscious(amount) /* UNCONSCIOUS */ diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 1a732c41a4d..3d7be3ea47e 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -88,7 +88,7 @@ else to_chat(src, span_warning("This ventilation duct is not connected to anything!")) -/mob/living/simple_animal/slime/can_enter_vent(obj/machinery/atmospherics/components/ventcrawl_target, provide_feedback = TRUE) +/mob/living/basic/slime/can_enter_vent(obj/machinery/atmospherics/components/ventcrawl_target, provide_feedback = TRUE) if(buckled) if(provide_feedback) to_chat(src, span_warning("You can't vent crawl while feeding!")) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c9769512e9e..30d0a528b96 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -737,7 +737,7 @@ if(!imagined_eye_contact && is_face_visible() && SEND_SIGNAL(examined_mob, COMSIG_MOB_EYECONTACT, src, FALSE) != COMSIG_BLOCK_EYECONTACT) var/msg = span_smallnotice("[src] makes eye contact with you.") - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), examined_mob, msg), 3) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), examined_mob, msg), 0.3 SECONDS) /** * Called by using Activate Held Object with an empty hand/limb @@ -1124,7 +1124,7 @@ antimagic_color = LIGHT_COLOR_DARK_BLUE playsound(src, 'sound/magic/magic_block_mind.ogg', 50, TRUE) - mob_light(range = 2, color = antimagic_color, duration = 5 SECONDS) + mob_light(range = 2, power = 2, color = antimagic_color, duration = 5 SECONDS) add_overlay(antimagic_effect) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), antimagic_effect), 5 SECONDS) @@ -1169,6 +1169,9 @@ var/datum/dna/mob_dna = has_dna() if(mob_dna?.check_mutation(/datum/mutation/human/telekinesis) && tkMaxRangeCheck(src, A)) return TRUE + var/obj/item/item_in_hand = get_active_held_item() + if(istype(item_in_hand, /obj/item/machine_remote)) + return TRUE //range check if(!interaction_range) // If you don't have extra length, GO AWAY @@ -1564,12 +1567,28 @@ get_language_holder().open_language_menu(usr) ///Adjust the nutrition of a mob -/mob/proc/adjust_nutrition(change) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks +/mob/proc/adjust_nutrition(change, forced = FALSE) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks + if(HAS_TRAIT(src, TRAIT_NOHUNGER) && !forced) + return + nutrition = max(0, nutrition + change) + hud_used?.hunger?.update_appearance() + +/mob/living/adjust_nutrition(change, forced) + . = ..() + mob_mood?.update_nutrition_moodlets() ///Force set the mob nutrition -/mob/proc/set_nutrition(change) //Seriously fuck you oldcoders. - nutrition = max(0, change) +/mob/proc/set_nutrition(set_to, forced = FALSE) //Seriously fuck you oldcoders. + if(HAS_TRAIT(src, TRAIT_NOHUNGER) && !forced) + return + + nutrition = max(0, set_to) + hud_used?.hunger?.update_appearance() + +/mob/living/set_nutrition(set_to, forced) + . = ..() + mob_mood?.update_nutrition_moodlets() ///Apply a proper movespeed modifier based on items we have equipped /mob/proc/update_equipment_speed_mods() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index aaf654e6dba..44d0db90355 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -140,9 +140,6 @@ /// Can this mob enter shuttles var/move_on_shuttle = 1 - ///A weakref to the last mob/living/carbon to push/drag/grab this mob (exclusively used by slimes friend recognition) - var/datum/weakref/LAssailant = null - /// bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc) var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH @@ -167,7 +164,7 @@ ///Allows a datum to intercept all click calls this mob is the source of var/datum/click_intercept - ///THe z level this mob is currently registered in + ///The z level this mob is currently registered in var/registered_z = null var/memory_throttle_time = 0 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index d2b8ce0f3c3..7a8c993f26b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -355,23 +355,22 @@ if(usr) log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") message_admins("[key_name_admin(usr)] has offered control of ([ADMIN_LOOKUPFLW(M)]) to ghosts") - var/poll_message = "Do you want to play as [M.real_name]?" + var/poll_message = "Do you want to play as [span_danger(M.real_name)]?" if(M.mind) - poll_message = "[poll_message] Job: [M.mind.assigned_role.title]." + poll_message = "[poll_message] Job: [span_notice(M.mind.assigned_role.title)]." if(M.mind.special_role) - poll_message = "[poll_message] Status: [M.mind.special_role]." + poll_message = "[poll_message] Status: [span_boldnotice(M.mind.special_role)]." else var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/) if(A) - poll_message = "[poll_message] Status: [A.name]." - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob(poll_message, check_jobban = ROLE_PAI, poll_time = 10 SECONDS, target_mob = M, pic_source = M, role_name_text = "ghost control") + poll_message = "[poll_message] Status: [span_boldnotice(A.name)]." + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(poll_message, check_jobban = ROLE_PAI, poll_time = 10 SECONDS, checked_target = M, alert_pic = M, role_name_text = "ghost control") - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + if(chosen_one) to_chat(M, "Your mob has been taken over by a ghost!") - message_admins("[key_name_admin(C)] has taken control of ([ADMIN_LOOKUPFLW(M)])") + message_admins("[key_name_admin(chosen_one)] has taken control of ([ADMIN_LOOKUPFLW(M)])") M.ghostize(FALSE) - M.key = C.key + M.key = chosen_one.key M.client?.init_verbs() return TRUE else diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index eeeb7815d19..ceff6e95658 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -493,14 +493,14 @@ set instant = TRUE if(isliving(mob)) var/mob/living/user_mob = mob - user_mob.toggle_move_intent(usr) + user_mob.toggle_move_intent() /** * Toggle the move intent of the mob * * triggers an update the move intent hud as well */ -/mob/living/proc/toggle_move_intent(mob/user) +/mob/living/proc/toggle_move_intent() if(move_intent == MOVE_INTENT_RUN) move_intent = MOVE_INTENT_WALK else @@ -515,6 +515,8 @@ selector.update_appearance() update_move_intent_slowdown() + SEND_SIGNAL(src, COMSIG_MOVE_INTENT_TOGGLED) + ///Moves a mob upwards in z level /mob/verb/up() set name = "Move Upwards" diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 79391916de4..8f1398ce244 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -52,9 +52,6 @@ QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/mob, emote), "me", 1, message, TRUE), SSspeech_controller) /mob/try_speak(message, ignore_spam = FALSE, forced = null, filterproof = FALSE) - SHOULD_CALL_PARENT(TRUE) - if(!..()) - return FALSE var/list/filter_result var/list/soft_filter_result if(client && !forced && !filterproof) @@ -88,9 +85,31 @@ return FALSE if(client.handle_spam_prevention(message, MUTE_IC)) return FALSE - // Including can_speak() here would ignore COMPONENT_CAN_ALWAYS_SPEAK in /mob/living/try_speak() + + var/sigreturn = SEND_SIGNAL(src, COMSIG_MOB_TRY_SPEECH, message, ignore_spam, forced) + if(sigreturn & COMPONENT_IGNORE_CAN_SPEAK) + return TRUE + if(sigreturn & COMPONENT_CANNOT_SPEAK) + return FALSE + + if(!..()) // the can_speak check + if(HAS_MIND_TRAIT(src, TRAIT_MIMING)) + to_chat(src, span_green("Your vow of silence prevents you from speaking!")) + else + to_chat(src, span_warning("You find yourself unable to speak!")) + return FALSE + return TRUE +/mob/can_speak(allow_mimes = FALSE) + if(!allow_mimes && HAS_MIND_TRAIT(src, TRAIT_MIMING)) + return FALSE + + if(is_muzzled()) + return FALSE + + return ..() + ///Speak as a dead person (ghost etc) /mob/proc/say_dead(message) var/name = real_name diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 6d2a8a9850d..56cd102a59b 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -2,7 +2,7 @@ //This proc is the most basic of the procs. All it does is make a new mob on the same tile and transfer over a few variables. //Returns the new mob //Note that this proc does NOT do MMI related stuff! -/mob/proc/change_mob_type(new_type = null, turf/location = null, new_name = null as text, delete_old_mob = FALSE) +/mob/proc/change_mob_type(new_type = null, turf/location = null, new_name = null as text|null, delete_old_mob = FALSE) if(isnewplayer(src)) to_chat(usr, span_danger("Cannot convert players who have not entered yet.")) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index ca82e13e803..b71a2a46045 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -184,11 +184,10 @@ to_chat(src, "You are job banned from cyborg! Appeal your job ban if you want to avoid this in the future!") ghostize(FALSE) - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as [src]?", check_jobban = JOB_CYBORG, poll_time = 5 SECONDS, target_mob = src, pic_source = src, role_name_text = "cyborg") - if(LAZYLEN(candidates)) - var/mob/dead/observer/chosen_candidate = pick(candidates) - message_admins("[key_name_admin(chosen_candidate)] has taken control of ([key_name_admin(src)]) to replace a jobbanned player.") - key = chosen_candidate.key + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_notice(name)]?", check_jobban = JOB_CYBORG, poll_time = 5 SECONDS, checked_target = src, alert_pic = src, role_name_text = "cyborg") + if(chosen_one) + message_admins("[key_name_admin(chosen_one)] has taken control of ([key_name_admin(src)]) to replace a jobbanned player.") + key = chosen_one.key //human -> alien /mob/living/carbon/human/proc/Alienize() @@ -234,18 +233,18 @@ for(var/t in bodyparts) qdel(t) - var/mob/living/simple_animal/slime/new_slime + var/mob/living/basic/slime/new_slime if(reproduce) var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring) var/list/babies = list() for(var/i in 1 to number) - var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc) + var/mob/living/basic/slime/M = new/mob/living/basic/slime(loc) M.set_nutrition(round(nutrition/number)) step_away(M,src) babies += M new_slime = pick(babies) else - new_slime = new /mob/living/simple_animal/slime(loc) + new_slime = new /mob/living/basic/slime(loc) new_slime.set_combat_mode(TRUE) new_slime.key = key diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index 3a63a246035..5145c3cc6ed 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -18,13 +18,13 @@ ///dead slimes, with a var for whatever color you want. /obj/effect/mob_spawn/corpse/slime - mob_type = /mob/living/simple_animal/slime + mob_type = /mob/living/basic/slime icon = 'icons/mob/simple/slimes.dmi' icon_state = "grey baby slime" //sets the icon in the map editor ///the color of the slime you're spawning. var/slime_species = /datum/slime_type/grey -/obj/effect/mob_spawn/corpse/slime/special(mob/living/simple_animal/slime/spawned_slime) +/obj/effect/mob_spawn/corpse/slime/special(mob/living/basic/slime/spawned_slime) . = ..() spawned_slime.set_slime_type(slime_species) diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm index 8ab32d9d4f4..102a73d6f92 100644 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/spider_roles.dm @@ -1,5 +1,6 @@ /obj/structure/spider/eggcluster name = "egg cluster" + icon = 'icons/effects/effects.dmi' desc = "There's something alive in there, and sooner or later it's going to find its way out." icon_state = "eggs" /// Mob spawner handling the actual spawn of the spider diff --git a/code/modules/mod/adding_new_mod.md b/code/modules/mod/adding_new_mod.md index 5dbd10cc5b1..b0bf12486c1 100644 --- a/code/modules/mod/adding_new_mod.md +++ b/code/modules/mod/adding_new_mod.md @@ -217,7 +217,7 @@ As we have an usable module, we want to set a cooldown time. All modules are als icon_state = "neuron_healer" module_type = MODULE_USABLE complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/neuron_healer) cooldown_time = 15 SECONDS var/brain_damage_healed = 25 @@ -245,7 +245,7 @@ After this, we want to put our special code, a basic effect of healing all mobs carbon_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -brain_damage_healed) mod.wearer.Beam(carbon_mob, icon_state = "plasmabeam", time = 1.5 SECONDS) playsound(src, 'sound/effects/magic.ogg', 100, TRUE) - drain_power(use_power_cost) + drain_power(use_energy_cost) ``` We now have a basic module, we can add it to the techwebs to make it printable ingame, and we can add an inbuilt, advanced version of it for our psychological suit. We'll give it more healing power, no complexity and make it unremovable. diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 3fca395e4b7..7d698aa5a75 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -244,7 +244,8 @@ for(var/obj/item/mod/module/module as anything in modules) module.on_suit_deactivation() update_speed() - update_icon_state() + update_appearance(UPDATE_ICON_STATE) + update_charge_alert() wearer.update_clothing(slot_flags) /// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 8442783d331..ca7be41ec42 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -60,7 +60,8 @@ Its shape is remarkably similar to that of a MOD core." light_system = OVERLAY_LIGHT light_color = "#cc00cc" - light_range = 2 + light_range = 2.5 + light_power = 1.5 /obj/item/mod/construction/lavalandcore/examine(mob/user) . = ..() diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 88bb8ac7b60..24bae497cab 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -236,7 +236,7 @@ if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- if(mod_link.link_call) - subtract_charge((DEFAULT_CHARGE_DRAIN * 0.25) * seconds_per_tick) + subtract_charge(0.25 * DEFAULT_CHARGE_DRAIN * seconds_per_tick) if(!active) return if(!get_charge() && active && !activating) @@ -244,9 +244,8 @@ return var/malfunctioning_charge_drain = 0 if(malfunctioning) - malfunctioning_charge_drain = rand(1,20) + malfunctioning_charge_drain = rand(0.2 * DEFAULT_CHARGE_DRAIN, 4 * DEFAULT_CHARGE_DRAIN) // About triple power usage on average. subtract_charge((charge_drain + malfunctioning_charge_drain) * seconds_per_tick) - update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) if(malfunctioning && module.active && SPT_PROB(5, seconds_per_tick)) module.on_deactivation(display_message = TRUE) @@ -332,7 +331,6 @@ wrench.play_tool_sound(src, 100) balloon_alert(user, "core removed") core.forceMove(drop_location()) - update_charge_alert() return TRUE return ..() @@ -415,7 +413,6 @@ attacking_core.install(src) balloon_alert(user, "core installed") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - update_charge_alert() return TRUE else if(is_wire_tool(attacking_item) && open) wires.interact(user) @@ -426,11 +423,9 @@ return ..() /obj/item/mod/control/get_cell() - if(!open) - return var/obj/item/stock_parts/cell/cell = get_charge_source() if(!istype(cell)) - return + return null return cell /obj/item/mod/control/GetAccess() @@ -500,8 +495,8 @@ for(var/obj/item/mod/module/module as anything in modules) module.on_unequip() UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_SPECIES_GAIN)) - wearer.clear_alert(ALERT_MODSUIT_CHARGE) SEND_SIGNAL(src, COMSIG_MOD_WEARER_UNSET, wearer) + wearer.update_spacesuit_hud_icon("0") wearer = null /obj/item/mod/control/proc/clean_up() @@ -644,13 +639,21 @@ /obj/item/mod/control/proc/check_charge(amount) return core?.check_charge(amount) || FALSE +/** + * Updates the wearer's hud according to the current state of the MODsuit + */ /obj/item/mod/control/proc/update_charge_alert() - if(!wearer) + if(isnull(wearer)) return - if(!core) - wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/nocore) - return - core.update_charge_alert() + var/state_to_use + if(!active) + state_to_use = "0" + else if(isnull(core)) + state_to_use = "coreless" + else + state_to_use = core.get_charge_icon_state() + + wearer.update_spacesuit_hud_icon(state_to_use || "0") /obj/item/mod/control/proc/update_speed() var/list/all_parts = mod_parts + src @@ -718,7 +721,6 @@ return if(part == core) core.uninstall() - update_charge_alert() return if(part.loc == wearer) return @@ -768,7 +770,7 @@ to_chat(user, span_warning("It's too dangerous to smear [speed_potion] on [src] while it's active!")) return SPEED_POTION_STOP to_chat(user, span_notice("You slather the red gunk over [src], making it faster.")) - set_mod_color("#FF0000") + set_mod_color(COLOR_RED) slowdown_inactive = 0 slowdown_active = 0 update_speed() diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 75a5b2385b7..0d71db68aac 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -18,9 +18,11 @@ mod = mod_unit mod.core = src forceMove(mod) + mod.update_charge_alert() /obj/item/mod/core/proc/uninstall() mod.core = null + mod.update_charge_alert() mod = null /obj/item/mod/core/proc/charge_source() @@ -41,8 +43,11 @@ /obj/item/mod/core/proc/check_charge(amount) return FALSE -/obj/item/mod/core/proc/update_charge_alert() - mod.wearer.clear_alert(ALERT_MODSUIT_CHARGE) +/** + * Gets what icon state to display on the HUD for the charge level of this core + */ +/obj/item/mod/core/proc/get_charge_icon_state() + return "0" /obj/item/mod/core/infinite name = "MOD infinite core" @@ -63,11 +68,14 @@ return TRUE /obj/item/mod/core/infinite/subtract_charge(amount) - return TRUE + return amount /obj/item/mod/core/infinite/check_charge(amount) return TRUE +/obj/item/mod/core/infinite/get_charge_icon_state() + return "high" + /obj/item/mod/core/standard name = "MOD standard core" icon_state = "mod-core-standard" @@ -80,8 +88,7 @@ var/obj/item/stock_parts/cell/cell /obj/item/mod/core/standard/Destroy() - if(cell) - QDEL_NULL(cell) + QDEL_NULL(cell) return ..() /obj/item/mod/core/standard/install(obj/item/mod/control/mod_unit) @@ -116,54 +123,57 @@ /obj/item/mod/core/standard/add_charge(amount) var/obj/item/stock_parts/cell/charge_source = charge_source() - if(!charge_source) + if(isnull(charge_source)) return FALSE - return charge_source.give(amount) + . = charge_source.give(amount) + if(.) + mod.update_charge_alert() + return . /obj/item/mod/core/standard/subtract_charge(amount) var/obj/item/stock_parts/cell/charge_source = charge_source() - if(!charge_source) + if(isnull(charge_source)) return FALSE - return charge_source.use(amount, TRUE) + . = charge_source.use(amount, TRUE) + if(.) + mod.update_charge_alert() + return . /obj/item/mod/core/standard/check_charge(amount) return charge_amount() >= amount -/obj/item/mod/core/standard/update_charge_alert() - var/obj/item/stock_parts/cell/charge_source = charge_source() - if(!charge_source) - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/nocell) - return - var/remaining_cell = charge_amount() / max_charge_amount() - switch(remaining_cell) +/obj/item/mod/core/standard/get_charge_icon_state() + if(isnull(charge_source())) + return "missing" + + switch(round(charge_amount() / max_charge_amount(), 0.01)) if(0.75 to INFINITY) - mod.wearer.clear_alert(ALERT_MODSUIT_CHARGE) + return "high" if(0.5 to 0.75) - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/lowcell, 1) + return "mid" if(0.25 to 0.5) - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/lowcell, 2) - if(0.01 to 0.25) - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/lowcell, 3) - else - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/emptycell) + return "low" + if(0.02 to 0.25) + return "very_low" + + return "empty" /obj/item/mod/core/standard/proc/install_cell(new_cell) cell = new_cell cell.forceMove(src) - RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) + mod.update_charge_alert() /obj/item/mod/core/standard/proc/uninstall_cell() if(!cell) return + cell.update_appearance() cell = null - UnregisterSignal(src, COMSIG_ATOM_EXITED) + mod.update_charge_alert() -/obj/item/mod/core/standard/proc/on_exit(datum/source, obj/item/stock_parts/cell, direction) - SIGNAL_HANDLER - - if(!istype(cell) || cell.loc == src) - return - uninstall_cell() +/obj/item/mod/core/standard/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) + uninstall_cell() /obj/item/mod/core/standard/proc/on_examine(datum/source, mob/examiner, list/examine_text) SIGNAL_HANDLER @@ -195,7 +205,6 @@ var/obj/item/cell_to_move = cell cell_to_move.forceMove(drop_location()) user.put_in_hands(cell_to_move) - mod.update_charge_alert() /obj/item/mod/core/standard/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user) SIGNAL_HANDLER @@ -212,7 +221,6 @@ install_cell(attacking_item) mod.balloon_alert(user, "cell installed") playsound(mod, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - mod.update_charge_alert() return COMPONENT_NO_AFTERATTACK return NONE @@ -228,11 +236,15 @@ UnregisterSignal(mod.wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) UnregisterSignal(mod, COMSIG_MOD_WEARER_UNSET) -/obj/item/mod/core/standard/proc/on_borg_charge(datum/source, amount) +/obj/item/mod/core/standard/proc/on_borg_charge(datum/source, datum/callback/charge_cell, seconds_per_tick) SIGNAL_HANDLER - add_charge(amount) - mod.update_charge_alert() + var/obj/item/stock_parts/cell/target_cell = charge_source() + if(isnull(target_cell)) + return + + if(charge_cell.Invoke(target_cell, seconds_per_tick)) + mod.update_charge_alert() /obj/item/mod/core/ethereal name = "MOD ethereal core" @@ -250,7 +262,7 @@ /obj/item/mod/core/ethereal/charge_amount() var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() - return charge_source?.crystal_charge || ETHEREAL_CHARGE_NONE + return charge_source?.cell.charge() || ETHEREAL_CHARGE_NONE /obj/item/mod/core/ethereal/max_charge_amount() return ETHEREAL_CHARGE_FULL @@ -266,21 +278,16 @@ var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() if(!charge_source) return FALSE - charge_source.adjust_charge(-amount*charge_modifier) - return TRUE + return -charge_source.adjust_charge(-amount*charge_modifier) /obj/item/mod/core/ethereal/check_charge(amount) return charge_amount() >= amount*charge_modifier -/obj/item/mod/core/ethereal/update_charge_alert() - var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() - if(charge_source) - mod.wearer.clear_alert(ALERT_MODSUIT_CHARGE) - return - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/nocell) +/obj/item/mod/core/ethereal/get_charge_icon_state() + return charge_source() ? "0" : "missing" -#define PLASMA_CORE_ORE_CHARGE 1500 -#define PLASMA_CORE_SHEET_CHARGE 2000 +#define PLASMA_CORE_ORE_CHARGE (1.5 * STANDARD_CELL_CHARGE) +#define PLASMA_CORE_SHEET_CHARGE (2 * STANDARD_CELL_CHARGE) /obj/item/mod/core/plasma name = "MOD plasma core" @@ -288,9 +295,9 @@ desc = "Nanotrasen's attempt at capitalizing on their plasma research. These plasma cores are refueled \ through plasma fuel, allowing for easy continued use by their mining squads." /// How much charge we can store. - var/maxcharge = 10000 + var/maxcharge = 10 * STANDARD_CELL_CHARGE /// How much charge we are currently storing. - var/charge = 10000 + var/charge = 10 * STANDARD_CELL_CHARGE /// Associated list of charge sources and how much they charge, only stacks allowed. var/list/charger_list = list(/obj/item/stack/ore/plasma = PLASMA_CORE_ORE_CHARGE, /obj/item/stack/sheet/mineral/plasma = PLASMA_CORE_SHEET_CHARGE) @@ -318,28 +325,30 @@ /obj/item/mod/core/plasma/add_charge(amount) charge = min(maxcharge, charge + amount) + mod.update_charge_alert() return TRUE /obj/item/mod/core/plasma/subtract_charge(amount) - charge = max(0, charge - amount) - return TRUE + amount = min(amount, charge) + charge -= amount + mod.update_charge_alert() + return amount /obj/item/mod/core/plasma/check_charge(amount) return charge_amount() >= amount -/obj/item/mod/core/plasma/update_charge_alert() - var/remaining_plasma = charge_amount() / max_charge_amount() - switch(remaining_plasma) +/obj/item/mod/core/plasma/get_charge_icon_state() + switch(round(charge_amount() / max_charge_amount(), 0.01)) if(0.75 to INFINITY) - mod.wearer.clear_alert(ALERT_MODSUIT_CHARGE) + return "high" if(0.5 to 0.75) - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/lowcell/plasma, 1) + return "mid" if(0.25 to 0.5) - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/lowcell/plasma, 2) - if(0.01 to 0.25) - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/lowcell/plasma, 3) - else - mod.wearer.throw_alert(ALERT_MODSUIT_CHARGE, /atom/movable/screen/alert/emptycell/plasma) + return "low" + if(0.02 to 0.25) + return "very_low" + + return "empty" /obj/item/mod/core/plasma/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user) SIGNAL_HANDLER @@ -369,7 +378,8 @@ The wires coming out of it could be hooked into a MODsuit." light_system = OVERLAY_LIGHT light_color = "#cc00cc" - light_range = 2 + light_range = 2.5 + light_power = 1.5 // Slightly better than the normal plasma core. // Not super sure if this should just be the same, but will see. maxcharge = 15000 diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm index 5781a040092..634b1dd648f 100644 --- a/code/modules/mod/mod_link.dm +++ b/code/modules/mod/mod_link.dm @@ -201,7 +201,7 @@ /obj/item/clothing/neck/link_scryer/process(seconds_per_tick) if(!mod_link.link_call) return - cell.use(min(20 * seconds_per_tick, cell.charge)) + cell.use(20 KILO WATTS * seconds_per_tick, force = TRUE) /obj/item/clothing/neck/link_scryer/attackby(obj/item/attacked_by, mob/user, params) . = ..() diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 509cdfc1ed7..88f697ccd48 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -1506,6 +1506,19 @@ acid = 90 wound = 10 +/datum/mod_theme/responsory/traitor + name = "dark paladin" + desc = "A high-speed suit stolen by the Gorlex Maradeurs, purposed for less than honest intents." + extended_desc = "A streamlined suit of Nanotrasen Syndicate design, these sleek black suits are only worn by \ + elite emergency response personnel traitors to help save ruin the day. While the slim and nimble design of the suit \ + cuts the ceramics and ablatives in it down, dropping the protection, \ + it keeps the wearer safe from the harsh void of space while sacrificing no speed whatsoever. \ + While wearing it you feel an extreme deference to darkness light." + armor_type = /datum/armor/mod_theme_elite + resistance_flags = FIRE_PROOF|ACID_PROOF + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + inbuilt_modules = list(/obj/item/mod/module/armor_booster/no_speedbost) + /datum/mod_theme/apocryphal name = "apocryphal" desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies." diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 0659dd6208b..47f588eb80b 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -477,6 +477,25 @@ /obj/item/mod/module/quick_cuff, ) +/obj/item/mod/control/pre_equipped/responsory/inquisitory/syndie + starting_frequency = MODLINK_FREQ_SYNDICATE + req_access = null + applied_cell = /obj/item/stock_parts/cell/super + theme = /datum/mod_theme/responsory/traitor + applied_modules = list( + /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, + /obj/item/mod/module/jetpack, + /obj/item/mod/module/pathfinder, + /obj/item/mod/module/flashlight/darkness, + /obj/item/mod/module/dna_lock, + /obj/item/mod/module/quick_cuff, + /obj/item/mod/module/visor/night, + /obj/item/mod/module/shove_blocker, + /obj/item/mod/module/noslip, + ) + /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander insignia_type = /obj/item/mod/module/insignia/commander additional_module = /obj/item/mod/module/power_kick diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 575518affbb..2f1e6faa0f4 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -47,7 +47,7 @@ "pinned" = module.pinned_to[REF(user)], "idle_power" = module.idle_power_cost, "active_power" = module.active_power_cost, - "use_power" = module.use_power_cost, + "use_energy" = module.use_energy_cost, "module_complexity" = module.complexity, "cooldown_time" = module.cooldown_time, "cooldown" = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS), @@ -80,19 +80,23 @@ if(.) return if(malfunctioning && prob(75)) - balloon_alert(usr, "button malfunctions!") + balloon_alert(ui.user, "button malfunctions!") return switch(action) if("lock") - locked = !locked - balloon_alert(usr, "[locked ? "locked" : "unlocked"]!") + if(!locked || allowed(ui.user)) + locked = !locked + balloon_alert(ui.user, "[locked ? "locked" : "unlocked"]!") + else + balloon_alert(ui.user, "access insufficent!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) if("call") if(!mod_link.link_call) - call_link(usr, mod_link) + call_link(ui.user, mod_link) else mod_link.end_call() if("activate") - toggle_activate(usr) + toggle_activate(ui.user) if("select") var/obj/item/mod/module/module = locate(params["ref"]) in modules if(!module) @@ -107,9 +111,9 @@ var/obj/item/mod/module/module = locate(params["ref"]) in modules if(!module) return - module.pin(usr) + module.pin(ui.user) if("eject_pai") - if (!ishuman(usr)) + if (!ishuman(ui.user)) return - remove_pai(usr) + remove_pai(ui.user) return TRUE diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 874f5f3dbdf..aeab9fbb43c 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -16,7 +16,7 @@ /// Power use when active var/active_power_cost = DEFAULT_CHARGE_DRAIN * 0 /// Power use when used, we call it manually - var/use_power_cost = DEFAULT_CHARGE_DRAIN * 0 + var/use_energy_cost = DEFAULT_CHARGE_DRAIN * 0 /// ID used by their TGUI var/tgui_id /// Linked MODsuit @@ -164,7 +164,7 @@ if(!COOLDOWN_FINISHED(src, cooldown_timer)) balloon_alert(mod.wearer, "on cooldown!") return FALSE - if(!check_power(use_power_cost)) + if(!check_power(use_energy_cost)) balloon_alert(mod.wearer, "not enough charge!") return FALSE if(!(allow_flags & MODULE_ALLOW_PHASEOUT) && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) @@ -238,7 +238,6 @@ if(!check_power(amount)) return FALSE mod.subtract_charge(amount) - mod.update_charge_alert() return TRUE /// Checks if there is enough power in the suit diff --git a/code/modules/mod/modules/module_kinesis.dm b/code/modules/mod/modules/module_kinesis.dm index 0cd13871071..4f4fa44ff96 100644 --- a/code/modules/mod/modules/module_kinesis.dm +++ b/code/modules/mod/modules/module_kinesis.dm @@ -9,7 +9,7 @@ icon_state = "kinesis" module_type = MODULE_ACTIVE complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/anomaly_locked/kinesis) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_kinesis" @@ -59,7 +59,7 @@ if(!can_grab(target)) balloon_alert(mod.wearer, "can't grab!") return - drain_power(use_power_cost) + drain_power(use_energy_cost) grab_atom(target) /obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE, deleting = FALSE) @@ -76,7 +76,7 @@ balloon_alert(mod.wearer, "out of range!") clear_grab() return - drain_power(use_power_cost/10) + drain_power(use_energy_cost/10) if(kinesis_catcher.mouse_params) kinesis_catcher.calculate_params() if(!kinesis_catcher.given_turf) @@ -171,7 +171,7 @@ kinesis_beam = mod.wearer.Beam(grabbed_atom, "kinesis") kinesis_catcher = mod.wearer.overlay_fullscreen("kinesis", /atom/movable/screen/fullscreen/cursor_catcher/kinesis, 0) kinesis_catcher.assign_to_mob(mod.wearer) - RegisterSignal(kinesis_catcher, COMSIG_CLICK, PROC_REF(on_catcher_click)) + RegisterSignal(kinesis_catcher, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(on_catcher_click)) soundloop.start() START_PROCESSING(SSfastprocess, src) @@ -259,7 +259,7 @@ name = "MOD prototype kinesis module" prebuilt = TRUE complexity = 0 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 removable = FALSE core_removable = FALSE @@ -280,7 +280,7 @@ This one can force some of the grasped objects to phase through walls. Oh no." complexity = 0 grab_range = INFINITY - use_power_cost = DEFAULT_CHARGE_DRAIN * 0 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0 prebuilt = TRUE stat_required = CONSCIOUS /// Does our object phase through stuff? diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 087718d14b3..16814960368 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -11,7 +11,7 @@ Nakamura Engineering swears up and down there's airbrakes." icon_state = "pathfinder" complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 10 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/pathfinder) /// The pathfinding implant. var/obj/item/implant/mod/implant @@ -68,7 +68,7 @@ human_user.update_action_buttons(TRUE) balloon_alert(human_user, "[mod] attached") playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/implant/mod name = "MOD pathfinder implant" diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index a35e39365b9..2462f62a3d3 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -29,6 +29,9 @@ /// List of traits added when the mod is activated var/list/traits_to_add = list(TRAIT_HEAD_INJURY_BLOCKED) +/obj/item/mod/module/armor_booster/no_speedbost + speed_added = 0 + /datum/armor/mod_module_armor_boost melee = 25 bullet = 30 @@ -98,7 +101,7 @@ icon_state = "energy_shield" complexity = 3 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - use_power_cost = DEFAULT_CHARGE_DRAIN * 2 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/energy_shield) /// Max charges of the shield. var/max_charges = 1 @@ -144,8 +147,8 @@ ) SIGNAL_HANDLER - if(SEND_SIGNAL(mod, COMSIG_ITEM_HIT_REACT, owner, hitby, attack_text, 0, damage, attack_type, damage_type) & COMPONENT_HIT_REACTION_BLOCK) - drain_power(use_power_cost) + if(mod.hit_reaction(owner, hitby, attack_text, 0, damage, attack_type)) + drain_power(use_energy_cost) return SUCCESSFUL_BLOCK return NONE @@ -156,8 +159,8 @@ This shield can perfectly nullify attacks ranging from high-caliber rifles to magic missiles, \ though can also be drained by more mundane attacks. It will not protect the caster from social ridicule." icon_state = "battlemage_shield" - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0 //magic - use_power_cost = DEFAULT_CHARGE_DRAIN * 0 //magic too + idle_power_cost = 0 //magic + use_energy_cost = 0 //magic too max_charges = 15 recharge_start_delay = 0 SECONDS charge_recovery = 8 @@ -236,6 +239,9 @@ /obj/item/mod/module/insignia/chaplain color = "#f0a00c" +/obj/item/mod/module/insignia/syndie + color = COLOR_SYNDIE_RED + ///Anti Slip - Prevents you from slipping on water. /obj/item/mod/module/noslip name = "MOD anti slip module" @@ -265,7 +271,7 @@ desc = initial(the_dna_lock_behind_the_slaughter.desc) icon_state = initial(the_dna_lock_behind_the_slaughter.icon_state) complexity = initial(the_dna_lock_behind_the_slaughter.complexity) - use_power_cost = initial(the_dna_lock_behind_the_slaughter.use_power_cost) + use_energy_cost = initial(the_dna_lock_behind_the_slaughter.use_energy_cost) /obj/item/mod/module/springlock/bite_of_87/on_install() mod.activation_step_time *= 0.1 @@ -287,7 +293,7 @@ icon_state = "flamethrower" module_type = MODULE_ACTIVE complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/flamethrower) cooldown_time = 2.5 SECONDS overlay_state_inactive = "module_flamethrower" @@ -302,7 +308,7 @@ flame.firer = mod.wearer playsound(src, 'sound/items/modsuit/flamethrower.ogg', 75, TRUE) INVOKE_ASYNC(flame, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Power kick - Lets the user launch themselves at someone to kick them. /obj/item/mod/module/power_kick @@ -311,7 +317,7 @@ icon_state = "power_kick" module_type = MODULE_ACTIVE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/power_kick) cooldown_time = 5 SECONDS /// Damage on kick. @@ -335,7 +341,7 @@ animate(mod.wearer, 0.2 SECONDS, pixel_z = -16, flags = ANIMATION_RELATIVE, easing = SINE_EASING|EASE_IN) return animate(mod.wearer) - drain_power(use_power_cost) + drain_power(use_energy_cost) playsound(src, 'sound/items/modsuit/loader_launch.ogg', 75, TRUE) var/angle = get_angle(mod.wearer, target) + 180 mod.wearer.transform = mod.wearer.transform.Turn(angle) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index fa746048e82..1ddcab08180 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -86,7 +86,7 @@ icon_state = "tether" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/tether) cooldown_time = 1.5 SECONDS @@ -106,7 +106,7 @@ tether.firer = mod.wearer playsound(src, 'sound/weapons/batonextend.ogg', 25, TRUE) INVOKE_ASYNC(tether, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/projectile/tether name = "tether" @@ -187,7 +187,7 @@ module_type = MODULE_USABLE complexity = 2 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 2 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) cooldown_time = 11 SECONDS @@ -202,7 +202,7 @@ if(!.) return rcd_scan(src, fade_time = 10 SECONDS) - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Safety-First Head Protection - Protects your brain matter from sudden impacts. /obj/item/mod/module/headprotector diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 9962bc8b9a4..f80fd952cef 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -97,7 +97,7 @@ module_type = MODULE_TOGGLE complexity = 3 active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/jetpack) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_jetpack" @@ -160,8 +160,8 @@ /obj/item/mod/module/jetpack/proc/allow_thrust(use_fuel = TRUE) if(!use_fuel) - return check_power(use_power_cost) - if(!drain_power(use_power_cost)) + return check_power(use_energy_cost) + if(!drain_power(use_energy_cost)) return FALSE return TRUE @@ -186,7 +186,7 @@ module_type = MODULE_USABLE complexity = 3 cooldown_time = 30 SECONDS - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/jump_jet) /obj/item/mod/module/jump_jet/on_use() @@ -225,7 +225,7 @@ to alert anyone nearby that someone has, in fact, died." icon_state = "status" complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.1 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.1 incompatible_modules = list(/obj/item/mod/module/status_readout) tgui_id = "status_readout" /// Does this show damage types, body temp, satiety @@ -334,10 +334,10 @@ incompatible_modules = list(/obj/item/mod/module/emp_shield) /obj/item/mod/module/emp_shield/on_install() - mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + mod.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/mod/module/emp_shield/on_uninstall(deleting = FALSE) - mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/mod/module/emp_shield/advanced name = "MOD advanced EMP shield module" @@ -377,6 +377,12 @@ /// Maximum range we can set. var/max_range = 5 +/obj/item/mod/module/flashlight/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + +/obj/item/mod/module/flashlight/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_HIT_BY_SABOTEUR) + /obj/item/mod/module/flashlight/on_activation() . = ..() if(!.) @@ -392,6 +398,12 @@ set_light_flags(light_flags & ~LIGHT_ATTACHED) set_light_on(active) +/obj/item/mod/module/flashlight/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(active) + on_deactivation() + return COMSIG_SABOTEUR_SUCCESS + /obj/item/mod/module/flashlight/on_process(seconds_per_tick) active_power_cost = base_power * light_range return ..() @@ -424,6 +436,21 @@ if("light_range") set_light_range(clamp(value, min_range, max_range)) +///Like the flashlight module, except the light color is stuck to black and cannot be changed. +/obj/item/mod/module/flashlight/darkness + name = "MOD flashdark module" + desc = "A quirky pair of configurable flashdarks installed on the sides of the helmet, \ + useful for providing darkness at a configurable range." + light_color = COLOR_BLACK + light_system = OVERLAY_LIGHT + light_range = 2 + min_range = 1 + max_range = 3 + +/obj/item/mod/module/flashlight/darkness/get_configuration() + . = ..() + . -= "light_color" + ///Dispenser - Dispenses an item after a time passes. /obj/item/mod/module/dispenser name = "MOD burger dispenser module" @@ -434,7 +461,7 @@ icon_state = "dispenser" module_type = MODULE_USABLE complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN * 2 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/dispenser) cooldown_time = 5 SECONDS /// Path we dispense. @@ -453,7 +480,7 @@ mod.wearer.put_in_hands(dispensed) balloon_alert(mod.wearer, "[dispensed] dispensed") playsound(src, 'sound/machines/click.ogg', 100, TRUE) - drain_power(use_power_cost) + drain_power(use_energy_cost) return dispensed ///Longfall - Nullifies fall damage, removing charge instead. @@ -465,7 +492,7 @@ Useful for mining, monorail tracks, or even skydiving!" icon_state = "longfall" complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/longfall) /obj/item/mod/module/longfall/on_suit_activation() @@ -476,7 +503,7 @@ /obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on) SIGNAL_HANDLER - if(!drain_power(use_power_cost * levels)) + if(!drain_power(use_energy_cost * levels)) return NONE new /obj/effect/temp_visual/mook_dust(fell_on) mod.wearer.Stun(levels * 1 SECONDS) @@ -526,7 +553,7 @@ icon_state = "dnalock" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/dna_lock, /obj/item/mod/module/eradication_lock) cooldown_time = 0.5 SECONDS /// The DNA we lock with. @@ -550,7 +577,7 @@ return dna = mod.wearer.dna.unique_enzymes balloon_alert(mod.wearer, "dna updated") - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/dna_lock/emp_act(severity) . = ..() @@ -788,19 +815,7 @@ /obj/item/cigbutt, ) /// Materials that will be extracted. - var/list/accepted_mats = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/silver, - /datum/material/plasma, - /datum/material/gold, - /datum/material/diamond, - /datum/material/plastic, - /datum/material/uranium, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/bluespace, - ) + var/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), @@ -810,10 +825,15 @@ /obj/item/mod/module/recycler/Initialize(mapload) . = ..() + + if(!length(accepted_mats)) + accepted_mats = SSmaterials.materials_by_category[MAT_CATEGORY_SILO] + container = AddComponent( \ /datum/component/material_container, \ - accepted_mats, 50 * SHEET_MATERIAL_AMOUNT, \ - MATCONTAINER_EXAMINE|MATCONTAINER_NO_INSERT, \ + 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) \ ) \ diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 6a77158ea09..45b77bb7bd9 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -148,7 +148,7 @@ SKYRAT EDIT END */ icon_state = "tanning" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/tanner) cooldown_time = 30 SECONDS @@ -162,7 +162,7 @@ SKYRAT EDIT END */ holder.trans_to(mod.wearer, 10, methods = VAPOR) if(prob(5)) SSradiation.irradiate(mod.wearer) - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Balloon Blower - Blows a balloon. /obj/item/mod/module/balloon @@ -171,7 +171,7 @@ SKYRAT EDIT END */ icon_state = "bloon" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/balloon) cooldown_time = 15 SECONDS @@ -185,7 +185,7 @@ SKYRAT EDIT END */ playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE) var/obj/item/toy/balloon/balloon = new(get_turf(src)) mod.wearer.put_in_hands(balloon) - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Paper Dispenser - Dispenses (sometimes burning) paper sheets. /obj/item/mod/module/paper_dispenser @@ -195,7 +195,7 @@ SKYRAT EDIT END */ icon_state = "paper_maker" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/paper_dispenser) cooldown_time = 5 SECONDS /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. @@ -227,7 +227,7 @@ SKYRAT EDIT END */ crisp_paper.visible_message(span_warning("[crisp_paper] bursts into flames, it's too crisp!")) crisp_paper.fire_act(1000, 100) - drain_power(use_power_cost) + drain_power(use_energy_cost) num_sheets_dispensed++ diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 2346d8f9305..6068b18fe10 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -14,7 +14,7 @@ icon_state = "health" module_type = MODULE_ACTIVE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/health_analyzer) cooldown_time = 0.5 SECONDS tgui_id = "health_analyzer" @@ -48,7 +48,7 @@ woundscan(mod.wearer, target) if(CHEM_SCAN) chemscan(mod.wearer, target) - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/health_analyzer/get_configuration() . = ..() @@ -128,7 +128,7 @@ icon_state = "organ_thrower" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/organ_thrower, /obj/item/mod/module/microwave_beam) cooldown_time = 0.5 SECONDS /// How many organs the module can hold. @@ -152,7 +152,7 @@ organ.forceMove(src) balloon_alert(mod.wearer, "picked up [organ]") playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - drain_power(use_power_cost) + drain_power(use_energy_cost) return if(!length(organ_list)) return @@ -162,7 +162,7 @@ projectile.firer = mod.wearer playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) INVOKE_ASYNC(projectile, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/projectile/organ name = "organ" @@ -241,7 +241,7 @@ icon_state = "defibrillator" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 25 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 25 device = /obj/item/shockpaddles/mod overlay_state_inactive = "module_defibrillator" overlay_state_active = "module_defibrillator_active" @@ -254,7 +254,7 @@ RegisterSignal(device, COMSIG_DEFIBRILLATOR_SUCCESS, PROC_REF(on_defib_success)) /obj/item/mod/module/defibrillator/proc/on_defib_success(obj/item/shockpaddles/source) - drain_power(use_power_cost) + drain_power(use_energy_cost) source.recharge(defib_cooldown) return COMPONENT_DEFIB_STOP @@ -304,7 +304,7 @@ icon_state = "thread_ripper" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/thread_ripper) cooldown_time = 1.5 SECONDS overlay_state_inactive = "module_threadripper" diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index f175dda0317..868b4a79500 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -10,7 +10,7 @@ module_type = MODULE_TOGGLE complexity = 4 active_power_cost = DEFAULT_CHARGE_DRAIN * 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 10 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/stealth) cooldown_time = 5 SECONDS /// Whether or not the cloak turns off on bumping. @@ -28,7 +28,7 @@ RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) RegisterSignals(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), PROC_REF(unstealth)) animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() @@ -44,7 +44,7 @@ to_chat(mod.wearer, span_warning("[src] gets discharged from contact!")) do_sparks(2, TRUE, src) - drain_power(use_power_cost) + drain_power(use_energy_cost) on_deactivation(display_message = TRUE, deleting = FALSE) /obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) @@ -73,7 +73,7 @@ bumpoff = FALSE stealth_alpha = 20 active_power_cost = DEFAULT_CHARGE_DRAIN - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 3 SECONDS /obj/item/mod/module/stealth/ninja/on_activation() @@ -133,10 +133,10 @@ icon_state = "hacker" removable = FALSE incompatible_modules = list(/obj/item/mod/module/hacker) - /// Minimum amount of power we can drain in a single drain action - var/mindrain = 200 - /// Maximum amount of power we can drain in a single drain action - var/maxdrain = 400 + /// Minimum amount of energy we can drain in a single drain action + var/mindrain = 200 KILO JOULES + /// Maximum amount of energy we can drain in a single drain action + var/maxdrain = 400 KILO JOULES /// Whether or not the communication console hack was used to summon another antagonist. var/communication_console_hack_success = FALSE /// How many times the module has been used to force open doors. @@ -174,7 +174,7 @@ icon_state = "recall" removable = FALSE module_type = MODULE_USABLE - use_power_cost = DEFAULT_CHARGE_DRAIN * 2 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/weapon_recall) cooldown_time = 0.5 SECONDS /// The item linked to the module that will get recalled. @@ -205,7 +205,7 @@ return var/distance = get_dist(mod.wearer, linked_weapon) var/in_view = (linked_weapon in view(mod.wearer)) - if(!in_view && !drain_power(use_power_cost * distance)) + if(!in_view && !drain_power(use_energy_cost * distance)) balloon_alert(mod.wearer, "not enough charge!") return linked_weapon.forceMove(linked_weapon.drop_location()) @@ -263,7 +263,7 @@ Due to utilizing a skintight dampening shield, this one is entirely sealed against electromagnetic interference; \ it also dutifully protects the secrets of the Spider Clan from unknowing outsiders." icon_state = "dnalock_ninja" - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.5 /obj/item/mod/module/dna_lock/reinforced/on_mod_activation(datum/source, mob/user) . = ..() @@ -288,7 +288,7 @@ it will piss off everyone around them." icon_state = "emp_pulse" module_type = MODULE_USABLE - use_power_cost = DEFAULT_CHARGE_DRAIN * 10 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 10 cooldown_time = 8 SECONDS /obj/item/mod/module/emp_shield/pulse/on_use() @@ -297,7 +297,7 @@ return playsound(src, 'sound/effects/empulse.ogg', 60, TRUE) empulse(src, heavy_range = 4, light_range = 6) - drain_power(use_power_cost) + drain_power(use_energy_cost) /// Ninja Status Readout - Like the normal status display (see the base type), but with a clock. /obj/item/mod/module/status_readout/ninja @@ -321,7 +321,7 @@ icon_state = "energy_net" removable = FALSE module_type = MODULE_ACTIVE - use_power_cost = DEFAULT_CHARGE_DRAIN * 6 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 6 incompatible_modules = list(/obj/item/mod/module/energy_net) cooldown_time = 5 SECONDS /// List of all energy nets this module made. @@ -342,7 +342,7 @@ net.firer = mod.wearer playsound(src, 'sound/weapons/punchmiss.ogg', 25, TRUE) INVOKE_ASYNC(net, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/energy_net/proc/add_net(obj/structure/energy_net/net) energy_nets += net diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm index c8d3cef027a..a5a56975f6c 100644 --- a/code/modules/mod/modules/modules_science.dm +++ b/code/modules/mod/modules/modules_science.dm @@ -100,7 +100,7 @@ icon_state = "teleporter" module_type = MODULE_ACTIVE complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 5 SECONDS accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/bluespace) /// Time it takes to teleport @@ -127,7 +127,7 @@ animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN) if(!do_teleport(mod.wearer, target_turf, asoundin = 'sound/effects/phasein.ogg')) return - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/anomaly_locked/teleporter/prebuilt prebuilt = TRUE diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index be271ae61e6..e35db603f5e 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -6,7 +6,7 @@ desc = "Based off old TerraGov harness kits, this magnetic harness automatically attaches dropped guns back to the wearer." icon_state = "mag_harness" complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/magnetic_harness) /// Time before we activate the magnet. var/magnet_delay = 0.8 SECONDS @@ -51,7 +51,7 @@ return playsound(src, 'sound/items/modsuit/magnetic_harness.ogg', 50, TRUE) balloon_alert(mod.wearer, "[item] reattached") - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Pepper Shoulders - When hit, reacts with a spray of pepper spray around the user. /obj/item/mod/module/pepper_shoulders @@ -60,7 +60,7 @@ icon_state = "pepper_shoulder" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/pepper_shoulders) cooldown_time = 5 SECONDS overlay_state_inactive = "module_pepper" @@ -89,7 +89,7 @@ if(!COOLDOWN_FINISHED(src, cooldown_timer)) return - if(!check_power(use_power_cost)) + if(!check_power(use_energy_cost)) return mod.wearer.visible_message(span_warning("[src] reacts to the attack with a smoke of pepper spray!"), span_notice("Your [src] releases a cloud of pepper spray!")) on_use() @@ -152,7 +152,7 @@ icon_state = "megaphone" module_type = MODULE_TOGGLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/megaphone) cooldown_time = 0.5 SECONDS /// List of spans we add to the speaker. @@ -174,7 +174,7 @@ SIGNAL_HANDLER speech_args[SPEECH_SPANS] |= voicespan - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Criminal Capture - Generates hardlight bags you can put people in and sinch. /obj/item/mod/module/criminalcapture @@ -187,7 +187,7 @@ icon_state = "criminal_capture" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/criminalcapture) cooldown_time = 0.5 SECONDS /// Time to capture a prisoner. @@ -366,7 +366,7 @@ icon_state = "active_sonar" module_type = MODULE_USABLE idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 complexity = 2 incompatible_modules = list(/obj/item/mod/module/active_sonar) cooldown_time = 15 SECONDS diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index e6e4a01c664..b4870a84ec5 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -8,7 +8,7 @@ icon_state = "bikehorn" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/bikehorn) cooldown_time = 1 SECONDS @@ -17,7 +17,7 @@ if(!.) return playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE) - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Microwave Beam - Microwaves items instantly. /obj/item/mod/module/microwave_beam @@ -28,7 +28,7 @@ icon_state = "microwave_beam" module_type = MODULE_ACTIVE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/microwave_beam, /obj/item/mod/module/organ_thrower) cooldown_time = 10 SECONDS @@ -53,7 +53,7 @@ var/datum/effect_system/spark_spread/spark_effect_two = new() spark_effect_two.set_up(2, 1, microwave_target) spark_effect_two.start() - drain_power(use_power_cost) + drain_power(use_energy_cost) //Waddle - Makes you waddle and squeak. /obj/item/mod/module/waddle diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 7fd9db2ce3b..e57a4c9e65c 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -9,7 +9,7 @@ icon_state = "gps" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/gps) cooldown_time = 0.5 SECONDS allow_flags = MODULE_ALLOW_INACTIVE @@ -33,7 +33,7 @@ icon_state = "clamp" module_type = MODULE_ACTIVE complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/clamp) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_clamp" @@ -64,7 +64,7 @@ stored_crates += picked_crate picked_crate.forceMove(src) balloon_alert(mod.wearer, "picked up [picked_crate]") - drain_power(use_power_cost) + drain_power(use_energy_cost) else if(length(stored_crates)) var/turf/target_turf = get_turf(target) if(target_turf.is_blocked_turf()) @@ -78,7 +78,7 @@ var/atom/movable/dropped_crate = pop(stored_crates) dropped_crate.forceMove(target_turf) balloon_alert(mod.wearer, "dropped [dropped_crate]") - drain_power(use_power_cost) + drain_power(use_energy_cost) else balloon_alert(mod.wearer, "invalid target!") @@ -119,7 +119,7 @@ icon_state = "drill" module_type = MODULE_ACTIVE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/drill) cooldown_time = 0.5 SECONDS overlay_state_active = "module_drill" @@ -145,17 +145,17 @@ if(ismineralturf(target)) var/turf/closed/mineral/mineral_turf = target mineral_turf.gets_drilled(mod.wearer) - drain_power(use_power_cost) + drain_power(use_energy_cost) else if(isasteroidturf(target)) var/turf/open/misc/asteroid/sand_turf = target if(!sand_turf.can_dig(mod.wearer)) return sand_turf.getDug() - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/drill/proc/bump_mine(mob/living/carbon/human/bumper, atom/bumped_into, proximity) SIGNAL_HANDLER - if(!ismineralturf(bumped_into) || !drain_power(use_power_cost)) + if(!ismineralturf(bumped_into) || !drain_power(use_energy_cost)) return var/turf/closed/mineral/mineral_turf = bumped_into var/turf/closed/mineral/gibtonite/giberal_turf = mineral_turf @@ -176,7 +176,7 @@ icon_state = "ore" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/orebag) cooldown_time = 0.5 SECONDS allow_flags = MODULE_ALLOW_INACTIVE @@ -214,7 +214,7 @@ for(var/obj/item/ore as anything in ores) ore.forceMove(drop_location()) ores -= ore - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/hydraulic name = "MOD loader hydraulic arms module" @@ -222,7 +222,7 @@ icon_state = "launch_loader" module_type = MODULE_ACTIVE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN*10 + use_energy_cost = DEFAULT_CHARGE_DRAIN*10 incompatible_modules = list(/obj/item/mod/module/hydraulic) cooldown_time = 4 SECONDS overlay_state_inactive = "module_hydraulic" @@ -252,7 +252,7 @@ if(!do_after(mod.wearer, launch_time, target = mod)) power = world.time - current_time animate(game_renderer) - drain_power(use_power_cost) + drain_power(use_energy_cost) new /obj/effect/temp_visual/mook_dust(get_turf(src)) playsound(src, 'sound/items/modsuit/loader_launch.ogg', 75, TRUE) game_renderer.transform = game_renderer.transform.Scale(0.8, 0.8) @@ -311,7 +311,7 @@ icon_state = "magnet_loader" module_type = MODULE_ACTIVE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/magnet) cooldown_time = 1.5 SECONDS overlay_state_active = "module_magnet" @@ -479,7 +479,7 @@ module_type = MODULE_ACTIVE removable = FALSE active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/sphere_transform) cooldown_time = 1.25 SECONDS /// Time it takes us to complete the animation. @@ -544,7 +544,7 @@ bomb.firer = mod.wearer playsound(src, 'sound/weapons/gun/general/grenade_launch.ogg', 75, TRUE) INVOKE_ASYNC(bomb, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) + drain_power(use_energy_cost) /obj/item/mod/module/sphere_transform/on_active_process(seconds_per_tick) animate(mod.wearer) //stop the animation diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 7adf7b13cd9..4e4d751065c 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -13,7 +13,7 @@ icon_state = "eradicationlock" module_type = MODULE_USABLE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/eradication_lock, /obj/item/mod/module/dna_lock) cooldown_time = 0.5 SECONDS /// The ckey we lock with, to allow all alternate versions of the user. @@ -33,7 +33,7 @@ return true_owner_ckey = mod.wearer.ckey balloon_alert(mod.wearer, "user remembered") - drain_power(use_power_cost) + drain_power(use_energy_cost) ///Signal fired when the modsuit tries activating /obj/item/mod/module/eradication_lock/proc/on_mod_activation(datum/source, mob/user) @@ -62,7 +62,7 @@ icon_state = "rewinder" module_type = MODULE_USABLE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/rewinder) cooldown_time = 20 SECONDS @@ -106,7 +106,7 @@ icon_state = "timestop" module_type = MODULE_USABLE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/timestopper) cooldown_time = 60 SECONDS ///The current timestop in progress. @@ -153,7 +153,7 @@ icon_state = "timeline_jumper" module_type = MODULE_USABLE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/timeline_jumper) cooldown_time = 5 SECONDS allow_flags = MODULE_ALLOW_PHASEOUT @@ -207,7 +207,7 @@ icon_state = "chronogun" module_type = MODULE_ACTIVE removable = FALSE - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/tem) cooldown_time = 0.5 SECONDS ///Reference to the chrono field being controlled by this module diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index fd689c3bc16..c63441124ae 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/machines/computer.dmi' icon_state = "laptop" light_on = FALSE + light_power = 1.2 integrity_failure = 0.5 max_integrity = 100 armor_type = /datum/armor/item_modular_computer @@ -70,7 +71,7 @@ /// How far the computer's light can reach, is not editable by players. var/comp_light_luminosity = 3 /// The built-in light's color, editable by players. - var/comp_light_color = "#FFFFFF" + var/comp_light_color = COLOR_WHITE ///Power usage when the computer is open (screen is active) and can be interacted with. var/base_active_power_usage = 15 // SKYRAT EDIT CHANGE - Original: 125 @@ -155,12 +156,12 @@ /obj/item/modular_computer/proc/on_circuit_attached(datum/source) SIGNAL_HANDLER - RegisterSignal(shell.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROC_REF(use_power_for_circuits)) + RegisterSignal(shell.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROC_REF(use_energy_for_circuits)) ///Try to draw power from our internal cell first, before switching to that of the circuit. -/obj/item/modular_computer/proc/use_power_for_circuits(datum/source, power_usage_per_input) +/obj/item/modular_computer/proc/use_energy_for_circuits(datum/source, energy_usage_per_input) SIGNAL_HANDLER - if(use_power(power_usage_per_input, check_programs = FALSE)) + if(use_energy(energy_usage_per_input, check_programs = FALSE)) return COMPONENT_OVERRIDE_POWER_USAGE /obj/item/modular_computer/proc/on_circuit_removed(datum/source) @@ -267,30 +268,34 @@ /** * InsertID - * Attempt to insert the ID in either card slot. + * Attempt to insert the ID in either card slot, if ID is present - attempts swap * Args: * inserting_id - the ID being inserted * user - The person inserting the ID */ /obj/item/modular_computer/InsertID(obj/item/card/inserting_id, mob/user) - //all slots taken - if(computer_id_slot) + if(!isnull(user) && !user.transferItemToLoc(inserting_id, src)) return FALSE - if(user) - if(!user.transferItemToLoc(inserting_id, src)) - return FALSE - to_chat(user, span_notice("You insert \the [inserting_id] into the card slot.")) else inserting_id.forceMove(src) + if(!isnull(computer_id_slot)) + RemoveID(user, silent = TRUE) + computer_id_slot = inserting_id + if(!isnull(user)) + to_chat(user, span_notice("You insert \the [inserting_id] into the card slot.")) + balloon_alert(user, "inserted ID") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + if(ishuman(loc)) var/mob/living/carbon/human/human_wearer = loc if(human_wearer.wear_id == src) human_wearer.sec_hud_set_ID() + update_appearance() update_slot_icon() SEND_SIGNAL(src, COMSIG_MODULAR_COMPUTER_INSERTED_ID, inserting_id, user) @@ -300,8 +305,9 @@ * Removes the ID card from the computer, and puts it in loc's hand if it's a mob * Args: * user - The mob trying to remove the ID, if there is one + * silent - Boolean, determines whether fluff text would be printed */ -/obj/item/modular_computer/RemoveID(mob/user) +/obj/item/modular_computer/RemoveID(mob/user, silent = FALSE) if(!computer_id_slot) return ..() @@ -314,14 +320,17 @@ computer_id_slot.forceMove(drop_location()) computer_id_slot = null - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - balloon_alert(user, "removed ID") - to_chat(user, span_notice("You remove the card from the card slot.")) + + if(!silent && !isnull(user)) + to_chat(user, span_notice("You remove the card from the card slot.")) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + balloon_alert(user, "removed ID") if(ishuman(loc)) var/mob/living/carbon/human/human_wearer = loc if(human_wearer.wear_id == src) human_wearer.sec_hud_set_ID() + update_slot_icon() update_appearance() return TRUE @@ -403,6 +412,10 @@ /obj/item/modular_computer/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() + if(computer_id_slot && isidcard(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Swap ID" + . = CONTEXTUAL_SCREENTIP_SET + if(held_item?.tool_behaviour == TOOL_SCREWDRIVER && internal_cell) context[SCREENTIP_CONTEXT_RMB] = "Remove Cell" . = CONTEXTUAL_SCREENTIP_SET @@ -443,7 +456,7 @@ /obj/item/modular_computer/Exited(atom/movable/gone, direction) if(internal_cell == gone) internal_cell = null - if(enabled && !use_power()) + if(enabled && !use_energy()) shutdown_computer() if(computer_id_slot == gone) computer_id_slot = null @@ -469,7 +482,7 @@ playsound(src, 'sound/machines/card_slide.ogg', 50) /obj/item/modular_computer/proc/turn_on(mob/user, open_ui = TRUE) - var/issynth = issilicon(user) // Robots and AIs get different activation messages. + var/issynth = HAS_SILICON_ACCESS(user) // Robots and AIs get different activation messages. if(atom_integrity <= integrity_failure * max_integrity) if(user) if(issynth) @@ -478,7 +491,7 @@ to_chat(user, span_warning("You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.")) return FALSE - if(use_power()) // checks if the PC is powered + if(use_energy(base_active_power_usage)) // checks if the PC is powered if(looping_sound) soundloop.start() enabled = TRUE @@ -543,7 +556,7 @@ physical.loc.visible_message(span_notice("[icon2html(physical, viewers(physical.loc))] \The [src] displays a [caller.filedesc] notification: [alerttext]")) /obj/item/modular_computer/proc/ring(ringtone) // bring bring - if(!use_power()) + if(!use_energy()) return if(HAS_TRAIT(SSstation, STATION_TRAIT_PDA_GLITCHED)) playsound(src, pick('sound/machines/twobeep_voice1.ogg', 'sound/machines/twobeep_voice2.ogg'), 50, TRUE) @@ -888,20 +901,18 @@ update_appearance() return ITEM_INTERACT_SUCCESS -/obj/item/modular_computer/deconstruct(disassembled = TRUE) +/obj/item/modular_computer/atom_deconstruct(disassembled = TRUE) remove_pai() eject_aicard() - if(!(obj_flags & NO_DECONSTRUCTION)) - if (disassembled) - internal_cell?.forceMove(drop_location()) - computer_id_slot?.forceMove(drop_location()) - inserted_disk?.forceMove(drop_location()) - new /obj/item/stack/sheet/iron(drop_location(), steel_sheet_cost) - else - physical.visible_message(span_notice("\The [src] breaks apart!")) - new /obj/item/stack/sheet/iron(drop_location(), round(steel_sheet_cost * 0.5)) + if (disassembled) + internal_cell?.forceMove(drop_location()) + computer_id_slot?.forceMove(drop_location()) + inserted_disk?.forceMove(drop_location()) + new /obj/item/stack/sheet/iron(drop_location(), steel_sheet_cost) + else + physical.visible_message(span_notice("\The [src] breaks apart!")) + new /obj/item/stack/sheet/iron(drop_location(), round(steel_sheet_cost * 0.5)) relay_qdel() - return ..() // Ejects the inserted intellicard, if one exists. Used when the computer is deconstructed. /obj/item/modular_computer/proc/eject_aicard() diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index db3ecdb7747..edce55c17a6 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -3,17 +3,17 @@ ///Draws power from its rightful source (area if its a computer, the cell otherwise) ///Takes into account special cases, like silicon PDAs through override, and nopower apps. -/obj/item/modular_computer/proc/use_power(amount = 0, check_programs = TRUE) +/obj/item/modular_computer/proc/use_energy(amount = 0, check_programs = TRUE) if(check_power_override(amount)) return TRUE if(!internal_cell) return FALSE - if(internal_cell.use(amount JOULES)) + if(internal_cell.use(amount)) return TRUE if(!check_programs) return FALSE - internal_cell.use(min(amount JOULES, internal_cell.charge)) //drain it anyways. + internal_cell.use(min(amount, internal_cell.charge)) //drain it anyways. if(active_program?.program_flags & PROGRAM_RUNS_WITHOUT_POWER) return TRUE INVOKE_ASYNC(src, PROC_REF(close_all_programs)) @@ -54,7 +54,7 @@ if(open_programs in idle_threads) power_usage += (open_programs.power_cell_use / 2) - if(use_power(power_usage * seconds_per_tick)) + if(use_energy(power_usage * seconds_per_tick)) return TRUE power_failure() return FALSE diff --git a/code/modules/modular_computers/computers/item/disks/role_disks.dm b/code/modules/modular_computers/computers/item/disks/role_disks.dm index da52ee76281..f7f20efb70b 100644 --- a/code/modules/modular_computers/computers/item/disks/role_disks.dm +++ b/code/modules/modular_computers/computers/item/disks/role_disks.dm @@ -98,6 +98,7 @@ starting_programs = list( /datum/computer_file/program/shipping, /datum/computer_file/program/budgetorders, + /datum/computer_file/program/restock_tracker, ) /** @@ -123,6 +124,6 @@ /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/atmosscan, /datum/computer_file/program/supermatter_monitor, - + ) diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 1d947a5574b..3a8f58576c9 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -44,10 +44,10 @@ machinery_computer = null return ..() -/obj/item/modular_computer/processor/use_power(amount = 0, check_programs = TRUE) +/obj/item/modular_computer/processor/use_energy(amount = 0, check_programs = TRUE) var/obj/machinery/machine_holder = physical if(machine_holder.powered()) - machine_holder.use_power(amount) + machine_holder.use_energy(amount) return TRUE return ..() 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 339def50add..547e85dd1b0 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -114,6 +114,7 @@ /datum/computer_file/program/robocontrol, /datum/computer_file/program/budgetorders, /datum/computer_file/program/shipping, + /datum/computer_file/program/restock_tracker, ) /** @@ -264,6 +265,7 @@ /datum/computer_file/program/shipping, /datum/computer_file/program/budgetorders, /datum/computer_file/program/robocontrol, + /datum/computer_file/program/restock_tracker, ) /obj/item/modular_computer/pda/shaftminer @@ -346,8 +348,10 @@ ) AddComponent(/datum/component/wearertargeting/sitcomlaughter, CALLBACK(src, PROC_REF(after_sitcom_laugh))) -/// Return true if our wearer is in a position to slip someone +/// Returns whether the PDA can slip or not, if we have a wearer then check if they are in a position to slip someone. /obj/item/modular_computer/pda/clown/proc/try_slip(mob/living/slipper, mob/living/slippee) + if(isnull(slipper)) + return TRUE if(!istype(slipper.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/clown_shoes)) to_chat(slipper,span_warning("[src] failed to slip anyone. Perhaps I shouldn't have abandoned my legacy...")) return FALSE @@ -416,7 +420,6 @@ /** * No Department/Station Trait */ - /obj/item/modular_computer/pda/assistant name = "assistant PDA" starting_programs = list( @@ -431,10 +434,40 @@ /datum/computer_file/program/status, ) +/obj/item/modular_computer/pda/veteran_advisor + name = "security advisor PDA" + greyscale_colors = "#EA3232#FFD700" + inserted_item = /obj/item/pen/fountain + starting_programs = list( + /datum/computer_file/program/records/security, + /datum/computer_file/program/crew_manifest, + /datum/computer_file/program/coupon, //veteran discount + /datum/computer_file/program/skill_tracker, + ) + +/obj/item/modular_computer/pda/human_ai + name = "modular interface" + icon_state = "pda-silicon-human" + base_icon_state = "pda-silicon-human" + greyscale_config = null + greyscale_colors = null + + has_light = FALSE //parity with borg PDAs + comp_light_luminosity = 0 + inserted_item = null + has_pda_programs = FALSE + starting_programs = list( + /datum/computer_file/program/messenger, + /datum/computer_file/program/secureye/human_ai, + /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/status, + /datum/computer_file/program/robocontrol, + /datum/computer_file/program/borg_monitor, + ) + /** * Non-roles */ - /obj/item/modular_computer/pda/syndicate name = "military PDA" greyscale_colors = "#891417#80FF80" diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 00af9975e24..18f394d6ee0 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -80,42 +80,69 @@ // ===== CARGO CHAT CONSOLES ===== /obj/machinery/modular_computer/preset/cargochat - name = "cargo chatroom console" - desc = "A stationary computer. This one comes preloaded with a chatroom for your cargo requests." + name = "cargo interfacing console" + desc = "A stationary computer that comes pre-loaded with software to interface with the cargo department." starting_programs = list( /datum/computer_file/program/chatclient, ) - - ///Used in Initialize to set the chat client name. - var/console_department + /// What department type is assigned to this console? + var/datum/job_department/department_type /obj/machinery/modular_computer/preset/cargochat/Initialize(mapload) + add_starting_software() . = ..() + setup_starting_software() + REGISTER_REQUIRED_MAP_ITEM(1, 1) + if(department_type) + name = "[lowertext(initial(department_type.department_name))] [name]" + cpu.name = name + +/obj/machinery/modular_computer/preset/cargochat/proc/add_starting_software() + starting_programs += /datum/computer_file/program/department_order + +/obj/machinery/modular_computer/preset/cargochat/proc/setup_starting_software() + if(!department_type) + return + var/datum/computer_file/program/chatclient/chatprogram = cpu.find_file_by_name("ntnrc_client") - chatprogram.username = "[lowertext(console_department)]_department" - cpu.active_program = chatprogram + chatprogram.username = "[lowertext(initial(department_type.department_name))]_department" + 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) + cpu.active_program = orderprogram + update_appearance(UPDATE_ICON) /obj/machinery/modular_computer/preset/cargochat/service - console_department = "Service" + department_type = /datum/job_department/service /obj/machinery/modular_computer/preset/cargochat/engineering - console_department = "Engineering" + department_type = /datum/job_department/engineering /obj/machinery/modular_computer/preset/cargochat/science - console_department = "Science" + department_type = /datum/job_department/science /obj/machinery/modular_computer/preset/cargochat/security - console_department = "Security" + department_type = /datum/job_department/security /obj/machinery/modular_computer/preset/cargochat/medical - console_department = "Medical" + department_type = /datum/job_department/medical - -//ONE PER MAP PLEASE, IT MAKES A CARGOBUS FOR EACH ONE OF THESE /obj/machinery/modular_computer/preset/cargochat/cargo - console_department = "Cargo" - name = "department chatroom console" - desc = "A stationary computer. This one comes preloaded with a chatroom for incoming cargo requests. You may moderate it from this computer." + department_type = /datum/job_department/cargo + name = "departmental interfacing console" + desc = "A stationary computer that comes pre-loaded with software to interface with incoming departmental cargo requests." + +/obj/machinery/modular_computer/preset/cargochat/cargo/add_starting_software() + starting_programs += /datum/computer_file/program/bounty_board + starting_programs += /datum/computer_file/program/budgetorders + starting_programs += /datum/computer_file/program/shipping + +/obj/machinery/modular_computer/preset/cargochat/cargo/setup_starting_software() + var/datum/computer_file/program/chatclient/chatprogram = cpu.find_file_by_name("ntnrc_client") + cpu.active_program = chatprogram + update_appearance(UPDATE_ICON) + // Rest of the chat program setup is done in LateInit /obj/machinery/modular_computer/preset/cargochat/cargo/LateInitialize() . = ..() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 8fb32244e1d..0e17f012453 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -6,7 +6,7 @@ desc = "You shouldn't see this. If you do, report it." //they should be examining the processor instead icon = 'icons/obj/machines/modular_console.dmi' icon_state = "console" - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05 + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.025 density = TRUE max_integrity = 300 integrity_failure = 0.5 @@ -129,7 +129,7 @@ // Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us. /obj/machinery/modular_computer/power_change() - if(cpu?.use_power()) // If it still has a power source, PC wouldn't go offline. + if(cpu?.use_energy()) // If it still has a power source, PC wouldn't go offline. set_machine_stat(machine_stat & ~NOPOWER) update_appearance() return @@ -140,10 +140,7 @@ var/obj/item/stock_parts/cell/cell = get_cell() if(isnull(cell) || cell.percent() >= 100) return - var/power_to_draw = idle_power_usage * seconds_per_tick * 0.5 - if(!use_power_from_net(power_to_draw)) - return - cell.give(power_to_draw) + charge_cell(idle_power_usage * seconds_per_tick, cell) /obj/machinery/modular_computer/get_cell() return cpu?.internal_cell diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 17ab7faf0f9..966bb1c80ed 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -8,6 +8,7 @@ can_run_on_flags = PROGRAM_LAPTOP | PROGRAM_PDA size = 10 tgui_id = "NtosCargo" + program_icon = FA_ICON_CART_FLATBED ///Are you actually placing orders with it? var/requestonly = TRUE ///Can the tablet see or buy illegal stuff? @@ -34,7 +35,7 @@ var/cargo_account = ACCOUNT_CAR /datum/computer_file/program/budgetorders/proc/is_visible_pack(mob/user, paccess_to_check, list/access, contraband) - if(issilicon(user)) //Borgs can't buy things. + if(HAS_SILICON_ACCESS(user)) //Borgs can't buy things. return FALSE if(computer.obj_flags & EMAGGED) return TRUE @@ -57,7 +58,7 @@ return FALSE -/datum/computer_file/program/budgetorders/ui_data() +/datum/computer_file/program/budgetorders/ui_data(mob/user) var/list/data = list() data["location"] = SSshuttle.supply.getStatusText() data["department"] = "Cargo" @@ -79,12 +80,12 @@ if(buyer) data["points"] = buyer.account_balance -//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. + //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(usr, P.access_view , null, P.contraband) || P.hidden) + if(!is_visible_pack(user, P.access_view , null, P.contraband) || P.hidden) continue if(!data["supplies"][P.group]) data["supplies"][P.group] = list( @@ -102,7 +103,7 @@ "access" = P.access )) -//Data regarding the User's capability to buy things. + //Data regarding the User's capability to buy things. data["has_id"] = id_card data["away"] = SSshuttle.supply.getDockedId() == docking_away data["self_paid"] = self_paid diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 238d05704e2..a9bbff8db1b 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -51,7 +51,7 @@ authenticated_user = auth_card.registered_name ? auth_card.registered_name : "Unknown" job_templates = is_centcom ? SSid_access.centcom_job_templates.Copy() : SSid_access.station_job_templates.Copy() valid_access = is_centcom ? SSid_access.get_region_access_list(list(REGION_CENTCOM)) : SSid_access.get_region_access_list(list(REGION_ALL_STATION)) - update_static_data(user) + computer.update_static_data_for_all_viewers() return TRUE // Otherwise, we're minor and now we have to build a list of restricted departments we can change access for. @@ -67,7 +67,7 @@ minor = TRUE valid_access |= SSid_access.get_region_access_list(region_access) authenticated_card = "[auth_card.name] \[LIMITED ACCESS\]" - update_static_data(user) + computer.update_static_data_for_all_viewers() return TRUE return FALSE diff --git a/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm index b3566591e12..66182437869 100644 --- a/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm @@ -8,13 +8,13 @@ filename = "ntnrc_client" filedesc = "Chat Client" downloader_category = PROGRAM_CATEGORY_DEVICE - program_open_overlay = "command" - extended_desc = "This program allows communication over NTNRC network" + program_open_overlay = "text" + extended_desc = "This program allows communication over NTNRC network." size = 8 ui_header = "ntnrc_idle.gif" program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET tgui_id = "NtosNetChat" - program_icon = "comment-alt" + program_icon = FA_ICON_COMMENT_ALT alert_able = TRUE ///The user's screen name. diff --git a/code/modules/modular_computers/file_system/programs/dept_order.dm b/code/modules/modular_computers/file_system/programs/dept_order.dm new file mode 100644 index 00000000000..2229628d392 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/dept_order.dm @@ -0,0 +1,274 @@ +/datum/computer_file/program/department_order + filename = "dept_order" + filedesc = "Departmental Orders" + can_run_on_flags = PROGRAM_CONSOLE + downloader_category = PROGRAM_CATEGORY_SUPPLY + program_open_overlay = "request" + extended_desc = "Allows for departments to order supplied from Cargo for free, with a cooldown between orders." + size = 10 + tgui_id = "NtosDeptOrder" + program_icon = FA_ICON_CART_FLATBED + alert_able = TRUE + + // Filled via set_linked_department. Also serves as "who can cancel the order". + download_access = list(ACCESS_COMMAND) + // Anyone can open, not everyone can use. + run_access = list() + /// Filled via set_linked_department. Serves as "who can place orders". + VAR_PRIVATE/list/use_access = list() + + /// The department we are linked to, typepath. + VAR_PRIVATE/datum/job_department/linked_department + /// Stores the time when we can next place an order for each department. + VAR_PRIVATE/static/list/department_cooldowns = list( + /datum/job_department/engineering = 0, + /datum/job_department/medical = 0, + /datum/job_department/science = 0, + /datum/job_department/security = 0, + /datum/job_department/service = 0, + ) + /// Reference to the order we've made UNTIL it gets sent on the supply shuttle. this is so heads can cancel it + VAR_PRIVATE/datum/supply_order/department_order + /// Our radio object we use to talk to our department. + VAR_PRIVATE/obj/item/radio/radio + /// The radio channel we will speak into by default. + VAR_PRIVATE/radio_channel + /// Maps what department gets what encryption key + /// I could've put this on the job department datum but it felt unnecessary + VAR_PRIVATE/static/list/dept_to_radio = list( + /datum/job_department/engineering = /obj/item/encryptionkey/headset_eng, + /datum/job_department/medical = /obj/item/encryptionkey/headset_med, + /datum/job_department/science = /obj/item/encryptionkey/headset_sci, + /datum/job_department/security = /obj/item/encryptionkey/headset_sec, + /datum/job_department/service = /obj/item/encryptionkey/headset_service, + ) + +/// Sets the passed department type as the active department for this computer file. +/datum/computer_file/program/department_order/proc/set_linked_department(datum/job_department/department) + linked_department = department + var/datum/job_department/linked_department_real = SSjob.get_department_type(linked_department) + // Heads of staff can download + download_access |= linked_department_real.head_of_staff_access + // Heads of staff + anyone in the dept can run it + use_access |= linked_department_real.head_of_staff_access + use_access |= linked_department_real.department_access + // Also set up the radio + if(dept_to_radio[linked_department]) + if(!isnull(radio)) + QDEL_NULL(radio) + var/picked_key = dept_to_radio[linked_department] || /obj/item/encryptionkey/headset_cargo + radio = new(computer) + radio.keyslot = new picked_key() + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() + radio_channel = radio.keyslot.channels[1] + computer.update_static_data_for_all_viewers() + +/datum/computer_file/program/department_order/Destroy() + QDEL_NULL(radio) + return ..() + +/datum/computer_file/program/department_order/ui_interact(mob/user, datum/tgui/ui) + check_cooldown() + +/datum/computer_file/program/department_order/ui_data(mob/user) + var/list/data = list() + data["no_link"] = !linked_department + data["id_inside"] = !!computer.computer_id_slot + data["time_left"] = department_cooldowns[linked_department] ? DisplayTimeText(max(department_cooldowns[linked_department] - world.time, 0), 1) : null + data["can_override"] = !!department_order + return data + +/datum/computer_file/program/department_order/ui_static_data(mob/user) + var/datum/job_department/linked_department_real = SSjob.get_department_type(linked_department) + if(isnull(linked_department_real)) + return list("supplies" = list()) + + var/list/data = list() + + var/list/supply_data = list() + for(var/group in linked_department_real.associated_cargo_groups) + supply_data[group] = list() + + for(var/pack_key in SSshuttle.supply_packs) + var/datum/supply_pack/pack = SSshuttle.supply_packs[pack_key] + if(!islist(supply_data[pack.group]) || !can_see_pack(pack)) + continue + + UNTYPED_LIST_ADD(supply_data[pack.group], list( + "name" = pack.name, + "cost" = pack.get_cost(), + "id" = pack.id, + "desc" = pack.desc || pack.name, // If there is a description, use it. Otherwise use the pack's name. + )) + + var/list/supply_data_flattened = list() + for(var/group in supply_data) + UNTYPED_LIST_ADD(supply_data_flattened, list( + "name" = group, + "packs" = supply_data[group], + )) + + data["supplies"] = supply_data_flattened + return data + +/// 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)) + return FALSE + if(to_check.special && !to_check.special_enabled) + return FALSE + if(to_check.drop_pod_only) + return FALSE + if(to_check.goody) + return FALSE + return TRUE + +/// Looks through all possible departments and finds one this ID card "corresponds" to. +/datum/computer_file/program/department_order/proc/find_department_to_link(obj/item/card/id/id_card) + PROTECTED_PROC(TRUE) + if(id_card.type != /obj/item/card/id/advanced/silver) + // I don't want to introduce weird "access order" behavior with Captain's ID / Chameleon ids / etc, so only silver IDs work + return null + var/list/access_to_depts = list() + for(var/datum/job_department/department as anything in department_cooldowns) + access_to_depts[initial(department.head_of_staff_access)] = department + for(var/access_key in id_card.GetAccess()) + if(access_to_depts[access_key]) + return access_to_depts[access_key] + return null + +/datum/computer_file/program/department_order/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return . + + var/mob/living/orderer = ui.user + if(!istype(orderer)) + return . + + if(action == "link") + if(!isnull(linked_department)) + return TRUE + + var/new_dept_type = find_department_to_link(computer.computer_id_slot) + if(isnull(new_dept_type)) + computer.physical.balloon_alert(orderer, "no department found!") + playsound(computer, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + else + computer.physical.balloon_alert(orderer, "linked") + playsound(computer, 'sound/machines/ping.ogg', 30, TRUE) + set_linked_department(new_dept_type) + return TRUE + + if(isnull(linked_department)) + return TRUE + + var/obj/item/card/id/id_card = computer.computer_id_slot || orderer.get_idcard(hand_first = TRUE) + var/list/id_card_access = id_card?.GetAccess() || list() + + if(length(use_access & id_card_access) <= 0) + computer.physical.balloon_alert(orderer, "access denied!") + playsound(computer, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + return TRUE + + if(action == "override_order") + if(isnull(department_order) || !(department_order in SSshuttle.shopping_list)) + return TRUE + if(length(download_access & id_card_access) <= 0) + computer.physical.balloon_alert(orderer, "requires head of staff access!") + playsound(computer, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + return TRUE + + department_cooldowns[linked_department] = 0 + SSshuttle.shopping_list -= department_order + department_order = null + UnregisterSignal(SSshuttle, COMSIG_SUPPLY_SHUTTLE_BUY) + return TRUE + + if(department_cooldowns[linked_department] > world.time) + return TRUE + + submit_order(orderer, params["id"]) + return TRUE + +/datum/computer_file/program/department_order/proc/submit_order(mob/living/orderer, id) + id = text2path(id) || id + + var/datum/job_department/linked_department_real = SSjob.get_department_type(linked_department) + var/datum/supply_pack/pack = SSshuttle.supply_packs[id] + if(isnull(pack)) + computer.physical.say("Something went wrong!") + CRASH("requested supply pack id \"[id]\" not found!") + if(!can_see_pack(pack) || !(pack.group in linked_department_real.associated_cargo_groups)) + return + var/name = "*None Provided*" + var/rank = "*None Provided*" + var/ckey = orderer.ckey + if(ishuman(orderer)) + var/mob/living/carbon/human/human_orderer = orderer + name = human_orderer.get_authentification_name() + rank = human_orderer.get_assignment(hand_first = TRUE) + else if(HAS_SILICON_ACCESS(orderer)) + name = orderer.real_name + rank = "Silicon" + var/already_signalled = !!department_order + var/chosen_delivery_area + for(var/delivery_area_type in linked_department_real.department_delivery_areas) + if(GLOB.areas_by_type[delivery_area_type]) + chosen_delivery_area = delivery_area_type + break + + if(SSshuttle.supply.get_order_count(pack) == OVER_ORDER_LIMIT) + playsound(computer, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + computer.physical.say("ERROR: No more then [CARGO_MAX_ORDER] of any pack may be ordered at once!") + return + + department_order = new( + pack = pack, + orderer = name, + orderer_rank = rank, + orderer_ckey = ckey, + reason = "Departmental Order", + paying_account = null, + department_destination = chosen_delivery_area, + coupon = null, + manifest_can_fail = FALSE, + ) + SSshuttle.shopping_list += department_order + if(!already_signalled) + RegisterSignal(SSshuttle, COMSIG_SUPPLY_SHUTTLE_BUY, PROC_REF(finalize_department_order)) + computer.physical.say("Order processed. Cargo will deliver the crate when it comes in on their shuttle. NOTICE: Heads of staff may override the order.") + calculate_cooldown(pack.cost) + +///signal when the supply shuttle begins to spawn orders. we forget the current order preventing it from being overridden (since it's already past the point of no return on undoing the order) +/datum/computer_file/program/department_order/proc/finalize_department_order(datum/subsystem) + SIGNAL_HANDLER + if(!isnull(department_order) && (department_order in SSshuttle.shopping_list)) + department_order = null + UnregisterSignal(subsystem, COMSIG_SUPPLY_SHUTTLE_BUY) + +/datum/computer_file/program/department_order/proc/calculate_cooldown(credits) + //minimum almost the lowest value of a crate + var/min = CARGO_CRATE_VALUE * 1.6 + //maximum fairly expensive crate at 3000 + var/max = CARGO_CRATE_VALUE * 15 + credits = clamp(credits, min, max) + var/time_y = (credits - min)/(max - min) + 1 //convert to between 1 and 2 + time_y = 10 MINUTES * time_y + department_cooldowns[linked_department] = world.time + time_y + +/datum/computer_file/program/department_order/process_tick(seconds_per_tick) + if(!check_cooldown() || alert_silenced || !alert_able) + return + radio?.talk_into(computer, "Order cooldown has expired! A new order may now be placed!", radio_channel) + computer.alert_call(src, "Order cooldown expired!", 'sound/machines/ping.ogg') + +/// Checks if the cooldown is up and resets it if so. +/datum/computer_file/program/department_order/proc/check_cooldown() + if(department_cooldowns[linked_department] > 0 && department_cooldowns[linked_department] <= world.time) + department_cooldowns[linked_department] = 0 + return TRUE + return FALSE 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 11188bc7cdf..34aaf9c8515 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 @@ -9,7 +9,7 @@ filename = "nt_messenger" filedesc = "Direct Messenger" downloader_category = PROGRAM_CATEGORY_DEVICE - program_open_overlay = "command" + program_open_overlay = "text" extended_desc = "This program allows old-school communication with other modular devices." size = 0 undeletable = TRUE // It comes by default in tablets, can't be downloaded, takes no space and should obviously not be able to be deleted. @@ -708,7 +708,6 @@ else reply = "(Reply)" - if (isAI(messaged_mob)) sender_title = "[sender_title]" diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm index c5a8eba952b..817cad275cd 100644 --- a/code/modules/modular_computers/file_system/programs/powermonitor.dm +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -67,13 +67,13 @@ var/list/supply = history["supply"] if(connected_powernet) - supply += connected_powernet.viewavail + supply += energy_to_power(connected_powernet.avail) if(supply.len > record_size) supply.Cut(1, 2) var/list/demand = history["demand"] if(connected_powernet) - demand += connected_powernet.viewload + demand += energy_to_power(connected_powernet.load) if(demand.len > record_size) demand.Cut(1, 2) @@ -84,8 +84,8 @@ data["interval"] = record_interval / 10 data["attached"] = connected_powernet ? TRUE : FALSE if(connected_powernet) - data["supply"] = display_power(connected_powernet.viewavail) - data["demand"] = display_power(connected_powernet.viewload) + data["supply"] = display_power(connected_powernet.avail) + data["demand"] = display_power(connected_powernet.load) data["history"] = history data["areas"] = list() diff --git a/code/modules/modular_computers/file_system/programs/restock_tracker.dm b/code/modules/modular_computers/file_system/programs/restock_tracker.dm new file mode 100644 index 00000000000..46462c0c6b5 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/restock_tracker.dm @@ -0,0 +1,31 @@ +/datum/computer_file/program/restock_tracker + filename = "restockapp" + filedesc = "NT Restock Tracker" + downloader_category = PROGRAM_CATEGORY_SUPPLY + program_open_overlay = "restock" + extended_desc = "Nanotrasen IoT network listing all the vending machines found on station, and how well stocked they are each. Profitable!" + program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET + can_run_on_flags = PROGRAM_LAPTOP | PROGRAM_PDA + size = 4 + program_icon = "cash-register" + tgui_id = "NtosRestock" + +/datum/computer_file/program/restock_tracker/ui_data() + var/list/data = list() + var/list/vending_list = list() + var/id_increment = 1 + for(var/obj/machinery/vending/vendor as anything in GLOB.vending_machines_to_restock) + var/stock = vendor.total_loaded_stock() + var/max_stock = vendor.total_max_stock() + if((max_stock == 0 || (stock >= max_stock)) && vendor.credits_contained == 0) + continue + vending_list += list(list( + "name" = vendor.name, + "location" = get_area_name(vendor), + "credits" = vendor.credits_contained, + "percentage" = (stock / max_stock) * 100, + "id" = id_increment, + )) + id_increment++ + data["vending_list"] = vending_list + return data diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 68f7ba3ddef..314048c5149 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -35,7 +35,7 @@ for(var/mob/living/simple_animal/bot/simple_bot as anything in GLOB.bots_list) if(!is_valid_z_level(current_turf, get_turf(simple_bot)) || !(simple_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) //Only non-emagged bots on the same Z-level are detected! continue - if(computer && !simple_bot.check_access(user)) // Only check Bots we can access) + if(!simple_bot.allowed(user) && !simple_bot.check_access(computer.computer_id_slot)) // Only check Bots we can access continue var/list/newbot = list( "name" = simple_bot.name, diff --git a/code/modules/modular_computers/file_system/programs/robotact.dm b/code/modules/modular_computers/file_system/programs/robotact.dm index 8a2a824d004..1738943b533 100644 --- a/code/modules/modular_computers/file_system/programs/robotact.dm +++ b/code/modules/modular_computers/file_system/programs/robotact.dm @@ -47,6 +47,7 @@ data["maxcharge"] = maxcharge //Cell max charge data["integrity"] = ((cyborg.health + 100) / 2) //health, as percentage data["lampIntensity"] = cyborg.lamp_intensity //lamp power setting + data["lampConsumption"] = cyborg.lamp_power_consumption //Power consumption of the lamp per lamp intensity. data["sensors"] = "[cyborg.sensors_on?"ACTIVE":"DISABLED"]" data["printerPictures"] = cyborg.connected_ai? cyborg.connected_ai.aicamera.stored.len : cyborg.aicamera.stored.len //Number of pictures taken, synced to AI if available data["printerToner"] = cyborg.toner //amount of toner diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 8eb3190afa5..eee170e7c2c 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -17,7 +17,7 @@ ///Boolean on whether or not the app will make noise when flipping around the channels. var/spying = FALSE - var/list/network = list("ss13") + var/list/network = list(CAMERANET_NETWORK_SS13) ///List of weakrefs of all users watching the program. var/list/concurrent_users = list() @@ -43,6 +43,22 @@ can_run_on_flags = PROGRAM_ALL program_flags = PROGRAM_ON_SYNDINET_STORE | PROGRAM_UNIQUE_COPY + network = list( + CAMERANET_NETWORK_SS13, + CAMERANET_NETWORK_MINE, + CAMERANET_NETWORK_RD, + CAMERANET_NETWORK_LABOR, + CAMERANET_NETWORK_ORDNANCE, + CAMERANET_NETWORK_MINISAT, + ) + spying = TRUE + +/datum/computer_file/program/secureye/human_ai + filename = "Overseer" + filedesc = "OverSeer" + run_access = list(ACCESS_MINISAT) + can_run_on_flags = PROGRAM_PDA + program_flags = PROGRAM_UNIQUE_COPY network = list("ss13", "mine", "rd", "labor", "ordnance", "minisat") spying = TRUE @@ -102,7 +118,7 @@ data["activeCamera"] = list( name = active_camera.c_tag, ref = REF(active_camera), - status = active_camera.status, + status = active_camera.camera_enabled, ) return data diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm index bf9e7b1e9b8..a72eef1bc9a 100644 --- a/code/modules/modular_computers/file_system/programs/techweb.dm +++ b/code/modules/modular_computers/file_system/programs/techweb.dm @@ -201,7 +201,7 @@ if(stored_research.research_node_id(id)) computer.say("Successfully researched [tech_node.display_name].") var/logname = "Unknown" - if(isAI(user)) + if(HAS_AI_ACCESS(user)) logname = "AI [user.name]" if(iscyborg(user)) logname = "CYBORG [user.name]" diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 6a17cd4e2c2..2770405a9f1 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -51,12 +51,6 @@ /datum/movespeed_modifier/grab_slowdown/kill multiplicative_slowdown = 9 -/datum/movespeed_modifier/slime_reagentmod - variable = TRUE - -/datum/movespeed_modifier/slime_healthmod - variable = TRUE - /datum/movespeed_modifier/config_walk_run multiplicative_slowdown = 1 id = MOVESPEED_ID_MOB_WALK_RUN @@ -131,9 +125,6 @@ multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN flags = IGNORE_NOSLOW -/datum/movespeed_modifier/slime_tempmod - variable = TRUE - /datum/movespeed_modifier/carbon_crawling multiplicative_slowdown = CRAWLING_ADD_SLOWDOWN flags = IGNORE_NOSLOW diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm index 6700854b11d..55726363310 100644 --- a/code/modules/movespeed/modifiers/reagent.dm +++ b/code/modules/movespeed/modifiers/reagent.dm @@ -5,7 +5,8 @@ multiplicative_slowdown = -0.55 /datum/movespeed_modifier/reagent/ephedrine - multiplicative_slowdown = -0.5 + variable = TRUE + // speed is based on purity of the reagent at the time of metabolization /datum/movespeed_modifier/reagent/pepperspray multiplicative_slowdown = 0.25 diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index c1a9c5a88ba..77ca42aeebc 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -21,6 +21,14 @@ /// Prevents a crew member from hitting "request pAI" repeatedly var/request_spam = FALSE +/obj/item/pai_card/Initialize(mapload) + . = ..() + + update_appearance() + SSpai.pai_card_list += src + ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + /obj/item/pai_card/attackby(obj/item/used, mob/user, params) if(pai && istype(used, /obj/item/encryptionkey)) if(!pai.encrypt_mod) @@ -63,12 +71,10 @@ emotion_icon = initial(emotion_icon) update_appearance() -/obj/item/pai_card/Initialize(mapload) - . = ..() - - update_appearance() - SSpai.pai_card_list += src - ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) +/obj/item/pai_card/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(pai) + return pai.on_saboteur(source, disrupt_duration) /obj/item/pai_card/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is staring sadly at [src]! [user.p_They()] can't keep living without real human intimacy!")) diff --git a/code/modules/pai/hud.dm b/code/modules/pai/hud.dm index 1a71b5235b6..b104c7b90ea 100644 --- a/code/modules/pai/hud.dm +++ b/code/modules/pai/hud.dm @@ -268,6 +268,6 @@ var/mob/living/silicon/pai/owner = mymob for(var/atom/movable/screen/pai/button in static_inventory) if(button.required_software) - button.color = owner.installed_software.Find(button.required_software) ? null : "#808080" + button.color = owner.installed_software.Find(button.required_software) ? null : COLOR_GRAY #undef PAI_MISSING_SOFTWARE_MESSAGE diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 81627021583..026aacc0e7d 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -230,6 +230,7 @@ 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)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /mob/living/silicon/pai/make_laws() laws = new /datum/ai_laws/pai() @@ -343,6 +344,12 @@ to_chat(src, span_danger("WARN: Holochasis range restrictions disabled.")) return TRUE +/mob/living/silicon/pai/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + set_silence_if_lower(disrupt_duration) + balloon_alert(src, "muted!") + return COMSIG_SABOTEUR_SUCCESS + /** * Resets the pAI and any emagged status. * @@ -451,7 +458,7 @@ SIGNAL_HANDLER for(var/mob/living/cultist as anything in invokers) - to_chat(cultist, span_cultitalic("You don't think this is what Nar'Sie had in mind when She asked for blood sacrifices...")) + to_chat(cultist, span_cult_italic("You don't think this is what Nar'Sie had in mind when She asked for blood sacrifices...")) return STOP_SACRIFICE /// Updates the distance we can be from our pai card diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index f9eafa901aa..0be6375ed17 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -33,22 +33,23 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department var/list/fax_history = list() /// List of types which should always be allowed to be faxed var/static/list/allowed_types = list( + /obj/item/canvas, /obj/item/paper, /obj/item/photo, - /obj/item/tcgcard + /obj/item/tcgcard, ) /// List of types which should be allowed to be faxed if hacked var/static/list/exotic_types = list( - /obj/item/food/pizzaslice, - /obj/item/food/root_flatbread, - /obj/item/food/pizza/flatbread, - /obj/item/food/breadslice, - /obj/item/food/salami, - /obj/item/throwing_star, - /obj/item/stack/spacecash, - /obj/item/holochip, /obj/item/card, /obj/item/folder/biscuit, + /obj/item/food/breadslice, + /obj/item/food/pizza/flatbread, + /obj/item/food/pizzaslice, + /obj/item/food/root_flatbread, + /obj/item/food/salami, + /obj/item/holochip, + /obj/item/stack/spacecash, + /obj/item/throwing_star, ) /// List with a fake-networks(not a fax actually), for request manager. var/list/special_networks = list( @@ -56,6 +57,15 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department syndicate = list(fax_name = "Sabotage Department", fax_id = "syndicate", color = "red", emag_needed = TRUE), ) +/obj/machinery/fax/auto_name + name = "Auto-naming Fax Machine" + +/obj/machinery/fax/auto_name/Initialize(mapload) + var/area/current_area = get_area(src) + name = "[current_area.name]'s Fax Machine" + fax_name = "[current_area.name]" + return ..() + /obj/machinery/fax/Initialize(mapload) . = ..() if (!fax_id) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 140bdffcf87..70e930ca31e 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -37,12 +37,10 @@ if(I.w_class < WEIGHT_CLASS_NORMAL) //there probably shouldn't be anything placed ontop of filing cabinets in a map that isn't meant to go in them I.forceMove(src) -/obj/structure/filingcabinet/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 2) - for(var/obj/item/I in src) - I.forceMove(loc) - qdel(src) +/obj/structure/filingcabinet/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, 2) + for(var/obj/item/obj in src) + obj.forceMove(loc) /obj/structure/filingcabinet/attackby(obj/item/P, mob/living/user, params) var/list/modifiers = params2list(params) @@ -97,7 +95,7 @@ if(istype(content) && in_range(src, usr)) usr.put_in_hands(content) icon_state = "[initial(icon_state)]-open" - addtimer(VARSET_CALLBACK(src, icon_state, initial(icon_state)), 5) + addtimer(VARSET_CALLBACK(src, icon_state, initial(icon_state)), 0.5 SECONDS) return TRUE /obj/structure/filingcabinet/attack_tk(mob/user) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 2703744d18a..e4ac04a22b6 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,12 +1,23 @@ +/// A mini-tool used to apply label items onto something to modify its name. /obj/item/hand_labeler //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "hand labeler" desc = "A combined label printer, applicator, and remover, all in a single portable device. Designed to be easy to operate and use." icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "labeler0" - inhand_icon_state = null - var/label = null + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_SMALL + drop_sound = 'sound/items/handling/tape_drop.ogg' + pickup_sound = 'sound/items/handling/tape_pickup.ogg' + custom_materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.25, + ) + /// Tracks the current label text + var/label + /// How many labels are left in the current roll? Also serves as our "max". var/labels_left = 30 - var/mode = 0 + /// Whether we are in label mode + VAR_FINAL/mode = FALSE /obj/item/hand_labeler/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is pointing [src] at [user.p_them()]self. [user.p_Theyre()] going to label [user.p_them()]self as a suicide!")) @@ -36,60 +47,77 @@ return OXYLOSS -/obj/item/hand_labeler/afterattack(atom/A, mob/user,proximity) +/obj/item/hand_labeler/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() - if(!proximity) - return - - . |= AFTERATTACK_PROCESSED_ITEM - + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . if(!mode) //if it's off, give up. - return + return . + if(!apply_label(interacting_with, user, modifiers)) + return ITEM_INTERACT_BLOCKING + return ITEM_INTERACT_SUCCESS +/obj/item/hand_labeler/proc/apply_label(atom/interacting_with, mob/living/user, list/modifiers) if(!labels_left) - to_chat(user, span_warning("No labels left!")) - return - if(!label || !length(label)) - to_chat(user, span_warning("No text set!")) - return - if(length(A.name) + length(label) > 64) - to_chat(user, span_warning("Label too big!")) - return - if(ismob(A)) - to_chat(user, span_warning("You can't label creatures!")) // use a collar - return + balloon_alert(user, "no labels left!") + return FALSE + if(!length(label)) + balloon_alert(user, "no text set!") + return FALSE + if(length(interacting_with.name) + length(label) > MAX_LABEL_LEN) + balloon_alert(user, "label too long!") + return FALSE + if(ismob(interacting_with)) + interacting_with.balloon_alert(user, "can't label!") + return FALSE - user.visible_message(span_notice("[user] labels [A] with \"[label]\"."), \ - span_notice("You label [A] with \"[label]\".")) - A.AddComponent(/datum/component/label, label) - playsound(A, 'sound/items/handling/component_pickup.ogg', 20, TRUE) + var/cursor_x = text2num(LAZYACCESS(modifiers, ICON_X)) + var/cursor_y = text2num(LAZYACCESS(modifiers, ICON_Y)) + interacting_with.balloon_alert_to_viewers("labelled") + user.visible_message( + span_notice("[user] labels [interacting_with] with \"[label]\"."), + span_notice("You label [interacting_with] with \"[label]\"."), + ) + var/obj/item/label/stick_label = new(null, label) + stick_label.stick_to_atom(interacting_with, cursor_x, cursor_y) + playsound(interacting_with, 'sound/items/handling/component_pickup.ogg', 20, TRUE) labels_left-- + return TRUE - -/obj/item/hand_labeler/attack_self(mob/user) +/obj/item/hand_labeler/interact(mob/user) + . = ..() + if(.) + return . if(!ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to use [src]!")) - return + return . + mode = !mode icon_state = "labeler[mode]" if(mode) to_chat(user, span_notice("You turn on [src].")) //Now let them chose the text. var/str = reject_bad_text(tgui_input_text(user, "Label text", "Set Label", label, MAX_NAME_LEN)) - if(!str) + if(!str || QDELETED(src) || !user.is_holding(src)) to_chat(user, span_warning("Invalid text!")) return label = str to_chat(user, span_notice("You set the text to '[str]'.")) else to_chat(user, span_notice("You turn off [src].")) + return TRUE -/obj/item/hand_labeler/attackby(obj/item/I, mob/user, params) - ..() - if(istype(I, /obj/item/hand_labeler_refill)) - to_chat(user, span_notice("You insert [I] into [src].")) - qdel(I) - labels_left = initial(labels_left) //Yes, it's capped at its initial value +/obj/item/hand_labeler/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(!istype(tool, /obj/item/hand_labeler_refill)) + return . + + balloon_alert(user, "refilled") + qdel(tool) + labels_left = initial(labels_left) //Yes, it's capped at its initial value + return ITEM_INTERACT_SUCCESS /obj/item/hand_labeler/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) return !mode @@ -97,15 +125,13 @@ /obj/item/hand_labeler/borg name = "cyborg-hand labeler" -/obj/item/hand_labeler/borg/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(!iscyborg(user)) - return +/obj/item/hand_labeler/borg/apply_label(atom/interacting_with, mob/living/silicon/robot/user, list/modifiers) + if(!istype(user)) + return FALSE - var/mob/living/silicon/robot/borgy = user + . = ..() + if(!.) + return . var/starting_labels = initial(labels_left) var/diff = starting_labels - labels_left @@ -116,8 +142,9 @@ // If the cyborg manages to use a module without a cell, they get the paper // for free. - if(borgy.cell) - borgy.cell.use(cost) + user.cell?.use(cost) + + return . /obj/item/hand_labeler_refill name = "hand labeler paper roll" @@ -128,3 +155,177 @@ lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' w_class = WEIGHT_CLASS_TINY + throw_range = 3 + throw_speed = 1 + pressure_resistance = 2 + resistance_flags = FLAMMABLE + max_integrity = 100 + item_flags = NOBLUDGEON + +/// The label item applied when labelling something +/obj/item/label + name = "label" + desc = "A strip of paper." + icon = 'icons/obj/toys/stickers.dmi' + icon_state = "label" + throw_range = 1 + throw_speed = 1 + pressure_resistance = 0 + resistance_flags = FLAMMABLE + max_integrity = 30 + drop_sound = 'sound/items/handling/paper_drop.ogg' + pickup_sound = 'sound/items/handling/paper_pickup.ogg' + item_flags = NOBLUDGEON | SKIP_FANTASY_ON_SPAWN + w_class = WEIGHT_CLASS_TINY + + /// The text on the label + var/label_name + /// What atom we're currently stuck to + VAR_FINAL/atom/sticking_to + +/obj/item/label/Initialize(mapload, new_label_name) + . = ..() + if(new_label_name) + update_label_name(new_label_name) + +/obj/item/label/Destroy() + clear_stick_to() + return ..() + +/obj/item/label/update_name(updates) + . = ..() + if(label_name) + name = "label ([label_name])" + +/// Sets the lable_name var and performs any necessary updates to the label's appearance +/obj/item/label/proc/update_label_name(new_label_name) + if(label_name == new_label_name) + return + + if(sticking_to) + remove_label() + label_name = new_label_name + if(sticking_to) + apply_label() + update_appearance(UPDATE_NAME) + +/obj/item/label/vv_edit_var(var_name, var_value) + if(var_name == NAMEOF(src, label_name)) + update_label_name(var_value) + datum_flags |= DF_VAR_EDITED + return TRUE + + return ..() + +/obj/item/label/proc/stick_to_atom(atom/applying_to, stick_px = world.icon_size / 2, stick_py = world.icon_size / 2) + applying_to.AddComponent( \ + /datum/component/sticker, \ + stickering_atom = src, \ + dir = applying_to.dir, \ + px = stick_px, \ + py = stick_py, \ + stick_callback = CALLBACK(src, PROC_REF(on_stick)), \ + peel_callback = CALLBACK(src, PROC_REF(on_peel)), \ + ) + +/// Callback invoked when the label is attached to something +/obj/item/label/proc/on_stick(atom/applying_to) + sticking_to = applying_to + RegisterSignal(sticking_to, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(interacted_with)) + RegisterSignal(sticking_to, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignals(sticking_to, list(SIGNAL_ADDTRAIT(TRAIT_WAS_RENAMED), SIGNAL_REMOVETRAIT(TRAIT_WAS_RENAMED)), PROC_REF(reapply)) + RegisterSignal(sticking_to, COMSIG_QDELETING, PROC_REF(clear_stick_to)) + apply_label() + +/// Callback invoked when the label is removed from something +/obj/item/label/proc/on_peel(atom/peeled_from) + qdel(src) + +/// General purpose / signal proc used to clear references and clean up when removed +/obj/item/label/proc/clear_stick_to(...) + SIGNAL_HANDLER + + if(isnull(sticking_to)) + return + if(!QDELING(sticking_to)) + remove_label() + UnregisterSignal(sticking_to, list( + COMSIG_ATOM_ITEM_INTERACTION, + COMSIG_ATOM_EXAMINE, + SIGNAL_ADDTRAIT(TRAIT_WAS_RENAMED), + SIGNAL_REMOVETRAIT(TRAIT_WAS_RENAMED), + COMSIG_QDELETING, + )) + sticking_to = null + +/** + * This proc will trigger when any object is used to attack the thing we're stuck to. . + * + * If the attacking object is not a hand labeler, it will return. + * If the attacking object is a hand labeler, it will either update the label or remove the label entirely. + * + * Arguments: + * * source: The parent. + * * attacker: The object that is hitting the parent. + * * user: The mob who is wielding the attacking object. +*/ +/obj/item/label/proc/interacted_with(atom/source, mob/living/user, obj/item/tool) + SIGNAL_HANDLER + + // If the attacking object is not a hand labeler or its mode is 1 (has a label ready to apply), return. + // The hand labeler should be off (mode is 0), in order to remove a label. + var/obj/item/hand_labeler/labeler = tool + if(!istype(labeler)) + return NONE + + if(labeler.mode) + if(!length(labeler.label)) + labeler.balloon_alert(user, "no text set!") + return ITEM_INTERACT_BLOCKING + if(labeler.label == label_name) + sticking_to.balloon_alert(user, "already labelled!") + return ITEM_INTERACT_BLOCKING + if(length(initial(sticking_to.name)) + length(labeler.label) > MAX_LABEL_LEN) + sticking_to.balloon_alert(user, "label too long!") + return ITEM_INTERACT_BLOCKING + + update_label_name(labeler.label) + playsound(sticking_to, 'sound/items/handling/component_pickup.ogg', 20, TRUE) + sticking_to.balloon_alert(user, "label renamed") + else + playsound(sticking_to, 'sound/items/poster_ripped.ogg', 20, TRUE) + sticking_to.balloon_alert(user, "label removed") + qdel(src) + return ITEM_INTERACT_SUCCESS + +/** + * This proc will trigger when someone examines the thing we're stuck to. + * It will attach the text found in the body of the proc to the `examine_list` and display it to the player examining the parent. + * + * Arguments: + * * source: The parent. + * * user: The mob exmaining the parent. + * * examine_list: The current list of text getting passed from the parent's normal examine() proc. +*/ +/obj/item/label/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_notice("It has a label with some words written on it. Use a hand labeler to remove it.") + +/// Applies a label to the name of what we're stuck to in the format of: "parent_name (label)" +/obj/item/label/proc/apply_label() + sticking_to.name += " ([label_name])" + ADD_TRAIT(sticking_to, TRAIT_HAS_LABEL, REF(src)) + +/// Removes the label from the name of what we're stuck to +/obj/item/label/proc/remove_label() + sticking_to.name = replacetext(sticking_to.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it's located. + sticking_to.name = trim(sticking_to.name) // Shave off any white space from the beginning or end of the parent's name. + REMOVE_TRAIT(sticking_to, TRAIT_HAS_LABEL, REF(src)) + +/// Used to re-apply the label when the thing we're stuck to is renamed. +/obj/item/label/proc/reapply(...) + SIGNAL_HANDLER + + remove_label() + apply_label() diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 9878249a6d1..ae93a1daad8 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -61,8 +61,7 @@ return CONTEXTUAL_SCREENTIP_SET -/obj/item/papercutter/deconstruct(disassembled) - ..() +/obj/item/papercutter/atom_deconstruct(disassembled) if(!disassembled) return diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 9971c0da7f7..3d7177dcb3e 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -124,7 +124,7 @@ return if(istype(I, /obj/item/paper)) var/obj/item/paper/paper = I - if(!user.transferItemToLoc(paper, src)) + if(!user.transferItemToLoc(paper, src, silent = FALSE)) return to_chat(user, span_notice("You put [paper] in [src].")) paper_stack += paper @@ -132,7 +132,7 @@ update_appearance() else if(istype(I, /obj/item/pen) && !bin_pen) var/obj/item/pen/pen = I - if(!user.transferItemToLoc(pen, src)) + if(!user.transferItemToLoc(pen, src, silent = FALSE)) return to_chat(user, span_notice("You put [pen] in [src].")) bin_pen = pen @@ -240,7 +240,7 @@ if(total_paper == 0) deconstruct(FALSE) -/obj/item/paper_bin/bundlenatural/deconstruct(disassembled) +/obj/item/paper_bin/bundlenatural/atom_deconstruct(disassembled) dump_contents(drop_location()) return ..() diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 10a15e88196..2a9e78e2489 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -25,7 +25,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 = "#000000" //what colour the ink is! + var/colour = COLOR_BLACK //what colour the ink is! var/degrees = 0 var/font = PEN_FONT var/requires_gravity = TRUE // can you use this to write in zero-g @@ -71,42 +71,42 @@ /obj/item/pen/blue desc = "It's a normal blue ink pen." icon_state = "pen_blue" - colour = "#0000FF" + colour = COLOR_BLUE /obj/item/pen/red desc = "It's a normal red ink pen." icon_state = "pen_red" - colour = "#FF0000" + colour = COLOR_RED throw_speed = 4 // red ones go faster (in this case, fast enough to embed!) /obj/item/pen/invisible desc = "It's an invisible pen marker." icon_state = "pen" - colour = "#FFFFFF" + colour = COLOR_WHITE /obj/item/pen/fourcolor desc = "It's a fancy four-color ink pen, set to black." name = "four-color pen" icon_state = "pen_4color" - colour = "#000000" + colour = COLOR_BLACK /obj/item/pen/fourcolor/attack_self(mob/living/carbon/user) . = ..() var/chosen_color = "black" switch(colour) - if("#000000") - colour = "#FF0000" + if(COLOR_BLACK) + colour = COLOR_RED chosen_color = "red" throw_speed++ - if("#FF0000") - colour = "#00FF00" + if(COLOR_RED) + colour = COLOR_VIBRANT_LIME chosen_color = "green" throw_speed-- - if("#00FF00") - colour = "#0000FF" + if(COLOR_VIBRANT_LIME) + colour = COLOR_BLUE chosen_color = "blue" else - colour = "#000000" + colour = COLOR_BLACK to_chat(user, span_notice("\The [src] will now write in [chosen_color].")) desc = "It's a fancy four-color ink pen, set to [chosen_color]." @@ -231,10 +231,6 @@ to_chat(user, span_notice("You changed [O] to... well... [O].")) else O.AddComponent(/datum/component/rename, input, O.desc) - var/datum/component/label/label = O.GetComponent(/datum/component/label) - if(label) - label.remove_label() - label.apply_label() to_chat(user, span_notice("You have successfully renamed \the [oldname] to [O].")) ADD_TRAIT(O, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT) O.update_appearance(UPDATE_ICON) @@ -257,13 +253,6 @@ return qdel(O.GetComponent(/datum/component/rename)) - - //reapply any label to name - var/datum/component/label/label = O.GetComponent(/datum/component/label) - if(label) - label.remove_label() - label.apply_label() - to_chat(user, span_notice("You have successfully reset [O]'s name and description.")) REMOVE_TRAIT(O, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT) O.update_appearance(UPDATE_ICON) @@ -327,8 +316,8 @@ item_flags = NO_BLOOD_ON_ITEM light_system = OVERLAY_LIGHT light_range = 1.5 - light_power = 0.75 - light_color = COLOR_SOFT_RED + light_power = 1.3 + light_color = "#FA8282" light_on = FALSE dart_insert_projectile_icon_state = "overlay_edagger" /// The real name of our item when extended. @@ -472,7 +461,7 @@ 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 - colour = "#0000FF" + colour = COLOR_BLUE dart_insert_casing_icon_state = "overlay_survivalpen" dart_insert_projectile_icon_state = "overlay_survivalpen_proj" diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index e5a30474f87..207b8351a58 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -161,7 +161,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) data["is_photo"] = TRUE data["color_mode"] = color_mode - if(isAI(user)) + if(HAS_AI_ACCESS(user)) data["isAI"] = TRUE data["can_AI_print"] = toner_cartridge && (toner_cartridge.charges >= PHOTO_TONER_USE) && (get_paper_count() >= PHOTO_PAPER_USE) else @@ -199,7 +199,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) else to_chat(usr, span_notice("You feel kind of silly, copying [ass]\'s ass with [ass.p_their()] clothes on.")) return FALSE - do_copies(CALLBACK(src, PROC_REF(make_ass_copy), usr), usr, ASS_PAPER_USE, ASS_TONER_USE, num_copies) + do_copies(CALLBACK(src, PROC_REF(make_ass_copy)), usr, ASS_PAPER_USE, ASS_TONER_USE, num_copies) return TRUE else // Basic paper @@ -489,24 +489,13 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) * Calls `check_ass()` first to make sure that `ass` exists, among other conditions. Since this proc is called from a timer, it's possible that it was removed. * Additionally checks that the mob has their clothes off. */ -/obj/machinery/photocopier/proc/make_ass_copy(mob/user) +/obj/machinery/photocopier/proc/make_ass_copy() if(!check_ass()) return null - var/icon/temp_img - if(ishuman(ass)) - var/mob/living/carbon/human/H = ass - var/datum/species/spec = H.dna.species - if(spec.ass_image) - temp_img = icon(spec.ass_image) - else - temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') - else if(isalienadult(ass)) //Xenos have their own asses, thanks to Pybro. - temp_img = icon('icons/ass/assalien.png') - else if(issilicon(ass)) - temp_img = icon('icons/ass/assmachine.png') - else if(isdrone(ass)) //Drones are hot - temp_img = icon('icons/ass/assdrone.png') - + var/butt_icon_state = ass.get_butt_sprite() + if(isnull(butt_icon_state)) + return null + var/icon/temp_img = icon('icons/mob/butts.dmi', butt_icon_state) var/obj/item/photo/copied_ass = new /obj/item/photo(src) var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img) toEmbed.psize_x = 128 @@ -606,7 +595,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) else user.visible_message(span_warning("[user] starts putting [target] onto the photocopier!"), span_notice("You start putting [target] onto the photocopier...")) - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, target = src)) if(!target || QDELETED(target) || QDELETED(src) || !Adjacent(target)) //check if the photocopier/target still exists. return @@ -629,7 +618,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) * Returns FALSE if `ass` doesn't exist or is not at the copier's location. Returns TRUE otherwise. */ /obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. - if(!ass) + if(!isliving(ass)) return FALSE if(ass.loc != loc) ass = null diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index 56b7343995a..5c849f4a530 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -156,7 +156,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) machine.increment() if(isnull(machine.current_ticket)) to_chat(activator, span_notice("The button light indicates that there are no more tickets to be processed.")) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 1 SECONDS) /obj/machinery/ticket_machine/update_icon() . = ..() @@ -187,7 +187,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) to_chat(user, span_notice("[src] refuses [I]! There [max_number - ticket_number == 1 ? "is" : "are"] still [max_number - ticket_number] ticket\s left!")) return to_chat(user, span_notice("You start to refill [src]'s ticket holder (doing this will reset its ticket count!).")) - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) to_chat(user, span_notice("You insert [I] into [src] as it whirs nondescriptly.")) qdel(I) ticket_number = 0 diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 4bdb1c4d93a..0d5f37cb867 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -10,8 +10,8 @@ worn_icon_state = "camera" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = OVERLAY_LIGHT //Used as a flash here. - light_range = 8 + light_system = OVERLAY_LIGHT_DIRECTIONAL //Used as a flash here. + light_range = 6 light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER light_on = FALSE diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index 4fbe3e034d8..9efde283e07 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -173,18 +173,15 @@ if(framed) . += framed -/obj/structure/sign/picture_frame/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/obj/item/wallframe/picture/F = new /obj/item/wallframe/picture(loc) - if(framed) - F.displayed = framed - set_and_save_framed(null) - if(contents.len) - var/obj/item/I = pick(contents) - I.forceMove(F) - F.update_appearance() - qdel(src) - +/obj/structure/sign/picture_frame/atom_deconstruct(disassembled = TRUE) + var/obj/item/wallframe/picture/showcase = new /obj/item/wallframe/picture(loc) + if(framed) + showcase.displayed = framed + set_and_save_framed(null) + if(contents.len) + var/obj/item/I = pick(contents) + I.forceMove(showcase) + showcase.update_appearance() /obj/structure/sign/picture_frame/showroom name = "distinguished crew display" diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index dcfa5faac5c..418df177465 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -36,7 +36,7 @@ /obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) to_chat(user, span_notice("You start furiously plunging [name].")) - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) to_chat(user, span_notice("You finish plunging the [name].")) reagents.expose(get_turf(src), TOUCH) //splash on the floor reagents.clear_reagents() diff --git a/code/modules/plumbing/plumbers/acclimator.dm b/code/modules/plumbing/plumbers/acclimator.dm index 850ebaaa3ed..79b525d3504 100644 --- a/code/modules/plumbing/plumbers/acclimator.dm +++ b/code/modules/plumbing/plumbers/acclimator.dm @@ -55,7 +55,7 @@ if(!emptying) //suspend heating/cooling during emptying phase reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * HEATER_COEFFICIENT * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater reagents.handle_reactions() - use_power(active_power_usage * seconds_per_tick) + use_energy(active_power_usage * seconds_per_tick) else if(acclimate_state != NEUTRAL) acclimate_state = NEUTRAL update_appearance() diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index 8e0158b61da..1acbed37a74 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -80,7 +80,7 @@ ///see if machine has enough to fill, is anchored down and has any inputspot objects to pick from if(reagents.total_volume >= wanted_amount && anchored && length(inputspot.contents)) - use_power(active_power_usage * seconds_per_tick) + use_energy(active_power_usage * seconds_per_tick) var/obj/AM = pick(inputspot.contents)///pick a reagent_container that could be used //allowed containers var/static/list/allowed_containers = list( diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm index de03f03aa0f..5f81e24eaf2 100644 --- a/code/modules/plumbing/plumbers/destroyer.dm +++ b/code/modules/plumbing/plumbers/destroyer.dm @@ -18,8 +18,8 @@ if(reagents.total_volume) if(icon_state != initial(icon_state) + "_working") //threw it here instead of update icon since it only has two states icon_state = initial(icon_state) + "_working" - reagents.remove_any(disposal_rate * seconds_per_tick) - use_power(active_power_usage * seconds_per_tick) + reagents.remove_all(disposal_rate * seconds_per_tick) + use_energy(active_power_usage * seconds_per_tick) else if(icon_state != initial(icon_state)) icon_state = initial(icon_state) diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm index 0fd631ca457..8800029779d 100644 --- a/code/modules/plumbing/plumbers/fermenter.dm +++ b/code/modules/plumbing/plumbers/fermenter.dm @@ -47,5 +47,5 @@ if(G.distill_reagent) var/amount = G.seed.potency * 0.25 reagents.add_reagent(G.distill_reagent, amount) - use_power(active_power_usage * amount) + use_energy(active_power_usage * amount) qdel(G) diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index e70977bc1f4..ae356fef089 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -57,7 +57,7 @@ var/obj/item/I = AM var/result if(I.grind_results || I.juice_typepath) - use_power(active_power_usage) + use_energy(active_power_usage) if(I.grind_results) result = I.grind(reagents, usr) else if (I.juice_typepath) diff --git a/code/modules/plumbing/plumbers/iv_drip.dm b/code/modules/plumbing/plumbers/iv_drip.dm index bbdb80f57b1..7275212ee76 100644 --- a/code/modules/plumbing/plumbers/iv_drip.dm +++ b/code/modules/plumbing/plumbers/iv_drip.dm @@ -24,7 +24,7 @@ /obj/machinery/iv_drip/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) to_chat(user, span_notice("You start furiously plunging [name].")) - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) to_chat(user, span_notice("You finish plunging the [name].")) reagents.expose(get_turf(src), TOUCH) //splash on the floor reagents.clear_reagents() diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index 6c309b525b9..5761474a959 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -115,7 +115,7 @@ stored_products -= AM AM.forceMove(drop_location()) - use_power(active_power_usage * seconds_per_tick) + use_energy(active_power_usage * seconds_per_tick) /obj/machinery/plumbing/pill_press/ui_assets(mob/user) return list( diff --git a/code/modules/plumbing/plumbers/plumbing_buffer.dm b/code/modules/plumbing/plumbers/plumbing_buffer.dm index 7b3ef306d04..06aad506ff0 100644 --- a/code/modules/plumbing/plumbers/plumbing_buffer.dm +++ b/code/modules/plumbing/plumbers/plumbing_buffer.dm @@ -68,7 +68,7 @@ neighbour.attempt_connect() //technically this would runtime if you made about 200~ buffers add_overlay(icon_state + "_alert") - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, cut_overlay), icon_state + "_alert"), 20) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, cut_overlay), icon_state + "_alert"), 2 SECONDS) /obj/machinery/plumbing/buffer/attack_hand_secondary(mob/user, modifiers) . = ..() diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 2b56bfb4ae6..72caa603767 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -64,7 +64,7 @@ //full power for doing reactions power_usage *= 2 - use_power(power_usage * seconds_per_tick) + use_energy(power_usage * seconds_per_tick) ///For subtypes that want to do additional reagent handling /obj/machinery/plumbing/reaction_chamber/proc/handle_reagents(seconds_per_tick) @@ -198,7 +198,7 @@ return //some power for accurate ph balancing & keep track of attempts made - use_power(active_power_usage * 0.03 * buffer_amount) + use_energy(active_power_usage * 0.03 * buffer_amount) /obj/machinery/plumbing/reaction_chamber/chem/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm index 0e9cb0c1b11..d7a5d83a251 100644 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -57,7 +57,7 @@ return reagents.add_reagent(reagent_id, amount) - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/plumbing/synthesizer/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -114,7 +114,7 @@ /obj/machinery/plumbing/synthesizer/update_overlays() . = ..() var/mutable_appearance/r_overlay = mutable_appearance(icon, "[icon_state]_overlay") - r_overlay.color = reagent_id ? initial(reagent_id.color) : "#FFFFFF" + r_overlay.color = reagent_id ? initial(reagent_id.color) : COLOR_WHITE . += r_overlay /obj/machinery/plumbing/synthesizer/soda diff --git a/code/modules/plumbing/plumbers/teleporter.dm b/code/modules/plumbing/plumbers/teleporter.dm index 7bb098eae4e..e1aa26532dc 100644 --- a/code/modules/plumbing/plumbers/teleporter.dm +++ b/code/modules/plumbing/plumbers/teleporter.dm @@ -95,7 +95,7 @@ next_index++ - use_power(active_power_usage * seconds_per_tick) + use_energy(active_power_usage * seconds_per_tick) ///Notify all senders to forget us /obj/machinery/plumbing/receiver/proc/lose_senders() diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index 509eb4f05b9..b57f3465f0d 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -1,184 +1,3 @@ -/obj/machinery/power/apc/attackby(obj/item/attacking_object, mob/living/user, params) - if(HAS_TRAIT(attacking_object, TRAIT_APC_SHOCKING)) - var/metal = 0 - var/shock_source = null - metal += LAZYACCESS(attacking_object.custom_materials, GET_MATERIAL_REF(/datum/material/iron))//This prevents wooden rolling pins from shocking the user - - if(cell || terminal) //The mob gets shocked by whichever powersource has the most electricity - if(cell && terminal) - shock_source = cell.charge > terminal.powernet.avail ? cell : terminal.powernet - else - shock_source = terminal?.powernet || cell - - if(shock_source && metal && (panel_open || opened)) //Now you're cooking with electricity - if(!electrocute_mob(user, shock_source, src, siemens_coeff = 1, dist_check = TRUE))//People with insulated gloves just attack the APC normally. They're just short of magical anyway - return - do_sparks(5, TRUE, src) - user.visible_message(span_notice("[user.name] shoves [attacking_object] into the internal components of [src], erupting into a cascade of sparks!")) - if(shock_source == cell)//If the shock is coming from the cell just fully discharge it, because it's funny - cell.use(cell.charge) - return - - if(issilicon(user) && get_dist(src,user) > 1) - return attack_hand(user) - - if(istype(attacking_object, /obj/item/stock_parts/cell) && opened) - if(cell) - balloon_alert(user, "cell already installed!") - return - if(machine_stat & MAINT) - balloon_alert(user, "no connector for a cell!") - return - if(!user.transferItemToLoc(attacking_object, src)) - return - cell = attacking_object - user.visible_message(span_notice("[user.name] inserts the power cell to [src.name]!")) - balloon_alert(user, "cell inserted") - chargecount = 0 - update_appearance() - return - - if(attacking_object.GetID()) - togglelock(user) - return - - if(istype(attacking_object, /obj/item/stack/cable_coil) && opened) - var/turf/host_turf = get_turf(src) - if(!host_turf) - CRASH("attackby on APC when it's not on a turf") - if(host_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) - balloon_alert(user, "remove the floor plating!") - return - if(terminal) - balloon_alert(user, "already wired!") - return - if(!has_electronics) - balloon_alert(user, "no board to wire!") - return - - var/obj/item/stack/cable_coil/installing_cable = attacking_object - if(installing_cable.get_amount() < 10) - balloon_alert(user, "need ten lengths of cable!") - return - - var/terminal_cable_layer = cable_layer // Default to machine's cable layer - if(LAZYACCESS(params2list(params), RIGHT_CLICK)) - var/choice = tgui_input_list(user, "Select Power Input Cable Layer", "Select Cable Layer", GLOB.cable_name_to_layer) - if(isnull(choice)) - return - terminal_cable_layer = GLOB.cable_name_to_layer[choice] - - user.visible_message(span_notice("[user.name] adds cables to the APC frame.")) - balloon_alert(user, "adding cables to the frame...") - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - - if(!do_after(user, 20, target = src)) - return - if(installing_cable.get_amount() < 10 || !installing_cable) - return - if(terminal || !opened || !has_electronics) - return - var/turf/our_turf = get_turf(src) - var/obj/structure/cable/cable_node = our_turf.get_cable_node(terminal_cable_layer) - if(prob(50) && electrocute_mob(usr, cable_node, cable_node, 1, TRUE)) - do_sparks(5, TRUE, src) - return - installing_cable.use(10) - balloon_alert(user, "cables added to the frame") - make_terminal(terminal_cable_layer) - terminal.connect_to_network() - return - - if(istype(attacking_object, /obj/item/electronics/apc) && opened) - if(has_electronics) - balloon_alert(user, "there is already a board!") - return - - if(machine_stat & BROKEN) - balloon_alert(user, "the frame is damaged!") - return - - user.visible_message(span_notice("[user.name] inserts the power control board into [src].")) - balloon_alert(user, "you start to insert the board...") - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - - if(!do_after(user, 10, target = src) || has_electronics) - return - - has_electronics = APC_ELECTRONICS_INSTALLED - locked = FALSE - balloon_alert(user, "board installed") - qdel(attacking_object) - return - - if(istype(attacking_object, /obj/item/electroadaptive_pseudocircuit) && opened) - var/obj/item/electroadaptive_pseudocircuit/pseudocircuit = attacking_object - if(!has_electronics) - if(machine_stat & BROKEN) - balloon_alert(user, "frame is too damaged!") - return - if(!pseudocircuit.adapt_circuit(user, 50)) - return - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt a power control board and click it into place in [src]'s guts.")) - has_electronics = APC_ELECTRONICS_INSTALLED - locked = FALSE - return - - if(!cell) - if(machine_stat & MAINT) - balloon_alert(user, "no board for a cell!") - return - if(!pseudocircuit.adapt_circuit(user, 500)) - return - var/obj/item/stock_parts/cell/crap/empty/bad_cell = new(src) - bad_cell.forceMove(src) - cell = bad_cell - chargecount = 0 - user.visible_message(span_notice("[user] fabricates a weak power cell and places it into [src]."), \ - span_warning("Your [pseudocircuit.name] whirrs with strain as you create a weak power cell and place it into [src]!")) - update_appearance() - return - - balloon_alert(user, "has both board and cell!") - return - - if(istype(attacking_object, /obj/item/wallframe/apc) && opened) - if(!(machine_stat & BROKEN || opened == APC_COVER_REMOVED || atom_integrity < max_integrity)) // There is nothing to repair - balloon_alert(user, "no reason for repairs!") - return - if((machine_stat & BROKEN) && opened == APC_COVER_REMOVED && has_electronics && terminal) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover - user.visible_message(span_notice("[user.name] replaces missing APC's cover.")) - balloon_alert(user, "replacing APC's cover...") - if(do_after(user, 20, target = src)) // replacing cover is quicker than replacing whole frame - balloon_alert(user, "cover replaced") - qdel(attacking_object) - update_integrity(30) //needs to be welded to fully repair but can work without - set_machine_stat(machine_stat & ~(BROKEN|MAINT)) - opened = APC_COVER_OPENED - update_appearance() - return - if(has_electronics) - balloon_alert(user, "remove the board inside!") - return - user.visible_message(span_notice("[user.name] replaces the damaged APC frame with a new one.")) - balloon_alert(user, "replacing damaged frame...") - if(do_after(user, 50, target = src)) - balloon_alert(user, "replaced frame") - qdel(attacking_object) - set_machine_stat(machine_stat & ~BROKEN) - atom_integrity = max_integrity - if(opened == APC_COVER_REMOVED) - opened = APC_COVER_OPENED - update_appearance() - return - - if(panel_open && !opened && is_wire_tool(attacking_object)) - wires.interact(user) - return - - return ..() - /obj/machinery/power/apc/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(!can_interact(user)) @@ -192,7 +11,7 @@ if(!istype(maybe_ethereal_stomach)) togglelock(user) else - if(maybe_ethereal_stomach.crystal_charge >= ETHEREAL_CHARGE_NORMAL) + if(maybe_ethereal_stomach.cell.charge() >= ETHEREAL_CHARGE_NORMAL) togglelock(user) ethereal_interact(user, modifiers) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -210,19 +29,20 @@ return var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - APC_POWER_GAIN var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach + var/obj/item/stock_parts/cell/stomach_cell = stomach.cell if(!((stomach?.drain_time < world.time) && LAZYACCESS(modifiers, RIGHT_CLICK))) return if(ethereal.combat_mode) if(cell.charge <= (cell.maxcharge / 2)) // ethereals can't drain APCs under half charge, this is so that they are forced to look to alternative power sources if the station is running low addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, balloon_alert), ethereal, "safeties prevent draining!"), alert_timer_duration) return - if(stomach.crystal_charge > charge_limit) + if(stomach_cell.charge() > charge_limit) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, balloon_alert), ethereal, "charge is full!"), alert_timer_duration) return stomach.drain_time = world.time + APC_DRAIN_TIME addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, balloon_alert), ethereal, "draining power"), alert_timer_duration) - if(do_after(user, APC_DRAIN_TIME, target = src)) - if(cell.charge <= (cell.maxcharge / 2) || (stomach.crystal_charge > charge_limit)) + while(do_after(user, APC_DRAIN_TIME, target = src)) + if(cell.charge <= (cell.maxcharge / 2) || (stomach_cell.charge() > charge_limit)) return balloon_alert(ethereal, "received charge") stomach.adjust_charge(APC_POWER_GAIN) @@ -232,20 +52,20 @@ if(cell.charge >= cell.maxcharge - APC_POWER_GAIN) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, balloon_alert), ethereal, "APC can't receive more power!"), alert_timer_duration) return - if(stomach.crystal_charge < APC_POWER_GAIN) + if(stomach_cell.charge() < APC_POWER_GAIN) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, balloon_alert), ethereal, "charge is too low!"), alert_timer_duration) return stomach.drain_time = world.time + APC_DRAIN_TIME addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, balloon_alert), ethereal, "transfering power"), alert_timer_duration) if(!do_after(user, APC_DRAIN_TIME, target = src)) return - if((cell.charge >= (cell.maxcharge - APC_POWER_GAIN)) || (stomach.crystal_charge < APC_POWER_GAIN)) + if((cell.charge >= (cell.maxcharge - APC_POWER_GAIN)) || (stomach_cell.charge() < APC_POWER_GAIN)) balloon_alert(ethereal, "can't transfer power!") return if(istype(stomach)) - balloon_alert(ethereal, "transferred power") - stomach.adjust_charge(-APC_POWER_GAIN) - cell.give(APC_POWER_GAIN) + while(do_after(user, APC_DRAIN_TIME, target = src)) + balloon_alert(ethereal, "transferred power") + cell.give(-stomach.adjust_charge(-APC_POWER_GAIN)) else balloon_alert(ethereal, "can't transfer power!") @@ -288,7 +108,7 @@ /obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic() if(isAdminGhostAI(user)) return TRUE - if(!user.has_unlimited_silicon_privilege) + if(!HAS_SILICON_ACCESS(user)) return TRUE var/mob/living/silicon/ai/AI = user var/mob/living/silicon/robot/robot = user diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 6960e6da599..3dd2df590e1 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -17,6 +17,7 @@ damage_deflection = 10 resistance_flags = FIRE_PROOF interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON + processing_flags = START_PROCESSING_MANUALLY ///Range of the light emitted when on var/light_on_range = 1.5 @@ -46,8 +47,6 @@ var/charging = APC_NOT_CHARGING ///Can the APC charge? var/chargemode = TRUE - ///Number of ticks where the apc is trying to recharge - var/chargecount = 0 ///Is the apc interface locked? var/locked = TRUE ///Is the apc cover locked? @@ -140,6 +139,12 @@ /obj/machinery/power/apc/Initialize(mapload, ndir) . = ..() + //APCs get added to their own processing tasks for the machines subsystem. + if (!(datum_flags & DF_ISPROCESSING)) + datum_flags |= DF_ISPROCESSING + SSmachines.apc_early_processing += src + SSmachines.apc_late_processing += src + //Pixel offset its appearance based on its direction dir = ndir switch(dir) @@ -203,8 +208,9 @@ //Make the apc visually interactive register_context() - addtimer(CALLBACK(src, PROC_REF(update)), 5) + addtimer(CALLBACK(src, PROC_REF(update)), 0.5 SECONDS) RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) update_appearance() var/static/list/hovering_mob_typechecks = list( @@ -235,6 +241,11 @@ disconnect_terminal() return ..() +/obj/machinery/power/apc/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + energy_fail(disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS + /obj/machinery/power/apc/proc/assign_to_area(area/target_area = get_area(src)) if(area == target_area) return @@ -323,10 +334,11 @@ "powerCellStatus" = cell ? cell.percent() : null, "chargeMode" = chargemode, "chargingStatus" = charging, + "chargingPowerDisplay" = display_power(area.energy_usage[AREA_USAGE_APC_CHARGE]), "totalLoad" = display_power(lastused_total), "coverLocked" = coverlocked, "remoteAccess" = (user == remote_control_user), - "siliconUser" = user.has_unlimited_silicon_privilege, + "siliconUser" = HAS_SILICON_ACCESS(user), "malfStatus" = get_malf_status(user), "emergencyLights" = !emergency_lights, "nightshiftLights" = nightshift_lights, @@ -401,11 +413,11 @@ /obj/machinery/power/apc/ui_act(action, params) . = ..() - if(. || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer && action != "toggle_nightshift")) + if(. || !can_use(usr, 1) || (locked && !HAS_SILICON_ACCESS(usr) && !failure_timer && action != "toggle_nightshift")) return switch(action) if("lock") - if(usr.has_unlimited_silicon_privilege) + if(HAS_SILICON_ACCESS(usr)) if((obj_flags & EMAGGED) || (machine_stat & (BROKEN|MAINT)) || remote_control_user) to_chat(usr, span_warning("The APC does not respond to the command!")) else @@ -442,7 +454,7 @@ update() . = TRUE if("overload") - if(usr.has_unlimited_silicon_privilege) + if(HAS_SILICON_ACCESS(usr)) overload_lighting() . = TRUE if("hack") @@ -475,7 +487,20 @@ if(user == remote_control_user) disconnect_remote_access() -/obj/machinery/power/apc/process() +/** + * APC early processing. This gets processed before any other machine does. + * This adds up the total static power usage for the apc's area, then draw that power usage from the grid or APC cell. + * This is done early so machines that use dynamic power get a more truthful surplus when accessing available energy. + */ +/obj/machinery/power/apc/proc/early_process() + var/total_static_energy_usage = 0 + total_static_energy_usage += APC_CHANNEL_IS_ON(lighting) * area.energy_usage[AREA_USAGE_STATIC_LIGHT] + total_static_energy_usage += APC_CHANNEL_IS_ON(equipment) * area.energy_usage[AREA_USAGE_STATIC_EQUIP] + total_static_energy_usage += APC_CHANNEL_IS_ON(environ) * area.energy_usage[AREA_USAGE_STATIC_ENVIRON] + if(total_static_energy_usage) //Use power from static power users. + draw_energy(total_static_energy_usage) + +/obj/machinery/power/apc/proc/late_process(seconds_per_tick) if(icon_update_needed) update_appearance() if(machine_stat & (BROKEN|MAINT)) @@ -493,13 +518,14 @@ flicker_hacked_icon() //dont use any power from that channel if we shut that power channel off - lastused_light = APC_CHANNEL_IS_ON(lighting) ? area.power_usage[AREA_USAGE_LIGHT] + area.power_usage[AREA_USAGE_STATIC_LIGHT] : 0 - lastused_equip = APC_CHANNEL_IS_ON(equipment) ? area.power_usage[AREA_USAGE_EQUIP] + area.power_usage[AREA_USAGE_STATIC_EQUIP] : 0 - lastused_environ = APC_CHANNEL_IS_ON(environ) ? area.power_usage[AREA_USAGE_ENVIRON] + area.power_usage[AREA_USAGE_STATIC_ENVIRON] : 0 + lastused_light = APC_CHANNEL_IS_ON(lighting) ? area.energy_usage[AREA_USAGE_LIGHT] + area.energy_usage[AREA_USAGE_STATIC_LIGHT] : 0 + lastused_equip = APC_CHANNEL_IS_ON(equipment) ? area.energy_usage[AREA_USAGE_EQUIP] + area.energy_usage[AREA_USAGE_STATIC_EQUIP] : 0 + lastused_environ = APC_CHANNEL_IS_ON(environ) ? area.energy_usage[AREA_USAGE_ENVIRON] + area.energy_usage[AREA_USAGE_STATIC_ENVIRON] : 0 area.clear_usage() lastused_total = lastused_light + lastused_equip + lastused_environ + //store states to update icon if any change var/last_lt = lighting var/last_eq = equipment @@ -510,49 +536,13 @@ if(!avail()) main_status = APC_NO_POWER - else if(excess < 0) + else if(excess <= 0) main_status = APC_LOW_POWER else main_status = APC_HAS_POWER - var/cellused - if(cell && !shorted) - // draw power from cell as before to power the area - cellused = min(cell.charge, lastused_total JOULES) // clamp deduction to a max, amount left in cell - cell.use(cellused) - - if(cell && !shorted) //need to check to make sure the cell is still there since rigged/corrupted cells can randomly explode after use(). - if(excess > lastused_total) // if power excess recharge the cell - // by the same amount just used - cell.give(cellused) - if(cell) //make sure the cell didn't expode and actually used power. - add_load(cellused WATTS) // add the load used to recharge the cell - - - else // no excess, and not enough per-apc - if((cell.charge WATTS + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? - cell.charge = min(cell.maxcharge, cell.charge + excess JOULES) //recharge with what we can - add_load(excess) // so draw what we can from the grid - charging = APC_NOT_CHARGING - - else // not enough power available to run the last tick! - charging = APC_NOT_CHARGING - chargecount = 0 - // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. - equipment = autoset(equipment, AUTOSET_FORCE_OFF) - lighting = autoset(lighting, AUTOSET_FORCE_OFF) - environ = autoset(environ, AUTOSET_FORCE_OFF) - if(cell && !shorted) //need to check to make sure the cell is still there since rigged/corrupted cells can randomly explode after give(). - // set channels depending on how much charge we have left - - // Allow the APC to operate as normal if the cell can charge - if(charging && long_term_power < 10) - long_term_power += 1 - else if(long_term_power > -10) - long_term_power -= 2 - if(cell.charge <= 0) // zero charge, turn all off equipment = autoset(equipment, AUTOSET_FORCE_OFF) lighting = autoset(lighting, AUTOSET_FORCE_OFF) @@ -561,7 +551,7 @@ if(!nightshift_lights || (nightshift_lights && !low_power_nightshift_lights)) low_power_nightshift_lights = TRUE INVOKE_ASYNC(src, PROC_REF(set_nightshift), TRUE) - else if(cell.percent() < 7 && long_term_power < 0) // SKYRAT EDIT CHANGE - orig: 15 + else if(cell.percent() < 7) // SKYRAT EDIT CHANGE - ORIGINAL: cell.percent() < 15 equipment = autoset(equipment, AUTOSET_OFF) lighting = autoset(lighting, AUTOSET_OFF) environ = autoset(environ, AUTOSET_ON) @@ -569,9 +559,9 @@ if(!nightshift_lights || (nightshift_lights && !low_power_nightshift_lights)) low_power_nightshift_lights = TRUE INVOKE_ASYNC(src, PROC_REF(set_nightshift), TRUE) - else if(cell.percent() < 17 && long_term_power < 0) // SKYRAT EDIT CHANGE - orig: 30 - equipment = autoset(equipment, AUTOSET_ON) // SKYRAT EDIT CHANGE - orig: AUTOSET_OFF - lighting = autoset(lighting, AUTOSET_OFF) // SKYRAT EDIT CHANGE - orig: AUTOSET_ON + else if(cell.percent() < 17) // SKYRAT EDIT CHANGE - ORIGINAL: cell.percent() < 30 + equipment = autoset(equipment, AUTOSET_ON) // SKYRAT EDIT CHANGE - ORIGINAL: AUTOSET_OFF + lighting = autoset(lighting, AUTOSET_OFF) // SKYRAT EDIT CHANGE - ORIGINAL: AUTOSET_ON environ = autoset(environ, AUTOSET_ON) alarm_manager.send_alarm(ALARM_POWER) if(!nightshift_lights || (nightshift_lights && !low_power_nightshift_lights)) @@ -588,40 +578,18 @@ if(cell.percent() > 75) alarm_manager.clear_alarm(ALARM_POWER) - + charging = APC_NOT_CHARGING // now trickle-charge the cell - if(chargemode && charging == APC_CHARGING && operating) - if(excess > 0) // check to make sure we have enough to charge - // Max charge is capped to % per second constant - var/ch = min(excess JOULES, cell.maxcharge JOULES) - add_load(ch WATTS) // Removes the power we're taking from the grid - cell.give(ch) // actually recharge the cell - - else - charging = APC_NOT_CHARGING // stop charging - chargecount = 0 + if(chargemode && operating && excess && cell.used_charge()) + // Max charge is capped to % per second constant. + lastused_total += charge_cell(min(cell.chargerate, cell.maxcharge * GLOB.CHARGELEVEL) * seconds_per_tick, cell = cell, grid_only = TRUE, channel = AREA_USAGE_APC_CHARGE) + charging = APC_CHARGING // show cell as fully charged if so if(cell.charge >= cell.maxcharge) cell.charge = cell.maxcharge charging = APC_FULLY_CHARGED - if(chargemode) - if(!charging) - if(excess > cell.maxcharge*GLOB.CHARGELEVEL) - chargecount++ - else - chargecount = 0 - - if(chargecount == 10) - - chargecount = 0 - charging = APC_CHARGING - - else // chargemode off - charging = APC_NOT_CHARGING - chargecount = 0 - // SKYRAT ADDITION START - CLOCK CULT if(integration_cog) var/power_delta = clamp(cell.charge - 50, 0, 50) @@ -629,15 +597,11 @@ cell.charge -= power_delta * (integration_cog.set_up ? 1 : 2) add_load(power_delta * (integration_cog.set_up ? 1 : 2)) // Twice the drained power if not set up yet charging = APC_NOT_CHARGING - chargecount = 0 if(cell.charge <= 50) cell.charge = 0 // SKYRAT ADDITION END - else // no cell, switch everything off - charging = APC_NOT_CHARGING - chargecount = 0 equipment = autoset(equipment, AUTOSET_FORCE_OFF) lighting = autoset(lighting, AUTOSET_FORCE_OFF) environ = autoset(environ, AUTOSET_FORCE_OFF) @@ -672,8 +636,7 @@ /obj/machinery/power/apc/proc/overload_lighting() if(!operating || shorted) return - if(cell && cell.charge >= 20) - cell.use(20) + if(cell && cell.use(20 KILO JOULES)) INVOKE_ASYNC(src, PROC_REF(break_lights)) /obj/machinery/power/apc/proc/break_lights() @@ -736,8 +699,34 @@ /obj/machinery/power/apc/proc/set_full_charge() cell.charge = cell.maxcharge +/// Returns the cell's current charge. +/obj/machinery/power/apc/proc/charge() + return cell.charge + +/// Draws energy from the connected grid. When there isn't enough surplus energy from the grid, draws the rest of the demand from its cell. Returns the energy used. +/obj/machinery/power/apc/proc/draw_energy(amount) + var/grid_used = min(terminal?.surplus(), amount) + terminal?.add_load(grid_used) + var/cell_used = 0 + if(amount > grid_used) + cell_used += cell.use(amount - grid_used, force = TRUE) + return grid_used + cell_used + +/// Draws power from the connected grid. When there isn't enough surplus energy from the grid, draws the rest of the demand from its cell. Returns the energy used. +/obj/machinery/power/apc/proc/draw_power(amount) + return draw_energy(power_to_energy(amount)) + /*Power module, used for APC construction*/ /obj/item/electronics/apc name = "power control module" icon_state = "power_mod" desc = "Heavy-duty switching circuits for power control." + +/// Returns the amount of time it will take the APC at its current trickle charge rate to reach a charge level. If the APC is functionally not charging, returns null. +/obj/machinery/power/apc/proc/time_to_charge(joules) + var/required_joules = joules - charge() + var/trickle_charge_power = energy_to_power(area.energy_usage[AREA_USAGE_APC_CHARGE]) + if(trickle_charge_power >= 1 KILO WATTS) // require at least a bit of charging + return round(energy_to_power(required_joules / trickle_charge_power) * SSmachines.wait + SSmachines.wait, SSmachines.wait) + + return null diff --git a/code/modules/power/apc/apc_malf.dm b/code/modules/power/apc/apc_malf.dm index 62134de146e..dee0d95de4d 100644 --- a/code/modules/power/apc/apc_malf.dm +++ b/code/modules/power/apc/apc_malf.dm @@ -116,7 +116,7 @@ return FALSE to_chat(user, span_notice("AI accepted request. Transferring stored intelligence to [card]...")) to_chat(occupier, span_notice("Transfer starting. You will be moved to [card] shortly.")) - if(!do_after(user, 50, target = src)) + if(!do_after(user, 5 SECONDS, target = src)) to_chat(occupier, span_warning("[user] was interrupted! Transfer canceled.")) transfer_in_progress = FALSE return FALSE diff --git a/code/modules/power/apc/apc_power_proc.dm b/code/modules/power/apc/apc_power_proc.dm index 52a671f00f5..ba60ec723b6 100644 --- a/code/modules/power/apc/apc_power_proc.dm +++ b/code/modules/power/apc/apc_power_proc.dm @@ -50,20 +50,27 @@ update() update_appearance() +/// Returns the surplus energy from the terminal's grid. /obj/machinery/power/apc/surplus() if(terminal) return terminal.surplus() return 0 +/// Adds load (energy) to the terminal's grid. /obj/machinery/power/apc/add_load(amount) if(terminal?.powernet) terminal.add_load(amount) +/// Returns the amount of energy the terminal's grid has. /obj/machinery/power/apc/avail(amount) if(terminal) return terminal.avail(amount) return 0 +/// Returns the surplus energy from the terminal's grid and the cell. +/obj/machinery/power/apc/available_energy() + return charge() + surplus() + /** * Returns the new status value for an APC channel. * diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index e712f474464..00d3fc7a538 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -1,4 +1,225 @@ //attack with an item - open/close cover, insert cell, or (un)lock interface + +/obj/machinery/power/apc/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + . = ..() + if(.) + return . + + if(HAS_TRAIT(tool, TRAIT_APC_SHOCKING)) + . = fork_outlet_act(user, tool) + if(.) + return . + + if(tool.GetID()) + togglelock(user) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/stock_parts/cell)) + . = cell_act(user, tool) + else if(istype(tool, /obj/item/stack/cable_coil)) + . = cable_act(user, tool, is_right_clicking) + else if(istype(tool, /obj/item/electronics/apc)) + . = electronics_act(user, tool) + else if(istype(tool, /obj/item/electroadaptive_pseudocircuit)) + . = pseudocircuit_act(user, tool) + else if(istype(tool, /obj/item/wallframe/apc)) + . = wallframe_act(user, tool) + if(.) + return . + + if(panel_open && !opened && is_wire_tool(tool)) + wires.interact(user) + return ITEM_INTERACT_SUCCESS + + return . + +/// Called when we interact with the APC with an item with which we can get shocked when we stuff it into an APC +/obj/machinery/power/apc/proc/fork_outlet_act(mob/living/user, obj/item/tool) + var/metal = 0 + var/shock_source = null + metal += LAZYACCESS(tool.custom_materials, GET_MATERIAL_REF(/datum/material/iron))//This prevents wooden rolling pins from shocking the user + + if(cell || terminal) //The mob gets shocked by whichever powersource has the most electricity + if(cell && terminal) + shock_source = cell.charge > terminal.powernet.avail ? cell : terminal.powernet + else + shock_source = terminal?.powernet || cell + + if(shock_source && metal && (panel_open || opened)) //Now you're cooking with electricity + if(!electrocute_mob(user, shock_source, src, siemens_coeff = 1, dist_check = TRUE))//People with insulated gloves just attack the APC normally. They're just short of magical anyway + return NONE + do_sparks(5, TRUE, src) + user.visible_message(span_notice("[user.name] shoves [tool] into the internal components of [src], erupting into a cascade of sparks!")) + if(shock_source == cell)//If the shock is coming from the cell just fully discharge it, because it's funny + cell.use(cell.charge) + return ITEM_INTERACT_SUCCESS + +/// Called when we interact with the APC with a cell, attempts to insert it +/obj/machinery/power/apc/proc/cell_act(mob/living/user, obj/item/stock_parts/cell/new_cell) + if(!opened) + return NONE + + if(cell) + balloon_alert(user, "cell already installed!") + return ITEM_INTERACT_BLOCKING + if(machine_stat & MAINT) + balloon_alert(user, "no connector for a cell!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(new_cell, src)) + return ITEM_INTERACT_BLOCKING + cell = new_cell + user.visible_message(span_notice("[user.name] inserts the power cell to [src.name]!")) + balloon_alert(user, "cell inserted") + update_appearance() + return ITEM_INTERACT_SUCCESS + +/// Called when we interact with the APC with a cable, attempts to wire the APC and create a terminal +/obj/machinery/power/apc/proc/cable_act(mob/living/user, obj/item/stack/cable_coil/installing_cable, is_right_clicking) + if(!opened) + return NONE + + var/turf/host_turf = get_turf(src) + if(!host_turf) + CRASH("cable_act on APC when it's not on a turf") + if(host_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) + balloon_alert(user, "remove the floor plating!") + return ITEM_INTERACT_BLOCKING + if(terminal) + balloon_alert(user, "already wired!") + return ITEM_INTERACT_BLOCKING + if(!has_electronics) + balloon_alert(user, "no board to wire!") + return ITEM_INTERACT_BLOCKING + + if(installing_cable.get_amount() < 10) + balloon_alert(user, "need ten lengths of cable!") + return ITEM_INTERACT_BLOCKING + + var/terminal_cable_layer = cable_layer // Default to machine's cable layer + if(is_right_clicking) + var/choice = tgui_input_list(user, "Select Power Input Cable Layer", "Select Cable Layer", GLOB.cable_name_to_layer) + if(isnull(choice)) + return ITEM_INTERACT_BLOCKING + terminal_cable_layer = GLOB.cable_name_to_layer[choice] + + user.visible_message(span_notice("[user.name] adds cables to the APC frame.")) + balloon_alert(user, "adding cables to the frame...") + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + + if(!do_after(user, 2 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + if(installing_cable.get_amount() < 10 || !installing_cable) + return ITEM_INTERACT_BLOCKING + if(terminal || !opened || !has_electronics) + return ITEM_INTERACT_BLOCKING + var/turf/our_turf = get_turf(src) + var/obj/structure/cable/cable_node = our_turf.get_cable_node(terminal_cable_layer) + if(prob(50) && electrocute_mob(usr, cable_node, cable_node, 1, TRUE)) + do_sparks(5, TRUE, src) + return ITEM_INTERACT_BLOCKING + installing_cable.use(10) + balloon_alert(user, "cables added to the frame") + make_terminal(terminal_cable_layer) + terminal.connect_to_network() + return ITEM_INTERACT_SUCCESS + +/// Called when we interact with the APC with APC electronics, attempts to install the board +/obj/machinery/power/apc/proc/electronics_act(mob/living/user, obj/item/electronics/apc/installing_board) + if(!opened) + return NONE + + if(has_electronics) + balloon_alert(user, "there is already a board!") + return ITEM_INTERACT_BLOCKING + + if(machine_stat & BROKEN) + balloon_alert(user, "the frame is damaged!") + return ITEM_INTERACT_BLOCKING + + user.visible_message(span_notice("[user.name] inserts the power control board into [src].")) + balloon_alert(user, "inserting the board...") + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + + if(!do_after(user, 1 SECONDS, target = src) || has_electronics) + return ITEM_INTERACT_BLOCKING + + has_electronics = APC_ELECTRONICS_INSTALLED + locked = FALSE + balloon_alert(user, "board installed") + qdel(installing_board) + return ITEM_INTERACT_SUCCESS + +/// Called when we interact with the APC with an electroadaptive pseudocircuit, used by cyborgs to install a board or weak cell +/obj/machinery/power/apc/proc/pseudocircuit_act(mob/living/user, obj/item/electroadaptive_pseudocircuit/pseudocircuit) + if(!has_electronics) + if(machine_stat & BROKEN) + balloon_alert(user, "frame is too damaged!") + return ITEM_INTERACT_BLOCKING + if(!pseudocircuit.adapt_circuit(user, circuit_cost = 50 KILO JOULES)) + return ITEM_INTERACT_BLOCKING + user.visible_message( + span_notice("[user] fabricates a circuit and places it into [src]."), + span_notice("You adapt a power control board and click it into place in [src]'s guts."), + ) + has_electronics = APC_ELECTRONICS_INSTALLED + locked = FALSE + return ITEM_INTERACT_SUCCESS + + if(!cell) + if(machine_stat & MAINT) + balloon_alert(user, "no board for a cell!") + return ITEM_INTERACT_BLOCKING + if(!pseudocircuit.adapt_circuit(user, circuit_cost = 500 KILO JOULES)) + return ITEM_INTERACT_BLOCKING + var/obj/item/stock_parts/cell/crap/empty/bad_cell = new(src) + bad_cell.forceMove(src) + cell = bad_cell + user.visible_message( + span_notice("[user] fabricates a weak power cell and places it into [src]."), + span_warning("Your [pseudocircuit.name] whirrs with strain as you create a weak power cell and place it into [src]!"), + ) + update_appearance() + return ITEM_INTERACT_SUCCESS + + balloon_alert(user, "has both board and cell!") + return ITEM_INTERACT_BLOCKING + +/// Called when we interact with the APC with and APC frame, used for replacing a damaged cover/frame +/obj/machinery/power/apc/proc/wallframe_act(mob/living/user, obj/item/wallframe/apc/wallframe) + if(!opened) + return NONE + + if(!(machine_stat & BROKEN || opened == APC_COVER_REMOVED || atom_integrity < max_integrity)) // There is nothing to repair + balloon_alert(user, "no reason for repairs!") + return ITEM_INTERACT_BLOCKING + if((machine_stat & BROKEN) && opened == APC_COVER_REMOVED && has_electronics && terminal) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover + user.visible_message(span_notice("[user.name] replaces missing APC's cover.")) + balloon_alert(user, "replacing APC's cover...") + if(!do_after(user, 2 SECONDS, target = src)) // replacing cover is quicker than replacing whole frame + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "cover replaced") + qdel(wallframe) + update_integrity(30) //needs to be welded to fully repair but can work without + set_machine_stat(machine_stat & ~(BROKEN|MAINT)) + opened = APC_COVER_OPENED + update_appearance() + return ITEM_INTERACT_SUCCESS + if(has_electronics) + balloon_alert(user, "remove the board inside!") + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user.name] replaces the damaged APC frame with a new one.")) + balloon_alert(user, "replacing damaged frame...") + if(!do_after(user, 5 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "replaced frame") + qdel(wallframe) + set_machine_stat(machine_stat & ~BROKEN) + atom_integrity = max_integrity + if(opened == APC_COVER_REMOVED) + opened = APC_COVER_OPENED + update_appearance() + return ITEM_INTERACT_SUCCESS + /obj/machinery/power/apc/crowbar_act(mob/user, obj/item/crowbar) . = TRUE @@ -193,7 +414,6 @@ var/obj/item/stock_parts/cell/crap/empty/C = new(src) C.forceMove(src) cell = C - chargecount = 0 balloon_alert(user, "power cell installed") update_appearance() return TRUE @@ -239,7 +459,7 @@ environ = APC_CHANNEL_OFF update_appearance() update() - addtimer(CALLBACK(src, PROC_REF(reset), APC_RESET_EMP), 600) + addtimer(CALLBACK(src, PROC_REF(reset), APC_RESET_EMP), 60 SECONDS) /obj/machinery/power/apc/proc/togglelock(mob/living/user) if(obj_flags & EMAGGED) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 34a0140e311..fd5752fea68 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -141,11 +141,9 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri return ..() // then go ahead and delete the cable -/obj/structure/cable/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/obj/item/stack/cable_coil/cable = new(drop_location(), 1) - cable.set_cable_color(cable_color) - qdel(src) +/obj/structure/cable/atom_deconstruct(disassembled = TRUE) + var/obj/item/stack/cable_coil/cable = new(drop_location(), 1) + cable.set_cable_color(cable_color) /////////////////////////////////// // General procedures @@ -576,7 +574,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri if(user == H) user.visible_message(span_notice("[user] starts to fix some of the wires in [H]'s [affecting.name]."), span_notice("You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [affecting.name].")) /* SKYRAT EDIT START - ORIGINAL: - if(!do_after(user, 50, H)) + if(!do_after(user, 5 SECONDS, H)) return */ // SKYRAT EDIT CHANGE START @@ -637,6 +635,9 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/item/stack/cable_coil/five amount = 5 +/obj/item/stack/cable_coil/thirty + amount = 30 + /obj/item/stack/cable_coil/cut amount = null icon_state = "coil2" diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 842772ed0b9..00b332e6608 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -1,6 +1,6 @@ #define CELL_DRAIN_TIME 35 -#define CELL_POWER_GAIN 60 -#define CELL_POWER_DRAIN 750 +#define CELL_POWER_GAIN (0.06 * STANDARD_CELL_CHARGE) +#define CELL_POWER_DRAIN (0.75 * STANDARD_CELL_CHARGE) /** * # Power cell @@ -30,8 +30,8 @@ var/rigged = FALSE ///If the power cell was damaged by an explosion, chance for it to become corrupted and function the same as rigged. var/corrupted = FALSE - ///how much power is given every tick in a recharger - var/chargerate = STANDARD_CELL_CHARGE * 0.1 + ///How much power is given per second in a recharger. + var/chargerate = STANDARD_CELL_CHARGE * 0.05 ///If true, the cell will state it's maximum charge in it's description var/ratingdesc = TRUE ///If it's a grown that acts as a battery, add a wire overlay to it. @@ -134,32 +134,71 @@ return ..() +/** + * Returns the percentage of the cell's charge. + */ /obj/item/stock_parts/cell/proc/percent() // return % charge of cell return 100 * charge / maxcharge -// use power from a cell -/obj/item/stock_parts/cell/use(used, force) - if(rigged && used > 0) +/** + * Returns the maximum charge of the cell. + */ +/obj/item/stock_parts/cell/proc/max_charge() + return maxcharge + +/** + * Returns the current charge of the cell. + */ +/obj/item/stock_parts/cell/proc/charge() + return charge + +/** + * Returns the amount of charge used on the cell. + */ +/obj/item/stock_parts/cell/proc/used_charge() + return maxcharge - charge + +/// Use power from the cell. +/// Args: +/// - used: Amount of power in joules to use. +/// - force: If true, uses the remaining power from the cell if there isn't enough power to supply the demand. +/// Returns: The power used from the cell in joules. +/obj/item/stock_parts/cell/use(used, force = FALSE) + var/power_used = min(used, charge) + if(rigged && power_used > 0) explode() - return FALSE + return 0 // The cell decided to explode so we won't be able to use it. if(!force && charge < used) - return FALSE - charge = max(charge - used, 0) + return 0 + charge -= power_used if(!istype(loc, /obj/machinery/power/apc)) SSblackbox.record_feedback("tally", "cell_used", 1, type) - return TRUE + return power_used -// recharge the cell +/// Recharge the cell. +/// Args: +/// - amount: The amount of energy to give to the cell in joules. +/// Returns: The power given to the cell in joules. /obj/item/stock_parts/cell/proc/give(amount) - if(rigged && amount > 0) - explode() - return 0 - if(maxcharge < amount) - amount = maxcharge var/power_used = min(maxcharge-charge,amount) charge += power_used + if(rigged && amount > 0) + explode() return power_used +/** + * Changes the charge of the cell. + * Args: + * - amount: The energy to give to the cell (can be negative). + * Returns: The energy that was given to the cell (can be negative). + */ +/obj/item/stock_parts/cell/proc/change(amount) + var/energy_used = clamp(amount, -charge, maxcharge - charge) + charge += energy_used + if(rigged && energy_used) + explode() + return energy_used + /obj/item/stock_parts/cell/examine(mob/user) . = ..() // SKYRAT EDIT ADDITION @@ -188,9 +227,9 @@ /obj/item/stock_parts/cell/proc/explode() if(!charge) return - var/range_devastation = -1 //round(charge/11000) - var/range_heavy = round(sqrt(charge)/60) - var/range_light = round(sqrt(charge)/30) + var/range_devastation = -1 + var/range_heavy = round(sqrt(charge / (3.6 * STANDARD_CELL_CHARGE))) + var/range_light = round(sqrt(charge / (0.9 * STANDARD_CELL_CHARGE))) var/range_flash = range_light if(!range_light) rigged = FALSE @@ -201,7 +240,6 @@ usr?.log_message("triggered a rigged/corrupted power cell explosion", LOG_GAME) usr?.log_message("triggered a rigged/corrupted power cell explosion", LOG_VICTIM, log_globally = FALSE) - //explosion(T, 0, 1, 2, 2) explosion(src, devastation_range = range_devastation, heavy_impact_range = range_heavy, light_impact_range = range_light, flash_range = range_flash) qdel(src) @@ -216,9 +254,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - charge -= 1000 / severity - if (charge < 0) - charge = 0 + use(STANDARD_CELL_CHARGE / severity, force = TRUE) /obj/item/stock_parts/cell/ex_act(severity, target) . = ..() @@ -244,18 +280,19 @@ var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - CELL_POWER_GAIN var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach + var/obj/item/stock_parts/cell/stomach_cell = stomach.cell if((stomach.drain_time > world.time) || !stomach) return if(charge < CELL_POWER_DRAIN) to_chat(H, span_warning("[src] doesn't have enough power!")) return - if(stomach.crystal_charge > charge_limit) + if(stomach_cell.charge() > charge_limit) to_chat(H, span_warning("Your charge is full!")) return to_chat(H, span_notice("You begin clumsily channeling power from [src] into your body.")) stomach.drain_time = world.time + CELL_DRAIN_TIME - if(do_after(user, CELL_DRAIN_TIME, target = src)) - if((charge < CELL_POWER_DRAIN) || (stomach.crystal_charge > charge_limit)) + while(do_after(user, CELL_DRAIN_TIME, target = src)) + if((charge < CELL_POWER_DRAIN) || (stomach_cell.charge() > charge_limit)) return if(istype(stomach)) to_chat(H, span_notice("You receive some charge from [src], wasting some in the process.")) @@ -270,10 +307,7 @@ SSexplosions.high_mov_atom += src /obj/item/stock_parts/cell/proc/get_electrocute_damage() - if(charge >= 1000) - return clamp(20 + round(charge/25000), 20, 195) + rand(-5,5) - else - return 0 + return ELECTROCUTE_DAMAGE(charge / max(0.001 * STANDARD_CELL_CHARGE, 1)) // Wouldn't want it to consider more energy than whatever is actually in the cell if for some strange reason someone set the STANDARD_CELL_CHARGE to below 1kJ. /obj/item/stock_parts/cell/get_part_rating() return maxcharge * 10 + charge @@ -300,7 +334,7 @@ desc = "A power cell with a slightly higher capacity than normal!" maxcharge = STANDARD_CELL_CHARGE * 2.5 custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.5) - chargerate = STANDARD_CELL_CHARGE + chargerate = STANDARD_CELL_CHARGE * 0.5 /obj/item/stock_parts/cell/upgraded/plus name = "upgraded power cell+" @@ -326,7 +360,7 @@ /obj/item/stock_parts/cell/pulse //200 pulse shots name = "pulse rifle power cell" maxcharge = STANDARD_CELL_CHARGE * 40 - chargerate = STANDARD_CELL_CHARGE * 1.5 + chargerate = STANDARD_CELL_CHARGE * 0.75 /obj/item/stock_parts/cell/pulse/carbine //25 pulse shots name = "pulse carbine power cell" @@ -341,14 +375,14 @@ icon_state = "bscell" maxcharge = STANDARD_CELL_CHARGE * 10 custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.6) - chargerate = STANDARD_CELL_CHARGE * 2 + chargerate = STANDARD_CELL_CHARGE /obj/item/stock_parts/cell/high name = "high-capacity power cell" icon_state = "hcell" maxcharge = STANDARD_CELL_CHARGE * 10 custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.6) - chargerate = STANDARD_CELL_CHARGE * 1.5 + chargerate = STANDARD_CELL_CHARGE * 0.75 /obj/item/stock_parts/cell/high/empty empty = TRUE @@ -358,7 +392,7 @@ icon_state = "scell" maxcharge = STANDARD_CELL_CHARGE * 20 custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT * 3) - chargerate = STANDARD_CELL_CHARGE * 2 + chargerate = STANDARD_CELL_CHARGE /obj/item/stock_parts/cell/super/empty empty = TRUE @@ -368,7 +402,7 @@ icon_state = "hpcell" maxcharge = STANDARD_CELL_CHARGE * 30 custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT * 4) - chargerate = STANDARD_CELL_CHARGE * 3 + chargerate = STANDARD_CELL_CHARGE * 1.5 /obj/item/stock_parts/cell/hyper/empty empty = TRUE @@ -379,7 +413,7 @@ icon_state = "bscell" maxcharge = STANDARD_CELL_CHARGE * 40 custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*6) - chargerate = STANDARD_CELL_CHARGE * 4 + chargerate = STANDARD_CELL_CHARGE * 2 /obj/item/stock_parts/cell/bluespace/empty empty = TRUE @@ -392,7 +426,7 @@ chargerate = INFINITY ratingdesc = FALSE -/obj/item/stock_parts/cell/infinite/use(used) +/obj/item/stock_parts/cell/infinite/use(used, force = FALSE) return TRUE /obj/item/stock_parts/cell/infinite/abductor @@ -412,7 +446,6 @@ desc = "A rechargeable starch based power cell." icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "potato" - charge = 100 maxcharge = STANDARD_CELL_CHARGE * 0.3 charge_light_type = null connector_type = null @@ -420,6 +453,10 @@ grown_battery = TRUE //it has the overlays for wires custom_premium_price = PAYCHECK_CREW +/obj/item/stock_parts/cell/potato/Initialize(mapload, override_maxcharge) + charge = maxcharge * 0.3 + . = ..() + /obj/item/stock_parts/cell/emproof name = "\improper EMP-proof cell" desc = "An EMP-proof cell." @@ -449,7 +486,7 @@ name = "beam rifle capacitor" desc = "A high powered capacitor that can provide huge amounts of energy in an instant." maxcharge = STANDARD_CELL_CHARGE * 50 - chargerate = STANDARD_CELL_CHARGE * 5 //Extremely energy intensive + chargerate = STANDARD_CELL_CHARGE * 2.5 //Extremely energy intensive /obj/item/stock_parts/cell/beam_rifle/corrupt() return @@ -488,6 +525,21 @@ /obj/item/stock_parts/cell/inducer_supply maxcharge = STANDARD_CELL_CHARGE * 5 +/obj/item/stock_parts/cell/ethereal + name = "ahelp it" + desc = "you sohuldn't see this" + maxcharge = ETHEREAL_CHARGE_DANGEROUS + charge = ETHEREAL_CHARGE_FULL + icon_state = null + charge_light_type = null + connector_type = null + custom_materials = null + grind_results = null + +/obj/item/stock_parts/cell/ethereal/examine(mob/user) + . = ..() + CRASH("[src.type] got examined by [user]") + #undef CELL_DRAIN_TIME #undef CELL_POWER_GAIN #undef CELL_POWER_DRAIN diff --git a/code/modules/power/energy_accumulator.dm b/code/modules/power/energy_accumulator.dm index 80c76f3916d..b4970014a69 100644 --- a/code/modules/power/energy_accumulator.dm +++ b/code/modules/power/energy_accumulator.dm @@ -1,4 +1,4 @@ -/// (this*100)% of stored power outputted per tick. +/// The coefficient of the proportionate power output. /// Doesn't change output total, lower numbers just increases the smoothing - taking longer to ramp up, and longer to drop away. /// 4% means an accumulator, when starting up for the first time: /// - emits 50% of what is being received after 40 seconds @@ -9,7 +9,9 @@ /// - emits 25% of what was previously being received after 79 seconds /// - emits 10% of what was previously being received after two minutes /// - emits 1% of what was previously being received after four minutes -#define ACCUMULATOR_STORED_OUTPUT 0.04 +#define ACCUMULATOR_PROPORTIONAL_COEFFICIENT 0.04 +/// The coefficient for the constant power output. +#define ACCUMULATOR_CONSTANT_COEFFICIENT 2000 /// Abstract type for generators that accumulate energy over time and slowly release it /// eg. radiation collectors, tesla coils @@ -20,24 +22,45 @@ var/wants_powernet = TRUE ///The amount of energy that is currently inside the machine before being converted to electricity var/stored_energy = 0 + ///The amount of energy that got processed last tick. + var/processed_energy = 0 /obj/machinery/power/energy_accumulator/proc/get_stored_joules() - return energy_to_joules(stored_energy) + return stored_energy -/obj/machinery/power/energy_accumulator/proc/get_power_output() - // Always consume at least 2kJ of energy if we have at least that much stored - return min(stored_energy, (stored_energy*ACCUMULATOR_STORED_OUTPUT)+joules_to_energy(2000)) +/** + * Gets the energy the energy_accumulator would release within the given timespan time. + * The power output is proportional to the energy, and has a constant power output added to it. + * Args: + * - time: The amount of time that is being processed, in seconds. + * Returns: The amount of energy it would release in the timespan. + */ +/obj/machinery/power/energy_accumulator/proc/calculate_energy_output(time = 0) + // dE/dt = -[ACCUMULATOR_PROPORTIONAL_COEFFICIENT] * E - [ACCUMULATOR_CONSTANT_COEFFICIENT] + return min(stored_energy, stored_energy - ((ACCUMULATOR_PROPORTIONAL_COEFFICIENT * stored_energy + ACCUMULATOR_CONSTANT_COEFFICIENT) * NUM_E ** (-ACCUMULATOR_PROPORTIONAL_COEFFICIENT * time) - ACCUMULATOR_CONSTANT_COEFFICIENT) / ACCUMULATOR_PROPORTIONAL_COEFFICIENT) + +/** + * Calculates the power needed to sustain the energy accumulator at its current energy. + */ +/obj/machinery/power/energy_accumulator/proc/calculate_sustainable_power() + return ACCUMULATOR_PROPORTIONAL_COEFFICIENT * stored_energy + ACCUMULATOR_CONSTANT_COEFFICIENT /obj/machinery/power/energy_accumulator/process(seconds_per_tick) - // NB: stored_energy is stored in energy units, a unit of measurement which already includes SSmachines.wait - // Do not multiply by seconds_per_tick here. It is already accounted for by being energy units. - var/power_produced = get_power_output() - release_energy(power_produced) - stored_energy -= power_produced + release_energy(calculate_energy_output(seconds_per_tick)) -/obj/machinery/power/energy_accumulator/proc/release_energy(power_produced) +/** + * Releases joules amount of its stored energy onto the powernet. + * Args: + * - joules: The amount of energy to release. + * Returns: Whether it successfully released its energy or not. + */ +/obj/machinery/power/energy_accumulator/proc/release_energy(joules = 0) if(wants_powernet) - add_avail(power_produced) + add_avail(joules) + stored_energy -= joules + processed_energy = joules + return TRUE + return FALSE /obj/machinery/power/energy_accumulator/should_have_node() return wants_powernet && anchored @@ -53,4 +76,5 @@ return connect_to_network() -#undef ACCUMULATOR_STORED_OUTPUT +#undef ACCUMULATOR_PROPORTIONAL_COEFFICIENT +#undef ACCUMULATOR_CONSTANT_COEFFICIENT diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index d3c5c1de569..38354241f9a 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -247,11 +247,11 @@ if(user) to_chat(user, span_notice("You set [src] to [setting_text].")) -/obj/machinery/power/floodlight/cable_layer_change_checks(mob/living/user, obj/item/tool) +/obj/machinery/power/floodlight/cable_layer_act(mob/living/user, obj/item/tool) if(anchored) balloon_alert(user, "unanchor first!") - return FALSE - return TRUE + return ITEM_INTERACT_BLOCKING + return ..() /obj/machinery/power/floodlight/wrench_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 3125772d267..a7013595543 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -122,6 +122,7 @@ /obj/machinery/light/LateInitialize() . = ..() +#ifndef MAP_TEST switch(fitting) if("tube") if(prob(2)) @@ -129,6 +130,7 @@ if("bulb") if(prob(5)) break_light_tube(TRUE) +#endif update(trigger = FALSE) /obj/machinery/light/Destroy() @@ -332,11 +334,11 @@ if(cell) if(cell.charge == cell.maxcharge && !reagents) //If the cell is done mooching station power, and reagents don't need processing, stop processing return PROCESS_KILL - cell.charge = min(cell.maxcharge, cell.charge + LIGHT_EMERGENCY_POWER_USE) //Recharge emergency power automatically while not using it + charge_cell(LIGHT_EMERGENCY_POWER_USE * seconds_per_tick, cell = cell) //Recharge emergency power automatically while not using it if(reagents) //with most reagents coming out at 300, and with most meaningful reactions coming at 370+, this rate gives a few seconds of time to place it in and get out of dodge regardless of input. reagents.adjust_thermal_energy(8 * reagents.total_volume * SPECIFIC_HEAT_DEFAULT * seconds_per_tick) reagents.handle_reactions() - if(low_power_mode && !use_emergency_power(LIGHT_EMERGENCY_POWER_USE)) + if(low_power_mode && !use_emergency_power(LIGHT_EMERGENCY_POWER_USE * seconds_per_tick)) update(FALSE) //Disables emergency mode and sets the color to normal /obj/machinery/light/proc/burn_out() @@ -520,7 +522,7 @@ if(!has_emergency_power(power_usage_amount)) return FALSE var/obj/item/stock_parts/cell/real_cell = get_cell() - if(real_cell.charge > 300) //it's meant to handle 120 W, ya doofus + if(real_cell.charge > 2.5 * /obj/item/stock_parts/cell/emergency_light::maxcharge) //it's meant to handle 120 W, ya doofus visible_message(span_warning("[src] short-circuits from too powerful of a power cell!")) burn_out() return FALSE diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm index 905ae72c2e3..8b79c33d69b 100644 --- a/code/modules/power/lighting/light_construct.dm +++ b/code/modules/power/lighting/light_construct.dm @@ -162,10 +162,8 @@ if(attacking_blob && attacking_blob.loc == loc) qdel(src) -/obj/structure/light_construct/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, sheets_refunded) - qdel(src) +/obj/structure/light_construct/atom_deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, sheets_refunded) /obj/structure/light_construct/small name = "small light fixture frame" diff --git a/code/modules/power/lighting/light_mapping_helpers.dm b/code/modules/power/lighting/light_mapping_helpers.dm index db11c77fbef..7a025e7f761 100644 --- a/code/modules/power/lighting/light_mapping_helpers.dm +++ b/code/modules/power/lighting/light_mapping_helpers.dm @@ -32,7 +32,7 @@ bulb_power = 0.6 /obj/machinery/light/red - bulb_colour = "#FF3232" + bulb_colour = COLOR_VIVID_RED nightshift_allowed = FALSE no_low_power = TRUE @@ -59,7 +59,7 @@ brightness = 4 nightshift_brightness = 4 fire_brightness = 4.5 - bulb_colour = "#FFD6AA" + bulb_colour = LIGHT_COLOR_TUNGSTEN fire_colour = "#bd3f46" desc = "A small lighting fixture." light_type = /obj/item/light/bulb @@ -77,7 +77,7 @@ brightness = 2.4 /obj/machinery/light/small/red - bulb_colour = "#FF3232" + bulb_colour = COLOR_VIVID_RED no_low_power = TRUE nightshift_allowed = FALSE fire_colour = "#ff1100" diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index 3d4c92d8b19..289b2d46fab 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -61,13 +61,13 @@ var/list/supply = history["supply"] if(connected_powernet) - supply += connected_powernet.viewavail + supply += energy_to_power(connected_powernet.avail) if(supply.len > record_size) supply.Cut(1, 2) var/list/demand = history["demand"] if(connected_powernet) - demand += connected_powernet.viewload + demand += energy_to_power(connected_powernet.load) if(demand.len > record_size) demand.Cut(1, 2) @@ -88,8 +88,8 @@ data["areas"] = list() if(connected_powernet) - data["supply"] = display_power(connected_powernet.viewavail) - data["demand"] = display_power(connected_powernet.viewload) + data["supply"] = display_power(connected_powernet.avail) + data["demand"] = display_power(connected_powernet.load) for(var/obj/machinery/power/terminal/term in connected_powernet.nodes) var/obj/machinery/power/apc/A = term.master if(istype(A)) diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index 2f18bab660a..2a41c70bdfe 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -106,15 +106,13 @@ By design, d1 is the smallest direction and d2 is the highest QDEL_NULL(stored) return ..() // then go ahead and delete the pipe_cleaner -/obj/structure/pipe_cleaner/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/turf/T = get_turf(loc) - if(T) - stored.forceMove(T) - stored = null - else - qdel(stored) - qdel(src) +/obj/structure/pipe_cleaner/atom_deconstruct(disassembled = TRUE) + var/turf/location = get_turf(loc) + if(location) + stored.forceMove(location) + stored = null + else + qdel(stored) /////////////////////////////////// // General procedures diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index b0f80127515..84542805d48 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -66,7 +66,7 @@ TogglePower() return if(powernet) - add_avail(power_gen * power_output) + add_avail(power_to_energy(power_gen * power_output)) UseFuel() else handleInactive() @@ -114,7 +114,7 @@ /obj/machinery/power/port_gen/pacman/examine(mob/user) . = ..() - . += span_notice("The generator has [sheets] units of [sheet_name] fuel left, producing [display_power(power_gen)] per cycle.") + . += span_notice("The generator has [sheets] units of [sheet_name] fuel left, producing [display_power(power_gen)].") if(anchored) . += span_notice("It is anchored to the ground.") @@ -240,8 +240,8 @@ data["anchored"] = anchored data["connected"] = (powernet == null ? 0 : 1) data["ready_to_boot"] = anchored && HasFuel() - data["power_generated"] = display_power(power_gen) - data["power_output"] = display_power(power_gen * power_output) + data["power_generated"] = display_power(power_gen, convert = FALSE) + data["power_output"] = display_power(power_gen * power_output, convert = FALSE) data["power_available"] = (powernet == null ? 0 : display_power(avail())) data["current_heat"] = current_heat . = data diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index f12da549da3..ce912027225 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -30,7 +30,7 @@ /obj/machinery/power/Destroy() disconnect_from_network() - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(update_cable_icons_on_turf), get_turf(src)), 3) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(update_cable_icons_on_turf), get_turf(src)), 0.3 SECONDS) return ..() /////////////////////////////// @@ -55,27 +55,23 @@ . += span_warning("It's disconnected from the [lowertext(GLOB.cable_layer_to_name["[cable_layer]"])].") . += span_notice("It's power line can be changed with a [EXAMINE_HINT("multitool")].") -///does the required checks to see if this machinery layer can be changed -/obj/machinery/power/proc/cable_layer_change_checks(mob/living/user, obj/item/tool) - return can_change_cable_layer - /obj/machinery/power/multitool_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING + if(can_change_cable_layer) + return cable_layer_act(user, tool) - if(!can_change_cable_layer || !cable_layer_change_checks(user, tool)) - return +/obj/machinery/power/multitool_act_secondary(mob/living/user, obj/item/tool) + return multitool_act(user, tool) +/// Called on multitool_act when we can change cable layers, override to add more conditions +/obj/machinery/power/proc/cable_layer_act(mob/living/user, obj/item/tool) var/choice = tgui_input_list(user, "Select Power Line For Operation", "Select Cable Layer", GLOB.cable_name_to_layer) - if(isnull(choice)) - return + if(isnull(choice) || QDELETED(src) || QDELETED(user) || QDELETED(tool) || !user.Adjacent(src) || !user.is_holding(tool)) + return ITEM_INTERACT_BLOCKING cable_layer = GLOB.cable_name_to_layer[choice] balloon_alert(user, "now operating on the [choice]") return ITEM_INTERACT_SUCCESS -/obj/machinery/power/multitool_act_secondary(mob/living/user, obj/item/tool) - return multitool_act(user, tool) - /obj/machinery/power/proc/add_avail(amount) if(powernet) powernet.newavail += amount @@ -132,28 +128,85 @@ return A.powered(chan) // return power status of the area -// increment the power usage stats for an area -/obj/machinery/proc/use_power(amount, chan = power_channel) - amount = max(amount * machine_power_rectifier, 0) // make sure we don't use negative power - var/area/A = get_area(src) // make sure it's in an area - A?.use_power(amount, chan) +/** + * Returns the available energy from the apc's cell and grid that can be used. + * Args: + * - consider_cell: Whether to count the energy from the APC's cell or not. + * Returns: The available energy the machine can access from the APC. + */ +/obj/machinery/proc/available_energy(consider_cell = TRUE) + var/area/home = get_area(src) + + if(isnull(home)) + return FALSE + if(!home.requires_power) + return INFINITY + + var/obj/machinery/power/apc/local_apc = home.apc + if(isnull(local_apc)) + return FALSE + + return consider_cell ? local_apc.available_energy() : local_apc.surplus() /** - * An alternative to 'use_power', this proc directly costs the APC in direct charge, as opposed to being calculated periodically. - * - Amount: How much power the APC's cell is to be costed. + * Draws energy from the APC. Will use excess energy from the APC's connected grid, + * then use energy from the APC's cell if there wasn't enough energy from the grid, unless ignore_apc is true. + * Args: + * - amount: The amount of energy to use. + * - channel: The power channel to use. + * - ignore_apc: If true, do not consider the APC's cell when demanding energy. + * - force: If true and if there isn't enough energy, consume the remaining energy. Returns 0 if false and there isn't enough energy. + * Returns: The amount of energy used. */ -/obj/machinery/proc/directly_use_power(amount) +/obj/machinery/proc/use_energy(amount, channel = power_channel, ignore_apc = FALSE, force = TRUE) + if(amount <= 0) //just in case + return FALSE + var/area/home = get_area(src) + + if(isnull(home)) + return FALSE //apparently space isn't an area + if(!home.requires_power) + return amount //Shuttles get free power, don't ask why + + var/obj/machinery/power/apc/local_apc = home.apc + if(isnull(local_apc)) + return FALSE + + // Surplus from the grid. + var/surplus = local_apc.surplus() + var/grid_used = min(surplus, amount) + var/apc_used = 0 + if((amount > grid_used) && !ignore_apc) // 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. + return FALSE + + // Use the grid's and APC's energy. + amount = grid_used + apc_used + local_apc.add_load(grid_used JOULES) + home.use_energy(amount JOULES, channel) + return amount + +/** + * An alternative to 'use_power', this proc directly costs the APC in direct charge, as opposed to prioritising the grid. + * Args: + * - amount: How much energy the APC's cell is to be costed. + * - force: If true, consumes the remaining energy of the cell if there isn't enough energy to supply the demand. + * Returns: The amount of energy that got used by the cell. + */ +/obj/machinery/proc/directly_use_energy(amount, force = FALSE) var/area/my_area = get_area(src) if(isnull(my_area)) stack_trace("machinery is somehow not in an area, nullspace?") return FALSE if(!my_area.requires_power) - return TRUE + return amount var/obj/machinery/power/apc/my_apc = my_area.apc if(isnull(my_apc)) return FALSE - return my_apc.cell.use(amount) + return my_apc.cell.use(amount, force = force) /** * Attempts to draw power directly from the APC's Powernet rather than the APC's battery. For high-draw machines, like the cell charger @@ -163,7 +216,7 @@ * If the take_any var arg is set to true, this proc will use and return any surplus that is under the requested amount, assuming that * the surplus is above zero. * Args: - * - amount, the amount of power requested from the Powernet. In standard loosely-defined SS13 power units. + * - amount, the amount of power requested from the powernet. In joules. * - take_any, a bool of whether any amount of power is acceptable, instead of all or nothing. Defaults to FALSE */ /obj/machinery/proc/use_power_from_net(amount, take_any = FALSE) @@ -189,6 +242,21 @@ local_apc.add_load(amount) return amount +/** + * Draws power from the apc's powernet and cell to charge a power cell. + * Args: + * - amount: The amount of energy given to the cell. + * - cell: The cell to charge. + * - grid_only: If true, only draw from the grid and ignore the APC's cell. + * - channel: The power channel to use. + * Returns: The amount of energy the cell received. + */ +/obj/machinery/proc/charge_cell(amount, obj/item/stock_parts/cell/cell, grid_only = FALSE, channel = AREA_USAGE_EQUIP) + var/demand = use_energy(min(amount, cell.used_charge()), channel = channel, ignore_apc = grid_only) + var/power_given = cell.give(demand) + return power_given + + /obj/machinery/proc/addStaticPower(value, powerchannel) var/area/A = get_area(src) A?.addStaticPower(value, powerchannel) @@ -448,10 +516,9 @@ if (isarea(power_source)) var/area/source_area = power_source - source_area.use_power(drained_energy WATTS) + source_area.apc?.terminal?.use_energy(drained_energy) else if (istype(power_source, /datum/powernet)) - var/drained_power = drained_energy WATTS //convert from "joules" to "watts" - PN.delayedload += (min(drained_power, max(PN.newavail - PN.delayedload, 0))) + PN.delayedload += (min(drained_energy, max(PN.newavail - PN.delayedload, 0))) else if (istype(power_source, /obj/item/stock_parts/cell)) cell.use(drained_energy) return drained_energy diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index ac24b109913..618812351f9 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -10,8 +10,6 @@ var/load = 0 // the current load on the powernet, increased by each machine at processing var/newavail = 0 // what available power was gathered last tick, then becomes... var/avail = 0 //...the current available power in the powernet - var/viewavail = 0 // the available power as it appears on the power console (gradually updated) - var/viewload = 0 // the load as it appears on the power console (gradually updated) var/netexcess = 0 // excess power on the powernet (typically avail-load)/////// var/delayedload = 0 // load applied to powernet between power ticks. @@ -84,10 +82,6 @@ for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network S.restore() // and restore some of the power that was used - // update power consoles - viewavail = round(0.8 * viewavail + 0.2 * avail) - viewload = round(0.8 * viewload + 0.2 * load) - // reset the powernet load = delayedload delayedload = 0 @@ -95,7 +89,4 @@ newavail = 0 /datum/powernet/proc/get_electrocute_damage() - if(avail >= 1000) - return clamp(20 + round(avail/25000), 20, 195) + rand(-5,5) - else - return 0 + return ELECTROCUTE_DAMAGE(energy_to_power(avail)) // Assuming 1 second of contact. diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index f79eb808a87..657263b3de4 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -22,7 +22,7 @@ connect_to_network() /obj/machinery/power/rtg/process() - add_avail(power_gen) + add_avail(power_to_energy(power_gen)) /obj/machinery/power/rtg/RefreshParts() . = ..() @@ -35,7 +35,7 @@ /obj/machinery/power/rtg/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Power generation now at [power_gen*0.001]kW.") + . += span_notice("The status display reads: Power generation at [display_power(power_gen, convert = FALSE)].") /obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 75dfc4b5c5b..9f19774cc61 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -164,4 +164,4 @@ to_chat(considered_atom, span_userdanger("The field repels you with tremendous force!")) playsound(src, 'sound/effects/gravhit.ogg', 50, TRUE) considered_atom.throw_at(target, 200, 4) - addtimer(CALLBACK(src, PROC_REF(clear_shock)), 5) + addtimer(CALLBACK(src, PROC_REF(clear_shock)), 0.5 SECONDS) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 77836007fd5..a360fc12145 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -77,11 +77,13 @@ welded = TRUE . = ..() -/obj/machinery/power/emitter/cable_layer_change_checks(mob/living/user, obj/item/tool) +/obj/machinery/power/emitter/cable_layer_act(mob/living/user, obj/item/tool) + if(panel_open) + return NONE if(welded) balloon_alert(user, "unweld first!") - return FALSE - return TRUE + return ITEM_INTERACT_BLOCKING + return ..() /obj/machinery/power/emitter/set_anchored(anchorvalue) . = ..() @@ -123,7 +125,7 @@ . += span_notice("Its status display is glowing faintly.") else . += span_notice("Its status display reads: Emitting one beam between [DisplayTimeText(minimum_fire_delay)] and [DisplayTimeText(maximum_fire_delay)].") - . += span_notice("Power consumption at [display_power(active_power_usage)].") + . += span_notice("Power consumption at [display_power(active_power_usage, convert = FALSE)].") /obj/machinery/power/emitter/should_have_node() return welded @@ -186,15 +188,16 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/power/emitter/process(seconds_per_tick) + var/power_usage = active_power_usage * seconds_per_tick if(machine_stat & (BROKEN)) return - if(!welded || (!powernet && active_power_usage)) + if(!welded || (!powernet && power_usage)) active = FALSE update_appearance() return if(!active) return - if(active_power_usage && surplus() < active_power_usage) + if(power_usage && surplus() < power_usage) if(powered) powered = FALSE update_appearance() @@ -202,7 +205,7 @@ log_game("[src] lost power in [AREACOORD(src)]") return - add_load(active_power_usage) + add_load(power_usage) if(!powered) powered = TRUE update_appearance() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 54615fb1fc8..527ce9c560b 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -283,11 +283,11 @@ no power level overlay is currently in the overlays list. set_explosion_block(INFINITY) can_atmos_pass = ATMOS_PASS_NO air_update_turf(TRUE, TRUE) - addtimer(CALLBACK(src, PROC_REF(setup_field), 1), 1) - addtimer(CALLBACK(src, PROC_REF(setup_field), 2), 2) - addtimer(CALLBACK(src, PROC_REF(setup_field), 4), 3) - addtimer(CALLBACK(src, PROC_REF(setup_field), 8), 4) - addtimer(VARSET_CALLBACK(src, active, FG_ONLINE), 5) + addtimer(CALLBACK(src, PROC_REF(setup_field), 1), 0.1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(setup_field), 2), 0.2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(setup_field), 4), 0.3 SECONDS) + addtimer(CALLBACK(src, PROC_REF(setup_field), 8), 0.4 SECONDS) + addtimer(VARSET_CALLBACK(src, active, FG_ONLINE), 0.5 SECONDS) /obj/machinery/field/generator/proc/setup_field(NSEW) var/turf/current_turf = loc diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index b21b26dcea0..5b712d52da2 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -50,7 +50,7 @@ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS flags_1 = SUPERMATTER_IGNORES_1 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | SHUTTLE_CRUSH_PROOF obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION /obj/singularity/Initialize(mapload, starting_energy = 50) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 45587fa48d9..c6fa9274cb3 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -1,7 +1,6 @@ // the SMES // stores power -#define SMESRATE 0.05 // rate of internal charge to external power //Cache defines #define SMES_CLEVEL_1 1 @@ -23,19 +22,21 @@ circuit = /obj/item/circuitboard/machine/smes can_change_cable_layer = TRUE - var/capacity = 5e6 // maximum charge - var/charge = 0 // actual charge + /// The charge capacity. + var/capacity = 50 * STANDARD_CELL_CHARGE // The board defaults with 5 high capacity power cells. + /// The current charge. + var/charge = 0 var/input_attempt = TRUE // TRUE = attempting to charge, FALSE = not attempting to charge var/inputting = TRUE // TRUE = actually inputting, FALSE = not inputting - var/input_level = 50000 // amount of power the SMES attempts to charge by - var/input_level_max = 200000 // cap on input_level + var/input_level = 50 KILO WATTS // amount of power the SMES attempts to charge by + var/input_level_max = 200 KILO WATTS // cap on input_level var/input_available = 0 // amount of charge available from input last tick var/output_attempt = TRUE // TRUE = attempting to output, FALSE = not attempting to output var/outputting = TRUE // TRUE = actually outputting, FALSE = not outputting - var/output_level = 50000 // amount of power the SMES attempts to output - var/output_level_max = 200000 // cap on output_level + var/output_level = 50 KILO WATTS // amount of power the SMES attempts to output + var/output_level_max = 200 KILO WATTS // cap on output_level var/output_used = 0 // amount of power actually outputted. may be less than output_level if the powernet returns excess power var/obj/machinery/power/terminal/terminal = null @@ -48,10 +49,10 @@ /obj/machinery/power/smes/Initialize(mapload) . = ..() dir_loop: - for(var/d in GLOB.cardinals) - var/turf/T = get_step(src, d) - for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == REVERSE_DIR(d)) + for(var/direction in GLOB.cardinals) + var/turf/turf = get_step(src, direction) + for(var/obj/machinery/power/terminal/term in turf) + if(term && term.dir == REVERSE_DIR(direction)) terminal = term break dir_loop @@ -63,40 +64,40 @@ /obj/machinery/power/smes/RefreshParts() SHOULD_CALL_PARENT(FALSE) - var/IO = 0 - var/MC = 0 - var/C + var/power_coefficient = 0 + var/max_charge = 0 + var/new_charge = 0 for(var/datum/stock_part/capacitor/capacitor in component_parts) - IO += capacitor.tier - input_level_max = initial(input_level_max) * IO - output_level_max = initial(output_level_max) * IO - for(var/obj/item/stock_parts/cell/PC in component_parts) - MC += PC.maxcharge - C += PC.charge - capacity = MC / (15000) * 1e6 + power_coefficient += capacitor.tier + input_level_max = initial(input_level_max) * power_coefficient + output_level_max = initial(output_level_max) * power_coefficient + for(var/obj/item/stock_parts/cell/power_cell in component_parts) + max_charge += power_cell.maxcharge + new_charge += power_cell.charge + capacity = max_charge if(!initial(charge) && !charge) - charge = C / 15000 * 1e6 + charge = new_charge /obj/machinery/power/smes/should_have_node() return TRUE -/obj/machinery/power/smes/cable_layer_change_checks(mob/living/user, obj/item/tool) +/obj/machinery/power/smes/cable_layer_act(mob/living/user, obj/item/tool) if(!QDELETED(terminal)) balloon_alert(user, "cut the terminal first!") - return FALSE - return TRUE + return ITEM_INTERACT_BLOCKING + return ..() -/obj/machinery/power/smes/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/smes/attackby(obj/item/item, mob/user, params) //opening using screwdriver - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), item)) update_appearance() return //changing direction using wrench - if(default_change_direction_wrench(user, I)) + if(default_change_direction_wrench(user, item)) terminal = null - var/turf/T = get_step(src, dir) - for(var/obj/machinery/power/terminal/term in T) + var/turf/turf = get_step(src, dir) + for(var/obj/machinery/power/terminal/term in turf) if(term && term.dir == REVERSE_DIR(dir)) terminal = term terminal.master = src @@ -110,7 +111,7 @@ return //building and linking a terminal - if(istype(I, /obj/item/stack/cable_coil)) + if(istype(item, /obj/item/stack/cable_coil)) var/dir = get_dir(user,src) if(dir & (dir-1))//we don't want diagonal click return @@ -123,14 +124,14 @@ to_chat(user, span_warning("You must open the maintenance panel first!")) return - var/turf/T = get_turf(user) - if (T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //can we get to the underfloor? + var/turf/turf = get_turf(user) + if (turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //can we get to the underfloor? to_chat(user, span_warning("You must first remove the floor plating!")) return - var/obj/item/stack/cable_coil/C = I - if(C.get_amount() < 10) + var/obj/item/stack/cable_coil/cable = item + if(cable.get_amount() < 10) to_chat(user, span_warning("You need more wires!")) return @@ -144,46 +145,46 @@ to_chat(user, span_notice("You start building the power terminal...")) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) - if(do_after(user, 20, target = src)) - if(C.get_amount() < 10 || !C) + if(do_after(user, 2 SECONDS, target = src)) + if(cable.get_amount() < 10 || !cable) return - var/obj/structure/cable/N = T.get_cable_node(terminal_cable_layer) //get the connecting node cable, if there's one - if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky + var/obj/structure/cable/connected_cable = turf.get_cable_node(terminal_cable_layer) //get the connecting node cable, if there's one + if (prob(50) && electrocute_mob(user, connected_cable, connected_cable, 1, TRUE)) //animate the electrocution if uncautious and unlucky do_sparks(5, TRUE, src) return if(!terminal) - C.use(10) + cable.use(10) user.visible_message(span_notice("[user.name] builds a power terminal."),\ span_notice("You build the power terminal.")) //build the terminal and link it to the network - make_terminal(T, terminal_cable_layer) + make_terminal(turf, terminal_cable_layer) terminal.connect_to_network() connect_to_network() return //crowbarring it ! - var/turf/T = get_turf(src) - if(default_deconstruction_crowbar(I)) - message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)].") + var/turf/turf = get_turf(src) + if(default_deconstruction_crowbar(item)) + message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(turf)].") user.log_message("deconstructed [src]", LOG_GAME) investigate_log("deconstructed by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_ENGINE) return - else if(panel_open && I.tool_behaviour == TOOL_CROWBAR) + else if(panel_open && item.tool_behaviour == TOOL_CROWBAR) return return ..() -/obj/machinery/power/smes/wirecutter_act(mob/living/user, obj/item/I) +/obj/machinery/power/smes/wirecutter_act(mob/living/user, obj/item/item) //disassembling the terminal . = ..() if(terminal && panel_open) - terminal.dismantle(user, I) + terminal.dismantle(user, item) return TRUE -/obj/machinery/power/smes/default_deconstruction_crowbar(obj/item/crowbar/C) - if(istype(C) && terminal) +/obj/machinery/power/smes/default_deconstruction_crowbar(obj/item/crowbar/crowbar) + if(istype(crowbar) && terminal) to_chat(usr, span_warning("You must first remove the power terminal!")) return FALSE @@ -195,20 +196,20 @@ /obj/machinery/power/smes/Destroy() if(SSticker.IsRoundInProgress()) - var/turf/T = get_turf(src) - message_admins("[src] deleted at [ADMIN_VERBOSEJMP(T)]") - log_game("[src] deleted at [AREACOORD(T)]") - investigate_log("deleted at [AREACOORD(T)]", INVESTIGATE_ENGINE) + var/turf/turf = get_turf(src) + message_admins("[src] deleted at [ADMIN_VERBOSEJMP(turf)]") + log_game("[src] deleted at [AREACOORD(turf)]") + investigate_log("deleted at [AREACOORD(turf)]", INVESTIGATE_ENGINE) if(terminal) disconnect_terminal() return ..() // create a terminal object pointing towards the SMES // wires will attach to this -/obj/machinery/power/smes/proc/make_terminal(turf/T, terminal_cable_layer = cable_layer) - terminal = new/obj/machinery/power/terminal(T) +/obj/machinery/power/smes/proc/make_terminal(turf/turf, terminal_cable_layer = cable_layer) + terminal = new/obj/machinery/power/terminal(turf) terminal.cable_layer = terminal_cable_layer - terminal.setDir(get_dir(T,src)) + terminal.setDir(get_dir(turf,src)) terminal.master = src set_machine_stat(machine_stat & ~BROKEN) @@ -238,7 +239,7 @@ /obj/machinery/power/smes/proc/chargedisplay() return clamp(round(5.5*charge/capacity),0,5) -/obj/machinery/power/smes/process() +/obj/machinery/power/smes/process(seconds_per_tick) if(machine_stat & BROKEN) return @@ -246,6 +247,28 @@ var/last_disp = chargedisplay() var/last_chrg = inputting var/last_onln = outputting + var/input_energy = power_to_energy(input_level) + var/output_energy = power_to_energy(output_level) + + //outputting + if(output_attempt) + if(outputting) + output_used = min(charge, output_energy) //limit output to that stored + + if (add_avail(output_used)) // add output to powernet if it exists (smes side) + charge -= output_used // reduce the storage (may be recovered in /restore() if excessive) + else + outputting = FALSE + + if(output_used < 0.1) // either from no charge or set to 0 + outputting = FALSE + investigate_log("lost power and turned off", INVESTIGATE_ENGINE) + else if(output_attempt && charge > output_energy && output_level > 0) + outputting = TRUE + else + output_used = 0 + else + outputting = FALSE //inputting if(terminal && input_attempt) @@ -254,9 +277,9 @@ if(inputting) if(input_available > 0) // if there's power available, try to charge - var/load = min(min((capacity-charge)/SMESRATE, input_level), input_available) // charge at set rate, limited to spare capacity + var/load = min((capacity-charge), input_energy, input_available) // charge at set rate, limited to spare capacity - charge += load * SMESRATE // increase the charge + charge += load // increase the charge terminal.add_load(load) // add the load to the terminal side network @@ -269,26 +292,6 @@ else inputting = FALSE - //outputting - if(output_attempt) - if(outputting) - output_used = min( charge/SMESRATE, output_level) //limit output to that stored - - if (add_avail(output_used)) // add output to powernet if it exists (smes side) - charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) - else - outputting = FALSE - - if(output_used < 0.0001) // either from no charge or set to 0 - outputting = FALSE - investigate_log("lost power and turned off", INVESTIGATE_ENGINE) - else if(output_attempt && charge > output_level && output_level > 0) - outputting = TRUE - else - output_used = 0 - else - outputting = FALSE - // only update icon if state changed if(last_disp != chargedisplay() || last_chrg != inputting || last_onln != outputting) update_appearance() @@ -309,13 +312,13 @@ excess = min(output_used, excess) // clamp it to how much was actually output by this SMES last ptick - excess = min((capacity-charge)/SMESRATE, excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen) + excess = min((capacity-charge), excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen) // now recharge this amount var/clev = chargedisplay() - charge += excess * SMESRATE // restore unused power + charge += excess // restore unused power powernet.netexcess -= excess // remove the excess from the powernet, so later SMESes don't try to use it output_used -= excess @@ -339,15 +342,15 @@ "inputAttempt" = input_attempt, "inputting" = inputting, "inputLevel" = input_level, - "inputLevel_text" = display_power(input_level), + "inputLevel_text" = display_power(input_level, convert = FALSE), "inputLevelMax" = input_level_max, - "inputAvailable" = input_available, + "inputAvailable" = energy_to_power(input_available), "outputAttempt" = output_attempt, - "outputting" = outputting, + "outputting" = energy_to_power(outputting), "outputLevel" = output_level, - "outputLevel_text" = display_power(output_level), + "outputLevel_text" = display_power(output_level, convert = FALSE), "outputLevelMax" = output_level_max, - "outputUsed" = output_used, + "outputUsed" = energy_to_power(output_used), ) return data @@ -417,15 +420,21 @@ outputting = output_attempt output_level = rand(0, output_level_max) input_level = rand(0, input_level_max) - charge -= 1e6/severity + charge -= STANDARD_CELL_CHARGE/severity if (charge < 0) charge = 0 update_appearance() log_smes() +/obj/machinery/power/smes/full + charge = 50 * STANDARD_CELL_CHARGE + +/obj/machinery/power/smes/ship + charge = 20 * STANDARD_CELL_CHARGE + /obj/machinery/power/smes/engineering - charge = 2.5e6 // Engineering starts with some charge for singulo //sorry little one, singulo as engine is gone - output_level = 90000 + charge = 50 * STANDARD_CELL_CHARGE // Engineering starts with some charge for singulo //sorry little one, singulo as engine is gone + output_level = 90 KILO WATTS /obj/machinery/power/smes/magical name = "magical power storage unit" @@ -437,8 +446,6 @@ ..() -#undef SMESRATE - #undef SMES_CLEVEL_1 #undef SMES_CLEVEL_2 #undef SMES_CLEVEL_3 diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index c62552913bb..9b47c133705 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -248,7 +248,7 @@ return var/sgen = SOLAR_GEN_RATE * sunfrac - add_avail(sgen) + add_avail(power_to_energy(sgen)) if(control) control.gen += sgen diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 4f45d0a50e3..c93b688634e 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -109,7 +109,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/external_damage_immediate = 0 ///The cutoff for a bolt jumping, grows with heat, lowers with higher mol count, - var/zap_cutoff = 1.2e6 + var/zap_cutoff = 1.2 MEGA JOULES ///How much the bullets damage should be multiplied by when it is added to the internal variables var/bullet_energy = SUPERMATTER_DEFAULT_BULLET_ENERGY ///How much hallucination should we produce per unit of power? @@ -306,7 +306,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) range = 3, zap_str = internal_energy * zap_transmission_rate * delta_time, zap_flags = ZAP_SUPERMATTER_FLAGS, - zap_cutoff = 2.4e5 * delta_time, + zap_cutoff = 240 KILO WATTS * delta_time, power_level = internal_energy, color = zap_color, ) @@ -891,7 +891,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) delamination_strategy.on_select(src) return TRUE -/obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 3.2e6, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1.2e6, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) +/obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 3.2 MEGA JOULES, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1.2 MEGA JOULES, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) if(QDELETED(zapstart)) return . = zapstart.dir diff --git a/code/modules/power/supermatter/supermatter_gas.dm b/code/modules/power/supermatter/supermatter_gas.dm index df8ef8e5b4f..35b9db0731f 100644 --- a/code/modules/power/supermatter/supermatter_gas.dm +++ b/code/modules/power/supermatter/supermatter_gas.dm @@ -39,7 +39,7 @@ "positive" = TRUE, )) if(sm_gas.heat_power_generation) - var/list/si_derived_data = siunit_isolated(sm_gas.heat_power_generation * GAS_HEAT_POWER_SCALING_COEFFICIENT * 1e7 / SSair.wait, "eV/K/s", 2) + var/list/si_derived_data = siunit_isolated(sm_gas.heat_power_generation * GAS_HEAT_POWER_SCALING_COEFFICIENT MEGA SECONDS / SSair.wait, "eV/K/s", 2) numeric_data += list(list( "name" = "Heat Power Gain", "amount" = si_derived_data["coefficient"], @@ -222,7 +222,7 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) sm.supermatter_zap( sm, range = 6, - zap_str = clamp(sm.internal_energy * 1600, 3.2e6, 1.6e7), + zap_str = clamp(sm.internal_energy * 1.6 KILO JOULES, 3.2 MEGA JOULES, 16 MEGA JOULES), zap_flags = ZAP_MOB_STUN, zap_cutoff = sm.zap_cutoff, power_level = sm.internal_energy, diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index def7bf7aa4d..b9313ae26ba 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -1,6 +1,3 @@ -// zap needs to be over this amount to get power -#define TESLA_COIL_THRESHOLD 32000 - /obj/machinery/power/energy_accumulator/tesla_coil name = "tesla coil" desc = "For the union!" @@ -37,12 +34,15 @@ . = ..() set_wires(new /datum/wires/tesla_coil(src)) -/obj/machinery/power/energy_accumulator/tesla_coil/cable_layer_change_checks(mob/living/user, obj/item/tool) +/obj/machinery/power/energy_accumulator/tesla_coil/cable_layer_act(mob/living/user, obj/item/tool) + if(panel_open) + return NONE if(anchored) balloon_alert(user, "unanchor first!") - return FALSE - return TRUE + return ITEM_INTERACT_BLOCKING + return ..() +/* SKYRAT EDIT CHANGE BEGIN - MOVED TO modular_skyrat/master_files/code/modules/power/tesla/coil.dm /obj/machinery/power/energy_accumulator/tesla_coil/RefreshParts() . = ..() var/power_multiplier = 0 @@ -51,6 +51,7 @@ power_multiplier += capacitor.tier zap_cooldown -= (capacitor.tier * 20) input_power_multiplier = max(1 * (power_multiplier / 8), 0.25) //Max out at 50% efficency. +*/// SKYRAT EDIT CHANGE END /obj/machinery/power/energy_accumulator/tesla_coil/examine(mob/user) . = ..() @@ -58,8 +59,8 @@ . += span_notice("The status display reads:
" + \ "Power generation at [input_power_multiplier*100]%.
" + \ "Shock interval at [zap_cooldown*0.1] seconds.
" + \ - "Stored [display_joules(get_stored_joules())].
" + \ - "Processing [display_power(get_power_output())].") + "Stored [display_energy(get_stored_joules())].
" + \ + "Processing [display_power(processed_energy)].") /obj/machinery/power/energy_accumulator/tesla_coil/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() @@ -90,8 +91,8 @@ /obj/machinery/power/energy_accumulator/tesla_coil/process(seconds_per_tick) . = ..() - zap_sound_volume = min(energy_to_joules(stored_energy)/200000, 100) - zap_sound_range = min(energy_to_joules(stored_energy)/4000000, 10) + zap_sound_volume = min(energy_to_power(processed_energy) / (4 KILO WATTS), 100) // 1 sound volume per 4kW. + zap_sound_range = min(energy_to_power(processed_energy) / (80 KILO WATTS), 10) // 1 sound range per 80kW. /obj/machinery/power/energy_accumulator/tesla_coil/zap_act(power, zap_flags) if(!anchored || panel_open) @@ -105,7 +106,7 @@ power /= 10 zap_buckle_check(power) var/power_removed = powernet ? power * input_power_multiplier : power - stored_energy += max(joules_to_energy(power_removed - TESLA_COIL_THRESHOLD), 0) + stored_energy += max(power_removed, 0) return max(power - power_removed, 0) //You get back the amount we didn't use /obj/machinery/power/energy_accumulator/tesla_coil/proc/zap() @@ -139,8 +140,8 @@ . = ..() if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads:
" + \ - "Recently grounded [display_joules(get_stored_joules())].
" + \ - "This energy would sustainably release [display_power(get_power_output())].") + "Recently grounded [display_energy(get_stored_joules())].
" + \ + "This energy would sustainably release [display_power(calculate_sustainable_power(), convert = FALSE)].") /obj/machinery/power/energy_accumulator/grounding_rod/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() @@ -164,13 +165,15 @@ return ..() -/obj/machinery/power/energy_accumulator/grounding_rod/zap_act(power, zap_flags) +/obj/machinery/power/energy_accumulator/grounding_rod/zap_act(energy, zap_flags) if(anchored && !panel_open) flick("grounding_rodhit", src) - zap_buckle_check(power) - stored_energy += joules_to_energy(power) + zap_buckle_check(energy) + stored_energy += energy return 0 else . = ..() - -#undef TESLA_COIL_THRESHOLD +/obj/machinery/power/energy_accumulator/grounding_rod/release_energy(joules = 0) + stored_energy -= joules + processed_energy = joules + return FALSE //Grounding rods don't release energy to the grid. diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 3e0f3baef0d..0e41a7d6e86 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -1,5 +1,5 @@ -#define TESLA_DEFAULT_POWER 6.95304e8 -#define TESLA_MINI_POWER 3.47652e8 +#define TESLA_DEFAULT_ENERGY (695.304 MEGA JOULES) +#define TESLA_MINI_ENERGY (347.652 MEGA JOULES) // Has a weird scaling thing so this is a lie for now (doesn't generate power anyways). //Zap constants, speeds up targeting #define BIKE (COIL + 1) #define COIL (ROD + 1) @@ -26,7 +26,7 @@ obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION pixel_x = -32 pixel_y = -32 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | SHUTTLE_CRUSH_PROOF flags_1 = SUPERMATTER_IGNORES_1 var/energy @@ -76,7 +76,7 @@ pixel_y = 0 shocked_things.Cut(1, shocked_things.len / 1.3) var/list/shocking_info = list() - tesla_zap(source = src, zap_range = 3, power = TESLA_DEFAULT_POWER, shocked_targets = shocking_info) + tesla_zap(source = src, zap_range = 3, power = TESLA_DEFAULT_ENERGY, shocked_targets = shocking_info) pixel_x = -32 pixel_y = -32 @@ -84,7 +84,7 @@ var/range = rand(1, clamp(orbiting_balls.len, 2, 3)) var/list/temp_shock = list() //We zap off the main ball instead of ourselves to make things looks proper - tesla_zap(source = src, zap_range = range, power = TESLA_MINI_POWER / 7 * range, shocked_targets = temp_shock) + tesla_zap(source = src, zap_range = range, power = TESLA_MINI_ENERGY / 7 * range, shocked_targets = temp_shock) shocking_info += temp_shock shocked_things += shocking_info @@ -127,7 +127,7 @@ energy_to_raise = energy_to_raise * 1.25 playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, TRUE, extrarange = 30) - addtimer(CALLBACK(src, PROC_REF(new_mini_ball)), 100) + addtimer(CALLBACK(src, PROC_REF(new_mini_ball)), 10 SECONDS) else if(energy < energy_to_lower && orbiting_balls.len) energy_to_raise = energy_to_raise / 1.25 energy_to_lower = (energy_to_raise / 1.25) - 20 @@ -365,5 +365,5 @@ #undef BLOB #undef STRUCTURE -#undef TESLA_DEFAULT_POWER -#undef TESLA_MINI_POWER +#undef TESLA_DEFAULT_ENERGY +#undef TESLA_MINI_ENERGY diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 3f4d3fd8446..21269c90d37 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -430,11 +430,11 @@ if(!all_parts_connected) . += span_warning("The parts need to be linked via a [EXAMINE_HINT("multitool")]") -/obj/machinery/power/turbine/core_rotor/cable_layer_change_checks(mob/living/user, obj/item/tool) +/obj/machinery/power/turbine/core_rotor/cable_layer_act(mob/living/user, obj/item/tool) if(!panel_open) balloon_alert(user, "open panel first!") - return FALSE - return TRUE + return ITEM_INTERACT_BLOCKING + return ..() /obj/machinery/power/turbine/core_rotor/multitool_act(mob/living/user, obj/item/tool) //allow cable layer changing diff --git a/code/modules/projectiles/ammunition/ballistic/rocket.dm b/code/modules/projectiles/ammunition/ballistic/rocket.dm index bb5c1072c14..cf88fd02313 100644 --- a/code/modules/projectiles/ammunition/ballistic/rocket.dm +++ b/code/modules/projectiles/ammunition/ballistic/rocket.dm @@ -1,5 +1,5 @@ /obj/item/ammo_casing/rocket - name = "\improper PM-9HE" + name = "\improper Dardo HE rocket" desc = "An 84mm High Explosive rocket. Fire at people and pray." caliber = CALIBER_84MM icon_state = "srm-8" @@ -15,15 +15,17 @@ icon_state = "[base_icon_state]" /obj/item/ammo_casing/rocket/heap - name = "\improper PM-9HEAP" + name = "\improper Dardo HE-AP rocket" desc = "An 84mm High Explosive All Purpose rocket. For when you just need something to not exist anymore." icon_state = "84mm-heap" base_icon_state = "84mm-heap" projectile_type = /obj/projectile/bullet/rocket/heap /obj/item/ammo_casing/rocket/weak - name = "\improper PM-9HE Low-Yield" + name = "\improper Dardo HE Low-Yield rocket" desc = "An 84mm High Explosive rocket. This one isn't quite as devastating." + icon_state = "low_yield_rocket" + base_icon_state = "low_yield_rocket" projectile_type = /obj/projectile/bullet/rocket/weak /obj/item/ammo_casing/a75 diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index dfd99e24766..3b2489022ea 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -13,6 +13,12 @@ /obj/item/ammo_box/magazine/internal/shot/tube/fire ammo_type = /obj/projectile/bullet/incendiary/shotgun/no_trail +/obj/item/ammo_box/magazine/internal/shot/tube/buckshot + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/magazine/internal/shot/tube/slug + ammo_type = /obj/item/ammo_casing/shotgun + /obj/item/ammo_box/magazine/internal/shot/lethal ammo_type = /obj/item/ammo_casing/shotgun/buckshot diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 310a3c187e9..1195a18d55d 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -593,7 +593,7 @@ semicd = TRUE - if(!bypass_timer && (!do_after(user, 120, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) + if(!bypass_timer && (!do_after(user, 12 SECONDS, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) if(user) if(user == target) user.visible_message(span_notice("[user] decided not to shoot.")) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 5f512813182..791055fd2d2 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -130,6 +130,12 @@ ///What is the cap on our misfire probability? Do not set this to 100. var/misfire_probability_cap = 25 + /// Fire Selector Variables /// + /// Tracks the firemode of burst weapons. TRUE means it is in burst mode. + var/burst_fire_selection = FALSE + /// If it has an icon for a selector switch indicating current firemode. + var/selector_switch_icon = FALSE + /obj/item/gun/ballistic/Initialize(mapload) . = ..() if(!spawn_magazine_type) @@ -200,6 +206,14 @@ /obj/item/gun/ballistic/update_overlays() . = ..() + + if(selector_switch_icon) + switch(burst_fire_selection) + if(FALSE) + . += "[initial(icon_state)]_semi" + if(TRUE) + . += "[initial(icon_state)]_burst" + if(show_bolt_icon) if (bolt_type == BOLT_TYPE_LOCKING) . += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]" @@ -249,6 +263,27 @@ if(capacity_number) . += "[icon_state]_mag_[capacity_number]" +/obj/item/gun/ballistic/ui_action_click(mob/user, actiontype) + if(istype(actiontype, /datum/action/item_action/toggle_firemode)) + burst_select() + else + ..() + +/obj/item/gun/ballistic/proc/burst_select() + var/mob/living/carbon/human/user = usr + burst_fire_selection = !burst_fire_selection + if(!burst_fire_selection) + burst_size = 1 + fire_delay = 0 + 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/weapons/empty.ogg', 100, TRUE) + update_appearance() + update_item_action_buttons() /obj/item/gun/ballistic/handle_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) if(!semi_auto && from_firing) @@ -623,7 +658,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( user.visible_message(span_danger("[src] goes off!"), span_danger("[src] goes off in your face!")) return - if(do_after(user, 30, target = src)) + if(do_after(user, 3 SECONDS, target = src)) if(sawn_off) return user.visible_message(span_notice("[user] shortens [src]!"), span_notice("You shorten [src].")) @@ -646,46 +681,39 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( return TRUE /obj/item/gun/ballistic/proc/guncleaning(mob/user, obj/item/A) - if(misfire_probability == 0) + if(misfire_probability == initial(misfire_probability)) balloon_alert(user, "it's already clean!") return user.changeNext_move(CLICK_CD_MELEE) - user.visible_message(span_notice("[user] begins to cleaning [src]."), span_notice("You begin to clean the internals of [src].")) + balloon_alert(user, "cleaning...") - if(do_after(user, 100, target = src)) - var/original_misfire_value = initial(misfire_probability) - if(misfire_probability > original_misfire_value) - misfire_probability = original_misfire_value - user.visible_message(span_notice("[user] cleans [src] of any fouling."), span_notice("You clean [src], removing any fouling, preventing misfire.")) - return TRUE - -/obj/item/gun/ballistic/wrench_act(mob/living/user, obj/item/I) - if(!user.is_holding(src)) - to_chat(user, span_notice("You need to hold [src] to modify it.")) + if(do_after(user, 10 SECONDS, target = src)) + misfire_probability = initial(misfire_probability) + balloon_alert(user, "fouling cleaned out") return TRUE +/obj/item/gun/ballistic/wrench_act(mob/living/user, obj/item/I) if(!can_modify_ammo) return - if(bolt_type == BOLT_TYPE_STANDARD) - if(get_ammo()) - to_chat(user, span_notice("You can't get at the internals while the gun has a bullet in it!")) - return + if(!user.is_holding(src)) + balloon_alert(user, "hold to modify!") + return TRUE - else if(!bolt_locked) - to_chat(user, span_notice("You can't get at the internals while the bolt is down!")) - return + if(get_ammo()) + balloon_alert(user, "can't modify while loaded!") + return - to_chat(user, span_notice("You begin to tinker with [src]...")) + if(!bolt_locked && bolt_type == BOLT_TYPE_LOCKING) + balloon_alert(user, "the bolt is in the way!") + return + + balloon_alert(user, "tinkering...") I.play_tool_sound(src) if(!I.use_tool(src, user, 3 SECONDS)) return TRUE - if(blow_up(user)) - user.visible_message(span_danger("[src] goes off!"), span_danger("[src] goes off in your face!")) - return - if(magazine.caliber == initial_caliber) magazine.caliber = alternative_caliber if(alternative_ammo_misfires) @@ -699,7 +727,6 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( fire_sound = initial_fire_sound to_chat(user, span_notice("You reset [src]. Now it will fire [initial_caliber] rounds.")) - ///used for sawing guns, causes the gun to fire without the input of the user /obj/item/gun/ballistic/proc/blow_up(mob/user) return chambered && process_fire(user, user, FALSE) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 4162ca9890f..3d6940692d8 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -9,41 +9,7 @@ fire_sound_volume = 90 rack_sound = 'sound/weapons/gun/smg/smgrack.ogg' suppressed_sound = 'sound/weapons/gun/smg/shot_suppressed.ogg' - var/select = 1 ///fire selector position. 1 = semi, 2 = burst. anything past that can vary between guns. - var/selector_switch_icon = FALSE ///if it has an icon for a selector switch indicating current firemode. - -/obj/item/gun/ballistic/automatic/update_overlays() - . = ..() - if(!selector_switch_icon) - return - - switch(select) - if(0) - . += "[initial(icon_state)]_semi" - if(1) - . += "[initial(icon_state)]_burst" - -/obj/item/gun/ballistic/automatic/ui_action_click(mob/user, actiontype) - if(istype(actiontype, /datum/action/item_action/toggle_firemode)) - burst_select() - else - ..() - -/obj/item/gun/ballistic/automatic/proc/burst_select() - var/mob/living/carbon/human/user = usr - select = !select - if(!select) - burst_size = 1 - fire_delay = 0 - 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/weapons/empty.ogg', 100, TRUE) - update_appearance() - update_item_action_buttons() + burst_fire_selection = TRUE /obj/item/gun/ballistic/automatic/proto name = "\improper Nanotrasen Saber SMG" @@ -205,14 +171,6 @@ else ..() -/obj/item/gun/ballistic/automatic/m90/update_overlays() - . = ..() - switch(select) - if(0) - . += "[initial(icon_state)]_semi" - if(1) - . += "[initial(icon_state)]_burst" - /obj/item/gun/ballistic/automatic/tommygun name = "\improper Thompson SMG" desc = "Based on the classic 'Chicago Typewriter'." diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 1985046a434..860bfd81f0b 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -42,13 +42,19 @@ casing_ejector = FALSE /obj/item/gun/ballistic/rocketlauncher - name = "\improper PML-9" - desc = "A reusable rocket propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel. \ - A sticker near the cheek rest reads, \"ENSURE AREA BEHIND IS CLEAR BEFORE FIRING\"" + name = "\improper Dardo-RE Rocket Launcher" + desc = "A reusable rocket propelled grenade launcher. An arrow pointing toward the front of the launcher \ + alongside the words \"Front Toward Enemy\" are printed on the tube. Someone seems to have crossed out \ + that last word and written \"NT\" over it at some point. A sticker near the back of the launcher warn \ + to \"CHECK BACKBLAST CLEAR BEFORE FIRING\", whatever that means." + icon = 'icons/obj/weapons/guns/wide_guns.dmi' icon_state = "rocketlauncher" inhand_icon_state = "rocketlauncher" + worn_icon_state = "rocketlauncher" + SET_BASE_PIXEL(-8, 0) accepted_magazine_type = /obj/item/ammo_box/magazine/internal/rocketlauncher fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg' + slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY can_suppress = FALSE pin = /obj/item/firing_pin/implant/pindicate @@ -70,11 +76,16 @@ AddElement(/datum/element/backblast) /obj/item/gun/ballistic/rocketlauncher/unrestricted + desc = "A reusable rocket propelled grenade launcher. An arrow pointing toward the front of the launcher \ + alongside the words \"Front Toward Enemy\" are printed on the tube. \ + A sticker near the back of the launcher warn to \"CHECK BACKBLAST CLEAR BEFORE FIRING\", whatever that means." pin = /obj/item/firing_pin /obj/item/gun/ballistic/rocketlauncher/nobackblast - name = "flameless PML-11" - desc = "A reusable rocket propelled grenade launcher. This one has been fitted with a special coolant loop to avoid embarassing teamkill 'accidents' from backblast." + name = "\improper Dardo-REF Flameless Rocket Launcher" + desc = "A reusable rocket propelled grenade launcher. An arrow pointing toward the front of the launcher \ + alongside the words \"Front Toward Enemy\" are printed on the tube. \ + This one has been fitted with a special backblast diverter to prevent 'friendly' fire 'accidents' during use." backblast = FALSE /obj/item/gun/ballistic/rocketlauncher/afterattack() @@ -84,6 +95,11 @@ /obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user) return //too difficult to remove the rocket with TK +/obj/item/gun/ballistic/rocketlauncher/update_overlays() + . = ..() + if(get_ammo()) + . += "rocketlauncher_loaded" + /obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user) user.visible_message(span_warning("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!"), \ span_userdanger("You aim [src] at the ground to perform a bisnasty rocket jump...")) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index a7186ae6439..37990971138 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -97,6 +97,10 @@ desc = "An advanced shotgun with two separate magazine tubes. This one shows signs of bounty hunting customization, meaning it likely has a dual rubber shot/fire slug load." alt_mag_type = /obj/item/ammo_box/magazine/internal/shot/tube/fire +/obj/item/gun/ballistic/shotgun/automatic/dual_tube/deadly + spawn_magazine_type = /obj/item/ammo_box/magazine/internal/shot/tube/buckshot + alt_mag_type = /obj/item/ammo_box/magazine/internal/shot/tube/slug + /obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user) . = ..() . += span_notice("Alt-click to pump it.") @@ -136,7 +140,7 @@ /obj/item/gun/ballistic/shotgun/bulldog name = "\improper Bulldog Shotgun" - desc = "A semi-auto, mag-fed shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines. Can have a secondary magazine attached to quickly swap between ammo types, or just to keep shooting." + desc = "A 2-round burst fire, mag-fed shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines. Can have a secondary magazine attached to quickly swap between ammo types, or just to keep shooting." icon_state = "bulldog" inhand_icon_state = "bulldog" worn_icon_state = "cshotgun" @@ -148,10 +152,11 @@ weapon_weight = WEAPON_MEDIUM accepted_magazine_type = /obj/item/ammo_box/magazine/m12g can_suppress = FALSE - burst_size = 1 - fire_delay = 10 //Skyrat edit - Original: 0 + burst_size = 2 + fire_delay = 10 //Skyrat edit - Original: 1 pin = /obj/item/firing_pin/implant/pindicate fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg' + actions_types = list(/datum/action/item_action/toggle_firemode) mag_display = TRUE empty_indicator = TRUE empty_alarm = TRUE @@ -160,6 +165,7 @@ semi_auto = TRUE internal_magazine = FALSE tac_reloads = TRUE + burst_fire_selection = TRUE ///the type of secondary magazine for the bulldog var/secondary_magazine_type ///the secondary magazine diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 811ba23122f..f4fc941c10e 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -151,7 +151,7 @@ if(charge_timer < charge_delay) return charge_timer = 0 - cell.give(100) + cell.give(STANDARD_ENERGY_GUN_SELF_CHARGE_RATE * seconds_per_tick) if(!chambered) //if empty chamber we try to charge a new shot recharge_newshot(TRUE) update_appearance() @@ -170,10 +170,10 @@ return if(use_cyborg_cell && !no_cyborg_drain) if(iscyborg(loc)) - var/mob/living/silicon/robot/R = loc - if(R.cell) + var/mob/living/silicon/robot/robot = loc + if(robot.cell) var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot - if(R.cell.use(shot.e_cost)) //Take power from the borg... + if(robot.cell.use(shot.e_cost)) //Take power from the borg... cell.give(shot.e_cost) //... to recharge the shot if(!chambered) var/obj/item/ammo_casing/energy/AC = ammo_type[select] diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm index 23cd6a297ed..64ffa86f360 100644 --- a/code/modules/projectiles/guns/energy/crank_guns.dm +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -17,7 +17,7 @@ AddComponent( \ /datum/component/crank_recharge, \ charging_cell = get_cell(), \ - charge_amount = 500, \ + charge_amount = STANDARD_CELL_CHARGE * 0.5, \ cooldown_time = 2 SECONDS, \ charge_sound = 'sound/weapons/laser_crank.ogg', \ charge_sound_cooldown_time = 1.8 SECONDS, \ @@ -50,7 +50,7 @@ AddComponent( \ /datum/component/crank_recharge, \ charging_cell = get_cell(), \ - charge_amount = 1000, \ + charge_amount = STANDARD_CELL_CHARGE, \ cooldown_time = 2 SECONDS, \ charge_sound = 'sound/weapons/laser_crank.ogg', \ charge_sound_cooldown_time = 1.8 SECONDS, \ @@ -72,3 +72,56 @@ 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 + +//Inferno and Cryo Pistols + +/obj/item/gun/energy/laser/thermal //the common parent of these guns, it just shoots hard bullets, somoene might like that? + name = "nanite pistol" + desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of angry robots into the bad guys." + icon_state = "infernopistol" + inhand_icon_state = null + ammo_type = list(/obj/item/ammo_casing/energy/nanite) + shaded_charge = TRUE + ammo_x_offset = 1 + obj_flags = UNIQUE_RENAME + can_bayonet = TRUE + knife_x_offset = 19 + knife_y_offset = 13 + w_class = WEIGHT_CLASS_NORMAL + dual_wield_spread = 5 //as intended by the coders + +/obj/item/gun/energy/laser/thermal/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + AddComponent( \ + /datum/component/crank_recharge, \ + charging_cell = get_cell(), \ + spin_to_win = TRUE, \ + charge_amount = LASER_SHOTS(8, STANDARD_CELL_CHARGE), \ + cooldown_time = 0.8 SECONDS, \ + charge_sound = 'sound/weapons/kinetic_reload.ogg', \ + charge_sound_cooldown_time = 0.8 SECONDS, \ + ) + +/obj/item/gun/energy/laser/thermal/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 15, \ + overlay_y = 9) + +/obj/item/gun/energy/laser/thermal/inferno //the magma gun + name = "inferno pistol" + desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of molten angry robots into the bad guys. \ + 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" + ammo_type = list(/obj/item/ammo_casing/energy/nanite/inferno) + +/obj/item/gun/energy/laser/thermal/cryo //the ice gun + name = "cryo pistol" + desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit shards of frozen angry robots into the bad guys. \ + 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" + ammo_type = list(/obj/item/ammo_casing/energy/nanite/cryo) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index ced8fff4c2d..2135343a152 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -11,10 +11,13 @@ can_bayonet = TRUE knife_x_offset = 20 knife_y_offset = 12 - var/mob/holder - var/max_mod_capacity = 100 - var/list/modkits = list() gun_flags = NOT_A_REAL_GUN + ///List of all mobs that projectiles fired from this gun will ignore. + var/list/ignored_mob_types + ///List of all modkits currently in the kinetic accelerator. + var/list/obj/item/borg/upgrade/modkit/modkits = list() + ///The max capacity of modkits the PKA can have installed at once. + var/max_mod_capacity = 100 var/disablemodification = FALSE // Bubber edit, stops removal and addition of mods. @@ -69,18 +72,16 @@ if(max_mod_capacity) . += "[get_remaining_mod_capacity()]% mod capacity remaining." . += span_info("You can use a crowbar to remove all modules or right-click with an empty hand to remove a specific one.") - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - . += span_notice("There is \a [M] installed, using [M.cost]% capacity.") + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + . += span_notice("There is \a [modkit_upgrade] installed, using [modkit_upgrade.cost]% capacity.") /obj/item/gun/energy/recharge/kinetic_accelerator/crowbar_act(mob/living/user, obj/item/I) . = TRUE if(!disablemodification && modkits.len) // BUBBER EDIT to_chat(user, span_notice("You pry all the modifications out.")) I.play_tool_sound(src, 100) - for(var/a in modkits) - var/obj/item/borg/upgrade/modkit/M = a - M.forceMove(drop_location()) //uninstallation handled in Exited(), or /mob/living/silicon/robot/remove_from_upgrades() for borgs + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + modkit_upgrade.forceMove(drop_location()) //uninstallation handled in Exited(), or /mob/living/silicon/robot/remove_from_upgrades() for borgs else to_chat(user, span_notice("There are no modifications currently installed.")) @@ -139,16 +140,14 @@ /obj/item/gun/energy/recharge/kinetic_accelerator/proc/get_remaining_mod_capacity() var/current_capacity_used = 0 - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - current_capacity_used += M.cost + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + current_capacity_used += modkit_upgrade.cost return max_mod_capacity - current_capacity_used -/obj/item/gun/energy/recharge/kinetic_accelerator/proc/modify_projectile(obj/projectile/kinetic/K) - K.kinetic_gun = src //do something special on-hit, easy! - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - M.modify_projectile(K) +/obj/item/gun/energy/recharge/kinetic_accelerator/proc/modify_projectile(obj/projectile/kinetic/kinetic_projectile) + kinetic_projectile.kinetic_gun = src //do something special on-hit, easy! + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + modkit_upgrade.modify_projectile(kinetic_projectile) /obj/item/gun/energy/recharge/kinetic_accelerator/cyborg icon_state = "kineticgun" // SKYRAT EDIT CHANGE @@ -194,13 +193,13 @@ return ..() /obj/projectile/kinetic/prehit_pierce(atom/target) + if(is_type_in_typecache(target, kinetic_gun?.ignored_mob_types)) + return PROJECTILE_PIERCE_PHASE . = ..() if(. == PROJECTILE_PIERCE_PHASE) return - if(kinetic_gun) - var/list/mods = kinetic_gun.modkits - for(var/obj/item/borg/upgrade/modkit/modkit in mods) - modkit.projectile_prehit(src, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in kinetic_gun?.modkits) + modkit_upgrade.projectile_prehit(src, target, kinetic_gun) if(!pressure_decrease_active && !lavaland_equipment_pressure_check(get_turf(target))) name = "weakened [name]" damage = damage * pressure_decrease @@ -220,10 +219,10 @@ target_turf = get_turf(src) if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. var/list/mods = kinetic_gun.modkits - for(var/obj/item/borg/upgrade/modkit/M in mods) - M.projectile_strike_predamage(src, target_turf, target, kinetic_gun) - for(var/obj/item/borg/upgrade/modkit/M in mods) - M.projectile_strike(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in mods) + modkit_upgrade.projectile_strike_predamage(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in mods) + modkit_upgrade.projectile_strike(src, target_turf, target, kinetic_gun) if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf M.gets_drilled(firer, TRUE) @@ -285,9 +284,8 @@ return FALSE if(denied_type) var/number_of_denied = 0 - for(var/A in KA.modkits) - var/obj/item/borg/upgrade/modkit/M = A - if(istype(M, denied_type)) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in KA.modkits) + if(istype(modkit_upgrade, denied_type)) number_of_denied++ if(number_of_denied >= maximum_of_type) . = FALSE @@ -435,8 +433,31 @@ /obj/item/borg/upgrade/modkit/minebot_passthrough name = "minebot passthrough" desc = "Causes kinetic accelerator shots to pass through minebots." + denied_type = /obj/item/borg/upgrade/modkit/human_passthrough cost = 0 +/obj/item/borg/upgrade/modkit/minebot_passthrough/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user, transfer_to_loc) + . = ..() + LAZYADD(KA.ignored_mob_types, typecacheof(/mob/living/basic/mining_drone)) + +/obj/item/borg/upgrade/modkit/minebot_passthrough/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) + . = ..() + LAZYREMOVE(KA.ignored_mob_types, typecacheof(/mob/living/basic/mining_drone)) + +/obj/item/borg/upgrade/modkit/human_passthrough + name = "human passthrough" + desc = "Causes kinetic accelerator shots to pass through humans, good for preventing friendly fire." + denied_type = /obj/item/borg/upgrade/modkit/minebot_passthrough + cost = 0 + +/obj/item/borg/upgrade/modkit/human_passthrough/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user, transfer_to_loc) + . = ..() + LAZYADD(KA.ignored_mob_types, typecacheof(/mob/living/carbon/human)) + +/obj/item/borg/upgrade/modkit/human_passthrough/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) + . = ..() + LAZYREMOVE(KA.ignored_mob_types, typecacheof(/mob/living/carbon/human)) + //Tendril-unique modules /obj/item/borg/upgrade/modkit/cooldown/repeater name = "rapid repeater" @@ -598,7 +619,7 @@ desc = "Causes kinetic accelerator bolts to have a white tracer trail and explosion." cost = 0 denied_type = /obj/item/borg/upgrade/modkit/tracer - var/bolt_color = "#FFFFFF" + var/bolt_color = COLOR_WHITE /obj/item/borg/upgrade/modkit/tracer/modify_projectile(obj/projectile/kinetic/K) K.icon_state = "ka_tracer" diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index ded25392c60..efdb6103a8e 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -93,8 +93,9 @@ 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 -/obj/item/gun/energy/laser/cyborg/emp_act() - return +/obj/item/gun/energy/laser/cyborg/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/gun/energy/laser/scatter name = "scatter laser gun" @@ -186,48 +187,6 @@ /obj/item/gun/energy/laser/redtag/hitscan ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan) -//Inferno and Cryo Pistols - -/obj/item/gun/energy/laser/thermal //the common parent of these guns, it just shoots hard bullets, somoene might like that? - name = "nanite pistol" - desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of angry robots into the bad guys." - icon_state = "infernopistol" - inhand_icon_state = null - ammo_type = list(/obj/item/ammo_casing/energy/nanite) - shaded_charge = TRUE - ammo_x_offset = 1 - obj_flags = UNIQUE_RENAME - can_bayonet = TRUE - knife_x_offset = 19 - knife_y_offset = 13 - w_class = WEIGHT_CLASS_NORMAL - dual_wield_spread = 10 //as intended by the coders - -/obj/item/gun/energy/laser/thermal/Initialize(mapload) - . = ..() - AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) - -/obj/item/gun/energy/laser/thermal/add_seclight_point() - AddComponent(/datum/component/seclite_attachable, \ - light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ - light_overlay = "flight", \ - overlay_x = 15, \ - overlay_y = 9) - -/obj/item/gun/energy/laser/thermal/inferno //the magma gun - name = "inferno pistol" - desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of molten angry robots into the bad guys. \ - While it doesn't manipulate temperature in and of itself, it does cause an violent eruption in anyone who is severely cold." - icon_state = "infernopistol" - ammo_type = list(/obj/item/ammo_casing/energy/nanite/inferno) - -/obj/item/gun/energy/laser/thermal/cryo //the ice gun - name = "cryo pistol" - desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit shards of frozen angry robots into the bad guys. \ - While it doesn't manipulate temperature in and of itself, it does cause an internal explosion in anyone who is severely hot." - icon_state = "cryopistol" - ammo_type = list(/obj/item/ammo_casing/energy/nanite/cryo) - // luxury shuttle funnies /obj/item/firing_pin/paywall/luxury multi_payment = TRUE diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 94dcb3bba7b..7b80e0c69f5 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -145,9 +145,8 @@ ..() ammo_pack.overheat++ if(ammo_pack.battery) - var/totransfer = min(100, ammo_pack.battery.charge) - var/transferred = cell.give(totransfer) - ammo_pack.battery.use(transferred) + var/transferred = ammo_pack.battery.use(cell.maxcharge - cell.charge, force = TRUE) + cell.give(transferred) /obj/item/gun/energy/minigun/afterattack(atom/target, mob/living/user, flag, params) @@ -158,5 +157,5 @@ /obj/item/stock_parts/cell/minigun name = "gatling gun fusion core" desc = "Where did these come from?" - maxcharge = 500000 - chargerate = 5000 + maxcharge = 500 * STANDARD_CELL_CHARGE + chargerate = 5 * STANDARD_CELL_CHARGE diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index f441937e60a..a589594d796 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -12,8 +12,9 @@ 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/cell/pulse -/obj/item/gun/energy/pulse/emp_act(severity) - return +/obj/item/gun/energy/pulse/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/gun/energy/pulse/prize pin = /obj/item/firing_pin diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index 26fbdef6e13..3d94193a531 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -30,6 +30,7 @@ . = ..() if(!holds_charge) empty() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/gun/energy/recharge/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) . = ..() @@ -78,9 +79,6 @@ deltimer(recharge_timerid) recharge_timerid = addtimer(CALLBACK(src, PROC_REF(reload)), set_recharge_time * carried, TIMER_STOPPABLE) -/obj/item/gun/energy/recharge/emp_act(severity) - return - /obj/item/gun/energy/recharge/proc/reload() cell.give(cell.maxcharge) if(!suppressed && recharge_sound) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 3802ca0de35..523f41af752 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -10,6 +10,10 @@ slot_flags = ITEM_SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/ion) +/obj/item/gun/energy/ionrifle/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) + /obj/item/gun/energy/ionrifle/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ @@ -17,9 +21,6 @@ overlay_x = 17, \ overlay_y = 9) -/obj/item/gun/energy/ionrifle/emp_act(severity) - return - /obj/item/gun/energy/ionrifle/carbine name = "ion carbine" desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient." @@ -95,7 +96,8 @@ usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') tool_behaviour = TOOL_WELDER toolspeed = 0.7 //plasmacutters can be used as welders, and are faster than standard welders - var/charge_weld = 25 //amount of charge used up to start action (multiplied by amount) and per progress_flash_divisor ticks of welding + /// amount of charge used up to start action (multiplied by amount) and per progress_flash_divisor ticks of welding + var/charge_weld = 25 KILO JOULES /obj/item/gun/energy/plasmacutter/Initialize(mapload) AddElement(/datum/element/update_icon_blocker) @@ -124,15 +126,13 @@ balloon_alert(user, "already fully charged!") return I.use(1) - cell.give(500*charge_multiplier) + cell.give(500 KILO JOULES * charge_multiplier) balloon_alert(user, "cell recharged") else ..() /obj/item/gun/energy/plasmacutter/emp_act(severity) - if(!cell.charge) - return - cell.use(cell.charge/3) + . = ..() if(isliving(loc)) var/mob/living/user = loc user.visible_message(span_danger("Concentrated plasma discharges from [src] onto [user], burning them!"), span_userdanger("[src] malfunctions, spewing concentrated plasma onto you! It burns!")) @@ -305,9 +305,7 @@ AddElement(/datum/element/update_icon_blocker) . = ..() AddComponent(/datum/component/automatic_fire, 0.3 SECONDS) - -/obj/item/gun/energy/printer/emp_act() - return + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/gun/energy/temperature name = "temperature gun" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index e099176ddd0..72148267b03 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -19,10 +19,11 @@ can_charge = FALSE use_cyborg_cell = TRUE -/obj/item/gun/energy/e_gun/advtaser/cyborg/add_seclight_point() - return +/obj/item/gun/energy/e_gun/advtaser/cyborg/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) -/obj/item/gun/energy/e_gun/advtaser/cyborg/emp_act() +/obj/item/gun/energy/e_gun/advtaser/cyborg/add_seclight_point() return /obj/item/gun/energy/disabler @@ -66,5 +67,6 @@ can_charge = FALSE use_cyborg_cell = TRUE -/obj/item/gun/energy/disabler/cyborg/emp_act() - return +/obj/item/gun/energy/disabler/cyborg/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) diff --git a/code/modules/projectiles/guns/special/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm index e5ce8c51316..830952dd769 100644 --- a/code/modules/projectiles/guns/special/grenade_launcher.dm +++ b/code/modules/projectiles/guns/special/grenade_launcher.dm @@ -53,4 +53,4 @@ F.active = 1 F.icon_state = initial(F.icon_state) + "_active" playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, TRUE, -3) - addtimer(CALLBACK(F, TYPE_PROC_REF(/obj/item/grenade, detonate)), 15) + addtimer(CALLBACK(F, TYPE_PROC_REF(/obj/item/grenade, detonate)), 1.5 SECONDS) diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm index 5c9cb1fd978..6a5ccf2dea1 100644 --- a/code/modules/projectiles/guns/special/hand_of_midas.dm +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -100,7 +100,7 @@ armour_penetration = 50 hitsound = 'sound/effects/coin2.ogg' icon_state = "pellet" - color = "#FFD700" + color = COLOR_GOLD /// The gold charge in this pellet var/gold_charge = 0 diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index c4b6f6fb4ce..77d6a702b49 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -137,7 +137,7 @@ /obj/item/firing_pin/clown name = "hilarious firing pin" desc = "Advanced clowntech that can convert any firearm into a far more useful object." - color = "#FFFF00" + color = COLOR_YELLOW fail_message = "honk!" force_replace = TRUE @@ -221,7 +221,7 @@ /obj/item/firing_pin/paywall name = "paywall firing pin" desc = "A firing pin with a built-in configurable paywall." - color = "#FFD700" + 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 var/list/gun_owners = list() @@ -387,4 +387,5 @@ /obj/item/firing_pin/Destroy() if(gun) gun.pin = null + gun = null return ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 625b4d4df99..27e93653a77 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -181,6 +181,8 @@ var/catastropic_dismemberment = FALSE //If TRUE, this projectile deals its damage to the chest if it dismembers a limb. var/impact_effect_type //what type of impact effect to show when hitting something var/log_override = FALSE //is this type spammed enough to not log? (KAs) + /// If true, the projectile won't cause any logging. Used for hallucinations and shit. + var/do_not_log = FALSE /// We ignore mobs with these factions. var/list/ignored_factions @@ -377,7 +379,7 @@ if(reagents?.reagent_list) reagent_note = "REAGENTS: [pretty_string_from_reagent_list(reagents.reagent_list)]" - if(ismob(firer)) + if(ismob(firer) && !do_not_log) log_combat(firer, living_target, "shot", src, reagent_note) return BULLET_ACT_HIT @@ -387,11 +389,12 @@ var/list/logging_mobs = firing_vehicle.return_controllers_with_flag(VEHICLE_CONTROL_EQUIPMENT) if(!LAZYLEN(logging_mobs)) logging_mobs = firing_vehicle.return_drivers() - for(var/mob/logged_mob as anything in logging_mobs) - log_combat(logged_mob, living_target, "shot", src, "from inside [firing_vehicle][logging_mobs.len > 1 ? " with multiple occupants" : null][reagent_note ? " and contained [reagent_note]" : null]") + if(!do_not_log) + for(var/mob/logged_mob as anything in logging_mobs) + log_combat(logged_mob, living_target, "shot", src, "from inside [firing_vehicle][logging_mobs.len > 1 ? " with multiple occupants" : null][reagent_note ? " and contained [reagent_note]" : null]") return BULLET_ACT_HIT - - living_target.log_message("has been shot by [firer] with [src][reagent_note ? " containing [reagent_note]" : null]", LOG_ATTACK, color="orange") + if(!do_not_log) + living_target.log_message("has been shot by [firer] with [src][reagent_note ? " containing [reagent_note]" : null]", LOG_ATTACK, color="orange") return BULLET_ACT_HIT /obj/projectile/proc/vol_by_damage() @@ -609,6 +612,8 @@ // if pass_flags match, pass through entirely - unless direct target is set. if((target.pass_flags_self & pass_flags) && !direct_target) return FALSE + if(HAS_TRAIT(target, TRAIT_UNHITTABLE_BY_PROJECTILES)) + return FALSE if(!ignore_source_check && firer) var/mob/M = firer if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target))) @@ -722,7 +727,7 @@ if(ismovable(A)) var/atom/movable/AM = A if(AM.throwing) - return (projectile_phasing & LETPASSTHROW)? PROJECTILE_PIERCE_PHASE : ((projectile_piercing & LETPASSTHROW)? PROJECTILE_PIERCE_HIT : PROJECTILE_PIERCE_NONE) + return (projectile_phasing & LETPASSTHROW) ? PROJECTILE_PIERCE_PHASE : ((projectile_piercing & LETPASSTHROW)? PROJECTILE_PIERCE_HIT : PROJECTILE_PIERCE_NONE) return PROJECTILE_PIERCE_NONE /obj/projectile/proc/check_ricochet(atom/A) @@ -789,7 +794,7 @@ SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) if(firer) SEND_SIGNAL(firer, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE, src, fired_from, original) - if(!log_override && firer && original) + 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. if(direct_target && (get_dist(direct_target, get_turf(fired_from)) <= 1)) // point blank shots // SKYRAT EDIT - ORIGINAL: if(direct_target && (get_dist(direct_target, get_turf(src)) <= 1)) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 5845ac0c990..d78b9ec5a31 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -11,7 +11,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_system = OVERLAY_LIGHT light_range = 1 - light_power = 1 + light_power = 1.4 light_color = COLOR_SOFT_RED ricochets_max = 50 //Honk! ricochet_chance = 80 diff --git a/code/modules/projectiles/projectile/bullets/cannonball.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm index 2f57a3dcc99..1d6108ed33f 100644 --- a/code/modules/projectiles/projectile/bullets/cannonball.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -42,7 +42,7 @@ /obj/projectile/bullet/cannonball/explosive name = "explosive shell" - color = "#FF0000" + color = COLOR_RED projectile_piercing = NONE damage = 40 //set to 30 before first mob impact, but they're gonna be gibbed by the explosion diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 9bdd5a145ea..914019b9792 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -54,7 +54,7 @@ jitter = 40 SECONDS range = 7 icon_state = "spark" - color = "#FFFF00" + color = COLOR_YELLOW embedding = null /obj/projectile/bullet/shotgun_frag12 diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index 7eb0945b18b..1bb7988e4ba 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -40,7 +40,7 @@ else com.target_ref = null - addtimer(CALLBACK(src, PROC_REF(pop), teletarget), 30) + addtimer(CALLBACK(src, PROC_REF(pop), teletarget), 3 SECONDS) /obj/effect/nettingportal/proc/pop(teletarget) if(teletarget) diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index c2a2247a00e..4cd2ea049e0 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -10,12 +10,12 @@ hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray var/static/list/particle_colors = list( - "red" = "#FF0000", - "blue" = "#00FF00", - "green" = "#0000FF", - "yellow" = "#FFFF00", - "cyan" = "#00FFFF", - "purple" = "#FF00FF" + "red" = COLOR_RED, + "blue" = COLOR_VIBRANT_LIME, + "green" = COLOR_BLUE, + "yellow" = COLOR_YELLOW, + "cyan" = COLOR_CYAN, + "purple" = COLOR_MAGENTA ) /obj/projectile/energy/nuclear_particle/Initialize(mapload) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 67cbd4352ee..40a5fc723cb 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -1,8 +1,9 @@ /obj/projectile/energy/electrode name = "electrode" icon_state = "spark" - color = "#FFFF00" - stamina = 80 // SKYRAT EDIT CHANGE + color = COLOR_YELLOW + stamina = 70 // SKYRAT EDIT CHANGE + paralyze = 10 SECONDS stutter = 10 SECONDS jitter = 40 SECONDS hitsound = 'sound/weapons/taserhit.ogg' @@ -24,7 +25,7 @@ if(C.dna && C.dna.check_mutation(/datum/mutation/human/hulk)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if(!C.check_stun_immunity(CANKNOCKDOWN)) - addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 5) + addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 0.5 SECONDS) /obj/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet do_sparks(1, TRUE, src) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index ae91fb6c603..e52d38b3da1 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -362,24 +362,23 @@ /obj/projectile/magic/wipe/proc/possession_test(mob/living/carbon/target) var/datum/brain_trauma/special/imaginary_friend/trapped_owner/trauma = target.gain_trauma(/datum/brain_trauma/special/imaginary_friend/trapped_owner) - var/poll_message = "Do you want to play as [target.real_name]?" + var/poll_message = "Do you want to play as [span_danger(target.real_name)]?" if(target.mind) - poll_message = "[poll_message] Job:[target.mind.assigned_role.title]." + poll_message = "[poll_message] Job:[span_notice(target.mind.assigned_role.title)]." if(target.mind && target.mind.special_role) - poll_message = "[poll_message] Status:[target.mind.special_role]." + poll_message = "[poll_message] Status:[span_boldnotice(target.mind.special_role)]." else if(target.mind) var/datum/antagonist/A = target.mind.has_antag_datum(/datum/antagonist/) if(A) - poll_message = "[poll_message] Status:[A.name]." - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob(poll_message, check_jobban = ROLE_PAI, poll_time = 10 SECONDS, target_mob = target, pic_source = target, role_name_text = "bolt of possession") + poll_message = "[poll_message] Status:[span_boldnotice(A.name)]." + var/mob/chosen_one = SSpolling.poll_ghosts_for_target(poll_message, check_jobban = ROLE_PAI, poll_time = 10 SECONDS, checked_target = target, alert_pic = target, role_name_text = "bolt of possession") if(target.stat == DEAD)//boo. return - if(LAZYLEN(candidates)) - var/mob/dead/observer/ghost = pick(candidates) + if(chosen_one) to_chat(target, span_boldnotice("You have been noticed by a ghost and it has possessed you!")) var/oldkey = target.key target.ghostize(FALSE) - target.key = ghost.key + target.key = chosen_one.key trauma.friend.key = oldkey trauma.friend.reset_perspective(null) trauma.friend.Show() diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm index 1a23b653a05..5fbcbb98dd6 100644 --- a/code/modules/projectiles/projectile/special/gravity.dm +++ b/code/modules/projectiles/projectile/special/gravity.dm @@ -5,7 +5,7 @@ hitsound = 'sound/weapons/wave.ogg' damage = 0 damage_type = BRUTE - color = "#33CCFF" + color = COLOR_BLUE_LIGHT var/turf/T var/power = 4 var/list/thrown_items = list() @@ -72,7 +72,7 @@ hitsound = 'sound/weapons/wave.ogg' damage = 0 damage_type = BRUTE - color = "#101010" + color = COLOR_FULL_TONER_BLACK var/turf/T var/power = 4 var/list/thrown_items = list() diff --git a/code/modules/projectiles/projectile/special/lightbreaker.dm b/code/modules/projectiles/projectile/special/lightbreaker.dm deleted file mode 100644 index 2be6d9e4470..00000000000 --- a/code/modules/projectiles/projectile/special/lightbreaker.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/projectile/energy/fisher - name = "attenuated kinetic force" - alpha = 0 - damage = 0 - damage_type = BRUTE - armor_flag = BOMB - range = 21 - projectile_phasing = PASSTABLE | PASSMOB | PASSMACHINE | PASSSTRUCTURE - hitscan = TRUE - var/disrupt_duration = 10 SECONDS - -/obj/projectile/energy/fisher/on_hit(atom/target, blocked, pierce_hit) - . = ..() - var/lights_flickered = 0 - if(SEND_SIGNAL(target, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) - lights_flickered++ - if(!isliving(target)) - return - var/list/things_to_disrupt = list() - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - things_to_disrupt = human_target.get_all_gear() - else - var/mob/living/living_target = target // i guess this covers borgs too? - things_to_disrupt = living_target.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE) - for(var/obj/item/thingy as anything in things_to_disrupt) - if(SEND_SIGNAL(thingy, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) - lights_flickered++ - if(lights_flickered) - to_chat(target, span_warning("Your light [lights_flickered > 1 ? "sources flick" : "source flicks"] off.")) - -/obj/projectile/energy/fisher/melee - range = 1 - suppressed = SUPPRESSED_VERY - disrupt_duration = 20 SECONDS diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 22082d3809f..dd9f18a114a 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -72,6 +72,7 @@ among other potential differences. This granularity is helpful for things like t /obj/projectile/bullet/rocket/weak name = "low-yield rocket" desc = "Boom, but less so." + icon_state = "low_yield_rocket" damage = 30 /obj/projectile/bullet/rocket/weak/do_boom(atom/target, blocked=0) @@ -101,6 +102,7 @@ among other potential differences. This granularity is helpful for things like t /obj/projectile/bullet/rocket/pep name = "precise explosive missile" desc = "Human friendly, metal unfriendly." + icon_state = "low_yield_rocket" damage = 30 anti_armour_damage = 80 //Doesn't (probably) kill borgs in one shot, but it will hurt random_crits_enabled = FALSE //yeah, no diff --git a/code/modules/projectiles/projectile/special/saboteur.dm b/code/modules/projectiles/projectile/special/saboteur.dm new file mode 100644 index 00000000000..4ef6b9ffcbe --- /dev/null +++ b/code/modules/projectiles/projectile/special/saboteur.dm @@ -0,0 +1,30 @@ +/obj/projectile/energy/fisher + name = "attenuated kinetic force" + alpha = 0 + damage = 0 + damage_type = BRUTE + armor_flag = BOMB + range = 21 + projectile_phasing = PASSTABLE | PASSMOB | PASSMACHINE | PASSSTRUCTURE + hitscan = TRUE + var/disrupt_duration = 15 SECONDS + +/obj/projectile/energy/fisher/on_hit(atom/target, blocked, pierce_hit) + . = ..() + var/list/things_to_disrupt = list(target) + if(isliving(target)) + var/mob/living/live_target = target + things_to_disrupt += live_target.get_all_gear() + + var/success = FALSE + for(var/atom/disrupted as anything in things_to_disrupt) + if(SEND_SIGNAL(disrupted, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) + success = TRUE + + if(success && ismob(firer)) + target.balloon_alert(firer, "disrupted") + +/obj/projectile/energy/fisher/melee + range = 1 + suppressed = SUPPRESSED_VERY + disrupt_duration = 25 SECONDS diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm index 90eadd0bb09..dbcb6f4cf8b 100644 --- a/code/modules/projectiles/projectile/special/wormhole.dm +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -6,7 +6,7 @@ pass_flags = PASSGLASS | PASSTABLE | PASSGRILLE | PASSMOB //Weakref to the thing that shot us var/datum/weakref/gun - color = "#33CCFF" + color = COLOR_BLUE_LIGHT tracer_type = /obj/effect/projectile/tracer/wormhole impact_type = /obj/effect/projectile/impact/wormhole muzzle_type = /obj/effect/projectile/muzzle/wormhole diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index d32cd92361b..3fe2e482f3e 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -255,53 +255,9 @@ //if we reached here means we have found our specific reagent type so break if(!include_subtypes) - break + return total_removed_amount - return total_removed_amount - -/** - * Removes a reagent at random and by a random quantity till the specified amount has been removed. - * Used to create a shower/spray effect for e.g. when you spill a bottle or turn a shower on - * and you want an chaotic effect of whatever coming out - * Arguments - * - * * amount- the volume to remove - */ -/datum/reagents/proc/remove_any(amount = 1) - if(!IS_FINITE(amount)) - stack_trace("non finite amount passed to remove any reagent [amount]") - return FALSE - - amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) - if(amount <= 0) - return FALSE - - var/list/cached_reagents = reagent_list - var/total_removed = 0 - var/current_list_element = 1 - var/initial_list_length = cached_reagents.len //stored here because removing can cause some reagents to be deleted, ergo length change. - - current_list_element = rand(1, cached_reagents.len) - - while(total_removed != amount) - if(total_removed >= amount) - break - if(total_volume <= 0 || !cached_reagents.len) - break - - if(current_list_element > cached_reagents.len) - current_list_element = 1 - - var/datum/reagent/target_holder = cached_reagents[current_list_element] - var/remove_amt = min(amount - total_removed, round(amount / rand(2, initial_list_length), round(amount / 10, 0.01))) //double round to keep it at a somewhat even spread relative to amount without getting funky numbers. - //min ensures we don't go over amount. - remove_reagent(target_holder.type, remove_amt) - - current_list_element++ - total_removed += remove_amt - - handle_reactions() - return total_removed //this should be amount unless the loop is prematurely broken, in which case it'll be lower. It shouldn't ever go OVER amount. + return round(total_removed_amount, CHEMICAL_VOLUME_ROUNDING) /** * Removes all reagents either proportionally(amount is the direct volume to remove) @@ -336,8 +292,8 @@ part /= total_volume for(var/datum/reagent/reagent as anything in cached_reagents) total_removed_amount += remove_reagent(reagent.type, reagent.volume * part) - handle_reactions() + return round(total_removed_amount, CHEMICAL_VOLUME_ROUNDING) /** diff --git a/code/modules/reagents/chemistry/holder/ui_data.dm b/code/modules/reagents/chemistry/holder/ui_data.dm index 39ceaaa06f0..97820c2fd6c 100644 --- a/code/modules/reagents/chemistry/holder/ui_data.dm +++ b/code/modules/reagents/chemistry/holder/ui_data.dm @@ -171,7 +171,7 @@ has_product = FALSE var/list/names = splittext("[reaction.type]", "/") var/product_name = names[names.len] - data["reagent_mode_recipe"] = list("name" = product_name, "id" = reaction.type, "hasProduct" = has_product, "reagentCol" = "#FFFFFF", "thermodynamics" = generate_thermodynamic_profile(reaction), "explosive" = generate_explosive_profile(reaction), "lowerpH" = reaction.optimal_ph_min, "upperpH" = reaction.optimal_ph_max, "thermics" = determine_reaction_thermics(reaction), "thermoUpper" = reaction.rate_up_lim, "minPurity" = reaction.purity_min, "inversePurity" = "N/A", "tempMin" = reaction.required_temp, "explodeTemp" = reaction.overheat_temp, "reqContainer" = container_name, "subReactLen" = 1, "subReactIndex" = 1) + data["reagent_mode_recipe"] = list("name" = product_name, "id" = reaction.type, "hasProduct" = has_product, "reagentCol" = COLOR_WHITE, "thermodynamics" = generate_thermodynamic_profile(reaction), "explosive" = generate_explosive_profile(reaction), "lowerpH" = reaction.optimal_ph_min, "upperpH" = reaction.optimal_ph_max, "thermics" = determine_reaction_thermics(reaction), "thermoUpper" = reaction.rate_up_lim, "minPurity" = reaction.purity_min, "inversePurity" = "N/A", "tempMin" = reaction.required_temp, "explodeTemp" = reaction.overheat_temp, "reqContainer" = container_name, "subReactLen" = 1, "subReactIndex" = 1) //If we do have a product then we find it else diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index c5afe257fda..80afcc534b0 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -12,14 +12,12 @@ /// The cell used to dispense reagents var/obj/item/stock_parts/cell/cell - /// Efficiency used when converting cell power to reagents - var/powerefficiency = 0.1 + /// Efficiency used when converting cell power to reagents. Units (volume) per joule. + var/powerefficiency = 1e-4 /// The current amount this machine is dispensing var/amount = 30 - /// The rate at which this machine recharges the power cell - var/recharge_amount = 10 - /// Keep track of the intervals made during recharges - var/recharge_counter = 0 + /// The rate at which this machine recharges the power cell. + var/recharge_amount = 1.25 KILO WATTS /// The temperature reagents are dispensed into the beaker var/dispensed_temperature = DEFAULT_REAGENT_TEMPERATURE /// If the UI has the pH meter shown @@ -178,8 +176,8 @@ . += span_notice("[src]'s maintenance hatch is open!") if(in_range(user, src) || isobserver(user)) . += "The status display reads:\n\ - Recharging [recharge_amount] power units per interval.\n\ - Power efficiency increased by [round((powerefficiency * 1000) -100, 1)]%." + Recharge rate: [display_power(recharge_amount, convert = FALSE)].\n\ + Energy cost: [siunit(INVERSE(powerefficiency), "J/u", 3)].
" . += span_notice("Use RMB to eject a stored beaker.") /obj/machinery/chem_dispenser/on_set_is_operational(old_value) @@ -189,13 +187,11 @@ begin_processing() /obj/machinery/chem_dispenser/process(seconds_per_tick) - if (recharge_counter >= 8) - var/usedpower = cell.give(recharge_amount) - if(usedpower) - use_power(active_power_usage + recharge_amount) - recharge_counter = 0 + if(cell.maxcharge == cell.charge) return - recharge_counter += seconds_per_tick + use_energy(active_power_usage * seconds_per_tick) //Additional power cost before charging the cell. + charge_cell(recharge_amount * seconds_per_tick, cell) //This also costs power. + /obj/machinery/chem_dispenser/proc/display_beaker() var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") @@ -263,15 +259,14 @@ is_hallucinating = !!living_user.has_status_effect(/datum/status_effect/hallucination) ui.set_autoupdate(!is_hallucinating) //to not ruin the immersion by constantly changing the fake chemicals -/obj/machinery/chem_dispenser/ui_static_data(mob/user) - . = ..() - .["showpH"] = show_ph - /obj/machinery/chem_dispenser/ui_data(mob/user) . = list() .["amount"] = amount - .["energy"] = cell.charge ? cell.charge * powerefficiency : 0 //To prevent NaN in the UI. - .["maxEnergy"] = cell.maxcharge * powerefficiency + .["energy"] = cell.charge ? cell.charge : 0 //To prevent NaN in the UI. + .["maxEnergy"] = cell.maxcharge + .["displayedEnergy"] = display_energy(cell.charge) + .["displayedMaxEnergy"] = display_energy(cell.maxcharge) + .["showpH"] = isnull(recording_recipe) ? show_ph : FALSE //virtual beakers have no ph to compute & display var/list/chemicals = list() var/is_hallucinating = FALSE @@ -306,7 +301,7 @@ beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) - for(var/datum/reagent/reagent in beaker.reagents.reagent_list) + for(var/datum/reagent/reagent as anything in beaker.reagents.reagent_list) beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING))) // list in a list because Byond merges the first list... beaker_data["contents"] = beakerContents .["beaker"] = beaker_data @@ -505,12 +500,12 @@ /obj/machinery/chem_dispenser/RefreshParts() . = ..() recharge_amount = initial(recharge_amount) - var/newpowereff = 0.0666666 + var/newpowereff = INVERSE(1.5e4) var/parts_rating = 0 for(var/obj/item/stock_parts/cell/stock_cell in component_parts) cell = stock_cell for(var/datum/stock_part/matter_bin/matter_bin in component_parts) - newpowereff += 0.0166666666 * matter_bin.tier + newpowereff += matter_bin.tier / 6e4 parts_rating += matter_bin.tier for(var/datum/stock_part/capacitor/capacitor in component_parts) recharge_amount *= capacitor.tier @@ -539,7 +534,7 @@ dispensable_reagents -= upgrade3_reagents //SKYRAT EDIT END parts_rating += servo.tier - powerefficiency = round(newpowereff, 0.01) + powerefficiency = round(newpowereff, 1e-5) /obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(!user) @@ -694,8 +689,7 @@ /obj/machinery/chem_dispenser/drinks/fullupgrade //fully ugpraded stock parts, emagged desc = "Contains a large reservoir of soft drinks. This model has had its safeties shorted out." - obj_flags = CAN_BE_HIT | EMAGGED | NO_DECONSTRUCTION - circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/fullupgrade + obj_flags = CAN_BE_HIT | EMAGGED /obj/machinery/chem_dispenser/drinks/fullupgrade/Initialize(mapload) . = ..() @@ -757,7 +751,7 @@ /obj/machinery/chem_dispenser/drinks/beer/fullupgrade //fully ugpraded stock parts, emagged desc = "Contains a large reservoir of the good stuff. This model has had its safeties shorted out." - obj_flags = CAN_BE_HIT | EMAGGED | NO_DECONSTRUCTION + obj_flags = CAN_BE_HIT | EMAGGED circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer/fullupgrade /obj/machinery/chem_dispenser/drinks/beer/fullupgrade/Initialize(mapload) @@ -781,7 +775,6 @@ /obj/machinery/chem_dispenser/mutagensaltpeter name = "botanical chemical dispenser" desc = "Creates and dispenses chemicals useful for botany." - obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION circuit = /obj/item/circuitboard/machine/chem_dispenser/mutagensaltpeter /// The default list of dispensable reagents available in the mutagensaltpeter chem dispenser @@ -807,7 +800,7 @@ /obj/machinery/chem_dispenser/fullupgrade //fully ugpraded stock parts, emagged desc = "Creates and dispenses chemicals. This model has had its safeties shorted out." - obj_flags = CAN_BE_HIT | EMAGGED | NO_DECONSTRUCTION + obj_flags = CAN_BE_HIT | EMAGGED circuit = /obj/item/circuitboard/machine/chem_dispenser/fullupgrade /obj/machinery/chem_dispenser/fullupgrade/Initialize(mapload) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index a07fd289f07..857cd5bd221 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -25,15 +25,14 @@ create_reagents(200, NO_REACT) register_context() -/obj/machinery/chem_heater/on_deconstruction(disassembled) - beaker?.forceMove(drop_location()) - /obj/machinery/chem_heater/Destroy() if(beaker) UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) QDEL_NULL(beaker) return ..() +/obj/machinery/chem_heater/on_deconstruction(disassembled) + beaker?.forceMove(drop_location()) /obj/machinery/chem_heater/add_context(atom/source, list/context, obj/item/held_item, mob/user) if(isnull(held_item) || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) @@ -60,10 +59,74 @@ return NONE +/obj/machinery/chem_heater/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += span_notice("The status display reads: Heating reagents at [heater_coefficient * 1000]% speed.") + if(!QDELETED(beaker)) + . += span_notice("It has a beaker of [beaker.reagents.total_volume] units capacity.") + if(beaker.reagents.is_reacting) + . += span_notice("Its contents are currently reacting.") + else + . += span_warning("There is no beaker inserted.") + . += span_notice("Its heating is turned [on ? "On" : "Off"].") + . += span_notice("The status display reads: Heating reagents at [heater_coefficient * 1000]% speed.") + if(panel_open) + . += span_notice("Its panel is open and can now be [EXAMINE_HINT("pried")] apart.") + else + . += span_notice("Its panel can be [EXAMINE_HINT("pried")] open") + /obj/machinery/chem_heater/update_icon_state() icon_state = "[base_icon_state][beaker ? 1 : 0]b" return ..() +/obj/machinery/chem_heater/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) + UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) + beaker = null + update_appearance() + +/obj/machinery/chem_heater/RefreshParts() + . = ..() + heater_coefficient = 0.1 + for(var/datum/stock_part/micro_laser/micro_laser in component_parts) + heater_coefficient *= micro_laser.tier + + +/obj/machinery/chem_heater/item_interaction(mob/living/user, obj/item/held_item, list/modifiers, is_right_clicking) + if((held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) + return ..() + + 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.afterattack(beaker, user, proximity_flag = TRUE) + 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 + + return ..() + +/obj/machinery/chem_heater/wrench_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/chem_heater/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_screwdriver(user, "mixer0b", "[base_icon_state][beaker ? 1 : 0]b", tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/chem_heater/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + /obj/machinery/chem_heater/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) @@ -73,13 +136,6 @@ replace_beaker(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/chem_heater/Exited(atom/movable/gone, direction) - . = ..() - if(gone == beaker) - UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) - beaker = null - update_appearance() - /obj/machinery/chem_heater/attack_robot_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) @@ -109,12 +165,6 @@ return TRUE -/obj/machinery/chem_heater/RefreshParts() - . = ..() - heater_coefficient = 0.1 - for(var/datum/stock_part/micro_laser/micro_laser in component_parts) - heater_coefficient *= micro_laser.tier - /** * Heats the reagents of the currently inserted beaker only if machine is on & beaker has some reagents inside * Arguments @@ -129,7 +179,7 @@ //heat the beaker and use some power. we want to use only a small amount of power since this proc gets called frequently beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) - use_power(active_power_usage * seconds_per_tick * 0.3) + use_energy(active_power_usage * seconds_per_tick * 0.3) return TRUE /obj/machinery/chem_heater/proc/on_reaction_step(datum/reagents/holder, num_reactions, seconds_per_tick) @@ -142,23 +192,6 @@ for(var/datum/tgui/ui in src.open_uis) ui.send_update() -/obj/machinery/chem_heater/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Heating reagents at [heater_coefficient * 1000]% speed.") - if(!QDELETED(beaker)) - . += span_notice("It has a beaker of [beaker.reagents.total_volume] units capacity.") - if(beaker.reagents.is_reacting) - . += span_notice("Its contents are currently reacting.") - else - . += span_warning("There is no beaker inserted.") - . += span_notice("Its heating is turned [on ? "On" : "Off"].") - . += span_notice("The status display reads: Heating reagents at [heater_coefficient * 1000]% speed.") - if(panel_open) - . += span_notice("Its panel is open and can now be [EXAMINE_HINT("pried")] apart.") - else - . += span_notice("Its panel can be [EXAMINE_HINT("pried")] open") - /obj/machinery/chem_heater/process(seconds_per_tick) //is_reacting is handled in reaction_step() if(QDELETED(beaker) || beaker.reagents.is_reacting) @@ -172,39 +205,6 @@ for(var/datum/tgui/ui in src.open_uis) ui.send_update() -/obj/machinery/chem_heater/wrench_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/chem_heater/screwdriver_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_deconstruction_screwdriver(user, "mixer0b", "[base_icon_state][beaker ? 1 : 0]b", tool)) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/chem_heater/crowbar_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_BLOCKING - if(default_deconstruction_crowbar(tool)) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/chem_heater/attackby(obj/item/held_item, mob/user, params) - if((held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) - return ..() - - if(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.afterattack(beaker, user, proximity_flag = TRUE) - return TRUE - - 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 TRUE - - return ..() - /obj/machinery/chem_heater/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) diff --git a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm index c871fa47110..298fe259814 100644 --- a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm +++ b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm @@ -1,21 +1,16 @@ - -#define BEAKER1 1 -#define BEAKER2 2 - /obj/machinery/chem_mass_spec name = "High-performance liquid chromatography machine" - desc = {"This machine can separate reagents based on charge, meaning it can clean reagents of some of their impurities, unlike the Chem Master 3000. -By selecting a range in the mass spectrograph certain reagents will be transferred from one beaker to another, which will clean it of any impurities up to a certain amount. -This will not clean any inverted reagents. Inverted reagents will still be correctly detected and displayed on the scanner, however. -\nLeft click with a beaker to add it to the input slot, Right click with a beaker to add it to the output slot. Alt + left/right click can let you quickly remove the corresponding beaker."} - density = TRUE - layer = BELOW_OBJ_LAYER + desc = "Allows you to purify reagents & seperate out inverse reagents" icon = 'icons/obj/medical/chemical.dmi' icon_state = "HPLC" base_icon_state = "HPLC" + density = TRUE + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_REQUIRES_ANCHORED idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.2 resistance_flags = FIRE_PROOF | ACID_PROOF + processing_flags = START_PROCESSING_MANUALLY circuit = /obj/item/circuitboard/machine/chem_mass_spec + ///If we're processing reagents or not var/processing_reagents = FALSE ///Time we started processing + the delay @@ -37,158 +32,244 @@ This will not clean any inverted reagents. Inverted reagents will still be corre /obj/machinery/chem_mass_spec/Initialize(mapload) . = ..() + ADD_TRAIT(src, TRAIT_DO_NOT_SPLASH, INNATE_TRAIT) + if(mapload) beaker2 = new /obj/item/reagent_containers/cup/beaker/large(src) - AddElement( \ - /datum/element/contextual_screentip_bare_hands, \ - lmb_text = "Add input beaker", \ - rmb_text = "Add output beaker", \ - ) + register_context() /obj/machinery/chem_mass_spec/Destroy() QDEL_NULL(beaker1) QDEL_NULL(beaker2) return ..() -/obj/machinery/chem_mass_spec/RefreshParts() - . = ..() - cms_coefficient = 1 - for(var/datum/stock_part/micro_laser/laser in component_parts) - cms_coefficient /= laser.tier - /obj/machinery/chem_mass_spec/on_deconstruction(disassembled) - if(beaker1) - beaker1.forceMove(drop_location()) - beaker1 = null - if(beaker2) - beaker2.forceMove(drop_location()) - beaker2 = null + var/location = drop_location() + beaker1?.forceMove(location) + beaker2?.forceMove(location) + +/obj/machinery/chem_mass_spec/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + + if(!QDELETED(beaker1)) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Eject input beaker" + . = CONTEXTUAL_SCREENTIP_SET + if(!QDELETED(beaker2)) + context[SCREENTIP_CONTEXT_ALT_RMB] = "Eject output beaker" + . = CONTEXTUAL_SCREENTIP_SET + + if(isnull(held_item) || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) + return + + if(is_reagent_container(held_item)) + if(QDELETED(beaker1)) + context[SCREENTIP_CONTEXT_LMB] = "Insert input beaker" + else + context[SCREENTIP_CONTEXT_LMB] = "Replace input beaker" + + if(QDELETED(beaker2)) + context[SCREENTIP_CONTEXT_RMB] = "Insert output beaker" + else + context[SCREENTIP_CONTEXT_RMB] = "Replace output beaker" + + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" + return CONTEXTUAL_SCREENTIP_SET + else if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/chem_mass_spec/examine(mob/user) + . = ..() + + if(!QDELETED(beaker1)) + . += span_notice("Input beaker of [beaker1.reagents.maximum_volume]u capacity is inserted.") + . += span_notice("Its Input beaker Can be ejected with [EXAMINE_HINT("LMB Alt")] click.") + else + . += span_warning("Its missing an input beaker. insert with [EXAMINE_HINT("Left Click")].") + if(!QDELETED(beaker2)) + . += span_notice("Output beaker of [beaker2.reagents.maximum_volume]u capacity is inserted.") + . += span_notice("Its Output beaker can be ejected with [EXAMINE_HINT("RMB Alt")] click.") + else + . += span_warning("Its missing an output beaker, insert with [EXAMINE_HINT("Right Click")].") + + if(anchored) + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") + else + . += span_warning("Needs to be [EXAMINE_HINT("wrenched")] to use.") + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + if(panel_open) + . += span_notice("It can be [EXAMINE_HINT("pried")] apart.") /obj/machinery/chem_mass_spec/update_overlays() . = ..() + if(panel_open) . += mutable_appearance(icon, "[base_icon_state]_panel-o") - -/obj/machinery/chem_mass_spec/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return ITEM_INTERACT_SUCCESS - -/* beaker swapping/attack code */ - -/obj/machinery/chem_mass_spec/attackby(obj/item/item, mob/user, params) - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return ..() - - if(default_deconstruction_screwdriver(user, icon_state, icon_state, item)) - update_appearance() return - if(is_reagent_container(item) && !(item.item_flags & ABSTRACT) && item.is_open_container()) - var/obj/item/reagent_containers/beaker = item - . = TRUE //no afterattack - if(!user.transferItemToLoc(beaker, src)) - return - replace_beaker(user, BEAKER1, beaker) - to_chat(user, span_notice("You add [beaker] to [src].")) - update_appearance() - ui_interact(user) - return - ..() - -/obj/machinery/chem_mass_spec/attackby_secondary(obj/item/item, mob/user, params) - . = ..() - - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return - - if(default_deconstruction_crowbar(item)) - return - - if(is_reagent_container(item) && !(item.item_flags & ABSTRACT) && item.is_open_container()) - var/obj/item/reagent_containers/beaker = item - if(!user.transferItemToLoc(beaker, src)) - return - replace_beaker(user, BEAKER2, beaker) - to_chat(user, span_notice("You add [beaker] to [src].")) - ui_interact(user) - . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - update_appearance() - -/obj/machinery/chem_mass_spec/AltClick(mob/living/user) - . = ..() - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return - if(!can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return ..() - replace_beaker(user, BEAKER1) - -/obj/machinery/chem_mass_spec/alt_click_secondary(mob/living/user) - . = ..() - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return - if(!can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - replace_beaker(user, BEAKER2) - -///Gee how come you get two beakers? -/* - * Similar to other replace beaker procs, except now there are two of them! - * When passed a beaker along with a position define it will swap a beaker in that slot (if there is one) with the beaker the machine is bonked with - * - * arguments: - * * user - The one bonking the machine - * * target beaker - the define (BEAKER1/BEAKER2) of what position to replace - * * new beaker - the new beaker to add/replace the slot with - */ -/obj/machinery/chem_mass_spec/proc/replace_beaker(mob/living/user, target_beaker, obj/item/reagent_containers/new_beaker) - if(!user) - return FALSE - switch(target_beaker) - if(BEAKER1) - if(beaker1) - try_put_in_hand(beaker1, user) - beaker1 = null - beaker1 = new_beaker - lower_mass_range = calculate_smallest_mass() - upper_mass_range = calculate_largest_mass() - if(BEAKER2) - if(beaker2) - try_put_in_hand(beaker2, user) - beaker2 = null - beaker2 = new_beaker - update_appearance() - return TRUE - -/* Icon code */ - -/obj/machinery/chem_mass_spec/update_icon_state() - if(powered()) - icon_state = "HPLC_on" - else - icon_state = "HPLC" - return ..() - -/obj/machinery/chem_mass_spec/update_overlays() - . = ..() - if(beaker1) + if(!QDELETED(beaker1)) . += "HPLC_beaker1" - if(beaker2) + if(!QDELETED(beaker2)) . += "HPLC_beaker2" - if(powered()) + + if(is_operational && !panel_open && anchored && !(machine_stat & (BROKEN | NOPOWER))) if(processing_reagents) . += "HPLC_graph_active" else if (length(beaker1?.reagents.reagent_list)) . += "HPLC_graph_idle" -/* UI Code */ +/obj/machinery/chem_mass_spec/update_icon_state() + if(is_operational && !panel_open && anchored && !(machine_stat & (BROKEN | NOPOWER))) + icon_state = "HPLC_on" + else + icon_state = "HPLC" + return ..() + +/obj/machinery/chem_mass_spec/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker1) + beaker1 = null + if(gone == beaker2) + beaker2 = null + +/obj/machinery/chem_mass_spec/RefreshParts() + . = ..() + + cms_coefficient = 1 + for(var/datum/stock_part/micro_laser/laser in component_parts) + cms_coefficient /= laser.tier + +/obj/machinery/chem_mass_spec/item_interaction(mob/living/user, obj/item/item, list/modifiers, is_right_clicking) + if((item.item_flags & ABSTRACT) || (item.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + return ..() + + if(is_reagent_container(item) && item.is_open_container()) + if(processing_reagents) + balloon_alert(user, "still processing!") + return ITEM_INTERACT_BLOCKING + + var/obj/item/reagent_containers/beaker = item + if(!user.transferItemToLoc(beaker, src)) + return ITEM_INTERACT_BLOCKING + + 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 + + return ..() + +/obj/machinery/chem_mass_spec/wrench_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(processing_reagents) + balloon_alert(user, "still processing!") + return . + + if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/chem_mass_spec/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(processing_reagents) + balloon_alert(user, "still processing!") + return . + + if(default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + update_appearance() + return ITEM_INTERACT_SUCCESS + +/obj/machinery/chem_mass_spec/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(processing_reagents) + balloon_alert(user, "still processing!") + return . + + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + + +/** + * Computes either the lightest or heaviest reagent in the input beaker + * Arguments + * + * * smallest - TRUE to find lightest reagent, FALSE to find heaviest reagent + */ +/obj/machinery/chem_mass_spec/proc/calculate_mass(smallest = TRUE) + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + if(QDELETED(beaker1)) + return 0 + + var/result = 0 + for(var/datum/reagent/reagent as anything in beaker1?.reagents.reagent_list) + var/datum/reagent/target = reagent + if(!istype(reagent, /datum/reagent/inverse) && (reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem)) + target = GLOB.chemical_reagents_list[reagent.inverse_chem] + + if(!result) + result = target.mass + else + result = smallest ? min(result, reagent.mass) : max(result, reagent.mass) + return smallest ? FLOOR(result, 50) : CEILING(result, 50) + +/* + * Replaces a beaker in the machine, either input or output + * Arguments + * + * * user - The one bonking the machine + * * target beaker - the target beaker we are trying to replace + * * new beaker - the new beaker to add/replace the slot with + */ +/obj/machinery/chem_mass_spec/proc/replace_beaker(mob/living/user, is_input, obj/item/reagent_containers/new_beaker) + PRIVATE_PROC(TRUE) + + 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() + + else //replace output beaker + if(!QDELETED(beaker2)) + try_put_in_hand(beaker2, user) + beaker2 = new_beaker + + update_appearance() + +///Computes time to purity reagents +/obj/machinery/chem_mass_spec/proc/estimate_time() + PRIVATE_PROC(TRUE) + + delay_time = 0 + if(QDELETED(beaker1)) + return + + for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) + //we don't bother about impure chems + if(istype(reagent, /datum/reagent/inverse) || (reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem)) + continue + //out of our selected range + if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) + continue + //already at max purity + if((initial(reagent.purity) - reagent.purity) <= 0) + continue + ///Roughly 10 - 30s? + delay_time += (((reagent.mass * reagent.volume) + (reagent.mass * reagent.get_inverse_purity() * 0.1)) * 0.0035) + 10 + + delay_time *= cms_coefficient /obj/machinery/chem_mass_spec/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -197,209 +278,215 @@ This will not clean any inverted reagents. Inverted reagents will still be corre ui.open() /obj/machinery/chem_mass_spec/ui_data(mob/user) - var/data = list() - data["graphLowerRange"] = 0 - data["lowerRange"] = lower_mass_range - data["upperRange"] = upper_mass_range - data["processing"] = processing_reagents - data["log"] = log - data["beaker1"] = beaker1 ? TRUE : FALSE - data["beaker2"] = beaker2 ? TRUE : FALSE - if(processing_reagents) - data["eta"] = delay_time - progress_time - else - data["eta"] = estimate_time() + . = list() + .["lowerRange"] = lower_mass_range + .["upperRange"] = upper_mass_range + .["processing"] = processing_reagents + .["eta"] = delay_time - progress_time + .["peakHeight"] = 0 - var/beakerContents[0] - if(beaker1 && beaker1.reagents) - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - var/in_range = TRUE - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent.mass < lower_mass_range || inverse_reagent.mass > upper_mass_range) - in_range = FALSE - beakerContents.Add(list(list("name" = inverse_reagent.name, "volume" = round(reagent.volume, 0.01), "mass" = inverse_reagent.mass, "purity" = round(reagent.get_inverse_purity(), 0.000001)*100, "selected" = in_range, "color" = "#b60046", "type" = "Inverted"))) - data["peakHeight"] = max(data["peakHeight"], reagent.volume) - continue - if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) - in_range = FALSE - ///We want to be sure that the impure chem appears after the parent chem in the list so that it always overshadows pure reagents - beakerContents.Add(list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01), "mass" = reagent.mass, "purity" = round(reagent.purity, 0.000001)*100, "selected" = in_range, "color" = "#3cf096", "type" = "Clean"))) - data["peakHeight"] = max(data["peakHeight"], reagent.volume) + //input reagents + var/list/beaker1Data = null + if(!QDELETED(beaker1)) + beaker1Data = list() + var/datum/reagents/beaker_1_reagents = beaker1.reagents + beaker1Data["currentVolume"] = beaker_1_reagents.total_volume + beaker1Data["maxVolume"] = beaker_1_reagents.maximum_volume + var/list/beakerContents = list() + for(var/datum/reagent/reagent as anything in beaker_1_reagents.reagent_list) + var/log = "" + var/datum/reagent/target = reagent + var/purity = target.purity + var/is_inverse = FALSE - data["beaker1CurrentVolume"] = beaker1.reagents.total_volume - data["beaker1MaxVolume"] = beaker1.reagents.maximum_volume - data["beaker1Contents"] = beakerContents - data["graphUpperRange"] = calculate_largest_mass() //+10 because of the range on the peak + if(istype(reagent, /datum/reagent/inverse)) + log = "Too impure to use" //we don't bother about impure chems + is_inverse = TRUE + else if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) + purity = target.get_inverse_purity() + target = GLOB.chemical_reagents_list[reagent.inverse_chem] + log = "Too impure to use" //we don't bother about impure chems + is_inverse = TRUE + else + var/initial_purity = initial(reagent.purity) + if((initial_purity - reagent.purity) <= 0) //already at max purity + log = "Cannot purify above [round(initial_purity * 100)]%" + else + log = "Ready" - beakerContents = list() - if(beaker2 && beaker2.reagents) - for(var/datum/reagent/reagent in beaker2.reagents.reagent_list) - ///Normal stuff - beakerContents.Add(list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01), "mass" = reagent.mass, "purity" = round(reagent.purity, 0.000001)*100, "color" = "#3cf096", "type" = "Clean", log = log[reagent.type]))) - data["beaker2CurrentVolume"] = beaker2.reagents.total_volume - data["beaker2MaxVolume"] = beaker2.reagents.maximum_volume - data["beaker2Contents"] = beakerContents + beakerContents += list(list( + "name" = target.name, + "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING), + "mass" = target.mass, + "purity" = round(purity * 100), + "type" = is_inverse ? "Inverted" : "Clean", + "log" = log + )) + .["peakHeight"] = max(.["peakHeight"], reagent.volume) + beaker1Data["contents"] = beakerContents + .["beaker1"] = beaker1Data - return data + //+10 because of the range on the peak + .["graphUpperRange"] = calculate_mass(smallest = FALSE) -/obj/machinery/chem_mass_spec/ui_act(action, params) + //output reagents + var/list/beaker2Data = null + if(!QDELETED(beaker2)) + beaker2Data = list() + var/datum/reagents/beaker_2_reagents = beaker2.reagents + beaker2Data["currentVolume"] = beaker_2_reagents.total_volume + beaker2Data["maxVolume"] = beaker_2_reagents.maximum_volume + var/list/beakerContents = list() + for(var/datum/reagent/reagent as anything in beaker_2_reagents.reagent_list) + beakerContents += list(list( + "name" = reagent.name, + "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING), + "mass" = reagent.mass, + "purity" = round(reagent.purity * 100), + "type" = "Clean", + "log" = log[reagent.type] + )) + beaker2Data["contents"] = beakerContents + .["beaker2"] = beaker2Data + +/obj/machinery/chem_mass_spec/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return + + if(processing_reagents) + balloon_alert(ui.user, "still processing") + return ..() + switch(action) if("activate") - if(!beaker1 || !beaker2 || !is_operational) - say("This [src] is missing an output beaker!") + if(QDELETED(beaker1)) + say("Missing input beaker!") return - if(processing_reagents) - say("You shouldn't be seeing this message! Please report this bug to https://github.com/tgstation/tgstation/issues . Thank you!") - stack_trace("Someone managed to break the HPLC and tried to get it to activate when it's already activated!") + if(QDELETED(beaker2)) + say("Missing output beaker!") return - processing_reagents = TRUE - estimate_time() + + //adjust timer for purification progress_time = 0 - update_appearance() + estimate_time() + if(delay_time <= 0) + say("No work to be done!") + return + + //start the purification process + processing_reagents = TRUE begin_processing() - . = TRUE + update_appearance() + + return TRUE + if("leftSlider") - if(!is_operational || processing_reagents) + var/value = params["value"] + if(isnull(value)) return - var/current_center = (lower_mass_range + upper_mass_range)/2 - lower_mass_range = clamp(params["value"], calculate_smallest_mass(), current_center) - . = TRUE + + value = text2num(value) + if(isnull(value)) + return + + lower_mass_range = clamp(value, calculate_mass(smallest = TRUE), (lower_mass_range + upper_mass_range) / 2) + estimate_time() + return TRUE + if("rightSlider") - if(!is_operational || processing_reagents) + var/value = params["value"] + if(isnull(value)) return - var/current_center = (lower_mass_range + upper_mass_range)/2 - upper_mass_range = clamp(params["value"], current_center, calculate_largest_mass()) - . = TRUE + + value = text2num(value) + if(isnull(value)) + return + + upper_mass_range = clamp(value, (lower_mass_range + upper_mass_range) / 2, calculate_mass(smallest = FALSE)) + estimate_time() + return TRUE + if("centerSlider") - if(!is_operational || processing_reagents) + var/value = params["value"] + if(isnull(value)) return - var/current_center = (lower_mass_range + upper_mass_range)/2 - var/delta_center = current_center - params["value"] - var/lowest = calculate_smallest_mass() - var/highest = calculate_largest_mass() + + value = text2num(value) + if(isnull(value)) + return + + var/delta_center = ((lower_mass_range + upper_mass_range) / 2) - params["value"] + var/lowest = calculate_mass(smallest = TRUE) + var/highest = calculate_mass(smallest = FALSE) lower_mass_range = clamp(lower_mass_range - delta_center, lowest, highest) upper_mass_range = clamp(upper_mass_range - delta_center, lowest, highest) - . = TRUE + estimate_time() + + return TRUE + if("eject1") - if(processing_reagents) - return - replace_beaker(usr, BEAKER1) - . = TRUE + replace_beaker(ui.user, TRUE) + return TRUE + if("eject2") - if(processing_reagents) - return - replace_beaker(usr, BEAKER2) - . = TRUE + replace_beaker(ui.user, FALSE) + return TRUE -/* processing procs */ - -///Increments time if it's progressing - if it's past time then it purifies and stops processing -/obj/machinery/chem_mass_spec/process(seconds_per_tick) +/obj/machinery/chem_mass_spec/AltClick(mob/living/user) . = ..() - if(!is_operational) - return FALSE + if(!can_interact(user)) + return + if(processing_reagents) + balloon_alert(user, "still processing!") + return ..() + replace_beaker(user, TRUE) + +/obj/machinery/chem_mass_spec/alt_click_secondary(mob/living/user) + . = ..() + if(!can_interact(user)) + return + if(processing_reagents) + balloon_alert(user, "still processing!") + return ..() + replace_beaker(user, FALSE) + +/obj/machinery/chem_mass_spec/process(seconds_per_tick) if(!processing_reagents) - return TRUE - use_power(active_power_usage) + return PROCESS_KILL + + if(!is_operational || panel_open || !anchored || (machine_stat & (BROKEN | NOPOWER))) + return + + if(!use_energy(active_power_usage * seconds_per_tick)) + return + + progress_time += seconds_per_tick if(progress_time >= delay_time) processing_reagents = FALSE progress_time = 0 - purify_reagents() - end_processing() + + log.Cut() + for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) + //we don't bother about impure chems + if(istype(reagent, /datum/reagent/inverse) || (reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem)) + continue + //out of our selected range + if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) + continue + //already at max purity + var/delta_purity = initial(reagent.purity) - reagent.purity + if(delta_purity <= 0) + continue + //add the purified reagent. More impure reagents will yield smaller amounts + var/product_vol = reagent.volume + beaker1.reagents.remove_reagent(reagent.type, product_vol) + beaker2.reagents.add_reagent(reagent.type, product_vol * (1 - delta_purity), reagtemp = beaker1.reagents.chem_temp, added_purity = initial(reagent.purity), added_ph = reagent.ph) + log[reagent.type] = "Purified to [initial(reagent.purity) * 100]%" + + //recompute everything + lower_mass_range = calculate_mass(smallest = TRUE) + upper_mass_range = calculate_mass(smallest = FALSE) + estimate_time() update_appearance() - return TRUE - progress_time += seconds_per_tick - return FALSE - -/* - * Processing through the reagents in beaker 1 - * For all the reagents within the selected range - we will then purify them up to their initial purity (usually 75%). It will take away the relative reagent volume from the sum volume of the reagent however. - * If there are any inverted reagents - then it will instead just create a new reagent of the inverted type. This doesn't really do anything other than change the name of it, - * As it processes through the reagents, it saves what changes were applied to each reagent in a log var to show the results at the end - */ -/obj/machinery/chem_mass_spec/proc/purify_reagents() - log = list() - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - //Inverse first - var/volume = reagent.volume - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent.mass < lower_mass_range || inverse_reagent.mass > upper_mass_range) - continue - log += list(inverse_reagent.type = "Cannot purify inverted") //Might as well make it do something - just updates the reagent's name - beaker2.reagents.add_reagent(reagent.inverse_chem, volume, reagtemp = beaker1.reagents.chem_temp, added_purity = reagent.get_inverse_purity()) - beaker1.reagents.remove_reagent(reagent.type, volume) - continue - - if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) - continue - - var/delta_purity = initial(reagent.purity) - reagent.purity - if(delta_purity <= 0)//As pure as we can be - so lets not add more than we need - log += list(reagent.type = "Can't purify over [initial(reagent.purity)*100]%") - beaker2.reagents.add_reagent(reagent.type, volume, reagtemp = beaker1.reagents.chem_temp, added_purity = reagent.purity, added_ph = reagent.ph) - beaker1.reagents.remove_reagent(reagent.type, volume) - continue - - var/product_vol = reagent.volume * (1-delta_purity) - beaker2.reagents.add_reagent(reagent.type, product_vol, reagtemp = beaker1.reagents.chem_temp, added_purity = initial(reagent.purity), added_ph = reagent.ph) - beaker1.reagents.remove_reagent(reagent.type, reagent.volume) - log += list(reagent.type = "Purified to [initial(reagent.purity)*100]%") - -/* Mass spec graph calcs */ - -///Returns the largest mass to the nearest 50 (rounded up) -/obj/machinery/chem_mass_spec/proc/calculate_largest_mass() - if(!beaker1?.reagents) - return 0 - var/max_mass = 0 - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - max_mass = max(max_mass, inverse_reagent.mass) - continue - max_mass = max(max_mass, reagent.mass) - return CEILING(max_mass, 50) - -///Returns the smallest mass to the nearest 50 (rounded down) -/obj/machinery/chem_mass_spec/proc/calculate_smallest_mass() - if(!beaker1?.reagents) - return 0 - var/min_mass = 0 - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - min_mass = min(min_mass, inverse_reagent.mass) - continue - min_mass = min(min_mass, reagent.mass) - return FLOOR(min_mass, 50) - -/* - * Estimates how long the highlighted range will take to process - * The time will increase based off the reagent's volume, mass and purity. - * In most cases this is between 10 to 30s for a single reagent. - * This is why having a higher mass for a reagent is a balancing tool. - */ -/obj/machinery/chem_mass_spec/proc/estimate_time() - if(!beaker1?.reagents) - return 0 - var/time = 0 - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent.mass < lower_mass_range || inverse_reagent.mass > upper_mass_range) - continue - time += (((inverse_reagent.mass * reagent.volume) + (inverse_reagent.mass * reagent.purity * 0.1)) * 0.003) + 10 ///Roughly 10 - 30s? - continue - if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) - continue - time += (((reagent.mass * reagent.volume) + (reagent.mass * reagent.get_inverse_purity() * 0.1)) * 0.0035) + 10 ///Roughly 10 - 30s? - delay_time = (time * cms_coefficient) - return delay_time - -#undef BEAKER1 -#undef BEAKER2 + return PROCESS_KILL diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 058da2fa7dc..092443db8d0 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -368,7 +368,7 @@ while(item_count > 0) if(!is_printing) break - use_power(active_power_usage) + use_energy(active_power_usage) stoplag(printing_speed) for(var/i in 1 to printing_amount_current) if(!item_count) @@ -397,7 +397,7 @@ if (!reagent) return FALSE - use_power(active_power_usage) + use_energy(active_power_usage) if (target == TARGET_BUFFER) if(!check_reactions(reagent, beaker.reagents)) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index bbde13c78a8..f08989390a2 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -198,7 +198,7 @@ if(!istype(adv_disease) || !adv_disease.mutable) to_chat(usr, span_warning("ERROR: Cannot replicate virus strain.")) return FALSE - use_power(active_power_usage) + use_energy(active_power_usage) adv_disease = adv_disease.Copy() var/list/data = list("viruses" = list(adv_disease)) var/obj/item/reagent_containers/cup/tube/bottle = new(drop_location()) @@ -220,7 +220,7 @@ * @returns {boolean} - Success or failure. */ /obj/machinery/computer/pandemic/proc/create_vaccine_bottle(index) - use_power(active_power_usage) + use_energy(active_power_usage) var/id = index var/datum/disease/disease = SSdisease.archive_diseases[id] var/obj/item/reagent_containers/cup/tube/bottle = new(drop_location()) diff --git a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm index 791feb80039..a6113d2f0c6 100644 --- a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm +++ b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm @@ -105,7 +105,7 @@ /obj/item/storage/portable_chem_mixer/ex_act(severity, target) return severity > EXPLODE_LIGHT ? ..() : FALSE -/obj/item/storage/portable_chem_mixer/attackby(obj/item/weapon, mob/user, params) +/obj/item/storage/portable_chem_mixer/item_interaction(mob/living/user, obj/item/weapon, list/modifiers, is_right_clicking) if (!atom_storage.locked || \ (weapon.item_flags & ABSTRACT) || \ (weapon.flags_1 & HOLOGRAM_1) || \ @@ -116,7 +116,7 @@ replace_beaker(user, weapon) update_appearance() - return TRUE + return ITEM_INTERACT_SUCCESS /** * Replaces the beaker of the portable chemical mixer with another beaker, or simply adds the new beaker if none is in currently @@ -185,11 +185,11 @@ beaker_data["maxVolume"] = beaker.volume beaker_data["transferAmounts"] = beaker.possible_transfer_amounts beaker_data["pH"] = round(beaker.reagents.ph, 0.01) - beaker_data["currentVolume"] = round(beaker.reagents.total_volume, 0.01) + beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent in beaker.reagents.reagent_list) - beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) // list in a list because Byond merges the first list... + beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING))) // list in a list because Byond merges the first list... beaker_data["contents"] = beakerContents .["beaker"] = beaker_data diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 6641e63520e..bdd4f125075 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -3,57 +3,41 @@ name = "\improper All-In-One Grinder" desc = "From BlenderTech. Will It Blend? Let's test it out!" icon = 'icons/obj/machines/kitchen.dmi' - icon_state = "juicer1" + icon_state = "juicer" base_icon_state = "juicer" - layer = BELOW_OBJ_LAYER + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.0025 circuit = /obj/item/circuitboard/machine/reagentgrinder pass_flags = PASSTABLE resistance_flags = ACID_PROOF + interaction_flags_machine = parent_type::interaction_flags_machine | INTERACT_MACHINE_OFFLINE anchored_tabletop_offset = 8 - var/operating = FALSE - var/obj/item/reagent_containers/beaker = null - var/limit = 10 - var/speed = 1 - var/list/holdingitems - var/static/radial_examine = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_examine") - var/static/radial_eject = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_eject") - var/static/radial_grind = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_grind") - var/static/radial_juice = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_juice") - var/static/radial_mix = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_mix") + /// The maximum weight of items this grinder can hold + var/maximum_weight = WEIGHT_CLASS_BULKY + /// Is the grinder currently performing work + var/operating = FALSE + /// The beaker to hold the final products + var/obj/item/reagent_containers/beaker = null + /// How fast operations take place + var/speed = 1 /obj/machinery/reagentgrinder/Initialize(mapload) . = ..() - holdingitems = list() - beaker = new /obj/item/reagent_containers/cup/beaker/large(src) - warn_of_dust() + + if(mapload) + beaker = new /obj/item/reagent_containers/cup/beaker/large(src) + + register_context() + update_appearance(UPDATE_OVERLAYS) + RegisterSignal(src, COMSIG_STORAGE_DUMP_CONTENT, PROC_REF(on_storage_dump)) -/// Add a description to the current beaker warning of blended dust, if it doesn't already have that warning. -/obj/machinery/reagentgrinder/proc/warn_of_dust() - if(HAS_TRAIT(beaker, TRAIT_MAY_CONTAIN_BLENDED_DUST)) - return - - beaker.desc += " May contain blended dust. Don't breathe this!" - ADD_TRAIT(beaker, TRAIT_MAY_CONTAIN_BLENDED_DUST, TRAIT_GENERIC) - -/obj/machinery/reagentgrinder/constructed/Initialize(mapload) - . = ..() - holdingitems = list() - QDEL_NULL(beaker) - update_appearance() - -/obj/machinery/reagentgrinder/on_deconstruction(disassmbled) - drop_all_items() - beaker?.forceMove(drop_location()) - beaker = null - /obj/machinery/reagentgrinder/Destroy() QDEL_NULL(beaker) return ..() /obj/machinery/reagentgrinder/contents_explosion(severity, target) - if(!beaker) + if(!QDELETED(beaker)) return switch(severity) @@ -64,11 +48,36 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/reagentgrinder/RefreshParts() - . = ..() - speed = 1 - for(var/datum/stock_part/servo/servo in component_parts) - speed = servo.tier +/obj/machinery/reagentgrinder/add_context(atom/source, list/context, obj/item/held_item, mob/user) + var/result = NONE + if(isnull(held_item)) + if(!QDELETED(beaker) && !operating) + context[SCREENTIP_CONTEXT_RMB] = "Remove beaker" + result = CONTEXTUAL_SCREENTIP_SET + return result + + if(is_reagent_container(held_item) && held_item.is_open_container() && !operating) + if(QDELETED(beaker)) + context[SCREENTIP_CONTEXT_LMB] = "Insert beaker" + else + context[SCREENTIP_CONTEXT_LMB] = "Replace beaker" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_CROWBAR && panel_open) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Una" : "A"]nchor" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/storage/bag)) + context[SCREENTIP_CONTEXT_LMB] = "Transfer contents" + else + context[SCREENTIP_CONTEXT_LMB] = "Insert item" + return CONTEXTUAL_SCREENTIP_SET /obj/machinery/reagentgrinder/examine(mob/user) . = ..() @@ -76,32 +85,241 @@ . += span_warning("You're too far away to examine [src]'s contents and display!") return + var/total_weight = 0 + var/list/obj/item/to_process = list() + for(var/obj/item/target in src) + if((target in component_parts) || target == beaker) + continue + to_process["[target.name]"] += 1 + total_weight += target.w_class + if(to_process.len) + . += span_notice("Currently holding.") + for(var/target_name as anything in to_process) + . += span_notice("[to_process[target_name]] [target_name]") + . += span_notice("Filled to [round((total_weight / maximum_weight) * 100)]% capacity.") + + if(!QDELETED(beaker)) + . += span_notice("A beaker of [beaker.reagents.maximum_volume]u capacity is present.") + . += span_notice("[EXAMINE_HINT("Right click")] with empty hand to remove beaker.") + else + . += span_warning("It's missing a beaker.") + + . += span_notice("You can drag a storage item to dump its contents in the grinder.") + if(anchored) + . += span_notice("It can be [EXAMINE_HINT("wrenched")] loose.") + else + . += span_warning("Needs to be [EXAMINE_HINT("wrenched")] in place to work.") + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + if(panel_open) + . += span_notice("It can be [EXAMINE_HINT("pried")] apart.") + +/obj/machinery/reagentgrinder/update_overlays() + . = ..() + + if(!QDELETED(beaker)) + . += "[base_icon_state]-beaker" + + if(anchored && !panel_open && is_operational) + . += "[base_icon_state]-on" + +/obj/machinery/reagentgrinder/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) + beaker = null + update_appearance(UPDATE_OVERLAYS) + +/obj/machinery/reagentgrinder/RefreshParts() + . = ..() + + for(var/datum/stock_part/part in component_parts) + if(istype(part, /datum/stock_part/servo)) + speed = part.tier + else if(istype(part, /datum/stock_part/matter_bin)) + maximum_weight = WEIGHT_CLASS_GIGANTIC * part.tier +/** + * Inserts, removes or replaces the beaker present + * Arguments + * + * * mob/living/user - the player performing the action + * * obj/item/reagent_containers/new_beaker - the new beaker to replace the old, null to do nothing + */ +/obj/machinery/reagentgrinder/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + PRIVATE_PROC(TRUE) + + if(!QDELETED(beaker)) + try_put_in_hand(beaker, user) + + if(!QDELETED(new_beaker)) + if(!user.transferItemToLoc(new_beaker, src)) + return + beaker = new_beaker + + update_appearance(UPDATE_OVERLAYS) + +/** + * Transfer this item or items inside if its a bag into the grinder + * Arguments + * + * * mob/user - the player who is inserting these items + * * list/obj/item/to_add - list of items to add + */ +/obj/machinery/reagentgrinder/proc/load_items(mob/user, list/obj/item/to_add) + PRIVATE_PROC(TRUE) + + //surface level checks to filter out items that can be grinded/juice + var/list/obj/item/filtered_list = list() + for(var/obj/item/ingredient as anything in to_add) + //what are we trying to grind exactly? + if((ingredient.item_flags & ABSTRACT) || (ingredient.flags_1 & HOLOGRAM_1)) + continue + + //Nothing would come from grinding or juicing + if(!length(ingredient.grind_results) && !ingredient.reagents.total_volume) + to_chat(user, span_warning("You cannot grind/juice [ingredient] into reagents!")) + continue + + //Error messages should be in the objects' definitions + if(!ingredient.blend_requirements(src)) + continue + + filtered_list += ingredient + if(!filtered_list.len) + return FALSE + + //find total weight of all items already in grinder + var/total_weight + for(var/obj/item/to_process in src) + if((to_process in component_parts) || to_process == beaker) + continue + total_weight += to_process.w_class + + //Now transfer the items 1 at a time while ensuring we don't go above the maximum allowed weight + var/items_transfered = 0 + for(var/obj/item/weapon as anything in filtered_list) + if(weapon.w_class + total_weight > maximum_weight) + to_chat(user, span_warning("[weapon] is too big to fit into [src].")) + continue + weapon.forceMove(src) + total_weight += weapon.w_class + items_transfered += 1 + to_chat(user, span_notice("[weapon] was loaded into [src].")) + + return items_transfered + +/obj/machinery/reagentgrinder/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH)) + return ..() + + //add the beaker + if (is_reagent_container(tool) && tool.is_open_container()) + replace_beaker(user, tool) + to_chat(user, span_notice("You add [tool] to [src].")) + return ITEM_INTERACT_SUCCESS + + //add items from bag + else if(istype(tool, /obj/item/storage/bag)) + var/list/obj/item/to_add = list() + //list of acceptable items from the bag + var/static/list/accepted_items = list( + /obj/item/grown, + /obj/item/food/grown, + /obj/item/food/honeycomb, + ) + + //add to list of items to check for + for(var/obj/item/ingredient in tool) + if(!is_type_in_list(ingredient, accepted_items)) + continue + to_add += ingredient + + //add the items + var/items_added = load_items(user, to_add) + if(!items_added) + to_chat(user, span_warning("No items were added.")) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("[items_added] items were added from [tool] to [src].")) + return ITEM_INTERACT_SUCCESS + + //add item directly + else if(length(tool.grind_results) || tool.reagents?.total_volume) + if(tool.atom_storage) //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.")) + return ITEM_INTERACT_BLOCKING + + //add the items + if(!load_items(user, list(tool))) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("[tool] was added to [src].")) + return ITEM_INTERACT_SUCCESS + + //ask player to drag stuff into grinder + else if(tool.atom_storage) + to_chat(user, span_warning("You must drag & dump contents of [tool] into [src].")) + return ITEM_INTERACT_BLOCKING + + return ..() + +/obj/machinery/reagentgrinder/wrench_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + + var/tool_result = ITEM_INTERACT_BLOCKING if(operating) - . += span_warning("\The [src] is operating.") - return + balloon_alert(user, "still operating!") + return tool_result - if(beaker || length(holdingitems)) - . += span_notice("\The [src] contains:") - if(beaker) - . += span_notice("- \A [beaker].") - for(var/i in holdingitems) - var/obj/item/O = i - . += span_notice("- \A [O.name].") + if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) + update_appearance(UPDATE_OVERLAYS) + tool_result = ITEM_INTERACT_SUCCESS + return tool_result - if(!(machine_stat & (NOPOWER|BROKEN))) - . += "[span_notice("The status display reads:")]\n"+\ - span_notice("- Grinding reagents at [speed*100]%.") - if(beaker) - for(var/datum/reagent/R in beaker.reagents.reagent_list) - . += span_notice("- [R.volume] units of [R.name].") +/obj/machinery/reagentgrinder/screwdriver_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + + var/tool_result = ITEM_INTERACT_BLOCKING + if(operating) + balloon_alert(user, "still operating!") + return tool_result + + if(default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + update_appearance(UPDATE_OVERLAYS) + tool_result = ITEM_INTERACT_SUCCESS + return tool_result + +/obj/machinery/reagentgrinder/crowbar_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + + var/tool_result = ITEM_INTERACT_BLOCKING + if(operating) + balloon_alert(user, "still operating!") + return tool_result + + if(default_deconstruction_crowbar(tool)) + tool_result = ITEM_INTERACT_SUCCESS + return tool_result + +/obj/machinery/reagentgrinder/proc/on_storage_dump(datum/source, datum/storage/storage, mob/user) + SIGNAL_HANDLER + + var/list/obj/item/contents_to_dump = list() + for(var/obj/item/to_dump in storage.real_location) + if(to_dump.atom_storage) //No recursive handling of contents please + continue + contents_to_dump += to_dump + + to_chat(user, span_notice("You dumped [load_items(user, contents_to_dump)] items from [storage.parent] into [src].")) + + return STORAGE_DUMP_HANDLED /obj/machinery/reagentgrinder/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(operating || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) + if(operating || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) return - eject(user) + replace_beaker(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/reagentgrinder/attack_robot_secondary(mob/user, list/modifiers) @@ -110,278 +328,182 @@ /obj/machinery/reagentgrinder/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/reagentgrinder/Exited(atom/movable/gone, direction) +/obj/machinery/reagentgrinder/ui_interact(mob/user) . = ..() - if(gone == beaker) - beaker = null - update_appearance() - if(holdingitems[gone]) - holdingitems -= gone -/obj/machinery/reagentgrinder/proc/drop_all_items() - for(var/i in holdingitems) - var/atom/movable/AM = i - AM.forceMove(drop_location()) - holdingitems = list() - -/obj/machinery/reagentgrinder/update_icon_state() - icon_state = "[base_icon_state][beaker ? 1 : 0]" - return ..() - -/obj/machinery/reagentgrinder/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) - if(!user) - return FALSE - if(beaker) - try_put_in_hand(beaker, user) - beaker = null - if(new_beaker) - beaker = new_beaker - update_appearance() - return TRUE - -/obj/machinery/reagentgrinder/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/reagentgrinder/screwdriver_act(mob/living/user, obj/item/tool) - . = ITEM_INTERACT_SUCCESS - if(!beaker && !length(holdingitems)) - return default_deconstruction_screwdriver(user, icon_state, icon_state, tool) - -/obj/machinery/reagentgrinder/crowbar_act(mob/living/user, obj/item/tool) - return default_deconstruction_crowbar(tool) - -/obj/machinery/reagentgrinder/attackby(obj/item/weapon, mob/living/user, params) - if(panel_open) //Can't insert objects when its screwed open - return TRUE - - if(!weapon.grind_requirements(src)) //Error messages should be in the objects' definitions - return - - if (is_reagent_container(weapon) && !(weapon.item_flags & ABSTRACT) && weapon.is_open_container()) - var/obj/item/reagent_containers/container = weapon - . = TRUE //no afterattack - if(!user.transferItemToLoc(container, src)) - return - replace_beaker(user, container) - to_chat(user, span_notice("You add [container] to [src].")) - update_appearance() - return TRUE //no afterattack - - if(holdingitems.len >= limit) - to_chat(user, span_warning("[src] is filled to capacity!")) - return TRUE - - //Fill machine with a bag! - if(istype(weapon, /obj/item/storage/bag)) - if(!weapon.contents.len) - to_chat(user, span_notice("[weapon] is empty!")) - return TRUE - - var/list/inserted = list() - if(weapon.atom_storage.remove_type(/obj/item/food/grown, src, limit - length(holdingitems), TRUE, FALSE, user, inserted)) - for(var/i in inserted) - holdingitems[i] = TRUE - inserted = list() - if(weapon.atom_storage.remove_type(/obj/item/food/honeycomb, src, limit - length(holdingitems), TRUE, FALSE, user, inserted)) - for(var/i in inserted) - holdingitems[i] = TRUE - - if(!weapon.contents.len) - to_chat(user, span_notice("You empty [weapon] into [src].")) - else - to_chat(user, span_notice("You fill [src] to the brim.")) - return TRUE - - if(!weapon.grind_results && !weapon.juice_typepath) - if(user.combat_mode) - return ..() - else - to_chat(user, span_warning("You cannot grind/juice [weapon] into reagents!")) - return TRUE - - if(user.transferItemToLoc(weapon, src)) - to_chat(user, span_notice("You add [weapon] to [src].")) - holdingitems[weapon] = TRUE - return FALSE - -/obj/machinery/reagentgrinder/proc/on_storage_dump(datum/source, datum/storage/storage, mob/user) - SIGNAL_HANDLER - - for(var/obj/item/to_dump in storage.real_location) - if(holdingitems.len >= limit) - break - - if(!to_dump.grind_results && !to_dump.juice_typepath) - continue - - if(!storage.attempt_remove(to_dump, src, silent = TRUE)) - continue - - holdingitems[to_dump] = TRUE - - to_chat(user, span_notice("You dump [storage.parent] into [src].")) - return STORAGE_DUMP_HANDLED - -/obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave - . = ..() - - if(operating || !user.can_perform_action(src, ALLOW_SILICON_REACH)) + //some interaction sanity checks + if(!anchored || operating || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) return + var/static/radial_eject = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_eject") + var/static/radial_mix = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_mix") + //create list of options available var/list/options = list() + //actions to be performed on the items stored inside + for(var/obj/item/to_process in src) + if((to_process in component_parts) || to_process == beaker) + continue + + if(!QDELETED(beaker) && !beaker.reagents.holder_full() && is_operational && anchored) + var/static/radial_grind = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_grind") + options["grind"] = radial_grind + + var/static/radial_juice = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_juice") + options["juice"] = radial_juice - if(beaker || length(holdingitems)) options["eject"] = radial_eject - - if(isAI(user)) + break + //eject action if we have a beaker + if(!QDELETED(beaker)) + options["eject"] = radial_eject + //mix reagents present inside + if(beaker?.reagents.total_volume && is_operational && anchored) + options["mix"] = radial_mix + //examine action if Ai is trying to see whats up + if(HAS_AI_ACCESS(user)) if(machine_stat & NOPOWER) return + var/static/radial_examine = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_examine") options["examine"] = radial_examine - // if there is no power or it's broken, the procs will fail but the buttons will still show - if(length(holdingitems)) - options["grind"] = radial_grind - options["juice"] = radial_juice - else if(beaker?.reagents.total_volume) - options["mix"] = radial_mix - - var/choice - - if(length(options) < 1) + //display choices & perform action + var/choice = show_radial_menu( + user, + src, + options, + custom_check = CALLBACK(src, PROC_REF(check_interactable), user), + require_near = !HAS_SILICON_ACCESS(user), + ) + if(!choice) return - if(length(options) == 1) - for(var/key in options) - choice = key - else - choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) - - // post choice verification - if(operating || (isAI(user) && machine_stat & NOPOWER) || !user.can_perform_action(src, ALLOW_SILICON_REACH)) - return - switch(choice) if("eject") - eject(user) - if("grind") - grind(user) - if("juice") - juice(user) + replace_beaker(user) + dump_inventory_contents() + if("grind", "juice") + operate_for(60 DECISECONDS, choice == "juice", user) if("mix") - mix(user) + mix(50 DECISECONDS, user) if("examine") - examine(user) + to_chat(user, examine_block("[examine(user)]")) -/obj/machinery/reagentgrinder/proc/eject(mob/user) - drop_all_items() - if(beaker) - replace_beaker(user) +/** + * Checks if the radial menu can interact with this machine + * Arguments + * + * * mob/user - the player interacting with this machine + */ +/obj/machinery/reagentgrinder/proc/check_interactable(mob/user) + PRIVATE_PROC(TRUE) -/obj/machinery/reagentgrinder/proc/remove_object(obj/item/weapon) - holdingitems -= weapon - qdel(weapon) + if(!can_interact(user)) + return FALSE -/obj/machinery/reagentgrinder/proc/start_shaking() - var/static/list/transforms - if(!transforms) - var/matrix/M1 = matrix() - var/matrix/M2 = matrix() - var/matrix/M3 = matrix() - var/matrix/M4 = matrix() - M1.Translate(-1, 0) - M2.Translate(0, 1) - M3.Translate(1, 0) - M4.Translate(0, -1) - transforms = list(M1, M2, M3, M4) - animate(src, transform=transforms[1], time=0.4, loop=-1) - animate(transform=transforms[2], time=0.2) - animate(transform=transforms[3], time=0.4) - animate(transform=transforms[4], time=0.6) + if(!anchored || operating || !user.can_perform_action(src, ALLOW_SILICON_REACH)) + return FALSE -/obj/machinery/reagentgrinder/proc/shake_for(duration) - start_shaking() //start shaking - addtimer(CALLBACK(src, PROC_REF(stop_shaking)), duration) + return TRUE -/obj/machinery/reagentgrinder/proc/stop_shaking() - update_appearance() - animate(src, transform = matrix()) +/** + * Grinds/Juices all contents inside the grinder + * Arguments + * + * * time - the duration in deciseconds to perform the operation + * * juicing - FALSE to grind, TRUE to juice + * * mob/user - the player who initiated this process + */ +/obj/machinery/reagentgrinder/proc/operate_for(time, juicing = FALSE, mob/user) + PRIVATE_PROC(TRUE) -/obj/machinery/reagentgrinder/proc/operate_for(time, silent = FALSE, juicing = FALSE) - shake_for(time / speed) + var/duration = time / speed + + Shake(duration = duration) operating = TRUE - if(!silent) - if(!juicing) - playsound(src, 'sound/machines/blender.ogg', 50, TRUE) - else - playsound(src, 'sound/machines/juicer.ogg', 20, TRUE) - use_power(active_power_usage * time * 0.1) // .1 needed here to convert time (in deciseconds) to seconds such that watts * seconds = joules - addtimer(CALLBACK(src, PROC_REF(stop_operating)), time / speed) + if(!juicing) + playsound(src, 'sound/machines/blender.ogg', 50, TRUE) + else + playsound(src, 'sound/machines/juicer.ogg', 20, TRUE) + var/total_weight + for(var/obj/item/weapon in src) + if((weapon in component_parts) || weapon == beaker) + continue + if(beaker.reagents.holder_full()) + break + + //recursively process everything inside this atom + var/item_processed = FALSE + var/item_weight = weapon.w_class + for(var/obj/item/ingredient as anything in weapon.get_all_contents_type(/obj/item)) + if(beaker.reagents.holder_full()) + break + + if(juicing) + if(!ingredient.juice(beaker.reagents, user)) + to_chat(user, span_danger("[src] shorts out as it tries to juice up [ingredient], and transfers it back to storage.")) + continue + item_processed = TRUE + else if(length(ingredient.grind_results) || ingredient.reagents?.total_volume) + if(!ingredient.grind(beaker.reagents, user)) + if(isstack(ingredient)) + to_chat(user, span_notice("[src] attempts to grind as many pieces of [ingredient] as possible.")) + else + to_chat(user, span_danger("[src] shorts out as it tries to grind up [ingredient], and transfers it back to storage.")) + continue + item_processed = TRUE + + //happens only for stacks where some of the sheets were grinded so we roughly compute the weight grinded + if(item_weight != weapon.w_class) + total_weight += item_weight - weapon.w_class + else + total_weight += item_weight + + //delete only if operation was successfull for atleast 1 item(also delete atoms for whom only some of its contents were processed as they are non functional now) + if(item_processed) + qdel(weapon) + + //use power according to the total weight of items grinded + use_energy((active_power_usage * (duration / 1 SECONDS)) * (total_weight / maximum_weight)) + + addtimer(CALLBACK(src, PROC_REF(stop_operating)), duration) + +///Reset the operating status of the machine /obj/machinery/reagentgrinder/proc/stop_operating() + PRIVATE_PROC(TRUE) + operating = FALSE -/obj/machinery/reagentgrinder/proc/juice(mob/user) - power_change() - if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.holder_full()) +/** + * Mixes the reagents inside the beaker + * Arguments + * + * * time - the length of time in deciseconds to operate + * * mob/user - the player who started the mixing process + */ +/obj/machinery/reagentgrinder/proc/mix(time, mob/user) + PRIVATE_PROC(TRUE) + + var/duration = time / speed + + Shake(duration = duration) + operating = TRUE + playsound(src, 'sound/machines/juicer.ogg', 20, TRUE) + + addtimer(CALLBACK(src, PROC_REF(mix_complete), duration), duration) + +/** + * Mix the reagents + * Arguments + * + * * duration - the time spent in mixing + */ +/obj/machinery/reagentgrinder/proc/mix_complete(duration) + PRIVATE_PROC(TRUE) + + if(QDELETED(beaker) || beaker.reagents.total_volume <= 0) + operating = FALSE return - operate_for(50, juicing = TRUE) - for(var/obj/item/ingredient in holdingitems) - if(beaker.reagents.holder_full()) - break - if(ingredient.flags_1 & HOLOGRAM_1) - to_chat(user, span_notice("You try to juice [ingredient], but it fades away!")) - qdel(ingredient) - continue - - if(ingredient.juice_typepath) - juice_item(ingredient, user) - -/obj/machinery/reagentgrinder/proc/juice_item(obj/item/ingredient, mob/user) //Juicing results can be found in respective object definitions - if(!ingredient.juice(beaker.reagents, user)) - to_chat(user, span_danger("[src] shorts out as it tries to juice up [ingredient], and transfers it back to storage.")) - return - remove_object(ingredient) - -/obj/machinery/reagentgrinder/proc/grind(mob/user) - power_change() - if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.holder_full()) - return - operate_for(60) - warn_of_dust() // don't breathe this. - for(var/obj/item/ingredient in holdingitems) - if(beaker.reagents.holder_full()) - break - - if(ingredient.flags_1 & HOLOGRAM_1) - to_chat(user, span_notice("You try to grind [ingredient], but it fades away!")) - qdel(ingredient) - continue - - if(ingredient.grind_results) - grind_item(ingredient, user) - -/obj/machinery/reagentgrinder/proc/grind_item(obj/item/ingredient, mob/user) //Grind results can be found in respective object definitions - if(!ingredient.grind(beaker.reagents, user)) - if(isstack(ingredient)) - to_chat(user, span_notice("[src] attempts to grind as many pieces of [ingredient] as possible.")) - else - to_chat(user, span_danger("[src] shorts out as it tries to grind up [ingredient], and transfers it back to storage.")) - return - remove_object(ingredient) - -/obj/machinery/reagentgrinder/proc/mix(mob/user) - //For butter and other things that would change upon shaking or mixing - power_change() - if(!beaker || machine_stat & (NOPOWER|BROKEN)) - return - operate_for(50, juicing = TRUE) - addtimer(CALLBACK(src, PROC_REF(mix_complete)), 50 / speed) - -/obj/machinery/reagentgrinder/proc/mix_complete() - if(beaker?.reagents.total_volume <= 0) - return //Recipe to make Butter var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount(/datum/reagent/consumable/milk) / MILK_TO_BUTTER_COEFF, 1) var/purity = beaker.reagents.get_reagent_purity(/datum/reagent/consumable/milk) @@ -389,9 +511,15 @@ for(var/i in 1 to butter_amt) var/obj/item/food/butter/tasty_butter = new(drop_location()) tasty_butter.reagents.set_all_reagents_purity(purity) + //Recipe to make Mayonnaise if (beaker.reagents.has_reagent(/datum/reagent/consumable/eggyolk)) beaker.reagents.convert_reagent(/datum/reagent/consumable/eggyolk, /datum/reagent/consumable/mayonnaise) + //Recipe to make whipped cream if (beaker.reagents.has_reagent(/datum/reagent/consumable/cream)) beaker.reagents.convert_reagent(/datum/reagent/consumable/cream, /datum/reagent/consumable/whipped_cream) + + //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 e91aea78d59..c103457025d 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -22,7 +22,7 @@ src.location = get_turf(location) src.amount = amount carry?.copy_to(chemholder, 20) - carry?.remove_any(amount / efficiency) + carry?.remove_all(amount / efficiency) /// A factory which produces clouds of smoke for the smoke machine. /datum/effect_system/fluid_spread/smoke/chem/smoke_machine @@ -37,6 +37,7 @@ . = ..() create_reagents(REAGENTS_BASE_VOLUME, INJECTABLE) AddComponent(/datum/component/plumbing/simple_demand) + AddComponent(/datum/component/simple_rotation) for(var/datum/stock_part/matter_bin/B in component_parts) reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.tier if(is_operational) @@ -88,7 +89,7 @@ var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/smoke = new() smoke.set_up(setting * 3, holder = src, location = location, carry = reagents, efficiency = efficiency) smoke.start() - use_power(active_power_usage) + use_energy(active_power_usage) /obj/machinery/smoke_machine/wrench_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index f51532b28b1..11947c70602 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -29,7 +29,7 @@ ///The molar mass of the reagent - if you're adding a reagent that doesn't have a recipe, just add a random number between 10 - 800. Higher numbers are "harder" but it's mostly arbitary. var/mass /// color it looks in containers etc - var/color = "#000000" // rgb: 0, 0, 0 + var/color = COLOR_BLACK // rgb: 0, 0, 0 ///how fast the reagent is metabolized by the mob var/metabolization_rate = REAGENTS_METABOLISM /// above this overdoses happen diff --git a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm index 1406e373693..5b425d61f8a 100644 --- a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm @@ -113,7 +113,7 @@ description = "A gas that is eight times more efficient than O2 at lung diffusion with organ healing properties on sleeping patients." reagent_state = GAS metabolization_rate = REAGENTS_METABOLISM * 0.5 - color = "#808080" + color = COLOR_GRAY taste_description = "irradiated air" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 58ee4797cb5..c5b77b7734f 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -457,7 +457,7 @@ overdose_threshold = 25 ph = 9.1 var/datum/brain_trauma/mild/muscle_weakness/trauma - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 1533986ea35..17b3f236e95 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -182,6 +182,7 @@ boozepwr = 45 ph = 6 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() @@ -230,6 +231,7 @@ overdose_threshold = 60 taste_description = "jitters and death" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() @@ -716,7 +718,7 @@ . = ..() to_chat(drinker, span_notice("You feel gentle warmth spread through your body!")) light_holder = new(drinker) - light_holder.set_light(3, 0.7, "#FFCC00") //Tequila Sunrise makes you radiate dim light, like a sunrise! + light_holder.set_light(3, 0.7, COLOR_TANGERINE_YELLOW) //Tequila Sunrise makes you radiate dim light, like a sunrise! /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(QDELETED(light_holder)) @@ -746,7 +748,7 @@ /datum/reagent/consumable/ethanol/beepsky_smash name = "Beepsky Smash" description = "Drink this and prepare for the LAW." - color = "#808000" // rgb: 128,128,0 + color = COLOR_OLIVE // rgb: 128,128,0 boozepwr = 60 //THE FIST OF THE LAW IS STRONG AND HARD quality = DRINK_GOOD metabolization_rate = 1.25 * REAGENTS_METABOLISM @@ -867,6 +869,7 @@ quality = DRINK_NICE taste_description = "giving up on the day" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/ethanol/margarita name = "Margarita" @@ -952,7 +955,7 @@ /datum/reagent/consumable/ethanol/snowwhite name = "Snow White" description = "A cold refreshment." - color = "#FFFFFF" // rgb: 255, 255, 255 + color = COLOR_WHITE // rgb: 255, 255, 255 boozepwr = 35 quality = DRINK_NICE taste_description = "refreshing cold" @@ -966,6 +969,7 @@ quality = DRINK_VERYGOOD taste_description = "sweet tasting iron" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/ethanol/demonsblood/on_mob_metabolize(mob/living/metabolizer) . = ..() @@ -1544,7 +1548,7 @@ /datum/reagent/consumable/ethanol/triple_sec name = "Triple Sec" description = "A sweet and vibrant orange liqueur." - color = "#ffcc66" + color = COLOR_ICECREAM_PEACH boozepwr = 30 taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of the caribbean" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1631,7 +1635,7 @@ /datum/reagent/consumable/ethanol/bastion_bourbon name = "Bastion Bourbon" description = "Soothing hot herbal brew with restorative properties. Hints of citrus and berry flavors." - color = "#00FFFF" + color = COLOR_CYAN boozepwr = 30 quality = DRINK_FANTASTIC taste_description = "hot herbal brew with a hint of fruit" @@ -1673,7 +1677,7 @@ /datum/reagent/consumable/ethanol/squirt_cider name = "Squirt Cider" description = "Fermented squirt extract with a nose of stale bread and ocean water. Whatever a squirt is." - color = "#FF0000" + color = COLOR_RED boozepwr = 40 taste_description = "stale bread with a staler aftertaste" nutriment_factor = 2 @@ -1947,7 +1951,7 @@ /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" description = "A wine made from grown plants." - color = "#FFFFFF" + color = COLOR_WHITE boozepwr = 35 quality = DRINK_GOOD taste_description = "bad coding" @@ -2410,7 +2414,7 @@ name = "Triumphal Arch" description = "A drink celebrating the Lizard Empire and its military victories. It's popular at bars on Unification Day." boozepwr = 60 - color = "#FFD700" + color = COLOR_GOLD quality = DRINK_FANTASTIC taste_description = "victory" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2628,7 +2632,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 3) + stomach.adjust_charge(reac_volume * 0.003 * STANDARD_CELL_CHARGE) /datum/reagent/consumable/ethanol/telepole name = "Telepole" @@ -2648,7 +2652,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 2) + stomach.adjust_charge(reac_volume * 0.002 * STANDARD_CELL_CHARGE) /datum/reagent/consumable/ethanol/pod_tesla name = "Pod Tesla" @@ -2675,7 +2679,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 5) + stomach.adjust_charge(reac_volume * 0.005 * STANDARD_CELL_CHARGE) // Welcome to the Blue Room Bar and Grill, home to Mars' finest cocktails /datum/reagent/consumable/ethanol/rice_beer @@ -2876,6 +2880,7 @@ quality = DRINK_VERYGOOD taste_description = "coconut coffee" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/ethanol/blue_hawaiian //pineapple juice, lemon juice, coconut rum, blue curacao name = "Blue Hawaiian" diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 43430d09469..d55fc0a33c5 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -264,7 +264,7 @@ taste_description = "bitterness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK - + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/coffee/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -289,6 +289,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK default_container = /obj/item/reagent_containers/cup/glass/mug/tea + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -361,6 +362,7 @@ nutriment_factor = 0 taste_description = "bitter coldness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -377,6 +379,7 @@ nutriment_factor = 0 taste_description = "bitter coldness and a hint of smoke" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -395,6 +398,7 @@ nutriment_factor = 0 taste_description = "sweet tea" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -522,6 +526,7 @@ color = "#102000" // rgb: 16, 32, 0 taste_description = "sweet citrus soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -545,7 +550,7 @@ /datum/reagent/consumable/space_up name = "Space-Up" description = "Tastes like a hull breach in your mouth." - color = "#00FF00" // rgb: 0, 255, 0 + color = COLOR_VIBRANT_LIME // rgb: 0, 255, 0 taste_description = "cherry soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -639,7 +644,7 @@ . = ..() affected_mob.adjust_drowsiness(3 SECONDS * REM * seconds_per_tick) var/need_mob_update - switch(affected_mob.mob_mood.sanity_level) + switch(affected_mob.mob_mood.sanity) if (SANITY_INSANE to SANITY_CRAZY) need_mob_update = affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) if (SANITY_UNSTABLE to SANITY_DISTURBED) @@ -656,6 +661,7 @@ overdose_threshold = 60 taste_description = "barbecue and nostalgia" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -701,6 +707,7 @@ taste_description = "creamy coffee" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -723,6 +730,7 @@ taste_description = "bitter cream" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -849,6 +857,7 @@ nutriment_factor = 3 taste_description = "creamy pumpkin" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/gibbfloats name = "Gibb Floats" @@ -1125,7 +1134,7 @@ /datum/reagent/consumable/funky_monkey name = "funky monkey smoothie" description = "A classic smoothie made from chocolate and bananas." - color = "#663300" + color = COLOR_BROWNER_BROWN nutriment_factor = 0 taste_description = "chocolate and banana" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1133,7 +1142,7 @@ /datum/reagent/consumable/green_giant name = "green giant smoothie" description = "A green vegetable smoothie, made without vegetables." - color = "#003300" + color = COLOR_VERY_DARK_LIME_GREEN nutriment_factor = 0 taste_description = "green, just green" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1201,6 +1210,7 @@ color = "#583d09" // rgb: 88, 61, 9 taste_description = "one of your 26 favorite letters" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/t_letter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1240,6 +1250,7 @@ color = "#99E550" taste_description = "sour pear" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/consumable/volt_energy/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -1249,4 +1260,4 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 3) + stomach.adjust_charge(reac_volume * 0.003 * STANDARD_CELL_CHARGE) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index d8841be7f66..a76fd26d963 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -87,11 +87,8 @@ to_chat(affected_mob, span_notice("[smoke_message]")) affected_mob.add_mood_event("smoked", /datum/mood_event/smoked) affected_mob.remove_status_effect(/datum/status_effect/jitter) - affected_mob.AdjustStun(-50 * REM * seconds_per_tick) - affected_mob.AdjustKnockdown(-50 * REM * seconds_per_tick) - affected_mob.AdjustUnconscious(-50 * REM * seconds_per_tick) - affected_mob.AdjustParalyzed(-50 * REM * seconds_per_tick) - affected_mob.AdjustImmobilized(-50 * REM * seconds_per_tick) + affected_mob.AdjustAllImmobility(-50 * REM * seconds_per_tick) + return UPDATE_MOB_HEALTH /datum/reagent/drug/nicotine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) @@ -147,6 +144,7 @@ ph = 5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/stimulants = 12) //4.8 per 2 seconds + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/drug/methamphetamine/on_new(data) . = ..() @@ -177,11 +175,7 @@ if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) affected_mob.add_mood_event("tweaking", /datum/mood_event/stimulant_medium) - affected_mob.AdjustStun(-40 * REM * seconds_per_tick) - affected_mob.AdjustKnockdown(-40 * REM * seconds_per_tick) - affected_mob.AdjustUnconscious(-40 * REM * seconds_per_tick) - affected_mob.AdjustParalyzed(-40 * REM * seconds_per_tick) - affected_mob.AdjustImmobilized(-40 * REM * seconds_per_tick) + affected_mob.AdjustAllImmobility(-40 * REM * seconds_per_tick) var/need_mob_update need_mob_update = affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) affected_mob.set_jitter_if_lower(4 SECONDS * REM * seconds_per_tick) @@ -217,7 +211,7 @@ addiction_types = list(/datum/addiction/stimulants = 25) //8 per 2 seconds ph = 8.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - metabolized_traits = list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE, TRAIT_ANALGESIA) + metabolized_traits = list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE, TRAIT_ANALGESIA, TRAIT_STIMULATED) var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage /datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/affected_mob) @@ -266,6 +260,7 @@ color = "#78FFF0" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/stimulants = 8) + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -334,7 +329,7 @@ overdose_threshold = 30 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/stimulants = 6) //2.6 per 2 seconds - metabolized_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_ANALGESIA) + metabolized_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_ANALGESIA, TRAIT_STIMULATED) /datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/carbon/affected_mob) . = ..() @@ -452,18 +447,14 @@ name = "Maintenance Tar" description = "An unknown tar that you most likely gotten from an assistant, a bored chemist... or cooked yourself. Raw tar, straight from the floor. It can help you with escaping bad situations at the cost of liver damage." reagent_state = LIQUID - color = "#000000" + color = COLOR_BLACK overdose_threshold = 30 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/maintenance_drugs = 5) /datum/reagent/drug/maint/tar/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.AdjustStun(-10 * REM * seconds_per_tick) - affected_mob.AdjustKnockdown(-10 * REM * seconds_per_tick) - affected_mob.AdjustUnconscious(-10 * REM * seconds_per_tick) - affected_mob.AdjustParalyzed(-10 * REM * seconds_per_tick) - affected_mob.AdjustImmobilized(-10 * REM * seconds_per_tick) + affected_mob.AdjustAllImmobility(-10 * REM * seconds_per_tick) affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) return UPDATE_MOB_HEALTH @@ -557,6 +548,7 @@ overdose_threshold = 30 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/hallucinogens = 15) + metabolized_traits = list(TRAIT_STIMULATED) ///How many flips have we done so far? var/flip_count = 0 ///How many spin have we done so far? @@ -693,7 +685,7 @@ . = ..() playsound(invisible_man, 'sound/chemistry/saturnx_fade.ogg', 40) to_chat(invisible_man, span_nicegreen("You feel pins and needles all over your skin as your body suddenly becomes transparent!")) - addtimer(CALLBACK(src, PROC_REF(turn_man_invisible), invisible_man), 10) //just a quick delay to synch up the sound. + addtimer(CALLBACK(src, PROC_REF(turn_man_invisible), invisible_man), 1 SECONDS) //just a quick delay to synch up the sound. if(!invisible_man.hud_used) return @@ -784,6 +776,25 @@ metabolization_rate = 0.75 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/stimulants = 20) + metabolized_traits = list(TRAIT_STIMULATED) + +/datum/reagent/drug/kronkaine/on_new(data) + . = ..() + // Kronkaine also makes for a great fishing bait (found in "natural" baits) + if(!istype(holder?.my_atom, /obj/item/food)) + return + ADD_TRAIT(holder.my_atom, TRAIT_GREAT_QUALITY_BAIT, type) + RegisterSignal(holder, COMSIG_REAGENTS_CLEAR_REAGENTS, PROC_REF(on_reagents_clear)) + RegisterSignal(holder, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_delete)) + +/datum/reagent/drug/kronkaine/proc/on_reagents_clear(datum/reagents/reagents) + SIGNAL_HANDLER + REMOVE_TRAIT(holder.my_atom, TRAIT_GREAT_QUALITY_BAIT, type) + +/datum/reagent/drug/kronkaine/proc/on_reagent_delete(datum/reagents/reagents, datum/reagent/deleted_reagent) + SIGNAL_HANDLER + if(deleted_reagent == src) + REMOVE_TRAIT(holder.my_atom, TRAIT_GREAT_QUALITY_BAIT, type) /datum/reagent/drug/kronkaine/on_mob_metabolize(mob/living/kronkaine_fiend) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index b9abdb3bd25..90bd7e14a86 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -189,7 +189,7 @@ exposed_mob.emote("scream") 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)), 3) + addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living, unfry_mob)), 0.3 SECONDS) if(FryLoss) exposed_mob.adjustFireLoss(FryLoss) @@ -282,7 +282,7 @@ name = "Sugar" description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." reagent_state = SOLID - color = "#FFFFFF" // rgb: 255, 255, 255 + color = COLOR_WHITE // rgb: 255, 255, 255 taste_mult = 1.5 // stop sugar drowning out other flavours nutriment_factor = 2 metabolization_rate = 5 * REAGENTS_METABOLISM @@ -403,7 +403,7 @@ exposed_open_turf.air.temperature = max(exposed_open_turf.air.temperature - ((temperature - TCMB) * (heat_capacity * reac_volume * specific_heat) / (heat_capacity + reac_volume * specific_heat)) / heat_capacity, TCMB) // Exchanges environment temperature with reagent. Reagent is at 2.7K with a heat capacity of 40J per unit. if(reac_volume < 5) return - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.adjustToxLoss(rand(15,30)) /datum/reagent/consumable/condensedcapsaicin @@ -457,7 +457,7 @@ name = "Table Salt" description = "A salt made of sodium chloride. Commonly used to season food." reagent_state = SOLID - color = "#FFFFFF" // rgb: 255,255,255 + color = COLOR_WHITE // rgb: 255,255,255 taste_description = "salt" penetrates_skin = NONE chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -568,7 +568,7 @@ /datum/reagent/consumable/sprinkles name = "Sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." - color = "#FF00FF" // rgb: 255, 0, 255 + color = COLOR_MAGENTA // rgb: 255, 0, 255 taste_description = "childhood whimsy" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -633,7 +633,7 @@ name = "Flour" description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID - color = "#FFFFFF" // rgb: 0, 0, 0 + color = COLOR_WHITE // rgb: 0, 0, 0 taste_description = "chalky wheat" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_AFFECTS_WOUNDS default_container = /obj/item/reagent_containers/condiment/flour @@ -698,7 +698,7 @@ description = "tiny nutritious grains" reagent_state = SOLID nutriment_factor = 3 - color = "#FFFFFF" // rgb: 0, 0, 0 + color = COLOR_WHITE // rgb: 0, 0, 0 taste_description = "rice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/rice @@ -707,7 +707,7 @@ name = "Rice Flour" description = "Flour mixed with Rice" reagent_state = SOLID - color = "#FFFFFF" // rgb: 0, 0, 0 + color = COLOR_WHITE // rgb: 0, 0, 0 taste_description = "chalky wheat with rice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -950,7 +950,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 30) + stomach.adjust_charge(reac_volume * 0.03 * STANDARD_CELL_CHARGE) /datum/reagent/consumable/liquidelectricity/enriched/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -966,7 +966,7 @@ nutriment_factor = 0 metabolization_rate = 2 * REAGENTS_METABOLISM reagent_state = SOLID - color = "#FFFFFF" // rgb: 255, 255, 255 + color = COLOR_WHITE // rgb: 255, 255, 255 taste_mult = 8 taste_description = "sweetness" overdose_threshold = 17 @@ -1038,7 +1038,7 @@ /datum/reagent/consumable/chocolatepudding name = "Chocolate Pudding" description = "A great dessert for chocolate lovers." - color = "#800000" + color = COLOR_MAROON quality = DRINK_VERYGOOD nutriment_factor = 4 taste_description = "sweet chocolate" @@ -1103,7 +1103,7 @@ name = "Korta Milk" description = "A milky liquid made by crushing the centre of a korta nut." taste_description = "sugary milk" - color = "#FFFFFF" + color = COLOR_WHITE chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/korta_nectar diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 90c68e8b9d5..10531d844c4 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -81,18 +81,15 @@ /datum/reagent/medicine/synaptizine name = "Synaptizine" description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations." - color = "#FF00FF" + color = COLOR_MAGENTA ph = 4 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustStun(-20 * REM * seconds_per_tick) - affected_mob.AdjustKnockdown(-20 * REM * seconds_per_tick) - affected_mob.AdjustUnconscious(-20 * REM * seconds_per_tick) - affected_mob.AdjustImmobilized(-20 * REM * seconds_per_tick) - affected_mob.AdjustParalyzed(-20 * REM * seconds_per_tick) + affected_mob.AdjustAllImmobility(-20 * REM * seconds_per_tick) + if(holder.has_reagent(/datum/reagent/toxin/mindbreaker)) holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5 * REM * seconds_per_tick) affected_mob.adjust_hallucinations(-20 SECONDS * REM * seconds_per_tick) @@ -105,7 +102,7 @@ description = "Reduces drowsiness, hallucinations, and Histamine from body." color = "#EC536D" // rgb: 236, 83, 109 ph = 5.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -551,7 +548,7 @@ name = "Salbutamol" description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent." reagent_state = LIQUID - color = "#00FFFF" + color = COLOR_CYAN metabolization_rate = 0.25 * REAGENTS_METABOLISM ph = 2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -584,11 +581,13 @@ addiction_types = list(/datum/addiction/stimulants = 4) //1.6 per 2 seconds inverse_chem = /datum/reagent/inverse/corazargh inverse_chem_val = 0.4 - metabolized_traits = list(TRAIT_BATON_RESISTANCE) + metabolized_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_STIMULATED) /datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/affected_mob) . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + var/purity_movespeed_accounting = -0.375 * normalise_creation_purity() + affected_mob.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine, TRUE, purity_movespeed_accounting) /datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/affected_mob) . = ..() @@ -596,14 +595,15 @@ /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(SPT_PROB(10 * (1.5-creation_purity), seconds_per_tick) && iscarbon(affected_mob)) - var/obj/item/I = affected_mob.get_active_held_item() - if(I && affected_mob.dropItemToGround(I)) + var/obj/item/active_held_item = affected_mob.get_active_held_item() + if(SPT_PROB(10 * (1.5-creation_purity), seconds_per_tick) && iscarbon(affected_mob) && active_held_item?.w_class > WEIGHT_CLASS_SMALL) + if(active_held_item && affected_mob.dropItemToGround(active_held_item)) to_chat(affected_mob, span_notice("Your hands spaz out and you drop what you were holding!")) affected_mob.set_jitter_if_lower(20 SECONDS) affected_mob.AdjustAllImmobility(-20 * REM * seconds_per_tick * normalise_creation_purity()) affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ephedrine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) @@ -1034,7 +1034,7 @@ /datum/reagent/medicine/neurine name = "Neurine" description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." - color = "#C0C0C0" //ditto + color = COLOR_SILVER //ditto chemical_flags = REAGENT_CAN_BE_SYNTHESIZED | REAGENT_DEAD_PROCESS purity = REAGENT_STANDARD_PURITY inverse_chem_val = 0.5 @@ -1130,7 +1130,7 @@ ph = 8.7 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE addiction_types = list(/datum/addiction/stimulants = 4) //0.8 per 2 seconds - metabolized_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_ANALGESIA) + metabolized_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_ANALGESIA, TRAIT_STIMULATED) /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/affected_mob) . = ..() @@ -1401,7 +1401,7 @@ /datum/reagent/medicine/cordiolis_hepatico name = "Cordiolis Hepatico" description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown." - color = "#000000" + color = COLOR_BLACK self_consuming = TRUE chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 7506cb6a417..6b6af30612c 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -232,7 +232,7 @@ if(reac_volume >= 5) exposed_turf.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS)) - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.apply_water() var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in exposed_turf) @@ -414,7 +414,7 @@ removed_any = TRUE qdel(BS) if(removed_any) - to_chat(affected_mob, span_cultlarge("Your blood rites falter as holy water scours your body!")) + to_chat(affected_mob, span_cult_large("Your blood rites falter as holy water scours your body!")) if(data["deciseconds_metabolized"] >= (25 SECONDS)) // 10 units affected_mob.adjust_stutter_up_to(4 SECONDS * REM * seconds_per_tick, 20 SECONDS) @@ -424,7 +424,7 @@ if(prob(10)) affected_mob.visible_message(span_danger("[affected_mob] starts having a seizure!"), span_userdanger("You have a seizure!")) affected_mob.Unconscious(12 SECONDS) - to_chat(affected_mob, span_cultlarge("[pick("Your blood is your bond - you are nothing without it", "Do not forget your place", \ + to_chat(affected_mob, span_cult_large("[pick("Your blood is your bond - you are nothing without it", "Do not forget your place", \ "All that power, and you still fail?", "If you cannot scour this poison, I shall scour your meager life!")].")) if(data["deciseconds_metabolized"] >= (1 MINUTES)) // 24 units @@ -449,7 +449,7 @@ description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." color = "#88878777" taste_description = "emptyiness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/hydrogen_peroxide name = "Hydrogen Peroxide" @@ -497,7 +497,7 @@ metabolization_rate = 2.5 * REAGENTS_METABOLISM //0.5u/second penetrates_skin = TOUCH|VAPOR ph = 6.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/fuel/unholywater/on_mob_metabolize(mob/living/affected_mob) . = ..() @@ -566,7 +566,7 @@ name = "Godblood" description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." overdose_threshold = 150 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE ///Used for clownery /datum/reagent/lube @@ -669,10 +669,10 @@ head.head_flags |= HEAD_HAIR //No hair? No problem! if(!HAS_TRAIT(affected_human, TRAIT_SHAVED)) affected_human.set_facial_hairstyle("Shaved", update = FALSE) - affected_human.set_facial_haircolor("#000000", update = FALSE) + affected_human.set_facial_haircolor(COLOR_BLACK, update = FALSE) if(!HAS_TRAIT(affected_human, TRAIT_BALD)) affected_human.set_hairstyle("Spiky", update = FALSE) - affected_human.set_haircolor("#000000", update = FALSE) + affected_human.set_haircolor(COLOR_BLACK, update = FALSE) if(HAS_TRAIT(affected_human, TRAIT_USES_SKINTONES)) affected_human.skin_tone = "orange" else if(HAS_TRAIT(affected_human, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(affected_human, TRAIT_FIXED_MUTANT_COLORS)) //Aliens with custom colors simply get turned orange @@ -944,7 +944,7 @@ name = "Oxygen" description = "A colorless, odorless gas. Grows on trees but is still pretty valuable." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY taste_mult = 0 // oderless and tasteless ph = 9.2//It's acutally a huge range and very dependant on the chemistry but ph is basically a made up var in it's implementation anyways chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -979,7 +979,7 @@ name = "Nitrogen" description = "A colorless, odorless, tasteless gas. A simple asphyxiant that can silently displace vital oxygen." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY taste_mult = 0 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -992,7 +992,7 @@ name = "Hydrogen" description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY taste_mult = 0 ph = 0.1//Now I'm stuck in a trap of my own design. Maybe I should make -ve phes? (not 0 so I don't get div/0 errors) chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1008,7 +1008,7 @@ /datum/reagent/mercury name = "Mercury" description = "A curious metal that's a liquid at room temperature. Neurodegenerative and very bad for the mind." - color = "#484848" // rgb: 72, 72, 72A + color = COLOR_WEBSAFE_DARK_GRAY // rgb: 72, 72, 72A taste_mult = 0 // apparently tasteless. chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1074,7 +1074,7 @@ name = "Fluorine" description = "A comically-reactive chemical element. The universe does not want this stuff to exist in this form in the slightest." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY taste_description = "acid" ph = 2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1095,7 +1095,7 @@ name = "Sodium" description = "A soft silver metal that can easily be cut with a knife. It's not salt just yet, so refrain from putting it on your chips." reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY taste_description = "salty metal" ph = 11.6 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1119,7 +1119,7 @@ name = "Lithium" description = "A silver metal, its claim to fame is its remarkably low density. Using it is a bit too effective in calming oneself down." reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY taste_description = "metal" ph = 11.3 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1256,7 +1256,7 @@ to_chat(affected_mob, span_warning("You feel unstable...")) affected_mob.set_jitter_if_lower(2 SECONDS) current_cycle = 1 - addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/living, bluespace_shuffle)), 30) + addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/living, bluespace_shuffle)), 3 SECONDS) /mob/living/proc/bluespace_shuffle() do_teleport(src, get_turf(src), 5, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) @@ -1304,6 +1304,9 @@ /datum/reagent/fuel/on_mob_life(mob/living/carbon/victim, seconds_per_tick, times_fired) . = ..() + var/obj/item/organ/internal/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)) return UPDATE_MOB_HEALTH @@ -1347,7 +1350,7 @@ continue movable_content.wash(clean_types) - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.adjustToxLoss(rand(5,10)) /datum/reagent/space_cleaner/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) @@ -1437,6 +1440,9 @@ /datum/reagent/cyborg_mutation_nanomachines/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() + var/obj/item/organ/internal/liver/liver = exposed_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) + return if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) exposed_mob.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE) @@ -1468,7 +1474,7 @@ /datum/reagent/snail name = "Agent-S" description = "Virological agent that infects the subject with Gastrolosis." - color = "#003300" // rgb(0, 51, 0) + color = COLOR_VERY_DARK_LIME_GREEN // rgb(0, 51, 0) taste_description = "goo" penetrates_skin = NONE ph = 11 @@ -1559,7 +1565,7 @@ used alongside sanguirite to allow blood clotting to continue." reagent_state = LIQUID metabolization_rate = 1.5 * REAGENTS_METABOLISM - color = "#808080" + color = COLOR_GRAY taste_description = "sweetness" ph = 5.8 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1735,7 +1741,7 @@ /datum/reagent/plantnutriment name = "Generic Nutriment" description = "Some kind of nutriment. You can't really tell what it is. You should probably report it, along with how you obtained it." - color = "#000000" // RBG: 0, 0, 0 + color = COLOR_BLACK // RBG: 0, 0, 0 var/tox_prob = 0 taste_description = "plant food" ph = 3 @@ -1948,7 +1954,7 @@ /datum/reagent/carpet/royal/black name = "Royal Black Carpet" description = "For those that feel the need to show off their timewasting skills." - color = "#000000" + color = COLOR_BLACK taste_description = "royalty" carpet_type = /turf/open/floor/carpet/royalblack chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2483,7 +2489,7 @@ /datum/reagent/glitter name = "Generic Glitter" description = "if you can see this description, contact a coder." - color = "#FFFFFF" //pure white + color = COLOR_WHITE //pure white taste_description = "plastic" reagent_state = SOLID var/glitter_type = /obj/effect/decal/cleanable/glitter @@ -2691,7 +2697,7 @@ /datum/reagent/wittel name = "Wittel" description = "An extremely rare metallic-white substance only found on demon-class planets." - color = "#FFFFFF" // rgb: 255, 255, 255 + color = COLOR_WHITE // rgb: 255, 255, 255 taste_mult = 0 // oderless and tasteless chemical_flags = REAGENT_CAN_BE_SYNTHESIZED diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 30757231625..4c68da0b7de 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -20,7 +20,7 @@ /datum/reagent/nitroglycerin name = "Nitroglycerin" description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY taste_description = "oil" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -28,7 +28,7 @@ name = "Stabilizing Agent" description = "Keeps unstable chemicals stable. This does not work on everything." reagent_state = LIQUID - color = "#FFFF00" + color = COLOR_YELLOW taste_description = "metal" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -95,7 +95,7 @@ name = "Gunpowder" description = "Explodes. Violently." reagent_state = LIQUID - color = "#000000" + color = COLOR_BLACK metabolization_rate = 0.125 * REAGENTS_METABOLISM taste_description = "salt" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -124,7 +124,7 @@ name = "RDX" description = "Military grade explosive" reagent_state = SOLID - color = "#FFFFFF" + color = COLOR_WHITE taste_description = "salt" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -132,7 +132,7 @@ name = "TaTP" description = "Suicide grade explosive" reagent_state = SOLID - color = "#FFFFFF" + color = COLOR_WHITE taste_description = "death" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -261,7 +261,7 @@ . = ..() if(reac_volume < 5) return - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.adjustToxLoss(rand(15,30)) #undef CRYO_SPEED_PREFACTOR diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index e9bea91fbed..bcdee284bd7 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -39,7 +39,7 @@ /datum/reagent/toxin/mutagen name = "Unstable Mutagen" description = "Might cause unpredictable mutations. Keep away from children." - color = "#00FF00" + color = COLOR_VIBRANT_LIME creation_purity = REAGENT_STANDARD_PURITY purity = REAGENT_STANDARD_PURITY toxpwr = 0 @@ -511,6 +511,7 @@ toxpwr = 0.5 ph = 4.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/toxin/teapowder name = "Ground Tea Leaves" @@ -521,6 +522,7 @@ taste_description = "green tea" ph = 4.9 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STIMULATED) /datum/reagent/toxin/mushroom_powder name = "Mushroom Powder" @@ -751,19 +753,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - var/need_mob_update = FALSE - if(SPT_PROB(8, seconds_per_tick)) - to_chat(affected_mob, span_danger("You scratch at your head.")) - need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - if(SPT_PROB(8, seconds_per_tick)) - to_chat(affected_mob, span_danger("You scratch at your leg.")) - need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - if(SPT_PROB(8, seconds_per_tick)) - to_chat(affected_mob, span_danger("You scratch at your arm.")) - need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) + var/scratched = FALSE + var/scratch_damage = 0.2 * REM - if(need_mob_update) - . = UPDATE_MOB_HEALTH + var/obj/item/bodypart/head = affected_mob.get_bodypart(BODY_ZONE_HEAD) + if(!isnull(head) && SPT_PROB(8, seconds_per_tick)) + scratched = affected_mob.itch(damage = scratch_damage, target_part = head) + + var/obj/item/bodypart/leg = affected_mob.get_bodypart(pick(BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)) + if(!isnull(leg) && SPT_PROB(8, seconds_per_tick)) + scratched = affected_mob.itch(damage = scratch_damage, target_part = leg, silent = scratched) || scratched + + var/obj/item/bodypart/arm = affected_mob.get_bodypart(pick(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM)) + if(!isnull(arm) && SPT_PROB(8, seconds_per_tick)) + scratched = affected_mob.itch(damage = scratch_damage, target_part = arm, silent = scratched) || scratched if(SPT_PROB(1.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine,rand(1,3)) @@ -830,7 +833,7 @@ description = "Sodium Thiopental induces heavy weakness in its target as well as unconsciousness." silent_toxin = TRUE reagent_state = LIQUID - color = "#6496FA" + color = LIGHT_COLOR_BLUE metabolization_rate = 0.75 * REAGENTS_METABOLISM toxpwr = 0 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE @@ -866,7 +869,7 @@ description = "A very powerful delayed toxin. Upon full metabolization, a massive amount of toxin damage will be dealt depending on how long it has been in the victim's bloodstream." silent_toxin = TRUE reagent_state = LIQUID - color = "#FFFFFF" + color = COLOR_WHITE toxpwr = 0 metabolization_rate = 0.5 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1045,11 +1048,11 @@ description = "A strong mineral acid with the molecular formula H2SO4." color = "#00FF32" toxpwr = 1 - var/acidpwr = 10 //the amount of protection removed from the armour taste_description = "acid" self_consuming = TRUE ph = 2.75 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/acidpwr = 10 //the amount of protection removed from the armour // ...Why? I mean, clearly someone had to have done this and thought, well, // acid doesn't hurt plants, but what brought us here, to this point? @@ -1062,6 +1065,9 @@ . = ..() if(!istype(exposed_carbon)) return + var/obj/item/organ/internal/liver/liver = exposed_carbon.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) + return reac_volume = round(reac_volume,0.1) if(methods & INGEST) exposed_carbon.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr), required_bodytype = affected_bodytype) @@ -1272,7 +1278,7 @@ description = "A colorless, oderless, tasteless neurotoxin usually carried by livers of animals of the Tetraodontiformes order." silent_toxin = TRUE reagent_state = SOLID - color = "#EEEEEE" + color = COLOR_VERY_LIGHT_GRAY metabolization_rate = 0.1 * REAGENTS_METABOLISM toxpwr = 0 taste_mult = 0 diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm index 1cb0e6204c2..7c18c7e2014 100644 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm @@ -118,4 +118,4 @@ lockers += closet if(!length(lockers)) return - SSeigenstates.create_new_link(lockers) + GLOB.eigenstate_manager.create_new_link(lockers) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 1c8d0604b43..0439b8e2071 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -267,10 +267,10 @@ else if(setting_type) if(step_away(X, T) && moving_power > 1) //Can happen twice at most. So this is fine. - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_step_away), X, T), 2) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_step_away), X, T), 0.2 SECONDS) else if(step_towards(X, T) && moving_power > 1) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_step_towards), X, T), 2) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_step_towards), X, T), 0.2 SECONDS) //////////////////Generic explosions/failures//////////////////// // It is HIGHLY, HIGHLY recomended that you consume all/a good volume of the reagents/products in an explosion - because it will just keep going forever until the reaction stops diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm index c61a7739377..376a805e7d6 100644 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm @@ -211,7 +211,6 @@ required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2) required_catalysts = list(/datum/reagent/toxin/acid = 1) mix_message = "The mixture turns into a tired reddish pink liquid." - optimal_temp = 1 optimal_temp = 900 overheat_temp = 720 optimal_ph_min = 2 diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index bc41e25090b..d190a44aea0 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -157,7 +157,7 @@ mix_message = "Sparks start flying around the gunpowder!" /datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - addtimer(CALLBACK(src, PROC_REF(default_explode), holder, created_volume, modifier, strengthdiv), rand(5,10) SECONDS) + addtimer(CALLBACK(src, PROC_REF(default_explode), holder, created_volume, modifier, strengthdiv), rand(5 SECONDS, 10 SECONDS)) /datum/chemical_reaction/thermite results = list(/datum/reagent/thermite = 3) @@ -560,7 +560,7 @@ var/atom/holder_atom = holder.my_atom if(QDELETED(holder_atom)) return - tesla_zap(source = holder_atom, zap_range = 7, power = power, cutoff = 1e3, zap_flags = zap_flags) + tesla_zap(source = holder_atom, zap_range = 7, power = power, cutoff = 1 KILO JOULES, zap_flags = zap_flags) playsound(holder_atom, 'sound/machines/defib_zap.ogg', 50, TRUE) /datum/chemical_reaction/reagent_explosion/teslium_lightning/heat diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index f37f9ebb081..ce13c9c70de 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -31,7 +31,7 @@ required_container = /obj/item/slime_extract/grey /datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/mob/living/simple_animal/slime/spawning_slime = new(get_turf(holder.my_atom), /datum/slime_type/grey) + var/mob/living/basic/slime/spawning_slime = new(get_turf(holder.my_atom), /datum/slime_type/grey) spawning_slime.visible_message(span_danger("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")) ..() @@ -103,21 +103,21 @@ /datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T) T.visible_message(span_danger("The slime extract begins to vibrate violently!")) - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 5, "Gold Slime", HOSTILE_SPAWN), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 5, "Gold Slime", HOSTILE_SPAWN), 5 SECONDS) /datum/chemical_reaction/slime/slimemobspawn/lesser required_reagents = list(/datum/reagent/blood = 1) /datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T) T.visible_message(span_danger("The slime extract begins to vibrate violently!")) - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, FACTION_NEUTRAL), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, FACTION_NEUTRAL), 5 SECONDS) /datum/chemical_reaction/slime/slimemobspawn/friendly required_reagents = list(/datum/reagent/water = 1) /datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T) T.visible_message(span_danger("The slime extract begins to vibrate adorably!")) - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, FACTION_NEUTRAL), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, FACTION_NEUTRAL), 5 SECONDS) /datum/chemical_reaction/slime/slimemobspawn/spider required_reagents = list(/datum/reagent/spider_extract = 1) @@ -125,7 +125,7 @@ /datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T) T.visible_message(span_danger("The slime extract begins to vibrate crikey-ingly!")) - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/spider/giant/midwife, FACTION_NEUTRAL, FALSE), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/spider/giant/midwife, FACTION_NEUTRAL, FALSE), 5 SECONDS) //Silver @@ -149,7 +149,7 @@ if(prob(5))//Fry it! food_item.AddElement(/datum/element/fried_item, rand(15, 60)) if(prob(5))//Grill it! - food_item.AddElement(/datum/element/grilled_item, rand(30, 100)) + food_item.AddElement(/datum/element/grilled_item, rand(30 SECONDS, 100 SECONDS)) if(prob(50)) for(var/j in 1 to rand(1, 3)) step(food_item, pick(NORTH,SOUTH,EAST,WEST)) @@ -194,7 +194,7 @@ /datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) T.visible_message(span_danger("The slime extract starts to feel extremely cold!")) - addtimer(CALLBACK(src, PROC_REF(freeze), holder), 50) + addtimer(CALLBACK(src, PROC_REF(freeze), holder), 5 SECONDS) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) ..() @@ -229,7 +229,7 @@ /datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) T.visible_message(span_danger("The slime extract begins to vibrate adorably!")) - addtimer(CALLBACK(src, PROC_REF(slime_burn), holder), 50) + addtimer(CALLBACK(src, PROC_REF(slime_burn), holder), 5 SECONDS) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) ..() @@ -313,13 +313,13 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS /datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) - if(slime.docile) //Undoes docility, but doesn't make rabid. + for(var/mob/living/basic/slime/slime in viewers(get_turf(holder.my_atom), null)) + if(slime.hunger_disabled) //Undoes docility, but doesn't make rabid. slime.visible_message(span_danger("[slime] forgets its training, becoming wild once again!")) - slime.docile = FALSE + slime.set_default_behaviour() slime.update_name() continue - slime.rabid = TRUE + slime.set_enraged_behaviour() slime.visible_message(span_danger("The [slime] is driven into a frenzy!")) ..() @@ -372,7 +372,7 @@ message_admins("Slime Explosion reaction started at [ADMIN_VERBOSEJMP(T)]. Last Fingerprint: [touch_msg]") log_game("Slime Explosion reaction started at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") T.visible_message(span_danger("The slime extract begins to vibrate violently !")) - addtimer(CALLBACK(src, PROC_REF(boom), holder), 50) + addtimer(CALLBACK(src, PROC_REF(boom), holder), 5 SECONDS) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) ..() @@ -525,9 +525,9 @@ S.visible_message(span_danger("Infused with plasma, the core begins to expand uncontrollably!")) S.icon_state = "[S.base_state]_active" S.active = TRUE - addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, detonate)), rand(15,60)) + addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, detonate)), rand(1.5 SECONDS, 6 SECONDS)) else - var/mob/living/simple_animal/slime/random/random_slime = new (get_turf(holder.my_atom)) + var/mob/living/basic/slime/random/random_slime = new (get_turf(holder.my_atom)) random_slime.visible_message(span_danger("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")) ..() @@ -541,7 +541,7 @@ S.visible_message(span_danger("Infused with slime jelly, the core begins to expand uncontrollably!")) S.icon_state = "[S.base_state]_active" S.active = TRUE - addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, detonate)), rand(15,60)) + addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, detonate)), rand(1.5 SECONDS, 6 SECONDS)) var/lastkey = holder.my_atom.fingerprintslast var/touch_msg = "N/A" if(lastkey) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d58df6a1d6b..dfffdad6ab8 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -151,7 +151,7 @@ if (ismob(target)) var/mob/target_mob = target target_mob.show_message( - span_userdanger("[user] splash the contents of [src] onto you!"), + span_userdanger("[user] splashes the contents of [src] onto you!"), MSG_VISUAL, span_userdanger("You feel drenched!"), ) diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index ca941be8ca1..a5a68315b87 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -426,6 +426,7 @@ /datum/reagent/consumable/bbqsauce = list("condi_bbq", "BBQ sauce", "Hand wipes not included."), /datum/reagent/consumable/peanut_butter = list("condi_peanutbutter", "Peanut Butter", "A creamy paste made from ground peanuts."), /datum/reagent/consumable/cherryjelly = list("condi_cherryjelly", "Cherry Jelly", "A jar of super-sweet cherry jelly."), + /datum/reagent/consumable/mayonnaise = list("condi_mayo", "Mayonnaise", "Not an instrument."), ) /// Can't use initial(name) for this. This stores the name set by condimasters. var/originalname = "condiment" @@ -518,3 +519,15 @@ originalname = "sugar" volume = 5 list_reagents = list(/datum/reagent/consumable/sugar = 5) + +/obj/item/reagent_containers/condiment/pack/soysauce + name = "soy sauce pack" + originalname = "soy sauce" + volume = 5 + list_reagents = list(/datum/reagent/consumable/soysauce = 5) + +/obj/item/reagent_containers/condiment/pack/mayonnaise + name = "mayonnaise pack" + originalname = "mayonnaise" + volume = 5 + list_reagents = list(/datum/reagent/consumable/mayonnaise = 5) diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index dde51891e66..31948c5cc1e 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -127,6 +127,7 @@ var/trans = reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_TO, target) + target.update_appearance() else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) @@ -140,8 +141,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_FROM, target) - - target.update_appearance() + target.update_appearance() /obj/item/reagent_containers/cup/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) if((!proximity_flag) || !check_allowed_items(target, target_self = TRUE)) @@ -418,7 +418,7 @@ if(reagents.total_volume == reagents.maximum_volume) user.balloon_alert(user, "mop is full!") return - mop.reagents.remove_any(mop.reagents.total_volume * SQUEEZING_DISPERSAL_RATIO) + mop.reagents.remove_all(mop.reagents.total_volume * SQUEEZING_DISPERSAL_RATIO) mop.reagents.trans_to(src, mop.reagents.total_volume, transferred_by = user) user.balloon_alert(user, "mop squeezed") else @@ -501,7 +501,7 @@ var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(grinded && in_range(src, user) && user.is_holding(I) && picked_option) to_chat(user, span_notice("You start grinding...")) - if(do_after(user, 25, target = src)) + if(do_after(user, 2.5 SECONDS, target = src)) user.adjustStaminaLoss(40) switch(picked_option) if("Juice") diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 9deb6582508..4f7abbe6f20 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -144,7 +144,7 @@ return var/amount_lost = intensity * 5 - reagents.remove_any(amount_lost) + reagents.remove_all(amount_lost) visible_message(span_warning("Some of [name]'s contents are let loose!")) var/intensity_state = null @@ -406,7 +406,7 @@ return "[year] [origin] [type]" /obj/item/reagent_containers/cup/glass/bottle/absinthe - name = "extra-strong absinthe" + name = "Extra-strong absinthe" desc = "A strong alcoholic drink brewed and distributed by" icon_state = "absinthebottle" list_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 100) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 4cbb4839416..c4cd57b1568 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -122,7 +122,7 @@ has_variable_transfer_amount = FALSE volume = 15 ignore_flags = 1 //so you can medipen through spacesuits - reagent_flags = DRAWABLE + reagent_flags = NONE flags_1 = null list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/toxin/formaldehyde = 3, /datum/reagent/medicine/coagulant = 2) custom_price = PAYCHECK_CREW @@ -312,7 +312,6 @@ base_icon_state = "gorillapen" volume = 5 ignore_flags = 0 - reagent_flags = NONE list_reagents = list(/datum/reagent/magillitis = 5) /obj/item/reagent_containers/hypospray/medipen/pumpup diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index b7a5fbb71f5..fa8d8cd3628 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -32,7 +32,7 @@ if(on && (!cell || cell.charge <= 0)) //Check if we ran out of power change_power_status(FALSE) return FALSE - cell.use(5 * seconds_per_tick) //Basic cell goes for like 200 seconds, bluespace for 8000 + cell.use(5 KILO WATTS * seconds_per_tick) //Basic cell goes for like 200 seconds, bluespace for 8000 if(!reagents.total_volume) return FALSE var/max_temp = min(500 + (500 * (0.2 * cell.rating)), 1000) // 373 to 1000 diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index fd2ab0eb493..ee512224184 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -49,7 +49,7 @@ ///Runs the consumption code, can be overriden for special effects /obj/item/reagent_containers/pill/proc/on_consumption(mob/consumer, mob/giver) if(icon_state == "pill4" && prob(5)) //you take the red pill - you stay in Wonderland, and I show you how deep the rabbit hole goes - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), consumer, span_notice("[pick(strings(REDPILL_FILE, "redpill_questions"))]")), 50) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), consumer, span_notice("[pick(strings(REDPILL_FILE, "redpill_questions"))]")), 5 SECONDS) if(apply_type == INGEST) SEND_SIGNAL(consumer, COMSIG_LIVING_PILL_CONSUMED, src, giver) SEND_SIGNAL(src, COMSIG_PILL_CONSUMED, eater = consumer, feeder = giver) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 3bff3a3abba..36424f22cbd 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -82,9 +82,10 @@ living_target.log_message("injected themselves ([contained]) with [name]", LOG_ATTACK, color="orange") else log_combat(user, living_target, "injected", src, addition="which had [contained]") - reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user, methods = INJECT) - to_chat(user, span_notice("You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.")) - target.update_appearance() + + if(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user, methods = INJECT)) + to_chat(user, span_notice("You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.")) + target.update_appearance() /obj/item/reagent_containers/syringe/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) if (!try_syringe(target, user, proximity_flag)) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 02ad176e8e0..d9ce792f1a0 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -199,12 +199,9 @@ explosion(src, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 6, flame_range = 8) qdel(src) -/obj/structure/reagent_dispensers/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(!disassembled) - boom() - else - qdel(src) +/obj/structure/reagent_dispensers/atom_deconstruct(disassembled = TRUE) + if(!disassembled) + boom() /obj/structure/reagent_dispensers/proc/tank_leak() if(leaking && reagents && reagents.total_volume >= amount_to_leak) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 0977917d082..9bd89517bb8 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -131,7 +131,7 @@ return place_item_in_disposal(I, user) update_appearance() - return 1 //no afterattack + return TRUE //no afterattack else return ..() @@ -198,7 +198,6 @@ else target.visible_message(span_danger("[user] places [target] in [src]."), span_userdanger("[user] places you in [src].")) log_combat(user, target, "stuffed", addition="into [src]") - target.LAssailant = WEAKREF(user) . = TRUE update_appearance() @@ -327,19 +326,73 @@ desc = "A pneumatic waste disposal unit." icon_state = "disposal" interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY + /// Reference to the mounted destination tagger for disposal bins with one mounted. + var/obj/item/dest_tagger/mounted_tagger // attack by item places it in to disposal -/obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type. - var/obj/item/storage/bag/trash/bag = I +/obj/machinery/disposal/bin/attackby(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type. + var/obj/item/storage/bag/trash/bag = weapon to_chat(user, span_warning("You empty the bag.")) bag.atom_storage.remove_all(src) update_appearance() else return ..() - // handle machine interaction +/obj/machinery/disposal/bin/attackby_secondary(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/dest_tagger)) + var/obj/item/dest_tagger/new_tagger = weapon + if(mounted_tagger) + balloon_alert(user, "already has a tagger!") + return + if(HAS_TRAIT(new_tagger, TRAIT_NODROP) || !user.transferItemToLoc(new_tagger, src)) + balloon_alert(user, "stuck to your hand!") + return + new_tagger.moveToNullspace() + user.visible_message(span_notice("[user] snaps \the [new_tagger] onto [src]!")) + balloon_alert(user, "tagger returned") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + mounted_tagger = new_tagger + update_appearance() + return + else + return ..() + +/obj/machinery/disposal/bin/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(!mounted_tagger) + balloon_alert(user, "no destination tagger!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!user.put_in_hands(mounted_tagger)) + balloon_alert(user, "destination tagger falls!") + mounted_tagger = null + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + user.visible_message(span_notice("[user] unhooks the [mounted_tagger] from [src].")) + balloon_alert(user, "tagger pulled") + playsound(src, 'sound/machines/click.ogg', 60, TRUE) + mounted_tagger = null + update_appearance(UPDATE_OVERLAYS) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/disposal/bin/examine(mob/user) + . = ..() + if(isnull(mounted_tagger)) + . += span_notice("The destination tagger mount is empty.") + else + . += span_notice("\The [mounted_tagger] is hanging on the side. Right Click to remove.") + +/obj/machinery/disposal/bin/Destroy() + if(!isnull(mounted_tagger)) + QDEL_NULL(mounted_tagger) + return ..() + +/obj/machinery/disposal/bin/on_deconstruction(disassembled) + . = ..() + if(!isnull(mounted_tagger)) + mounted_tagger.forceMove(drop_location()) + mounted_tagger = null + /obj/machinery/disposal/bin/ui_state(mob/user) return GLOB.notcontained_state @@ -358,7 +411,7 @@ data["pressure_charging"] = pressure_charging data["panel_open"] = panel_open data["per"] = CLAMP01(air_contents.return_pressure() / (SEND_PRESSURE)) - data["isai"] = isAI(user) + data["isai"] = HAS_AI_ACCESS(user) return data /obj/machinery/disposal/bin/ui_act(action, params) @@ -419,6 +472,9 @@ if(flush) . += "dispover-handle" + if(mounted_tagger) + . += "tagger_mount" + //only handle is shown if no power if(machine_stat & NOPOWER || panel_open) return @@ -460,13 +516,13 @@ if(machine_stat & NOPOWER) // won't charge if no power return - use_power(idle_power_usage) // base power usage + use_energy(idle_power_usage) // base power usage if(!pressure_charging) // if off or ready, no need to charge return // otherwise charge - use_power(idle_power_usage) // charging power usage + use_energy(idle_power_usage) // charging power usage var/atom/L = loc //recharging from loc turf @@ -493,6 +549,10 @@ if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) +/obj/machinery/disposal/bin/tagger/Initialize(mapload, obj/structure/disposalconstruct/make_from) + mounted_tagger = new /obj/item/dest_tagger(null) + return ..() + //Delivery Chute /obj/machinery/disposal/delivery_chute diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 69519874cd2..9a1ad786e72 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -170,27 +170,24 @@ return TRUE // called when pipe is cut with welder -/obj/structure/disposalpipe/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - if(spawn_pipe) - var/obj/structure/disposalconstruct/construct = stored - if(!construct) // Don't have something? Make one now - construct = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) - stored = null - construct.forceMove(loc) - transfer_fingerprints_to(construct) - construct.setDir(dir) - spawn_pipe = FALSE - else - var/turf/T = get_turf(src) - for(var/D in GLOB.cardinals) - if(D & dpdir) - var/obj/structure/disposalpipe/broken/P = new(T) - P.setDir(D) +/obj/structure/disposalpipe/atom_deconstruct(disassembled = TRUE) + if(disassembled) + if(spawn_pipe) + var/obj/structure/disposalconstruct/construct = stored + if(!construct) // Don't have something? Make one now + construct = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) + stored = null + construct.forceMove(loc) + transfer_fingerprints_to(construct) + construct.setDir(dir) + spawn_pipe = FALSE + else + var/turf/location = get_turf(src) + for(var/dir in GLOB.cardinals) + if(dir & dpdir) + var/obj/structure/disposalpipe/broken/pipe = new(location) + pipe.setDir(dir) spew_forth() - qdel(src) - /obj/structure/disposalpipe/singularity_pull(S, current_size) ..() @@ -323,9 +320,6 @@ spawn_pipe = FALSE anchored = FALSE -/obj/structure/disposalpipe/broken/deconstruct() - qdel(src) - /obj/structure/disposalpipe/rotator icon_state = "pipe-r1" initialize_dirs = DISP_DIR_LEFT | DISP_DIR_RIGHT | DISP_DIR_FLIP diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 785fab73097..f11ad91e002 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -51,23 +51,22 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += contents -/obj/item/delivery/deconstruct() +/obj/item/delivery/atom_deconstruct(dissambled = TRUE) unwrap_contents() post_unwrap_contents() - return ..() /obj/item/delivery/examine(mob/user) . = ..() if(note) if(!in_range(user, src)) - . += "There's a [note.name] attached to it. You can't read it from here." + . += span_info("There's a [EXAMINE_HINT(note.name)] attached to it. You can't read it from here.") else - . += "There's a [note.name] attached to it..." + . += span_info("There's a [EXAMINE_HINT(note.name)] attached to it...") . += note.examine(user) if(sticker) - . += "There's a barcode attached to the side." + . += span_notice("There's a [EXAMINE_HINT("barcode")] attached to the side. The package is marked for [EXAMINE_HINT("export.")]") if(sort_tag) - . += "There's a sorting tag with the destination set to [GLOB.TAGGERLOCATIONS[sort_tag]]." + . += span_notice("There's a [EXAMINE_HINT("sorting tag")] with the destination set to [EXAMINE_HINT("[GLOB.TAGGERLOCATIONS[sort_tag]].")]") /obj/item/delivery/proc/disposal_handling(disposal_source, obj/structure/disposalholder/disposal_holder, obj/machinery/disposal/disposal_machine, hasmob) SIGNAL_HANDLER @@ -80,7 +79,7 @@ movable_loc.relay_container_resist_act(user, object) return to_chat(user, span_notice("You lean on the back of [object] and start pushing to rip the wrapping around it.")) - if(do_after(user, 50, target = object)) + if(do_after(user, 5 SECONDS, target = object)) if(!user || user.stat != CONSCIOUS || user.loc != object || object.loc != src) return to_chat(user, span_notice("You successfully removed [object]'s wrapping!")) @@ -102,7 +101,7 @@ if(note) . += "[base_icon_state]_note" if(sticker) - . += "[base_icon_state]_tag" + . += "[base_icon_state]_barcode" /obj/item/delivery/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/dest_tagger)) diff --git a/code/modules/religion/festival/instrument_rites.dm b/code/modules/religion/festival/instrument_rites.dm index d8537f5845e..3bcf3224d37 100644 --- a/code/modules/religion/festival/instrument_rites.dm +++ b/code/modules/religion/festival/instrument_rites.dm @@ -68,7 +68,7 @@ ///particle effect of playing this tune var/particles_path = /particles/musical_notes ///what the instrument will glow when playing - var/glow_color = "#000000" + var/glow_color = COLOR_BLACK /datum/religion_rites/song_tuner/invoke_effect(mob/living/user, obj/structure/altar_of_gods/altar) . = ..() @@ -138,7 +138,7 @@ var/obj/effect/dummy/lighting_obj/moblight/performer_light_obj /datum/religion_rites/song_tuner/light/performer_start_effect(mob/living/carbon/human/performer, atom/song_source) - performer_light_obj = performer.mob_light(8, color = LIGHT_COLOR_DIM_YELLOW) + performer_light_obj = performer.mob_light(8, 1.5, color = LIGHT_COLOR_DIM_YELLOW) /datum/religion_rites/song_tuner/light/Destroy() QDEL_NULL(performer_light_obj) diff --git a/code/modules/religion/honorbound/honorbound_trauma.dm b/code/modules/religion/honorbound/honorbound_trauma.dm index 399bf6765ed..6bc0879b125 100644 --- a/code/modules/religion/honorbound/honorbound_trauma.dm +++ b/code/modules/religion/honorbound/honorbound_trauma.dm @@ -20,7 +20,8 @@ RegisterSignal(owner, COMSIG_MOB_FIRED_GUN, PROC_REF(staff_check)) //adds the relay_attackers element to the owner so whoever attacks him becomes guilty. - owner.AddElement(/datum/element/relay_attackers) + if(!HAS_TRAIT(owner, TRAIT_RELAYING_ATTACKER)) + owner.AddElement(/datum/element/relay_attackers) RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) //signal that checks for dishonorable attacks diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index ebb8a69a7e5..16cd82c5650 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -154,10 +154,10 @@ /datum/religion_sect/mechanical/sect_bless(mob/living/target, mob/living/chap) if(iscyborg(target)) var/mob/living/silicon/robot/R = target - var/charge_amt = 50 + var/charge_amount = 0.05 * STANDARD_CELL_CHARGE if(target.mind?.holy_role == HOLY_ROLE_HIGHPRIEST) - charge_amt *= 2 - R.cell?.charge += charge_amt + charge_amount *= 2 + R.cell?.charge += charge_amount R.visible_message(span_notice("[chap] charges [R] with the power of [GLOB.deity]!")) to_chat(R, span_boldnotice("You are charged by the power of [GLOB.deity]!")) R.add_mood_event("blessing", /datum/mood_event/blessing) @@ -171,7 +171,7 @@ var/did_we_charge = FALSE var/obj/item/organ/internal/stomach/ethereal/eth_stomach = blessed.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(eth_stomach)) - eth_stomach.adjust_charge(60) + eth_stomach.adjust_charge(0.06 * STANDARD_CELL_CHARGE) did_we_charge = TRUE //if we're not targeting a robot part we stop early @@ -200,7 +200,7 @@ if(!istype(power_cell)) return - if(power_cell.charge < 300) + if(power_cell.charge < 0.3 * STANDARD_CELL_CHARGE) to_chat(chap, span_notice("[GLOB.deity] does not accept pity amounts of power.")) return diff --git a/code/modules/religion/sparring/ceremonial_gear.dm b/code/modules/religion/sparring/ceremonial_gear.dm index c21920af410..08ab6940805 100644 --- a/code/modules/religion/sparring/ceremonial_gear.dm +++ b/code/modules/religion/sparring/ceremonial_gear.dm @@ -10,7 +10,7 @@ greyscale_config = /datum/greyscale_config/ceremonial_blade greyscale_config_inhand_left = /datum/greyscale_config/ceremonial_blade_lefthand greyscale_config_inhand_right = /datum/greyscale_config/ceremonial_blade_righthand - greyscale_colors = "#FFFFFF" + greyscale_colors = COLOR_WHITE hitsound = 'sound/weapons/bladeslice.ogg' custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*6) //Defaults to an Iron blade. diff --git a/code/modules/religion/sparring/sparring_datum.dm b/code/modules/religion/sparring/sparring_datum.dm index bfaa94d65a8..78de2bd3a0b 100644 --- a/code/modules/religion/sparring/sparring_datum.dm +++ b/code/modules/religion/sparring/sparring_datum.dm @@ -301,4 +301,4 @@ return to_chat(loser, span_userdanger("You've lost ownership over your soul to [winner]!")) var/obj/item/soulstone/anybody/chaplain/sparring/shard = new(shard_turf) - shard.capture_soul(loser, winner, forced = TRUE) + INVOKE_ASYNC(shard, TYPE_PROC_REF(/obj/item/soulstone, capture_soul), loser, winner, forced = TRUE) diff --git a/code/modules/research/designs/autolathe/engineering_designs.dm b/code/modules/research/designs/autolathe/engineering_designs.dm index 6249f5c645a..945966035f3 100644 --- a/code/modules/research/designs/autolathe/engineering_designs.dm +++ b/code/modules/research/designs/autolathe/engineering_designs.dm @@ -426,3 +426,29 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/tram_floor_dark + name = "Dark Tram Tile" + id = "tram_floor_dark" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 0.25) + build_path = /obj/item/stack/thermoplastic + maxstack = 50 + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/tram_floor_light + name = "Light Tram Tile" + id = "tram_floor_light" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 0.25) + build_path = /obj/item/stack/thermoplastic/light + maxstack = 50 + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index ef8c762acd7..32bbfc8ab01 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -1,5 +1,5 @@ ///////////////////////////////////// -//////////Limb Grower Designs /////// +////////// Designs /////// ///////////////////////////////////// /datum/design/leftarm diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index a73b4459333..65dd75142a2 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -318,6 +318,26 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY +/datum/design/board/photobooth + name = "Photobooth Board" + desc = "The circuit board for a photobooth." + id = "photobooth" + build_path = /obj/item/circuitboard/machine/photobooth + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/board/security_photobooth + name = "Security Photobooth Board" + desc = "The circuit board for a security photobooth." + id = "security_photobooth" + build_path = /obj/item/circuitboard/machine/photobooth/security + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + /datum/design/board/biogenerator name = "Biogenerator Board" desc = "The circuit board for a biogenerator." diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index e9e34bfd806..03fffcec8ca 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -48,7 +48,7 @@ return TRUE busy = TRUE loaded_item = weapon - to_chat(user, span_notice("You add the [weapon.name] to the [name]!")) + to_chat(user, span_notice("You place the [weapon.name] inside the [name].")) flick("[base_icon_state]_la", src) addtimer(CALLBACK(src, PROC_REF(finish_loading)), 1 SECONDS) return TRUE @@ -115,10 +115,26 @@ say("Destructive analysis failed!") return TRUE +//Let emags in on a right click +/obj/machinery/rnd/destructive_analyzer/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + if(is_right_clicking && istype(tool, /obj/item/card/emag)) + return NONE + return ..() + //This allows people to put syndicate screwdrivers in the machine. Secondary act still passes. /obj/machinery/rnd/destructive_analyzer/screwdriver_act(mob/living/user, obj/item/tool) return FALSE +//We need to call default_deconstruction_screwdriver here since its parent will call screwdriver_act on this level which will stop us from ever deconstructing. +/obj/machinery/rnd/destructive_analyzer/screwdriver_act_secondary(mob/living/user, obj/item/tool) + return default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), tool) + +//We need to let wire cutter in (not block) so we can analyze alien wirecutters. +/obj/machinery/rnd/destructive_analyzer/wirecutter_act(mob/living/user, obj/item/tool) + if(panel_open) + wires.interact(user) + return ITEM_INTERACT_SUCCESS + ///Drops the loaded item where it can and nulls it. /obj/machinery/rnd/destructive_analyzer/proc/unload_item() if(!loaded_item) @@ -146,7 +162,7 @@ flick("[base_icon_state]_process", src) busy = TRUE addtimer(CALLBACK(src, PROC_REF(reset_busy)), 2.4 SECONDS) - use_power(DESTRUCTIVE_ANALYZER_POWER_USAGE) + use_energy(DESTRUCTIVE_ANALYZER_POWER_USAGE) var/list/all_contents = loaded_item.get_all_contents() for(var/innerthing in all_contents) destroy_item_individual(innerthing, gain_research_points) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index ce61208b322..98d3943d4f9 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -235,7 +235,7 @@ stored_research.unhide_node(SSresearch.techweb_node_by_id(picked_node_id)) experiment(reaction, loaded_item) - use_power(750) + use_energy(750 JOULES) /obj/machinery/rnd/experimentor/proc/throwSmoke(turf/where) var/datum/effect_system/fluid_spread/smoke/smoke = new @@ -351,7 +351,7 @@ playsound(src, 'sound/machines/ding.ogg', 50, TRUE) var/obj/item/reagent_containers/cup/glass/coffee/C = new /obj/item/reagent_containers/cup/glass/coffee(get_turf(pick(oview(1,src)))) chosenchem = pick(/datum/reagent/toxin/plasma,/datum/reagent/consumable/capsaicin,/datum/reagent/consumable/ethanol) - C.reagents.remove_any(25) + C.reagents.remove_all(25) C.reagents.add_reagent(chosenchem , 50) C.name = "Cup of Suspicious Liquid" C.desc = "It has a large hazard symbol printed on the side in fading ink." @@ -395,7 +395,7 @@ var/obj/item/reagent_containers/cup/glass/coffee/C = new /obj/item/reagent_containers/cup/glass/coffee(get_turf(pick(oview(1,src)))) playsound(src, 'sound/machines/ding.ogg', 50, TRUE) //Ding! Your death coffee is ready! chosenchem = pick(/datum/reagent/uranium,/datum/reagent/consumable/frostoil,/datum/reagent/medicine/ephedrine) - C.reagents.remove_any(25) + C.reagents.remove_all(25) C.reagents.add_reagent(chosenchem , 50) C.name = "Cup of Suspicious Liquid" C.desc = "It has a large hazard symbol printed on the side in fading ink." @@ -505,14 +505,14 @@ ejectItem(TRUE) if(globalMalf > 76 && globalMalf < 98) visible_message(span_warning("[src] begins to smoke and hiss, shaking violently!")) - use_power(500000) + use_energy(500 KILO JOULES) investigate_log("Experimentor has drained power from its APC", INVESTIGATE_EXPERIMENTOR) if(globalMalf == 99) visible_message(span_warning("[src] begins to glow and vibrate. It's going to blow!")) - addtimer(CALLBACK(src, PROC_REF(boom)), 50) + addtimer(CALLBACK(src, PROC_REF(boom)), 5 SECONDS) if(globalMalf == 100) visible_message(span_warning("[src] begins to glow and vibrate. It's going to blow!")) - addtimer(CALLBACK(src, PROC_REF(honk)), 50) + addtimer(CALLBACK(src, PROC_REF(honk)), 5 SECONDS) addtimer(CALLBACK(src, PROC_REF(reset_exp)), resetTime) @@ -663,7 +663,7 @@ /obj/item/relic/proc/explode(mob/user) to_chat(user, span_danger("[src] begins to heat up!")) - addtimer(CALLBACK(src, PROC_REF(do_explode), user), rand(35, 100)) + addtimer(CALLBACK(src, PROC_REF(do_explode), user), rand(3.5 SECONDS, 10 SECONDS)) /obj/item/relic/proc/do_explode(mob/user) if(loc == user) @@ -674,7 +674,7 @@ /obj/item/relic/proc/teleport(mob/user) to_chat(user, span_notice("[src] begins to vibrate!")) - addtimer(CALLBACK(src, PROC_REF(do_the_teleport), user), rand(10, 30)) + addtimer(CALLBACK(src, PROC_REF(do_the_teleport), user), rand(1 SECONDS, 3 SECONDS)) /obj/item/relic/proc/do_the_teleport(mob/user) var/turf/userturf = get_turf(user) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index f95145b4b94..8ed6ef04df0 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -1,6 +1,8 @@ /obj/machinery/rnd/production name = "technology fabricator" desc = "Makes researched and prototype items with materials and energy." + // Energy cost per full stack of materials spent. Material insertion is 40% of this. + active_power_usage = 50 * BASE_MACHINE_ACTIVE_CONSUMPTION /// The efficiency coefficient. Material costs and print times are multiplied by this number; var/efficiency_coeff = 1 @@ -28,7 +30,7 @@ /datum/component/remote_materials, \ mapload, \ mat_container_signals = list( \ - COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/rnd, local_material_insert) + COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/rnd/production, local_material_insert) ) \ ) @@ -49,7 +51,6 @@ cached_designs = null return ..() - // Stuff for the stripe on the department machines /obj/machinery/rnd/production/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) . = ..() @@ -128,7 +129,7 @@ addtimer(CALLBACK(src, PROC_REF(update_designs)), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) ///When materials are instered via silo link -/obj/machinery/rnd/proc/silo_material_insert(obj/machinery/rnd/machine, container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted) +/obj/machinery/rnd/production/proc/silo_material_insert(obj/machinery/rnd/machine, container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted) SIGNAL_HANDLER process_item(item_inserted, mats_consumed, amount_inserted) @@ -141,37 +142,39 @@ * * list/mats_consumed - list of mats consumed * * amount_inserted - amount of material actually processed */ -/obj/machinery/rnd/proc/process_item(obj/item/item_inserted, list/mats_consumed, amount_inserted) +/obj/machinery/rnd/production/proc/process_item(obj/item/item_inserted, list/mats_consumed, amount_inserted) PRIVATE_PROC(TRUE) //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it - if(directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage)))) - var/mat_name = "iron" + if(directly_use_energy(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.4 * initial(active_power_usage)))) + var/datum/material/highest_mat_ref var/highest_mat = 0 for(var/datum/material/mat as anything in mats_consumed) var/present_mat = mats_consumed[mat] if(present_mat > highest_mat) - mat_name = initial(mat.name) - if(mat_name == "silver" || mat_name == "titanium" || mat_name == "plastic") //these materials have similar appearances so use an common overlay for them - mat_name = "shiny" highest_mat = present_mat + highest_mat_ref = mat - flick_animation(mat_name) + flick_animation(highest_mat_ref) /** * Plays an visual animation when materials are inserted * Arguments * - * * mat_name - the name of the material we are trying to animate on the machine + * * mat - the material ref we are trying to animate on the machine */ -/obj/machinery/rnd/proc/flick_animation(mat_name) +/obj/machinery/rnd/production/proc/flick_animation(datum/material/mat_ref) PROTECTED_PROC(TRUE) SHOULD_CALL_PARENT(FALSE) - flick_overlay_view(mutable_appearance('icons/obj/machines/research.dmi', "protolathe_[mat_name]"), 1 SECONDS) + //first play the insertion animation + flick_overlay_view(material_insertion_animation(mat_ref.greyscale_colors), 1 SECONDS) + + //now play the progress bar animation + flick_overlay_view(mutable_appearance('icons/obj/machines/research.dmi', "protolathe_progress"), 1 SECONDS) ///When materials are instered into local storage -/obj/machinery/rnd/proc/local_material_insert(container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted, atom/context) +/obj/machinery/rnd/production/proc/local_material_insert(container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER process_item(item_inserted, mats_consumed, amount_inserted) @@ -288,7 +291,7 @@ return //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it - if(!directly_use_power(ROUND_UP((amount / MAX_STACK_SIZE) * 0.01 * initial(active_power_usage)))) + if(!directly_use_energy(ROUND_UP((amount / MAX_STACK_SIZE) * 0.4 * initial(active_power_usage)))) say("No power to dispense sheets") return @@ -337,8 +340,12 @@ var/charge_per_item = 0 for(var/material in design.materials) charge_per_item += design.materials[material] - charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * coefficient * 0.05 * active_power_usage) + charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * coefficient * active_power_usage) var/build_time_per_item = (design.construction_time * design.lathe_time_factor) ** 0.8 + // SKYRAT EDIT - Faster lathes + if(!speedup_disabled) + build_time_per_item *= 0.1 + // SKYRAT EDIT END //start production busy = TRUE @@ -374,11 +381,24 @@ finalize_build() return - if(!is_operational || !directly_use_power(charge_per_item)) + if(!is_operational) say("Unable to continue production, power failure.") finalize_build() return + + if(!directly_use_energy(charge_per_item)) // provide the wait time until lathe is ready + var/area/my_area = get_area(src) + var/obj/machinery/power/apc/my_apc = my_area.apc + var/charging_wait = my_apc.time_to_charge(charge_per_item) + if(!isnull(charging_wait)) + say("Unable to continue production, APC overload. Wait [DisplayTimeText(charging_wait, round_seconds_to = 1)] and try again.") + else + say("Unable to continue production, power grid overload.") + finalize_build() + return + if(!materials.can_use_resource()) + say("Unable to continue production, materials on hold.") finalize_build() return @@ -386,6 +406,7 @@ var/list/design_materials = design.materials if(!materials.mat_container.has_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1)) say("Unable to continue production, missing materials.") + finalize_build() return materials.use_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1, "built", "[design.name]") @@ -420,7 +441,7 @@ /obj/machinery/rnd/production/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) . = ..() - if((!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) + if(!can_interact(usr) || (!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) return if(busy) balloon_alert(usr, "busy printing!") diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm index 2dcbde23663..c6d50f13307 100644 --- a/code/modules/research/machinery/circuit_imprinter.dm +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -13,7 +13,7 @@ return 0.5 ** max(rating - 1, 0) // One sheet, half sheet, quarter sheet, eighth sheet. -/obj/machinery/rnd/production/circuit_imprinter/flick_animation(mat_name) +/obj/machinery/rnd/production/circuit_imprinter/flick_animation(datum/material/mat) return //we presently have no animation /obj/machinery/rnd/production/circuit_imprinter/offstation diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index a6fe3c9f3ac..7afe201f360 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -20,7 +20,7 @@ // Lighting system to better communicate the directions. light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 - light_power = 1 + light_power = 1.5 light_color = COLOR_RED /obj/machinery/doppler_array/Initialize(mapload) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index b2b468db120..e529f97eb0c 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -112,7 +112,7 @@ Nothing else in the console has ID requirements. if(stored_research.research_node_id(id)) say("Successfully researched [TN.display_name].") var/logname = "Unknown" - if(isAI(user)) + if(HAS_AI_ACCESS(user)) logname = "AI [user.name]" if(iscyborg(user)) logname = "CYBORG [user.name]" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index b6b6d2f7b8b..7b01536034c 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -121,6 +121,8 @@ "toy_armblade", "toy_balloon", "toygun", + "tram_floor_dark", + "tram_floor_light", "trapdoor_electronics", "turbine_part_compressor", "turbine_part_rotor", @@ -1066,6 +1068,18 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/ai_basic/New() + . = ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_HUMAN_AI)) + design_ids -= list( + "aicore", + "borg_ai_control", + "intellicard", + "mecha_tracking_ai_control", + "aifixer", + "aiupload", + ) + /datum/techweb_node/ai_adv id = "ai_adv" display_name = "Advanced Artificial Intelligence" @@ -1191,8 +1205,10 @@ "idcard", "libraryconsole", "mining", + "photobooth", "rdcamera", "seccamera", + "security_photobooth", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index b83a0a5b7f4..a68bc9258de 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -46,7 +46,7 @@ To add a crossbreed: /obj/item/slimecross/Initialize(mapload) . = ..() name = effect + " " + colour + " extract" - var/itemcolor = "#FFFFFF" + var/itemcolor = COLOR_WHITE switch(colour) if(SLIME_TYPE_ORANGE) itemcolor = "#FFA500" @@ -57,15 +57,15 @@ To add a crossbreed: if(SLIME_TYPE_METAL) itemcolor = "#7E7E7E" if(SLIME_TYPE_YELLOW) - itemcolor = "#FFFF00" + itemcolor = COLOR_YELLOW if(SLIME_TYPE_DARK_PURPLE) - itemcolor = "#551A8B" + itemcolor = COLOR_DARK_PURPLE if(SLIME_TYPE_DARK_BLUE) - itemcolor = "#0000FF" + itemcolor = COLOR_BLUE if(SLIME_TYPE_SILVER) itemcolor = "#D3D3D3" if(SLIME_TYPE_BLUESPACE) - itemcolor = "#32CD32" + itemcolor = COLOR_LIME if(SLIME_TYPE_SEPIA) itemcolor = "#704214" if(SLIME_TYPE_CERULEAN) @@ -73,17 +73,17 @@ To add a crossbreed: if(SLIME_TYPE_PYRITE) itemcolor = "#FAFAD2" if(SLIME_TYPE_RED) - itemcolor = "#FF0000" + itemcolor = COLOR_RED if(SLIME_TYPE_GREEN) - itemcolor = "#00FF00" + itemcolor = COLOR_VIBRANT_LIME if(SLIME_TYPE_PINK) itemcolor = "#FF69B4" if(SLIME_TYPE_GOLD) - itemcolor = "#FFD700" + itemcolor = COLOR_GOLD if(SLIME_TYPE_OIL) itemcolor = "#505050" if(SLIME_TYPE_BLACK) - itemcolor = "#000000" + itemcolor = COLOR_BLACK if(SLIME_TYPE_LIGHT_PINK) itemcolor = "#FFB6C1" if(SLIME_TYPE_ADAMANTINE) @@ -119,7 +119,7 @@ To add a crossbreed: /obj/item/slimecrossbeaker/bloodpack //Pack of 50u blood. Deletes on empty. name = "blood extract" desc = "A sphere of liquid blood, somehow managing to stay together." - color = "#FF0000" + color = COLOR_RED list_reagents = list(/datum/reagent/blood = 50) /obj/item/slimecrossbeaker/pax //5u synthpax. @@ -131,7 +131,7 @@ To add a crossbreed: /obj/item/slimecrossbeaker/omnizine //15u omnizine. name = "healing extract" desc = "A gelatinous extract of pure omnizine." - color = "#FF00FF" + color = COLOR_MAGENTA list_reagents = list(/datum/reagent/medicine/omnizine = 15) /obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents. @@ -165,7 +165,7 @@ To add a crossbreed: ignore_flags = TRUE //It is, after all, intended to heal. name = "mending solution" desc = "A strange glob of sweet-smelling semifluid, which seems to stick to skin rather easily." - color = "#FF00FF" + color = COLOR_MAGENTA list_reagents = list(/datum/reagent/medicine/regen_jelly = 20) /obj/item/slimecrossbeaker/autoinjector/slimejelly //Primarily for slimepeople, but you do you. @@ -173,7 +173,7 @@ To add a crossbreed: ignore_flags = TRUE name = "slime jelly bubble" desc = "A sphere of slime jelly. It seems to stick to your skin, but avoids other surfaces." - color = "#00FF00" + color = COLOR_VIBRANT_LIME list_reagents = list(/datum/reagent/toxin/slimejelly = 50) /obj/item/slimecrossbeaker/autoinjector/peaceandlove @@ -189,5 +189,5 @@ To add a crossbreed: /obj/item/slimecrossbeaker/autoinjector/slimestimulant name = "invigorating gel" desc = "A bubbling purple mixture, designed to heal and boost movement." - color = "#FF00FF" + color = COLOR_MAGENTA list_reagents = list(/datum/reagent/medicine/regen_jelly = 30, /datum/reagent/drug/methamphetamine = 9) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 12a900349ca..4fb51d223bd 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -37,7 +37,7 @@ Slimecrossing Armor icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "prismglasses" actions_types = list(/datum/action/item_action/change_prism_colour, /datum/action/item_action/place_light_prism) - var/glasses_color = "#FFFFFF" + var/glasses_color = COLOR_WHITE /obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot) if(slot & ITEM_SLOT_EYES) diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm index 046b5764b43..9b37be5d1a5 100644 --- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm +++ b/code/modules/research/xenobiology/crossbreeding/_mobs.dm @@ -15,7 +15,7 @@ Slimecrossing Mobs spell_requirements = NONE convert_damage_type = TOX - possible_shapes = list(/mob/living/simple_animal/slime/transformed_slime) + possible_shapes = list(/mob/living/basic/slime/transformed_slime) /// If TRUE, we self-delete (remove ourselves) the next time we turn back into a human var/remove_on_restore = FALSE @@ -29,10 +29,10 @@ Slimecrossing Mobs qdel(src) /// Transformed slime - from Burning Black -/mob/living/simple_animal/slime/transformed_slime +/mob/living/basic/slime/transformed_slime // Just in case. -/mob/living/simple_animal/slime/transformed_slime/Reproduce() +/mob/living/basic/slime/transformed_slime/reproduce() to_chat(src, span_warning("I can't reproduce...")) // Mood return diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 7fb7f10849d..ecf76357e20 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -54,7 +54,7 @@ Slimecrossing Potions peace_target.visible_message(span_danger("[user] starts to drink [src]!"), span_danger("You start to drink [src]!")) - if(!do_after(user, 100, target = peace_target)) + if(!do_after(user, 10 SECONDS, target = peace_target)) return if(peace_target != user) to_chat(user, span_notice("You feed [peace_target] [src]!")) @@ -91,7 +91,7 @@ Slimecrossing Potions 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, 50, target = love_target)) + if(!do_after(user, 5 SECONDS, target = love_target)) return 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()].")) @@ -127,7 +127,7 @@ Slimecrossing Potions to_chat(user, span_notice("You slather the blue gunk over the [C], making it airtight.")) C.name = "pressure-resistant [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) + C.add_atom_colour(COLOR_NAVY, FIXED_COLOUR_PRIORITY) C.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT C.cold_protection = C.body_parts_covered C.clothing_flags |= STOPSPRESSUREDAMAGE @@ -166,7 +166,7 @@ Slimecrossing Potions to_chat(user, span_notice("You slather the red gunk over the [C], making it lavaproof.")) C.name = "lavaproof [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#800000", FIXED_COLOUR_PRIORITY) + C.add_atom_colour(COLOR_MAROON, FIXED_COLOUR_PRIORITY) C.resistance_flags |= LAVA_PROOF if (isclothing(C)) var/obj/item/clothing/CL = C @@ -183,7 +183,7 @@ Slimecrossing Potions icon = 'icons/obj/medical/chemical.dmi' icon_state = "potsilver" -/obj/item/slimepotion/slime_reviver/attack(mob/living/simple_animal/slime/revive_target, mob/user) +/obj/item/slimepotion/slime_reviver/attack(mob/living/basic/slime/revive_target, mob/user) if(!isslime(revive_target)) to_chat(user, span_warning("The potion only works on slimes!")) return ..() @@ -207,7 +207,7 @@ Slimecrossing Potions icon = 'icons/obj/medical/chemical.dmi' icon_state = "potcyan" -/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/simple_animal/slime/stabilize_target, mob/user) +/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 ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index a1d4eff50a6..667ffe24191 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -473,10 +473,10 @@ colour = SLIME_TYPE_GREY /datum/status_effect/stabilized/grey/tick(seconds_between_ticks) - for(var/mob/living/simple_animal/slime/slimes_in_range in range(1, get_turf(owner))) - if(!(owner in slimes_in_range.Friends)) + for(var/mob/living/basic/slime/slimes_in_range in range(1, get_turf(owner))) + if(!(REF(owner) in slimes_in_range.faction)) to_chat(owner, span_notice("[linked_extract] pulses gently as it communicates with [slimes_in_range].")) - slimes_in_range.set_friendship(owner, 1) + slimes_in_range.befriend(owner) return ..() /datum/status_effect/stabilized/orange @@ -528,7 +528,7 @@ // Technically, "healed this tick" by now. if(healed_last_tick) - new /obj/effect/temp_visual/heal(get_turf(owner), "#FF0000") + new /obj/effect/temp_visual/heal(get_turf(owner), COLOR_RED) return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 0103ee40b91..72ee9d98516 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -32,11 +32,11 @@ Burning extracts: effect_desc = "Creates a hungry and speedy slime that will love you forever." /obj/item/slimecross/burning/grey/do_effect(mob/user) - var/mob/living/simple_animal/slime/new_slime = new(get_turf(user),/datum/slime_type/grey) + var/mob/living/basic/slime/new_slime = new(get_turf(user),/datum/slime_type/grey) new_slime.visible_message(span_danger("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!")) - new_slime.set_friendship(user, 20) //Gas, gas, gas + new_slime.befriend(user) //Gas, gas, gas new_slime.bodytemperature = T0C + 400 //We gonna step on the gas. - new_slime.set_nutrition(new_slime.hunger_nutrition) //Tonight, we fight! + new_slime.set_nutrition(SLIME_HUNGER_NUTRITION) //Tonight, we fight! ..() /obj/item/slimecross/burning/orange @@ -198,15 +198,12 @@ Burning extracts: /obj/item/slimecross/burning/red/do_effect(mob/user) user.visible_message(span_danger("[src] pulses a hazy red aura for a moment, which wraps around [user]!")) - for(var/mob/living/simple_animal/slime/slimes_in_view in view(7, get_turf(user))) - if(user in slimes_in_view.Friends) - var/friendliness = slimes_in_view.Friends[user] - slimes_in_view.clear_friends() - slimes_in_view.set_friendship(user, friendliness) - else - slimes_in_view.clear_friends() - slimes_in_view.rabid = TRUE - slimes_in_view.visible_message(span_danger("The [slimes_in_view] is driven into a dangerous frenzy!")) + for(var/mob/living/basic/slime/slime_in_view in view(7, get_turf(user))) + var/list/mob/living/friends = slime_in_view.ai_controller?.blackboard[BB_FRIENDS_LIST] - user + for(var/list/mob/living/ex_friend in friends) + slime_in_view.unfriend(ex_friend) + slime_in_view.set_enraged_behaviour() + slime_in_view.visible_message(span_danger("The [slime_in_view] is driven into a dangerous frenzy!")) ..() /obj/item/slimecross/burning/green @@ -261,7 +258,7 @@ Burning extracts: /obj/item/slimecross/burning/oil/do_effect(mob/user) user.visible_message(span_warning("[user] activates [src]. It's going to explode!"), span_danger("You activate [src]. It crackles in anticipation")) - addtimer(CALLBACK(src, PROC_REF(boom)), 50) + addtimer(CALLBACK(src, PROC_REF(boom)), 5 SECONDS) /// Inflicts a blastwave upon every mob within a small radius. /obj/item/slimecross/burning/oil/proc/boom() diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index cde5e234afd..76c4d3eaa14 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -199,7 +199,7 @@ Charged extracts: /obj/item/slimecross/charged/gold/do_effect(mob/user) user.visible_message(span_warning("[src] starts shuddering violently!")) - addtimer(CALLBACK(src, PROC_REF(startTimer)), 50) + addtimer(CALLBACK(src, PROC_REF(startTimer)), 5 SECONDS) /obj/item/slimecross/charged/gold/proc/startTimer() START_PROCESSING(SSobj, src) @@ -224,7 +224,7 @@ Charged extracts: /obj/item/slimecross/charged/oil/do_effect(mob/user) user.visible_message(span_danger("[src] begins to shake with rapidly increasing force!")) - addtimer(CALLBACK(src, PROC_REF(boom)), 50) + addtimer(CALLBACK(src, PROC_REF(boom)), 5 SECONDS) /obj/item/slimecross/charged/oil/proc/boom() explosion(src, devastation_range = 2, heavy_impact_range = 3, light_impact_range = 4, explosion_cause = src) //Much smaller effect than normal oils, but devastatingly strong where it does hit. @@ -278,6 +278,6 @@ Charged extracts: /obj/item/slimecross/charged/rainbow/do_effect(mob/user) user.visible_message(span_warning("[src] swells and splits into three new slimes!")) for(var/i in 1 to 3) - var/mob/living/simple_animal/slime/new_slime = new(get_turf(user)) + var/mob/living/basic/slime/new_slime = new (get_turf(user)) new_slime.random_colour() return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 8890db9a890..d8cf3456ed2 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -174,7 +174,7 @@ Chilling extracts: for(var/mob/living/M in allies) var/datum/status_effect/slimerecall/S = M.apply_status_effect(/datum/status_effect/slimerecall) S.target = user - if(do_after(user, 100, target=src)) + if(do_after(user, 10 SECONDS, target=src)) to_chat(user, span_notice("[src] shatters as it tears a hole in reality, snatching the linked individuals from the void!")) for(var/mob/living/M in allies) var/datum/status_effect/slimerecall/S = M.has_status_effect(/datum/status_effect/slimerecall) @@ -236,9 +236,9 @@ Chilling extracts: /obj/item/slimecross/chilling/red/do_effect(mob/user) var/slimesfound = FALSE - for(var/mob/living/simple_animal/slime/slimes_in_view in view(get_turf(user), 7)) + for(var/mob/living/basic/slime/slime_in_view in view(get_turf(user), 7)) slimesfound = TRUE - slimes_in_view.docile = TRUE + slime_in_view.set_pacified_behaviour() if(slimesfound) user.visible_message(span_notice("[src] lets out a peaceful ring as it shatters, and nearby slimes seem calm.")) else @@ -292,7 +292,7 @@ Chilling extracts: /obj/item/slimecross/chilling/oil/do_effect(mob/user) user.visible_message(span_danger("[src] begins to shake with muted intensity!")) - addtimer(CALLBACK(src, PROC_REF(boom)), 50) + addtimer(CALLBACK(src, PROC_REF(boom)), 5 SECONDS) /obj/item/slimecross/chilling/oil/proc/boom() explosion(src, devastation_range = -1, heavy_impact_range = -1, light_impact_range = 10, explosion_cause = src) //Large radius, but mostly light damage, and no flash. diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 84084b2302e..5a23d30671f 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -66,7 +66,7 @@ Consuming extracts: 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, 20, target = M)) + if(do_after(user, 2 SECONDS, target = M)) fed = TRUE M.visible_message(span_danger("[user] forces [M] to eat [src]!"), span_warning("[user] forces you to eat [src].")) if(fed) @@ -293,7 +293,7 @@ Consuming extracts: desc = "A yellow cookie with rainbow-colored icing. Reflects the light strangely." icon_state = "pyrite" taste = "vanilla and " //Randomly selected color dye. - var/colour = "#FFFFFF" + var/colour = COLOR_WHITE /obj/item/slime_cookie/pyrite/Initialize(mapload) . = ..() @@ -301,25 +301,25 @@ Consuming extracts: switch(rand(1,7)) if(1) tastemessage = "red dye" - colour = "#FF0000" + colour = COLOR_RED if(2) tastemessage = "orange dye" colour = "#FFA500" if(3) tastemessage = "yellow dye" - colour = "#FFFF00" + colour = COLOR_YELLOW if(4) tastemessage = "green dye" - colour = "#00FF00" + colour = COLOR_VIBRANT_LIME if(5) tastemessage = "blue dye" - colour = "#0000FF" + colour = COLOR_BLUE if(6) tastemessage = "indigo dye" colour = "#4B0082" if(7) tastemessage = "violet dye" - colour = "#FF00FF" + colour = COLOR_MAGENTA taste += tastemessage /obj/item/slime_cookie/pyrite/do_effect(mob/living/M, mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm index 95e3c77e4d6..3f8509c1a7c 100644 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ b/code/modules/research/xenobiology/crossbreeding/prismatic.dm @@ -8,7 +8,7 @@ Prismatic extracts: effect = "prismatic" effect_desc = "When used it paints whatever it hits." icon_state = "prismatic" - var/paintcolor = "#FFFFFF" + var/paintcolor = COLOR_WHITE /obj/item/slimecross/prismatic/afterattack(turf/target, mob/user, proximity) if(!proximity) @@ -47,15 +47,15 @@ Prismatic extracts: colour = SLIME_TYPE_METAL /obj/item/slimecross/prismatic/yellow - paintcolor = "#FFFF00" + paintcolor = COLOR_YELLOW colour = SLIME_TYPE_YELLOW /obj/item/slimecross/prismatic/darkpurple - paintcolor = "#551A8B" + paintcolor = COLOR_DARK_PURPLE colour = SLIME_TYPE_DARK_PURPLE /obj/item/slimecross/prismatic/darkblue - paintcolor = "#0000FF" + paintcolor = COLOR_BLUE colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/prismatic/silver @@ -63,7 +63,7 @@ Prismatic extracts: colour = SLIME_TYPE_SILVER /obj/item/slimecross/prismatic/bluespace - paintcolor = "#32CD32" + paintcolor = COLOR_LIME colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/prismatic/sepia @@ -79,11 +79,11 @@ Prismatic extracts: colour = SLIME_TYPE_PYRITE /obj/item/slimecross/prismatic/red - paintcolor = "#FF0000" + paintcolor = COLOR_RED colour = SLIME_TYPE_RED /obj/item/slimecross/prismatic/green - paintcolor = "#00FF00" + paintcolor = COLOR_VIBRANT_LIME colour = SLIME_TYPE_GREEN /obj/item/slimecross/prismatic/pink @@ -91,7 +91,7 @@ Prismatic extracts: colour = SLIME_TYPE_PINK /obj/item/slimecross/prismatic/gold - paintcolor = "#FFD700" + paintcolor = COLOR_GOLD colour = SLIME_TYPE_GOLD /obj/item/slimecross/prismatic/oil @@ -99,7 +99,7 @@ Prismatic extracts: colour = SLIME_TYPE_OIL /obj/item/slimecross/prismatic/black - paintcolor = "#000000" + paintcolor = COLOR_BLACK colour = SLIME_TYPE_BLACK /obj/item/slimecross/prismatic/lightpink @@ -111,7 +111,7 @@ Prismatic extracts: colour = SLIME_TYPE_ADAMANTINE /obj/item/slimecross/prismatic/rainbow - paintcolor = "#FFFFFF" + paintcolor = COLOR_WHITE colour = SLIME_TYPE_RAINBOW /obj/item/slimecross/prismatic/rainbow/attack_self(mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 4a222e8e982..ee02a18f11f 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -125,7 +125,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkblue/proc/fireproof(obj/item/clothing/C) C.name = "fireproofed [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) + C.add_atom_colour(COLOR_NAVY, FIXED_COLOUR_PRIORITY) C.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT C.heat_protection = C.body_parts_covered C.resistance_flags |= FIRE_PROOF @@ -197,7 +197,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) if(isslime(target)) target.visible_message(span_warning("The [target] suddenly changes color!")) - var/mob/living/simple_animal/slime/target_slime = target + var/mob/living/basic/slime/target_slime = target target_slime.random_colour() if(isjellyperson(target)) target.reagents.add_reagent(/datum/reagent/mutationtoxin/jelly,5) @@ -237,7 +237,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) var/dummytype = target.type if(ismegafauna(target)) //Prevents megafauna duping in a lame way - dummytype = /mob/living/simple_animal/slime + dummytype = /mob/living/basic/slime to_chat(user, span_warning("The milky goo flows over [target], falling into a weak puddle.")) var/mob/living/dummy = new dummytype(target.loc) to_chat(target, span_notice("The milky goo flows from your skin, forming an imperfect copy of you.")) diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index 08caca83854..b170cb19fd7 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -246,7 +246,7 @@ /datum/reagent/consumable/ice = -2) //Brrr! virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/slime = 1) + resulting_atoms = list(/mob/living/basic/slime = 1) /datum/micro_organism/cell_line/blob_spore //nuisance cell line desc = "Immature blob spores" diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 97e78121908..de97ea7bf69 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -27,7 +27,7 @@ /obj/machinery/computer/camera_advanced/xenobio name = "Slime management console" desc = "A computer used for remotely handling slimes." - networks = list("ss13") + networks = list(CAMERANET_NETWORK_SS13) circuit = /obj/item/circuitboard/computer/xenobiology ///The recycler connected to the camera console @@ -68,7 +68,7 @@ /obj/machinery/computer/camera_advanced/xenobio/Destroy() QDEL_NULL(current_potion) for(var/thing in stored_slimes) - var/mob/living/simple_animal/slime/stored_slime = thing + var/mob/living/basic/slime/stored_slime = thing stored_slime.forceMove(drop_location()) stored_slimes.Cut() if(connected_recycler) @@ -167,14 +167,14 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo ///Places every slime in storage on target turf /obj/machinery/computer/camera_advanced/xenobio/proc/slime_place(turf/open/target_turf) - for(var/mob/living/simple_animal/slime/stored_slime in stored_slimes) + for(var/mob/living/basic/slime/stored_slime in stored_slimes) stored_slime.forceMove(target_turf) stored_slime.visible_message(span_notice("[stored_slime] warps in!")) stored_slimes -= stored_slime ///Places every slime not controlled by a player into the internal storage, respecting its limits ///Returns TRUE to signal it hitting the limit, in case its being called from a loop and we want it to stop -/obj/machinery/computer/camera_advanced/xenobio/proc/slime_pickup(mob/living/user, mob/living/simple_animal/slime/target_slime) +/obj/machinery/computer/camera_advanced/xenobio/proc/slime_pickup(mob/living/user, mob/living/basic/slime/target_slime) if(stored_slimes.len >= max_slimes) to_chat(user, span_warning("Slime storage is full.")) return TRUE @@ -199,7 +199,8 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo if (QDELETED(food)) return - food.LAssailant = WEAKREF(user) + food.apply_status_effect(/datum/status_effect/slime_food, user) + monkeys-- monkeys = round(monkeys, 0.1) //Prevents rounding errors to_chat(user, span_notice("[src] now has [monkeys] monkeys stored.")) @@ -212,7 +213,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo return target_mob.visible_message(span_notice("[target_mob] vanishes as [p_theyre()] reclaimed for recycling!")) - connected_recycler.use_power(500) + connected_recycler.use_energy(500 JOULES) monkeys += connected_recycler.cube_production monkeys = round(monkeys, 0.1) //Prevents rounding errors qdel(target_mob) @@ -250,7 +251,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo if(!xeno_console.validate_area(owner, remote_eye, remote_eye.loc)) return - for(var/mob/living/simple_animal/slime/target_slime in remote_eye.loc) + for(var/mob/living/basic/slime/target_slime in remote_eye.loc) if(xeno_console.slime_pickup(owner_mob, target_slime)) ///Returns true if we hit our slime pickup limit break @@ -310,7 +311,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo if(!xeno_console.validate_area(owner, remote_eye, remote_eye.loc)) return - for(var/mob/living/simple_animal/slime/scanned_slime in remote_eye.loc) + for(var/mob/living/basic/slime/scanned_slime in remote_eye.loc) slime_scan(scanned_slime, owner_mob) /datum/action/innate/feed_potion @@ -333,7 +334,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo to_chat(owner, span_warning("No potion loaded.")) return - for(var/mob/living/simple_animal/slime/potioned_slime in remote_eye.loc) + for(var/mob/living/basic/slime/potioned_slime in remote_eye.loc) xeno_console.current_potion.attack(potioned_slime, owner_mob) break @@ -359,11 +360,11 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo // Alternate clicks for slime, monkey and open turf if using a xenobio console -/mob/living/simple_animal/slime/AltClick(mob/user) +/mob/living/basic/slime/AltClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) ..() -/mob/living/simple_animal/slime/ShiftClick(mob/user) +/mob/living/basic/slime/ShiftClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) ..() @@ -371,7 +372,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) ..() -/mob/living/simple_animal/slime/CtrlClick(mob/user) +/mob/living/basic/slime/CtrlClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) ..() @@ -384,7 +385,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo ..() /// Scans the target slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/target_slime) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/basic/slime/target_slime) SIGNAL_HANDLER var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control @@ -396,7 +397,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo slime_scan(target_slime, user) ///Feeds a stored potion to a slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/target_slime) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/basic/slime/target_slime) SIGNAL_HANDLER var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control @@ -412,7 +413,7 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo INVOKE_ASYNC(xeno_console.current_potion, TYPE_PROC_REF(/obj/item/slimepotion/slime, attack), target_slime, user) ///Picks up a slime, and places them in the internal storage -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/target_slime) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/basic/slime/target_slime) SIGNAL_HANDLER var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 0edcb78cc1f..1551d6eb952 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -67,7 +67,7 @@ * * 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/simple_animal/slime/target_slime, mob/user) +/obj/item/slime_extract/attack(mob/living/basic/slime/target_slime, mob/user) if(!isslime(target_slime)) return ..() if(target_slime.stat) @@ -108,10 +108,10 @@ return 120 if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_notice("Your [name] starts pulsing...")) - if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/slime/S = new(get_turf(user), /datum/slime_type/grey) + if(do_after(user, 4 SECONDS, target = user)) + var/mob/living/basic/slime/new_slime = new(get_turf(user), /datum/slime_type/grey) playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - to_chat(user, span_notice("You spit out [S].")) + to_chat(user, span_notice("You spit out [new_slime].")) return 350 else return 0 @@ -128,7 +128,7 @@ switch(activation_type) if(SLIME_ACTIVATE_MINOR) user.visible_message(span_warning("[user] starts shaking!"),span_notice("Your [name] starts pulsing gently...")) - if(do_after(user, 40, target = user)) + if(do_after(user, 4 SECONDS, target = user)) var/mob/living/spawned_mob = create_random_mob(user.drop_location(), FRIENDLY_SPAWN) spawned_mob.faction |= FACTION_NEUTRAL playsound(user, 'sound/effects/splat.ogg', 50, TRUE) @@ -137,7 +137,7 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message(span_warning("[user] starts shaking violently!"),span_warning("Your [name] starts pulsing violently...")) - if(do_after(user, 50, target = user)) + if(do_after(user, 5 SECONDS, target = user)) var/mob/living/spawned_mob = create_random_mob(user.drop_location(), HOSTILE_SPAWN) if(!user.combat_mode) spawned_mob.faction |= FACTION_NEUTRAL @@ -274,12 +274,12 @@ to_chat(user, span_warning("Your glow is already enhanced!")) return species.update_glow(user, 5) - addtimer(CALLBACK(species, TYPE_PROC_REF(/datum/species/jelly/luminescent, update_glow), user, LUMINESCENT_DEFAULT_GLOW), 600) + addtimer(CALLBACK(species, TYPE_PROC_REF(/datum/species/jelly/luminescent, update_glow), user, LUMINESCENT_DEFAULT_GLOW), 1 MINUTES) to_chat(user, span_notice("You start glowing brighter.")) 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, 25, target = user)) + if(do_after(user, 2.5 SECONDS, target = user)) empulse(user, 1, 2) user.visible_message(span_warning("[user]'s skin flashes!"), span_warning("Your skin flashes as you emit an electromagnetic pulse!")) return 600 @@ -299,8 +299,8 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message(span_warning("[user]'s skin flashes red for a moment..."), span_warning("Your skin flashes red as you emit rage-inducing pheromones...")) - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user), null)) - slime.rabid = TRUE + for(var/mob/living/basic/slime/slime in viewers(get_turf(user), null)) + slime.ai_controller?.set_blackboard_key(BB_SLIME_RABID, TRUE) slime.visible_message(span_danger("The [slime] is driven into a frenzy!")) return 600 @@ -384,7 +384,7 @@ switch(activation_type) if(SLIME_ACTIVATE_MINOR) to_chat(user, span_warning("You feel yourself reverting to human form...")) - if(do_after(user, 120, target = user)) + if(do_after(user, 12 SECONDS, target = user)) to_chat(user, span_warning("You feel human again!")) user.set_species(/datum/species/human) return @@ -392,7 +392,7 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_warning("You feel yourself radically changing your slime type...")) - if(do_after(user, 120, target = user)) + if(do_after(user, 12 SECONDS, target = user)) to_chat(user, span_warning("You feel different!")) user.set_species(pick(/datum/species/jelly/slime, /datum/species/jelly/stargazer)) return @@ -437,7 +437,7 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_warning("You feel your own light turning dark...")) - if(do_after(user, 120, target = user)) + if(do_after(user, 12 SECONDS, target = user)) to_chat(user, span_warning("You feel a longing for darkness.")) user.set_species(pick(/datum/species/shadow)) return @@ -459,7 +459,7 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message(span_warning("[user]'s skin starts pulsing and glowing ominously..."), span_userdanger("You feel unstable...")) - if(do_after(user, 60, target = user)) + if(do_after(user, 6 SECONDS, target = user)) to_chat(user, span_userdanger("You explode!")) explosion(user, devastation_range = 1, heavy_impact_range = 3, light_impact_range = 6, explosion_cause = src) user.investigate_log("has been gibbed by an oil slime extract explosion.", INVESTIGATE_DEATHS) @@ -487,7 +487,7 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_warning("You feel your body rapidly hardening...")) - if(do_after(user, 120, target = user)) + if(do_after(user, 12 SECONDS, target = user)) to_chat(user, span_warning("You feel solid.")) user.set_species(/datum/species/golem) return @@ -511,7 +511,7 @@ switch(activation_type) if(SLIME_ACTIVATE_MINOR) to_chat(user, span_warning("You feel your body vibrating...")) - if(do_after(user, 25, target = user)) + if(do_after(user, 2.5 SECONDS, target = user)) to_chat(user, span_warning("You teleport!")) do_teleport(user, get_turf(user), 6, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) return 300 @@ -598,7 +598,7 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_warning("You feel time slow down...")) - if(do_after(user, 30, target = user)) + if(do_after(user, 3 SECONDS, target = user)) new /obj/effect/timestop(get_turf(user), 2, 50, list(user)) return 900 @@ -658,29 +658,28 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potsilver" -/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) +/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(M.stat) + if(target_slime.stat) to_chat(user, span_warning("The slime is dead!")) return - if(M.rabid) //Stops being rabid, but doesn't become truly docile. - to_chat(M, span_warning("You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.")) + 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.")) to_chat(user, span_notice("You feed the slime the potion, calming its rabid rage.")) - M.rabid = FALSE + target_slime.set_default_behaviour() qdel(src) return - M.docile = TRUE - M.set_nutrition(700) - to_chat(M, span_warning("You absorb the potion and feel your intense desire to feed melt away.")) + target_slime.set_pacified_behaviour() + to_chat(target_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" - M.name = newname - M.real_name = newname + target_slime.name = newname + target_slime.real_name = newname qdel(src) /obj/item/slimepotion/slime/sentience @@ -688,9 +687,28 @@ desc = "A miraculous chemical mix that grants human like intelligence to living beings." icon = 'icons/obj/medical/chemical.dmi' icon_state = "potpink" - var/list/not_interested = list() + /// Are we being offered to a mob, and therefore is a ghost poll currently in progress for the sentient mob? var/being_used = FALSE var/sentience_type = SENTIENCE_ORGANIC + /// 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) + . = ..() + . += 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) + register_context() + return ..() + +/obj/item/slimepotion/slime/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/AltClick(mob/living/user) + if(!can_interact(user)) + return + potion_reason = tgui_input_text(user, "Enter reason for offering potion", "Intelligence Potion", potion_reason, multiline = TRUE) /obj/item/slimepotion/slime/sentience/attack(mob/living/dumb_mob, mob/user) if(being_used || !isliving(dumb_mob)) @@ -704,16 +722,22 @@ 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 - + if(isnull(potion_reason)) + balloon_alert(user, "no reason for offering set!") + return balloon_alert(user, "offering...") being_used = TRUE - - var/datum/callback/to_call = CALLBACK(src, PROC_REF(on_poll_concluded), user, dumb_mob) - dumb_mob.AddComponent(/datum/component/orbit_poll, \ - ignore_key = POLL_IGNORE_SENTIENCE_POTION, \ - job_bans = ROLE_SENTIENCE, \ - to_call = to_call, \ + var/mob/chosen_one = SSpolling.poll_ghosts_for_target( + question = "[span_danger(user.name)] is offering [span_notice(dumb_mob.name)] an intelligence potion! Reason: [span_boldnotice(potion_reason)]", + check_jobban = ROLE_SENTIENCE, + poll_time = 20 SECONDS, + checked_target = dumb_mob, + ignore_category = POLL_IGNORE_SENTIENCE_POTION, + alert_pic = dumb_mob, + role_name_text = "intelligence potion", + chat_text_border_icon = src, ) + on_poll_concluded(user, dumb_mob, chosen_one) /// 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) @@ -804,7 +828,7 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potred" -/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/target, mob/user) +/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 ..() @@ -834,19 +858,19 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potcyan" -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) +/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(M.stat) + if(target_slime.stat) to_chat(user, span_warning("The slime is dead!")) return - if(M.mutation_chance == 0) + if(target_slime.mutation_chance == 0) to_chat(user, span_warning("The slime already has no chance of mutating!")) return to_chat(user, span_notice("You feed the slime the stabilizer. It is now less likely to mutate.")) - M.mutation_chance = clamp(M.mutation_chance-15,0,100) + target_slime.mutation_chance = clamp(target_slime.mutation_chance-15,0,100) qdel(src) /obj/item/slimepotion/slime/mutator @@ -855,23 +879,23 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potgreen" -/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) +/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(M.stat) + if(target_slime.stat) to_chat(user, span_warning("The slime is dead!")) return - if(M.mutator_used) + if(target_slime.mutator_used) to_chat(user, span_warning("This slime has already consumed a mutator, any more would be far too unstable!")) return - if(M.mutation_chance == 100) + if(target_slime.mutation_chance == 100) to_chat(user, span_warning("The slime is already guaranteed to mutate!")) return to_chat(user, span_notice("You feed the slime the mutator. It is now more likely to mutate.")) - M.mutation_chance = clamp(M.mutation_chance+12,0,100) - M.mutator_used = TRUE + target_slime.mutation_chance = clamp(target_slime.mutation_chance+12,0,100) + target_slime.mutator_used = TRUE qdel(src) /obj/item/slimepotion/speed @@ -899,7 +923,7 @@ to_chat(user, span_notice("You slather the red gunk over the [C], making it faster.")) C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) + C.add_atom_colour(COLOR_RED, FIXED_COLOUR_PRIORITY) qdel(src) /obj/item/slimepotion/speed/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) @@ -936,7 +960,7 @@ to_chat(user, span_notice("You slather the blue gunk over the [clothing], fireproofing it.")) clothing.name = "fireproofed [clothing.name]" clothing.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - clothing.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) + clothing.add_atom_colour(COLOR_NAVY, FIXED_COLOUR_PRIORITY) clothing.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT clothing.heat_protection = clothing.body_parts_covered clothing.resistance_flags |= FIRE_PROOF diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index eb6e9db94e0..e3faa923744 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -139,7 +139,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) event = event_type waiting = TRUE GLOB.keycard_events.fireEvent("triggerEvent", src) - addtimer(CALLBACK(src, PROC_REF(eventSent)), 20) + addtimer(CALLBACK(src, PROC_REF(eventSent)), 2 SECONDS) /obj/machinery/keycard_auth/proc/eventSent() triggerer = null @@ -149,7 +149,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) /obj/machinery/keycard_auth/proc/triggerEvent(source) event_source = source update_appearance() - addtimer(CALLBACK(src, PROC_REF(eventTriggered)), 20) + addtimer(CALLBACK(src, PROC_REF(eventTriggered)), 2 SECONDS) /obj/machinery/keycard_auth/proc/eventTriggered() event_source = null diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 3e76fc9671d..b628d7c5d84 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -17,8 +17,8 @@ /obj/item/assault_pod name = "Assault Pod Targeting Device" icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-red" - inhand_icon_state = "radio" + icon_state = "designator_syndicate" + inhand_icon_state = "nukietalkie" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' desc = "Used to select a landing zone for assault pods." diff --git a/code/modules/shuttle/battlecruiser_starfury.dm b/code/modules/shuttle/battlecruiser_starfury.dm index e95ff4243f5..a27cadacad2 100644 --- a/code/modules/shuttle/battlecruiser_starfury.dm +++ b/code/modules/shuttle/battlecruiser_starfury.dm @@ -135,7 +135,7 @@ */ /proc/summon_battlecruiser(datum/team/battlecruiser/team) - var/list/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for battlecruiser crew?", check_jobban = ROLE_TRAITOR, pic_source = /obj/machinery/sleeper/syndie, role_name_text = "battlecruiser crew") + var/list/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for [span_notice("battlecruiser crew")]?", check_jobban = ROLE_TRAITOR, alert_pic = /obj/machinery/sleeper/syndie, role_name_text = "battlecruiser crew") shuffle_inplace(candidates) var/datum/map_template/ship = SSmapping.map_templates["battlecruiser_starfury.dmm"] diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 7c8b26b5d16..a5ed3577de9 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -21,26 +21,22 @@ All ShuttleMove procs go here return var/shuttle_dir = shuttle.dir - for(var/i in contents) - var/atom/movable/thing = i - if(ismob(thing)) - if(isliving(thing)) - var/mob/living/M = thing - if(M.buckled) - M.buckled.unbuckle_mob(M, 1) - if(M.pulledby) - M.pulledby.stop_pulling() - M.stop_pulling() - M.visible_message(span_warning("[shuttle] slams into [M]!")) - SSblackbox.record_feedback("tally", "shuttle_gib", 1, M.type) - log_shuttle("[key_name(M)] was shuttle gibbed by [shuttle].") - M.investigate_log("has been gibbed by [shuttle].", INVESTIGATE_DEATHS) - M.gib(DROP_ALL_REMAINS) - - - else //non-living mobs shouldn't be affected by shuttles, which is why this is an else - if(istype(thing, /obj/effect/abstract) || istype(thing, /obj/singularity) || istype(thing, /obj/energy_ball)) + for(var/atom/movable/thing as anything in contents) + if(thing.resistance_flags & SHUTTLE_CRUSH_PROOF) + continue + if(isliving(thing)) + var/mob/living/living_thing = thing + if(living_thing.incorporeal_move) // Don't crush incorporeal things continue + living_thing.buckled?.unbuckle_mob(living_thing, force = TRUE) + living_thing.pulledby?.stop_pulling() + living_thing.stop_pulling() + living_thing.visible_message(span_warning("[shuttle] slams into [living_thing]!")) + SSblackbox.record_feedback("tally", "shuttle_gib", 1, living_thing.type) + log_shuttle("[key_name(living_thing)] was shuttle gibbed by [shuttle].") + living_thing.investigate_log("has been gibbed by [shuttle].", INVESTIGATE_DEATHS) + living_thing.gib(DROP_ALL_REMAINS) + else if(!ismob(thing)) //non-living mobs shouldn't be affected by shuttles, which is why this is an else if(!thing.anchored) step(thing, shuttle_dir) else @@ -136,8 +132,6 @@ All ShuttleMove procs go here if(rotation) shuttleRotate(rotation) - update_parallax_contents() - return TRUE /atom/movable/proc/lateShuttleMove(turf/oldT, list/movement_force, move_dir) diff --git a/code/modules/shuttle/shuttle_events/player_controlled.dm b/code/modules/shuttle/shuttle_events/player_controlled.dm index 77fee390a68..86d134f29f7 100644 --- a/code/modules/shuttle/shuttle_events/player_controlled.dm +++ b/code/modules/shuttle/shuttle_events/player_controlled.dm @@ -17,17 +17,12 @@ /// Attempt to grant control of a mob to ghosts before spawning it in. if spawn_anyway_if_no_player = TRUE, we spawn the mob even if there's no ghosts /datum/shuttle_event/simple_spawner/player_controlled/proc/try_grant_ghost_control(spawn_type) - var/list/candidates = SSpolling.poll_ghost_candidates(ghost_alert_string + " (Warning: you will not be able to return to your body!)", check_jobban = role_type, poll_time = 10 SECONDS, pic_source = spawn_type, role_name_text = "shot at shuttle") - - if(!candidates.len && !spawn_anyway_if_no_player) + var/mob/chosen_one = SSpolling.poll_ghost_candidates(ghost_alert_string + " (Warning: you will not be able to return to your body!)", check_jobban = role_type, poll_time = 10 SECONDS, alert_pic = spawn_type, role_name_text = "shot at shuttle", amount_to_pick = 1) + if(isnull(chosen_one) && !spawn_anyway_if_no_player) return - var/mob/living/new_mob = new spawn_type (get_turf(get_spawn_turf())) - - if(candidates.len) - var/mob/dead/observer/candidate = pick(candidates) - new_mob.ckey = candidate.ckey - post_spawn(new_mob) + new_mob.ckey = chosen_one.ckey + post_spawn(new_mob) ///BACK FOR REVENGE!!! /datum/shuttle_event/simple_spawner/player_controlled/alien_queen diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index 2c0b95239b6..eb613be54de 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -39,9 +39,10 @@ START_PROCESSING(SSmachines, src) COOLDOWN_START(src, next_automatic_message_time, automatic_message_cooldown) -/obj/machinery/spaceship_navigation_beacon/emp_act() +/obj/machinery/spaceship_navigation_beacon/emp_act(severity) + . = ..() locked = TRUE - update_icon_state() + update_appearance(UPDATE_ICON_STATE) /obj/machinery/spaceship_navigation_beacon/Destroy() SSshuttle.beacon_list -= src diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index d9240285991..989ab4edc94 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -108,11 +108,11 @@ // New sleepers for(var/i in found - sleepers) var/mob/living/L = i - L.add_atom_colour("#800080", TEMPORARY_COLOUR_PRIORITY) + L.add_atom_colour(COLOR_PURPLE, TEMPORARY_COLOUR_PRIORITY) L.visible_message(span_revennotice("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious."), span_revendanger("[desc]")) // Don't let them sit suround unconscious forever - addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100) + addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 10 SECONDS) // Existing sleepers for(var/i in found) @@ -122,7 +122,7 @@ // Missing sleepers for(var/i in sleepers - found) var/mob/living/L = i - L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#800080") + L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_PURPLE) L.visible_message("The glow from [L] fades \ away.") L.grab_ghost() @@ -167,31 +167,6 @@ . = ..() AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE) -/mob/living/simple_animal/hostile/alien/maid/barmaid - gold_core_spawnable = NO_SPAWN - name = "Barmaid" - desc = "A barmaid, a maiden found in a bar." - pass_flags = PASSTABLE - unique_name = FALSE - AIStatus = AI_OFF - stop_automated_movement = TRUE - initial_language_holder = /datum/language_holder/universal - -/mob/living/simple_animal/hostile/alien/maid/barmaid/Initialize(mapload) - . = ..() - // Simple bot ID card that can hold all accesses. Someone turn access into a component at some point, please. - access_card = new /obj/item/card/id/advanced/simple_bot(src) - - var/datum/id_trim/job/cap_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/captain] - access_card.add_access(cap_trim.access + cap_trim.wildcard_access + list(ACCESS_CENT_BAR)) - - ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE) - -/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy() - qdel(access_card) - . = ..() - // Bar table, a wooden table that kicks you in a direction if you're not // barstaff (defined as someone who was a roundstart bartender or someone // with CENTCOM_BARSTAFF) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index f08446b650d..402a87bf6d4 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -64,5 +64,6 @@ y_offset = -1 whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava, /turf/closed/mineral, /turf/open/openspace, /turf/open/misc) see_hidden = TRUE + circuit = /obj/item/circuitboard/computer/syndicate_shuttle_docker #undef SYNDICATE_CHALLENGE_TIMER diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm index 10b14bd47d5..99f0c5af821 100644 --- a/code/modules/spells/spell_types/conjure/_conjure.dm +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -15,12 +15,17 @@ var/summon_respects_density = FALSE /// If TRUE, no two summons can be spawned in the same turf. var/summon_respects_prev_spawn_points = TRUE + /// for how long must we stay still when summoning + var/create_summon_timer /datum/action/cooldown/spell/conjure/is_valid_target(atom/cast_on) return isturf(cast_on.loc) /datum/action/cooldown/spell/conjure/cast(atom/cast_on) . = ..() + if(create_summon_timer && !do_after(owner, create_summon_timer, target = cast_on.loc)) + owner?.balloon_alert(owner, "need to stay still!") + return var/list/to_summon_in = list() for(var/turf/summon_turf in range(summon_radius, cast_on)) if(summon_respects_density && summon_turf.density) diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm index aa9aabc6810..9fef5629d03 100644 --- a/code/modules/spells/spell_types/conjure/simian.dm +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -13,6 +13,9 @@ invocation = "OOGA OOGA OOGA!!!!" invocation_type = INVOCATION_SHOUT + ///Our gorilla transformation spell, additionally granted to the user at max level. + var/datum/action/cooldown/spell/shapeshift/gorilla/gorilla_transformation + summon_radius = 2 summon_type = list( /mob/living/basic/gorilla/lesser, @@ -21,13 +24,18 @@ ) summon_amount = 4 +/datum/action/cooldown/spell/conjure/simian/Destroy() + . = ..() + QDEL_NULL(gorilla_transformation) + /datum/action/cooldown/spell/conjure/simian/level_spell(bypass_cap) . = ..() summon_amount++ // MORE, MOOOOORE if(spell_level == spell_max_level) // We reward the faithful. - summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/basic/gorilla) + gorilla_transformation = new(owner) + gorilla_transformation.Grant(owner) spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC // Max level lets you cast it naked, for monkey larp. - to_chat(owner, span_notice("Your simian power has reached maximum capacity! You can now cast this spell naked, and you will create adult Gorillas with each cast.")) + to_chat(owner, span_notice("Your simian power has reached maximum capacity! You can now cast this spell naked, and have additionally been granted a gorilla transformation spell!")) /datum/action/cooldown/spell/conjure/simian/cast(atom/cast_on) . = ..() diff --git a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm index 836bfd98dca..00327111e89 100644 --- a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm +++ b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm @@ -162,6 +162,8 @@ they will be consumed by you, fully healing you." /// The sound played when someone's consumed. var/consume_sound = 'sound/magic/demon_consume.ogg' + /// consume count (statistics and stuff) + var/consume_count = 0 /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/try_enter_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter) // Save this before the actual jaunt @@ -228,6 +230,7 @@ victim.investigate_log("has been killed by being consumed by a slaugter demon.", INVESTIGATE_DEATHS) victim.death() on_victim_consumed(victim, jaunter) + consume_count++ /** * Called when a victim starts to be consumed. diff --git a/code/modules/spells/spell_types/self/mutate.dm b/code/modules/spells/spell_types/self/mutate.dm index 4908a37053d..477c7e6723c 100644 --- a/code/modules/spells/spell_types/self/mutate.dm +++ b/code/modules/spells/spell_types/self/mutate.dm @@ -54,7 +54,7 @@ if(HAS_TRAIT(cast_on, TRAIT_USES_SKINTONES) || HAS_TRAIT(cast_on, TRAIT_MUTANT_COLORS)) return // Our caster has a species that doesn't greenify when hulked, so we will do it manually. - cast_on.add_atom_colour("#00FF00", TEMPORARY_COLOUR_PRIORITY) + cast_on.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) /datum/action/cooldown/spell/apply_mutations/mutate/remove_mutations(mob/living/carbon/human/cast_on) if(QDELETED(cast_on) || !is_valid_target(cast_on)) diff --git a/code/modules/spells/spell_types/shapeshift/gorilla.dm b/code/modules/spells/spell_types/shapeshift/gorilla.dm new file mode 100644 index 00000000000..fe93c0f2bc4 --- /dev/null +++ b/code/modules/spells/spell_types/shapeshift/gorilla.dm @@ -0,0 +1,9 @@ + +/datum/action/cooldown/spell/shapeshift/gorilla + name = "Gorilla Form" + desc = "Take on the shape of a powerful gorilla." + button_icon_state = "return_to_monkey" + invocation = "B'NA NAH-SLEMA!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + possible_shapes = list(/mob/living/basic/gorilla) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 40a8a99ac57..a4b1287aa53 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -259,8 +259,8 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) /obj/machinery/bsa/full/proc/reload() ready = FALSE - use_power(power_used_per_shot) - addtimer(CALLBACK(src,"ready_cannon"),600) + use_energy(power_used_per_shot) + addtimer(CALLBACK(src,"ready_cannon"), 1 MINUTES) /obj/machinery/bsa/full/proc/ready_cannon() ready = TRUE diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 5c146758d12..354f08667eb 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -220,7 +220,7 @@ H.dna.add_mutation(associated_mutation[upgrade_type], MUT_OTHER, 0) ADD_TRAIT(H, TRAIT_USED_DNA_VAULT, DNA_VAULT_TRAIT) power_lottery[human_weakref] = list() - use_power(active_power_usage) + use_energy(active_power_usage) #undef VAULT_TOXIN #undef VAULT_NOBREATH diff --git a/code/modules/surgery/advanced/bioware/bioware.dm b/code/modules/surgery/advanced/bioware/bioware.dm deleted file mode 100644 index 4a679e74631..00000000000 --- a/code/modules/surgery/advanced/bioware/bioware.dm +++ /dev/null @@ -1,36 +0,0 @@ -//Bioware -//Body modifications applied through surgery. They generally affect physiology. - -/datum/bioware - var/name = "Generic Bioware" - var/mob/living/carbon/human/owner - var/desc = "If you see this something's wrong, warn a coder." - var/active = FALSE - var/can_process = FALSE - var/mod_type = BIOWARE_GENERIC - -/datum/bioware/New(mob/living/carbon/human/new_owner) - owner = new_owner - for(var/datum/bioware/bioware as anything in owner.biowares) - if(bioware.mod_type == mod_type) - qdel(src) - return - LAZYADD(owner.biowares, src) - on_gain() - -/datum/bioware/Destroy() - if(owner) - LAZYREMOVE(owner.biowares, src) - owner = null - if(active) - on_lose() - return ..() - -/datum/bioware/proc/on_gain() - active = TRUE - if(can_process) - START_PROCESSING(SSobj, src) - -/datum/bioware/proc/on_lose() - STOP_PROCESSING(SSobj, src) - return diff --git a/code/modules/surgery/advanced/bioware/bioware_surgery.dm b/code/modules/surgery/advanced/bioware/bioware_surgery.dm index 4db161e5249..6145b63ca6f 100644 --- a/code/modules/surgery/advanced/bioware/bioware_surgery.dm +++ b/code/modules/surgery/advanced/bioware/bioware_surgery.dm @@ -1,13 +1,29 @@ /datum/surgery/advanced/bioware name = "Enhancement surgery" - var/bioware_target = BIOWARE_GENERIC + /// 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 - for(var/datum/bioware/bioware as anything in target.biowares) - if(bioware.mod_type == bioware_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 + +/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 index e3629b02b0a..73792575a7b 100644 --- a/code/modules/surgery/advanced/bioware/cortex_folding.dm +++ b/code/modules/surgery/advanced/bioware/cortex_folding.dm @@ -8,11 +8,11 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/fold_cortex, + /datum/surgery_step/apply_bioware/fold_cortex, /datum/surgery_step/close, ) - bioware_target = BIOWARE_CORTEX + status_effect_gained = /datum/status_effect/bioware/cortex/folded /datum/surgery/advanced/bioware/cortex_folding/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) @@ -20,12 +20,10 @@ return FALSE return ..() -/datum/surgery_step/fold_cortex +/datum/surgery_step/apply_bioware/fold_cortex name = "fold cortex (hand)" - accept_hand = TRUE - time = 125 -/datum/surgery_step/fold_cortex/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -35,7 +33,11 @@ ) display_pain(target, "Your head throbs with gruesome pain, it's nearly too much to handle!") -/datum/surgery_step/fold_cortex/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -44,10 +46,8 @@ span_notice("[user] completes the surgery on [target]'s brain."), ) display_pain(target, "Your brain feels stronger... more flexible!") - new /datum/bioware/cortex_fold(target) - return ..() -/datum/surgery_step/fold_cortex/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -62,16 +62,3 @@ else user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) return FALSE - -/datum/bioware/cortex_fold - name = "Cortex Fold" - desc = "The cerebral cortex has been folded into a complex fractal pattern, and can support non-standard neural patterns." - mod_type = BIOWARE_CORTEX - -/datum/bioware/cortex_fold/on_gain() - . = ..() - ADD_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/cortex_fold/on_lose() - REMOVE_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST, EXPERIMENTAL_SURGERY_TRAIT) - return ..() diff --git a/code/modules/surgery/advanced/bioware/cortex_imprint.dm b/code/modules/surgery/advanced/bioware/cortex_imprint.dm index 542795294b0..26b43ee691f 100644 --- a/code/modules/surgery/advanced/bioware/cortex_imprint.dm +++ b/code/modules/surgery/advanced/bioware/cortex_imprint.dm @@ -8,11 +8,11 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/imprint_cortex, + /datum/surgery_step/apply_bioware/imprint_cortex, /datum/surgery_step/close, ) - bioware_target = BIOWARE_CORTEX + status_effect_gained = /datum/status_effect/bioware/cortex/imprinted /datum/surgery/advanced/bioware/cortex_imprint/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) @@ -20,12 +20,10 @@ return FALSE return ..() -/datum/surgery_step/imprint_cortex +/datum/surgery_step/apply_bioware/imprint_cortex name = "imprint cortex (hand)" - accept_hand = TRUE - time = 125 -/datum/surgery_step/imprint_cortex/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -35,7 +33,11 @@ ) display_pain(target, "Your head throbs with gruesome pain, it's nearly too much to handle!") -/datum/surgery_step/imprint_cortex/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -44,10 +46,8 @@ span_notice("[user] completes the surgery on [target]'s brain."), ) display_pain(target, "Your brain feels stronger... more resillient!") - new /datum/bioware/cortex_imprint(target) - return ..() -/datum/surgery_step/imprint_cortex/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -62,12 +62,3 @@ else user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) return FALSE - -/datum/bioware/cortex_imprint - name = "Cortex Imprint" - desc = "The cerebral cortex has been reshaped into a redundant neural pattern, making the brain able to bypass impediments caused by minor brain traumas." - mod_type = BIOWARE_CORTEX - can_process = TRUE - -/datum/bioware/cortex_imprint/process() - owner.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm index 4d263641769..b4a8b168a2e 100644 --- a/code/modules/surgery/advanced/bioware/ligament_hook.dm +++ b/code/modules/surgery/advanced/bioware/ligament_hook.dm @@ -9,17 +9,16 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/reshape_ligaments, + /datum/surgery_step/apply_bioware/reshape_ligaments, /datum/surgery_step/close, ) - bioware_target = BIOWARE_LIGAMENTS -/datum/surgery_step/reshape_ligaments + status_effect_gained = /datum/status_effect/bioware/ligaments/hooked + +/datum/surgery_step/apply_bioware/reshape_ligaments name = "reshape ligaments (hand)" - accept_hand = TRUE - time = 125 -/datum/surgery_step/reshape_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -29,7 +28,11 @@ ) display_pain(target, "Your limbs burn with severe pain!") -/datum/surgery_step/reshape_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -38,18 +41,3 @@ span_notice("[user] finishes manipulating [target]'s ligaments."), ) display_pain(target, "Your limbs feel... strangely loose.") - new /datum/bioware/hooked_ligaments(target) - return ..() - -/datum/bioware/hooked_ligaments - name = "Hooked Ligaments" - desc = "The ligaments and nerve endings that connect the torso to the limbs are formed into a hook-like shape, so limbs can be attached without requiring surgery, but are easier to sever." - mod_type = BIOWARE_LIGAMENTS - -/datum/bioware/hooked_ligaments/on_gain() - ..() - owner.add_traits(list(TRAIT_LIMBATTACHMENT, TRAIT_EASYDISMEMBER), EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/hooked_ligaments/on_lose() - ..() - owner.remove_traits(list(TRAIT_LIMBATTACHMENT, TRAIT_EASYDISMEMBER), EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm index 1aa4d5e18fb..27f4674c7b6 100644 --- a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm +++ b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm @@ -9,18 +9,16 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/reinforce_ligaments, + /datum/surgery_step/apply_bioware/reinforce_ligaments, /datum/surgery_step/close, ) - bioware_target = BIOWARE_LIGAMENTS + status_effect_gained = /datum/status_effect/bioware/ligaments/reinforced -/datum/surgery_step/reinforce_ligaments +/datum/surgery_step/apply_bioware/reinforce_ligaments name = "reinforce ligaments (hand)" - accept_hand = TRUE - time = 125 -/datum/surgery_step/reinforce_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -30,7 +28,11 @@ ) display_pain(target, "Your limbs burn with severe pain!") -/datum/surgery_step/reinforce_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -39,18 +41,3 @@ span_notice("[user] finishes manipulating [target]'s ligaments."), ) display_pain(target, "Your limbs feel more secure, but also more frail.") - new /datum/bioware/reinforced_ligaments(target) - return ..() - -/datum/bioware/reinforced_ligaments - name = "Reinforced Ligaments" - desc = "The ligaments and nerve endings that connect the torso to the limbs are protected by a mix of bone and tissues, and are much harder to separate from the body, but are also easier to wound." - mod_type = BIOWARE_LIGAMENTS - -/datum/bioware/reinforced_ligaments/on_gain() - ..() - owner.add_traits(list(TRAIT_NODISMEMBER, TRAIT_EASILY_WOUNDED), EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/reinforced_ligaments/on_lose() - ..() - owner.remove_traits(list(TRAIT_NODISMEMBER, TRAIT_EASILY_WOUNDED), EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm index 80987779d66..13355a56948 100644 --- a/code/modules/surgery/advanced/bioware/muscled_veins.dm +++ b/code/modules/surgery/advanced/bioware/muscled_veins.dm @@ -8,18 +8,16 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/muscled_veins, + /datum/surgery_step/apply_bioware/muscled_veins, /datum/surgery_step/close, ) - bioware_target = BIOWARE_CIRCULATION + status_effect_gained = /datum/status_effect/bioware/heart/muscled_veins -/datum/surgery_step/muscled_veins +/datum/surgery_step/apply_bioware/muscled_veins name = "shape vein muscles (hand)" - accept_hand = TRUE - time = 125 -/datum/surgery_step/muscled_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -29,7 +27,11 @@ ) display_pain(target, "Your entire body burns in agony!") -/datum/surgery_step/muscled_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -38,18 +40,3 @@ span_notice("[user] finishes manipulating [target]'s circulatory system."), ) display_pain(target, "You can feel your heartbeat's powerful pulses ripple through your body!") - new /datum/bioware/muscled_veins(target) - return ..() - -/datum/bioware/muscled_veins - name = "Muscled Veins" - desc = "The circulatory system is affixed with a muscled membrane, allowing the veins to pump blood without the need for a heart." - mod_type = BIOWARE_CIRCULATION - -/datum/bioware/muscled_veins/on_gain() - ..() - ADD_TRAIT(owner, TRAIT_STABLEHEART, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/muscled_veins/on_lose() - ..() - REMOVE_TRAIT(owner, TRAIT_STABLEHEART, EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm index aca9758e351..b0879bb0734 100644 --- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm +++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm @@ -8,18 +8,17 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/ground_nerves, + /datum/surgery_step/apply_bioware/ground_nerves, /datum/surgery_step/close, ) - bioware_target = BIOWARE_NERVES + status_effect_gained = /datum/status_effect/bioware/nerves/grounded -/datum/surgery_step/ground_nerves +/datum/surgery_step/apply_bioware/ground_nerves name = "ground nerves (hand)" - accept_hand = TRUE - time = 155 + time = 15.5 SECONDS -/datum/surgery_step/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -29,7 +28,7 @@ ) display_pain(target, "Your entire body goes numb!") -/datum/surgery_step/ground_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -38,18 +37,4 @@ span_notice("[user] finishes manipulating [target]'s nervous system."), ) display_pain(target, "You regain feeling in your body! You feel energzed!") - new /datum/bioware/grounded_nerves(target) return ..() - -/datum/bioware/grounded_nerves - name = "Grounded Nerves" - desc = "Nerves form a safe path for electricity to traverse, protecting the body from electric shocks." - mod_type = BIOWARE_NERVES - -/datum/bioware/grounded_nerves/on_gain() - ..() - ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/grounded_nerves/on_lose() - ..() - REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm index e7d0e336a5e..5962f828009 100644 --- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm +++ b/code/modules/surgery/advanced/bioware/nerve_splicing.dm @@ -8,18 +8,17 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/splice_nerves, + /datum/surgery_step/apply_bioware/splice_nerves, /datum/surgery_step/close, ) - bioware_target = BIOWARE_NERVES + status_effect_gained = /datum/status_effect/bioware/nerves/spliced -/datum/surgery_step/splice_nerves +/datum/surgery_step/apply_bioware/splice_nerves name = "splice nerves (hand)" - accept_hand = TRUE - time = 155 + time = 15.5 SECONDS -/datum/surgery_step/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -29,7 +28,11 @@ ) display_pain(target, "Your entire body goes numb!") -/datum/surgery_step/splice_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -38,22 +41,3 @@ span_notice("[user] finishes manipulating [target]'s nervous system."), ) display_pain(target, "You regain feeling in your body; It feels like everything's happening around you in slow motion!") - new /datum/bioware/spliced_nerves(target) - if(target.ckey) - SSblackbox.record_feedback("nested tally", "nerve_splicing", 1, list("[target.ckey]", "got")) - return ..() - -/datum/bioware/spliced_nerves - name = "Spliced Nerves" - desc = "Nerves are connected to each other multiple times, greatly reducing the impact of stunning effects." - mod_type = BIOWARE_NERVES - -/datum/bioware/spliced_nerves/on_gain() - ..() - owner.physiology.stun_mod *= 0.5 - owner.physiology.stamina_mod *= 0.8 - -/datum/bioware/spliced_nerves/on_lose() - ..() - owner.physiology.stun_mod *= 2 - owner.physiology.stamina_mod *= 1.25 diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm index 97efbd876c9..ee83ddbba4d 100644 --- a/code/modules/surgery/advanced/bioware/vein_threading.dm +++ b/code/modules/surgery/advanced/bioware/vein_threading.dm @@ -8,18 +8,16 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/thread_veins, + /datum/surgery_step/apply_bioware/thread_veins, /datum/surgery_step/close, ) - bioware_target = BIOWARE_CIRCULATION + status_effect_gained = /datum/status_effect/bioware/heart/threaded_veins -/datum/surgery_step/thread_veins +/datum/surgery_step/apply_bioware/thread_veins name = "thread veins (hand)" - accept_hand = TRUE - time = 125 -/datum/surgery_step/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/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, @@ -29,7 +27,11 @@ ) display_pain(target, "Your entire body burns in agony!") -/datum/surgery_step/thread_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/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, @@ -38,18 +40,3 @@ span_notice("[user] finishes manipulating [target]'s circulatory system."), ) display_pain(target, "You can feel your blood pumping through reinforced veins!") - new /datum/bioware/threaded_veins(target) - return ..() - -/datum/bioware/threaded_veins - name = "Threaded Veins" - desc = "The circulatory system is woven into a mesh, severely reducing the amount of blood lost from wounds." - mod_type = BIOWARE_CIRCULATION - -/datum/bioware/threaded_veins/on_gain() - ..() - owner.physiology.bleed_mod *= 0.25 - -/datum/bioware/threaded_veins/on_lose() - ..() - owner.physiology.bleed_mod *= 4 diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 8e174b24cf1..03f87b6d741 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -397,7 +397,7 @@ playsound(loc, 'sound/weapons/slice.ogg', 50, TRUE, -1) user.visible_message(span_warning("[user] begins to cut open [src]."),\ span_notice("You begin to cut open [src]...")) - if(do_after(user, 54, target = src)) + if(do_after(user, 5.4 SECONDS, target = src)) drop_organs(user, TRUE) else return ..() @@ -1178,10 +1178,11 @@ bodypart_overlays -= overlay overlay.removed_from_limb(src) -/obj/item/bodypart/deconstruct(disassembled = TRUE) +/obj/item/bodypart/atom_deconstruct(disassembled = TRUE) SHOULD_CALL_PARENT(TRUE) drop_organs() + return ..() /// INTERNAL PROC, DO NOT USE diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 29481da7496..711e21288dc 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -38,7 +38,7 @@ /// Hair style var/hairstyle = "Bald" /// Hair colour and style - var/hair_color = "#000000" + var/hair_color = COLOR_BLACK /// Hair alpha var/hair_alpha = 255 /// Is the hair currently hidden by something? @@ -47,7 +47,7 @@ ///Facial hair style var/facial_hairstyle = "Shaved" ///Facial hair color - var/facial_hair_color = "#000000" + var/facial_hair_color = COLOR_BLACK ///Facial hair alpha var/facial_hair_alpha = 255 ///Is the facial hair currently hidden by something? @@ -216,13 +216,9 @@ return -/obj/item/bodypart/head/talk_into(mob/holder, message, channel, spans, datum/language/language, list/message_mods) - var/mob/headholder = holder - if(istype(headholder)) - headholder.log_talk(message, LOG_SAY, tag = "beheaded talk") - - say(message, language, sanitize = FALSE) - return NOPASS +/obj/item/bodypart/head/Initialize(mapload) + . = ..() + AddElement(/datum/element/toy_talk) /obj/item/bodypart/head/GetVoice() return "The head of [real_name]" diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index ead03aa0f70..22450ca793d 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -69,6 +69,15 @@ cavity_item = null return ..() +/// Sprite to show for photocopying mob butts +/obj/item/bodypart/chest/proc/get_butt_sprite() + if(!ishuman(owner)) + return null + var/mob/living/carbon/human/human_owner = owner + var/butt_sprite = human_owner.physique == FEMALE ? BUTT_SPRITE_HUMAN_FEMALE : BUTT_SPRITE_HUMAN_MALE + var/obj/item/organ/external/tail/tail = human_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + return tail?.get_butt_sprite() || butt_sprite + /obj/item/bodypart/chest/monkey icon = 'icons/mob/human/species/monkey/bodyparts.dmi' icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi' diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index 5f44dc7ef38..f2064c5c26a 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -10,6 +10,9 @@ is_dimorphic = TRUE wing_types = list(/obj/item/organ/external/wings/functional/dragon) +/obj/item/bodypart/chest/lizard/get_butt_sprite() + return BUTT_SPRITE_LIZARD + /obj/item/bodypart/arm/left/lizard icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index 7e415f61cda..a5569d803b0 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -60,6 +60,9 @@ should_draw_greyscale = FALSE wing_types = NONE +/obj/item/bodypart/chest/abductor/get_butt_sprite() + return BUTT_SPRITE_GREY + /obj/item/bodypart/arm/left/abductor limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE @@ -85,7 +88,7 @@ is_dimorphic = TRUE dmg_overlay_type = null burn_modifier = 0.5 // = 1/2x generic burn damage - head_flags = HEAD_ALL_FEATURES + head_flags = HEAD_EYECOLOR | HEAD_EYESPRITES | HEAD_HAIR | HEAD_FACIAL_HAIR /obj/item/bodypart/chest/jelly biological_state = (BIO_FLESH|BIO_BLOODED) @@ -95,6 +98,9 @@ burn_modifier = 0.5 // = 1/2x generic burn damage wing_types = list(/obj/item/organ/external/wings/functional/slime) +/obj/item/bodypart/chest/jelly/get_butt_sprite() + return BUTT_SPRITE_SLIME + /obj/item/bodypart/arm/left/jelly biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_JELLYPERSON @@ -120,61 +126,42 @@ burn_modifier = 0.5 // = 1/2x generic burn damage ///SLIME -/obj/item/bodypart/head/slime - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/head/jelly/slime limb_id = SPECIES_SLIMEPERSON is_dimorphic = FALSE - head_flags = HEAD_ALL_FEATURES -/obj/item/bodypart/chest/slime - biological_state = (BIO_FLESH|BIO_BLOODED) - limb_id = SPECIES_SLIMEPERSON - is_dimorphic = TRUE - wing_types = list(/obj/item/organ/external/wings/functional/slime) - -/obj/item/bodypart/arm/left/slime - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/chest/jelly/slime limb_id = SPECIES_SLIMEPERSON -/obj/item/bodypart/arm/right/slime - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/arm/left/jelly/slime limb_id = SPECIES_SLIMEPERSON -/obj/item/bodypart/leg/left/slime - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/arm/right/jelly/slime limb_id = SPECIES_SLIMEPERSON -/obj/item/bodypart/leg/right/slime - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/leg/left/jelly/slime + limb_id = SPECIES_SLIMEPERSON + +/obj/item/bodypart/leg/right/jelly/slime limb_id = SPECIES_SLIMEPERSON ///LUMINESCENT -/obj/item/bodypart/head/luminescent - biological_state = (BIO_FLESH|BIO_BLOODED) - limb_id = SPECIES_LUMINESCENT - is_dimorphic = TRUE - head_flags = HEAD_ALL_FEATURES - -/obj/item/bodypart/chest/luminescent - biological_state = (BIO_FLESH|BIO_BLOODED) - limb_id = SPECIES_LUMINESCENT - is_dimorphic = TRUE - wing_types = list(/obj/item/organ/external/wings/functional/slime) - -/obj/item/bodypart/arm/left/luminescent - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/head/jelly/luminescent limb_id = SPECIES_LUMINESCENT -/obj/item/bodypart/arm/right/luminescent - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/chest/jelly/luminescent limb_id = SPECIES_LUMINESCENT -/obj/item/bodypart/leg/left/luminescent - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/arm/left/jelly/luminescent limb_id = SPECIES_LUMINESCENT -/obj/item/bodypart/leg/right/luminescent - biological_state = (BIO_FLESH|BIO_BLOODED) +/obj/item/bodypart/arm/right/jelly/luminescent + limb_id = SPECIES_LUMINESCENT + +/obj/item/bodypart/leg/left/jelly/luminescent + limb_id = SPECIES_LUMINESCENT + +/obj/item/bodypart/leg/right/jelly/luminescent limb_id = SPECIES_LUMINESCENT ///ZOMBIE @@ -230,6 +217,9 @@ burn_modifier = 1.25 wing_types = NONE +/obj/item/bodypart/chest/pod/get_butt_sprite() + return BUTT_SPRITE_FLOWERPOT + /obj/item/bodypart/arm/left/pod limb_id = SPECIES_PODPERSON unarmed_attack_verb = "slash" diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm index 1431fc197b9..25f9e719fda 100644 --- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm @@ -17,6 +17,9 @@ should_draw_greyscale = FALSE wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra) +/obj/item/bodypart/chest/moth/get_butt_sprite() + return BUTT_SPRITE_FUZZY + /obj/item/bodypart/arm/left/moth icon = 'icons/mob/human/species/moth/bodyparts.dmi' icon_state = "moth_l_arm" diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm index 8ba27c2cdf9..40bf4a51c04 100644 --- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm @@ -26,6 +26,9 @@ bodypart_flags = BODYPART_UNHUSKABLE wing_types = NONE +/obj/item/bodypart/chest/plasmaman/get_butt_sprite() + return BUTT_SPRITE_PLASMA + /obj/item/bodypart/arm/left/plasmaman icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_l_arm" diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index aa4028997e7..deda90bdd6e 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -1,6 +1,6 @@ /datum/surgery/core_removal name = "Core removal" - target_mobtypes = list(/mob/living/simple_animal/slime) + target_mobtypes = list(/mob/living/basic/slime) surgery_flags = SURGERY_IGNORE_CLOTHES possible_locs = list( BODY_ZONE_R_ARM, @@ -36,7 +36,7 @@ ) /datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/simple_animal/slime/target_slime = target + var/mob/living/basic/slime/target_slime = target if(target_slime.cores > 0) target_slime.cores-- display_results( diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 8ebfa6e425d..a8c7c7825b6 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -38,6 +38,7 @@ implements = list( TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, + TOOL_WIRECUTTER = 60, /obj/item/pen = 55) repeatable = TRUE time = 25 diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index a2b9eb33cbf..66eaf6faf73 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -56,6 +56,9 @@ display_pain(target, "You can feel your [implant.name] pulled out of you!") implant.removed(target) + if (QDELETED(implant)) + return ..() + var/obj/item/implantcase/case for(var/obj/item/implantcase/implant_case in user.held_items) case = implant_case diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 031534b0723..0e5bfb97785 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -10,7 +10,7 @@ ) /datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target) - if(!HAS_TRAIT(target, TRAIT_FAT) || target.nutrition < NUTRITION_LEVEL_WELL_FED) + if(!HAS_TRAIT_FROM(target, TRAIT_FAT, OBESITY) || target.nutrition < NUTRITION_LEVEL_WELL_FED) return FALSE return ..() diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 25004d20d20..144d30e067d 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -252,6 +252,7 @@ span_notice("[user] inserts something into [target]'s [parse_zone(target_zone)]!"), ) display_pain(target, "Your [parse_zone(target_zone)] throbs with pain as your new [tool.name] comes to life!") + target_organ.on_surgical_insertion(user, target, target_zone, tool) else target_organ.forceMove(target.loc) diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index d7f08a7be35..366f0f0087f 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -239,6 +239,11 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) for(var/obj/item/organ/organ as anything in organs) organ.set_organ_damage(0) set_heartattack(FALSE) + + // Ears have aditional vаr "deaf", need to update it too + var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + ears?.adjustEarDamage(0, -INFINITY) // full heal ears deafness + return // Default organ fixing handling @@ -273,7 +278,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) if(!ears) ears = new() ears.Insert(src) - ears.set_organ_damage(0) + ears.adjustEarDamage(-INFINITY, -INFINITY) // actually do: set_organ_damage(0) and deaf = 0 /obj/item/organ/proc/handle_failing_organs(seconds_per_tick) return diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index b577b9f8ec0..6e3d9a0ee7c 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -157,15 +157,27 @@ /obj/item/autosurgeon/syndicate/thermal_eyes starting_organ = /obj/item/organ/internal/eyes/robotic/thermals +/obj/item/autosurgeon/syndicate/thermal_eyes/single_use + uses = 1 + /obj/item/autosurgeon/syndicate/xray_eyes starting_organ = /obj/item/organ/internal/eyes/robotic/xray +/obj/item/autosurgeon/syndicate/xray_eyes/single_use + uses = 1 + /obj/item/autosurgeon/syndicate/anti_stun starting_organ = /obj/item/organ/internal/cyberimp/brain/anti_stun +/obj/item/autosurgeon/syndicate/anti_stun/single_use + uses = 1 + /obj/item/autosurgeon/syndicate/reviver starting_organ = /obj/item/organ/internal/cyberimp/chest/reviver +/obj/item/autosurgeon/syndicate/reviver/single_use + uses = 1 + /obj/item/autosurgeon/syndicate/commsagent desc = "A device that automatically - painfully - inserts an implant. It seems someone's specially \ modified this one to only insert... tongues. Horrifying." @@ -177,3 +189,11 @@ /obj/item/autosurgeon/syndicate/emaggedsurgerytoolset starting_organ = /obj/item/organ/internal/cyberimp/arm/surgery/emagged + +/obj/item/autosurgeon/syndicate/emaggedsurgerytoolset/single_use + uses = 1 + +/obj/item/autosurgeon/syndicate/contraband_sechud + desc = "Contains a contraband SecHUD implant, undetectable by health scanners." + uses = 1 + starting_organ = /obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index d8205b3ad16..e1de62308f0 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -126,6 +126,9 @@ UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH) return succeeded +/obj/item/organ/external/tail/proc/get_butt_sprite() + return null + ///Tail parent type, with wagging functionality /datum/bodypart_overlay/mutant/tail layers = EXTERNAL_FRONT|EXTERNAL_BEHIND @@ -153,6 +156,9 @@ wag_flags = WAG_ABLE +/obj/item/organ/external/tail/cat/get_butt_sprite() + return BUTT_SPRITE_CAT + ///Cat tail bodypart overlay /datum/bodypart_overlay/mutant/tail/cat feature_key = "tail" // SKYRAT EDIT - Customization - ORIGINAL: feature_key = "tail_cat" diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index 513f0794c31..24aadfeca14 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -23,7 +23,7 @@ synthesizing = TRUE to_chat(owner, span_notice("You feel less hungry...")) owner.adjust_nutrition(25 * seconds_per_tick) - addtimer(CALLBACK(src, PROC_REF(synth_cool)), 50) + addtimer(CALLBACK(src, PROC_REF(synth_cool)), 5 SECONDS) /obj/item/organ/internal/cyberimp/chest/nutriment/proc/synth_cool() synthesizing = FALSE @@ -123,6 +123,7 @@ owner.visible_message(span_warning("[owner]'s body convulses a bit.")) playsound(owner, SFX_BODYFALL, 50, TRUE) playsound(owner, 'sound/machines/defib_zap.ogg', 75, TRUE, -1) + owner.set_heartattack(FALSE) owner.revive() owner.emote("gasp") owner.set_jitter_if_lower(200 SECONDS) diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index 67a02e71d7e..89c6f9c96a4 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -5,7 +5,7 @@ visual = FALSE organ_flags = ORGAN_ROBOTIC failing_desc = "seems to be broken." - var/implant_color = "#FFFFFF" + var/implant_color = COLOR_WHITE var/implant_overlay /obj/item/organ/internal/cyberimp/New(mob/implanted_mob = null) @@ -101,37 +101,67 @@ /obj/item/organ/internal/cyberimp/brain/anti_stun name = "CNS Rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." - implant_color = "#FFFF00" + implant_color = COLOR_YELLOW slot = ORGAN_SLOT_BRAIN_ANTISTUN var/static/list/signalCache = list( COMSIG_LIVING_STATUS_STUN, - COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_LIVING_STATUS_IMMOBILIZE, COMSIG_LIVING_STATUS_PARALYZE, ) - var/stun_cap_amount = 40 + ///timer before the implant activates + var/stun_cap_amount = 1 SECONDS + ///amount of time you are resistant to stuns and knockdowns + var/stun_resistance_time = 6 SECONDS + COOLDOWN_DECLARE(implant_cooldown) /obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_remove(mob/living/carbon/implant_owner) . = ..() UnregisterSignal(implant_owner, signalCache) + UnregisterSignal(implant_owner, COMSIG_CARBON_ENTER_STAMCRIT) /obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver) . = ..() RegisterSignals(receiver, signalCache, PROC_REF(on_signal)) + RegisterSignal(receiver, COMSIG_CARBON_ENTER_STAMCRIT, PROC_REF(on_stamcrit)) /obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) SIGNAL_HANDLER if(!(organ_flags & ORGAN_FAILING) && amount > 0) addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE) +/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_stamcrit(datum/source) + SIGNAL_HANDLER + if(!(organ_flags & ORGAN_FAILING)) + addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE) + /obj/item/organ/internal/cyberimp/brain/anti_stun/proc/clear_stuns() - if(owner || !(organ_flags & ORGAN_FAILING)) - owner.SetStun(0) - owner.SetKnockdown(0) - owner.SetImmobilized(0) - owner.SetParalyzed(0) + if(isnull(owner) || (organ_flags & ORGAN_FAILING) || !COOLDOWN_FINISHED(src, implant_cooldown)) + return + + owner.SetStun(0) + 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) + + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread + sparks.set_up(5, 1, src) + sparks.start() + + owner.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_BATON_RESISTANCE, TRAIT_STUNIMMUNE), REF(src)) + addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_IGNOREDAMAGESLOWDOWN, REF(src)), stun_resistance_time) + addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_BATON_RESISTANCE, REF(src)), stun_resistance_time) + addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_STUNIMMUNE, REF(src)), stun_resistance_time) + + COOLDOWN_START(src, implant_cooldown, 60 SECONDS) + addtimer(CALLBACK(src, PROC_REF(implant_ready)),60 SECONDS) + +/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/implant_ready() + if(owner) + to_chat(owner, span_purple("Your rebooter implant is ready.")) /obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity) . = ..() @@ -141,7 +171,8 @@ addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) /obj/item/organ/internal/cyberimp/brain/anti_stun/proc/reboot() - organ_flags &= ~ORGAN_FAILING + organ_flags &= ~ORGAN_FAILING + implant_ready() //[[[[MOUTH]]]] /obj/item/organ/internal/cyberimp/mouth diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index 2a3eabd5f8e..8e9c7ae70a7 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -67,6 +67,13 @@ icon_state = "kitty" visual = TRUE damage_multiplier = 2 + // Keeps track of which cat ears sprite is associated with this. + var/variant = "Cat" + +/obj/item/organ/internal/ears/cat/Initialize(mapload, variant_pref) + . = ..() + if(variant_pref) + variant = variant_pref //SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION /* @@ -74,7 +81,7 @@ . = ..() if(istype(ear_owner) && ear_owner.dna) color = ear_owner.hair_color - ear_owner.dna.features["ears"] = ear_owner.dna.species.mutant_bodyparts["ears"] = "Cat" + ear_owner.dna.features["ears"] = ear_owner.dna.species.mutant_bodyparts["ears"] = variant ear_owner.dna.update_uf_block(DNA_EARS_BLOCK) ear_owner.update_body() diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index c9e54027137..08fbd4e955a 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -383,8 +383,9 @@ tint = INFINITY var/obj/item/flashlight/eyelight/eye -/obj/item/organ/internal/eyes/robotic/flashlight/emp_act(severity) - return +/obj/item/organ/internal/eyes/robotic/flashlight/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) /obj/item/organ/internal/eyes/robotic/flashlight/on_mob_insert(mob/living/carbon/victim) . = ..() @@ -408,8 +409,9 @@ desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." flash_protect = FLASH_PROTECTION_WELDER -/obj/item/organ/internal/eyes/robotic/shield/emp_act(severity) - return +/obj/item/organ/internal/eyes/robotic/shield/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) #define MATCH_LIGHT_COLOR 1 #define USE_CUSTOM_COLOR 0 @@ -445,7 +447,7 @@ deactivate(close_ui = TRUE) QDEL_NULL(eye) -/obj/item/organ/internal/eyes/robotic/glow/emp_act() +/obj/item/organ/internal/eyes/robotic/glow/emp_act(severity) . = ..() if(!eye.light_on || . & EMP_PROTECT_SELF) return diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index db619536c5a..5c6eaf9b38f 100644 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -100,6 +100,8 @@ . += span_info("A half-digested rat's tail (somehow), disgusting sludge, and the faint smell of Grey Bull imply this is what remains of an assistant's liver.") if(HAS_TRAIT(src, TRAIT_CORONER_METABOLISM)) . += span_info("An aroma of pickles and sea water, along with being remarkably well-preserved, imply this is what remains of a coroner's liver.") + if(HAS_TRAIT(src, TRAIT_HUMAN_AI_METABOLISM)) + . += span_info("The liver appears barely human and entirely self-sufficient, implying this is what remains of a human AI's liver.") // royal trumps pretender royal if(HAS_TRAIT(src, TRAIT_ROYAL_METABOLISM)) diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index 388c4c95fe1..6df5047f4af 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -444,7 +444,7 @@ /// React to speach while hopped up on the high pitched voice juice /obj/item/organ/internal/lungs/proc/handle_helium_speech(mob/living/carbon/breather, list/speech_args) SIGNAL_HANDLER - speech_args[SPEECH_SPANS] |= SPAN_HELIUM + speech_args[SPEECH_SPANS] |= SPAN_SMALL_VOICE /// Gain hypernob effects if we have enough of the stuff /obj/item/organ/internal/lungs/proc/consume_hypernoblium(mob/living/carbon/breather, datum/gas_mixture/breath, hypernob_pp, old_hypernob_pp) @@ -754,31 +754,85 @@ if(!HAS_TRAIT(breather, TRAIT_RESISTCOLD)) // COLD DAMAGE var/cold_modifier = breather.dna.species.coldmod + var/breath_effect_prob = 0 if(breath_temperature < cold_level_3_threshold) - breather.apply_damage(cold_level_3_damage*cold_modifier, cold_damage_type, spread_damage = TRUE) + breather.apply_damage(cold_level_3_damage * cold_modifier, cold_damage_type, spread_damage = TRUE) + breath_effect_prob = 100 if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) - breather.apply_damage(cold_level_2_damage*cold_modifier, cold_damage_type, spread_damage = TRUE) + breather.apply_damage(cold_level_2_damage * cold_modifier, cold_damage_type, spread_damage = TRUE) + breath_effect_prob = 50 if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) - breather.apply_damage(cold_level_1_damage*cold_modifier, cold_damage_type, spread_damage = TRUE) + breather.apply_damage(cold_level_1_damage * cold_modifier, cold_damage_type, spread_damage = TRUE) + breath_effect_prob = 25 if(breath_temperature < cold_level_1_threshold) - if(prob(20)) + if(prob(sqrt(breath_effect_prob) * 4)) to_chat(breather, span_warning("You feel [cold_message] in your [name]!")) + if(prob(50)) + breather.emote("shiver") + if(prob(breath_effect_prob)) + // Breathing into your mask, no particle. We can add fogged up glasses later + if(breather.is_mouth_covered()) + return + // Even though breathing via internals TECHNICALLY exhales into the environment, we'll still block it + if(breather.internal || breather.external) + return + emit_breath_particle(breather, /particles/fog/breath) if(!HAS_TRAIT(breather, TRAIT_RESISTHEAT)) // HEAT DAMAGE var/heat_modifier = breather.dna.species.heatmod + var/heat_message_prob = 0 if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) - breather.apply_damage(heat_level_1_damage*heat_modifier, heat_damage_type, spread_damage = TRUE) + breather.apply_damage(heat_level_1_damage * heat_modifier, heat_damage_type, spread_damage = TRUE) + heat_message_prob = 100 if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) - breather.apply_damage(heat_level_2_damage*heat_modifier, heat_damage_type, spread_damage = TRUE) + breather.apply_damage(heat_level_2_damage * heat_modifier, heat_damage_type, spread_damage = TRUE) + heat_message_prob = 50 if(breath_temperature > heat_level_3_threshold) - breather.apply_damage(heat_level_3_damage*heat_modifier, heat_damage_type, spread_damage = TRUE) + breather.apply_damage(heat_level_3_damage * heat_modifier, heat_damage_type, spread_damage = TRUE) + heat_message_prob = 25 if(breath_temperature > heat_level_1_threshold) - if(prob(20)) + if(prob(sqrt(heat_message_prob) * 4)) to_chat(breather, span_warning("You feel [hot_message] in your [name]!")) // The air you breathe out should match your body temperature breath.temperature = breather.bodytemperature +/// Creates a particle effect off the mouth of the passed mob. +/obj/item/organ/internal/lungs/proc/emit_breath_particle(mob/living/carbon/human/breather, particle_type) + ASSERT(ispath(particle_type, /particles)) + + var/obj/effect/abstract/particle_holder/holder = new(breather, particle_type) + var/particles/breath_particle = holder.particles + var/breath_dir = breather.dir + + var/list/particle_grav = list(0, 0.1, 0) + var/list/particle_pos = list(0, breather.get_mob_height() + 2, 0) + if(breath_dir & NORTH) + particle_grav[2] = 0.2 + breath_particle.rotation = pick(-45, 45) + // Layer it behind the mob since we're facing away from the camera + holder.pixel_w -= 4 + holder.pixel_y += 4 + if(breath_dir & WEST) + particle_grav[1] = -0.2 + particle_pos[1] = -5 + breath_particle.rotation = -45 + if(breath_dir & EAST) + particle_grav[1] = 0.2 + particle_pos[1] = 5 + breath_particle.rotation = 45 + if(breath_dir & SOUTH) + particle_grav[2] = 0.2 + breath_particle.rotation = pick(-45, 45) + // Shouldn't be necessary but just for parity + holder.pixel_w += 4 + holder.pixel_y -= 4 + + breath_particle.gravity = particle_grav + breath_particle.position = particle_pos + + QDEL_IN(holder, breath_particle.lifespan) + /obj/item/organ/internal/lungs/on_life(seconds_per_tick, times_fired) . = ..() if(failed && !(organ_flags & ORGAN_FAILING)) diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm index e0e01fbd797..92609c3bf49 100644 --- a/code/modules/surgery/organs/internal/stomach/_stomach.dm +++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm @@ -127,17 +127,12 @@ if(HAS_TRAIT_FROM(human, TRAIT_FAT, OBESITY))//I share your pain, past coder. if(human.overeatduration < (200 SECONDS)) to_chat(human, span_notice("You feel fit again!")) - REMOVE_TRAIT(human, TRAIT_FAT, OBESITY) - human.remove_movespeed_modifier(/datum/movespeed_modifier/obesity) - human.update_worn_undersuit() - human.update_worn_oversuit() + human.remove_traits(list(TRAIT_FAT, TRAIT_OFF_BALANCE_TACKLER), OBESITY) + else if(human.overeatduration >= (200 SECONDS)) to_chat(human, span_danger("You suddenly feel blubbery!")) - ADD_TRAIT(human, TRAIT_FAT, OBESITY) - human.add_movespeed_modifier(/datum/movespeed_modifier/obesity) - human.update_worn_undersuit() - human.update_worn_oversuit() + human.add_traits(list(TRAIT_FAT, TRAIT_OFF_BALANCE_TACKLER), OBESITY) // nutrition decrease and satiety if (human.nutrition > 0 && human.stat != DEAD) @@ -189,18 +184,6 @@ if(CONFIG_GET(flag/disable_human_mood)) handle_hunger_slowdown(human) - // If we did anything more then just set and throw alerts here I would add bracketing - // But well, it is all we do, so there's not much point bothering with it you get me? - switch(nutrition) - if(NUTRITION_LEVEL_FULL to INFINITY) - human.throw_alert(ALERT_NUTRITION, /atom/movable/screen/alert/fat) - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL) - human.clear_alert(ALERT_NUTRITION) - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - human.throw_alert(ALERT_NUTRITION, /atom/movable/screen/alert/hungry) - if(0 to NUTRITION_LEVEL_STARVING) - human.throw_alert(ALERT_NUTRITION, /atom/movable/screen/alert/starving) - ///for when mood is disabled and hunger should handle slowdowns /obj/item/organ/internal/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human) var/hungry = (500 - human.nutrition) / 5 //So overeat would be 100 and default level would be 80 @@ -263,13 +246,16 @@ disgusted.throw_alert(ALERT_DISGUST, /atom/movable/screen/alert/disgusted) disgusted.add_mood_event("disgust", /datum/mood_event/disgusted) +/obj/item/organ/internal/stomach/Insert(mob/living/carbon/receiver, special, movement_flags) + . = ..() + receiver.hud_used?.hunger?.update_appearance() + /obj/item/organ/internal/stomach/Remove(mob/living/carbon/stomach_owner, special, movement_flags) if(ishuman(stomach_owner)) var/mob/living/carbon/human/human_owner = owner human_owner.clear_alert(ALERT_DISGUST) human_owner.clear_mood_event("disgust") - human_owner.clear_alert(ALERT_NUTRITION) - + stomach_owner.hud_used?.hunger?.update_appearance() return ..() /obj/item/organ/internal/stomach/bone diff --git a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm index 68f9d9428a0..2675f46d13d 100644 --- a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm @@ -3,14 +3,22 @@ icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy. desc = "A crystal-like organ that stores the electric charge of ethereals." organ_traits = list(TRAIT_NOHUNGER) // We have our own hunger mechanic. - ///basically satiety but electrical - var/crystal_charge = ETHEREAL_CHARGE_FULL + /// Where the energy of the stomach is stored. + var/obj/item/stock_parts/cell/cell ///used to keep ethereals from spam draining power sources var/drain_time = 0 +/obj/item/organ/internal/stomach/ethereal/Initialize(mapload) + . = ..() + cell = new /obj/item/stock_parts/cell/ethereal(null) + +/obj/item/organ/internal/stomach/ethereal/Destroy() + QDEL_NULL(cell) + return ..() + /obj/item/organ/internal/stomach/ethereal/on_life(seconds_per_tick, times_fired) . = ..() - adjust_charge(-ETHEREAL_CHARGE_FACTOR * seconds_per_tick) + adjust_charge(-ETHEREAL_DISCHARGE_RATE * seconds_per_tick) handle_charge(owner, seconds_per_tick, times_fired) /obj/item/organ/internal/stomach/ethereal/on_mob_insert(mob/living/carbon/stomach_owner) @@ -27,24 +35,31 @@ stomach_owner.clear_alert(ALERT_ETHEREAL_OVERCHARGE) /obj/item/organ/internal/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human) - human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - crystal_charge / 100))) + human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - cell.charge() / 100))) -/obj/item/organ/internal/stomach/ethereal/proc/charge(datum/source, amount, repairs) +/obj/item/organ/internal/stomach/ethereal/proc/charge(datum/source, datum/callback/charge_cell, seconds_per_tick) SIGNAL_HANDLER - adjust_charge(amount / 3.5) -/obj/item/organ/internal/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) + charge_cell.Invoke(cell, seconds_per_tick / 3.5) // Ethereals don't have NT designed charging ports, so they charge slower. + +/obj/item/organ/internal/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, shock_source, siemens_coeff = 1, flags = NONE) SIGNAL_HANDLER if(flags & SHOCK_ILLUSION) return adjust_charge(shock_damage * siemens_coeff * 2) to_chat(owner, span_notice("You absorb some of the shock into your body!")) +/**Changes the energy of the crystal stomach. +* Args: +* - amount: The change of the energy, in joules. +* Returns: The amount of energy that actually got changed in joules. +**/ /obj/item/organ/internal/stomach/ethereal/proc/adjust_charge(amount) - crystal_charge = clamp(crystal_charge + amount, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_DANGEROUS) + var/amount_changed = clamp(amount, ETHEREAL_CHARGE_NONE - cell.charge(), ETHEREAL_CHARGE_DANGEROUS - cell.charge()) + return cell.change(amount_changed) /obj/item/organ/internal/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, seconds_per_tick, times_fired) - switch(crystal_charge) + switch(cell.charge()) if(-INFINITY to ETHEREAL_CHARGE_NONE) carbon.add_mood_event("charge", /datum/mood_event/decharged) carbon.throw_alert(ALERT_ETHEREAL_CHARGE, /atom/movable/screen/alert/emptycell/ethereal) @@ -92,8 +107,9 @@ playsound(carbon, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) carbon.cut_overlay(overcharge) - tesla_zap(source = carbon, zap_range = 2, power = crystal_charge * 2.5, cutoff = 1e3, zap_flags = ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) - adjust_charge(ETHEREAL_CHARGE_FULL - crystal_charge) + // Only a small amount of the energy gets discharged as the zap. The rest dissipates as heat. Keeps the damage and energy from the zap the same regardless of what STANDARD_CELL_CHARGE is. + var/discharged_energy = -adjust_charge(ETHEREAL_CHARGE_FULL - cell.charge()) * min(7500 / STANDARD_CELL_CHARGE, 1) + tesla_zap(source = carbon, zap_range = 2, power = discharged_energy, cutoff = 1 KILO JOULES, zap_flags = ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) carbon.visible_message(span_danger("[carbon] violently discharges energy!"), span_warning("You violently discharge energy!")) if(prob(10)) //chance of developing heart disease to dissuade overcharging oneself diff --git a/code/modules/surgery/organs/organ_movement.dm b/code/modules/surgery/organs/organ_movement.dm index 7c6907da863..c39541fb8ef 100644 --- a/code/modules/surgery/organs/organ_movement.dm +++ b/code/modules/surgery/organs/organ_movement.dm @@ -224,9 +224,14 @@ /** * Proc that gets called when the organ is surgically removed by someone, can be used for special effects - * Currently only used so surplus organs can explode when surgically removed. */ /obj/item/organ/proc/on_surgical_removal(mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ORGAN_SURGICALLY_REMOVED, user, old_owner, target_zone, tool) RemoveElement(/datum/element/decal/blood) +/** + * 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) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ORGAN_SURGICALLY_INSERTED, user, new_owner, target_zone, tool) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index a8e0305d505..5dcf070ccd2 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -94,6 +94,9 @@ target.grab_ghost() target.adjustOxyLoss(-50, 0) target.updatehealth() + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + carbon_target.set_heartattack(FALSE) if(target.revive()) on_revived(user, target) return TRUE diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm index 922ef836dbb..ec33b47dca2 100644 --- a/code/modules/surgery/surgery_helpers.dm +++ b/code/modules/surgery/surgery_helpers.dm @@ -34,10 +34,10 @@ if(covered_locations & HEAD) return FALSE if(BODY_ZONE_PRECISE_EYES) - if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES) + if((face_covered & HIDEEYES) || (eyesmouth_covered & (MASKCOVERSEYES|HEADCOVERSEYES|GLASSESCOVERSEYES))) return FALSE if(BODY_ZONE_PRECISE_MOUTH) - if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH || eyesmouth_covered & HEADCOVERSMOUTH) + if((face_covered & HIDEFACE) || (eyesmouth_covered & (MASKCOVERSMOUTH|HEADCOVERSMOUTH))) return FALSE if(BODY_ZONE_CHEST) if(covered_locations & CHEST) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index fee7f389dca..85c1beab0a3 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -94,7 +94,8 @@ w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 light_system = OVERLAY_LIGHT - light_range = 1 + light_range = 1.5 + light_power = 0.4 light_color = COLOR_SOFT_RED /obj/item/cautery/advanced/get_all_tool_behaviours() @@ -120,7 +121,13 @@ /obj/item/cautery/advanced/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - tool_behaviour = (active ? TOOL_DRILL : TOOL_CAUTERY) + 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/weapons/tap.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE @@ -163,7 +170,7 @@ /obj/item/surgicaldrill/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] rams [src] into [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!")) - addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living/carbon, gib), null, null, TRUE, TRUE), 25) + 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 @@ -286,6 +293,7 @@ w_class = WEIGHT_CLASS_TINY attack_verb_continuous = list("slaps") attack_verb_simple = list("slap") + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY /obj/item/surgical_drapes/Initialize(mapload) . = ..() @@ -379,7 +387,8 @@ w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 light_system = OVERLAY_LIGHT - light_range = 1 + light_range = 1.5 + light_power = 0.4 light_color = LIGHT_COLOR_BLUE sharpness = SHARP_EDGED @@ -410,10 +419,10 @@ if(active) tool_behaviour = TOOL_SAW - set_light_range(2) + set_light_color(LIGHT_COLOR_ORANGE) else tool_behaviour = TOOL_SCALPEL - set_light_range(1) + 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) diff --git a/code/modules/tgs/LICENSE b/code/modules/tgs/LICENSE index 2bedf9a63aa..324c48e993e 100644 --- a/code/modules/tgs/LICENSE +++ b/code/modules/tgs/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2017-2023 Jordan Brown +Copyright (c) 2017-2024 Jordan Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 898516f1248..f734fd0527f 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -7,7 +7,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) var/list/warned_deprecated_command_runs /datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version) - . = ..() + ..() src.event_handler = event_handler src.version = version diff --git a/code/modules/tgs/core/tgs_version.dm b/code/modules/tgs/core/tgs_version.dm index a5dae1241a3..bc561e67487 100644 --- a/code/modules/tgs/core/tgs_version.dm +++ b/code/modules/tgs/core/tgs_version.dm @@ -1,4 +1,5 @@ /datum/tgs_version/New(raw_parameter) + ..() src.raw_parameter = raw_parameter deprefixed_parameter = replacetext(raw_parameter, "/tg/station 13 Server v", "") var/list/version_bits = splittext(deprefixed_parameter, ".") diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 92fa3b5b5c1..dc3d543f143 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -101,6 +101,11 @@ * return UI_state The state of the UI. */ /mob/living/proc/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE, allow_tk = TRUE) + var/obj/item/item_in_hand = get_active_held_item() + if(istype(item_in_hand, /obj/item/machine_remote)) //snowflake, this lets you interact with all. + var/obj/item/machine_remote/remote = item_in_hand + if(remote.controlling_machine_or_bot == src_object) + return UI_INTERACTIVE // If the object is obscured, close it. if(viewcheck && !(src_object in view(src))) return UI_CLOSE diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index f97e0326d58..4b3e59a6028 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -32,9 +32,9 @@ if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) if(encode) if(multiline) - return stripped_multiline_input(user, message, title, default, max_length) + return stripped_multiline_input(user, message, title, default, PREVENT_CHARACTER_TRIM_LOSS(max_length)) else - return stripped_input(user, message, title, default, max_length) + return stripped_input(user, message, title, default, PREVENT_CHARACTER_TRIM_LOSS(max_length)) else if(multiline) return input(user, message, title, default) as message|null @@ -162,4 +162,4 @@ /datum/tgui_input_text/proc/set_entry(entry) if(!isnull(entry)) var/converted_entry = encode ? html_encode(entry) : entry - src.entry = trim(converted_entry, max_length) + src.entry = trim(converted_entry, PREVENT_CHARACTER_TRIM_LOSS(max_length)) diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 22027a3cf8e..4b9514aa38c 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -85,7 +85,7 @@ Notes: queueHide = showing ? TRUE : FALSE if (queueHide) - addtimer(CALLBACK(src, PROC_REF(do_hide)), 1) + addtimer(CALLBACK(src, PROC_REF(do_hide)), 0.1 SECONDS) else do_hide() diff --git a/code/modules/transport/elevator/elev_indicator.dm b/code/modules/transport/elevator/elev_indicator.dm index 9751b44e0ff..7b34f2d6105 100644 --- a/code/modules/transport/elevator/elev_indicator.dm +++ b/code/modules/transport/elevator/elev_indicator.dm @@ -109,7 +109,7 @@ set_lift_state(0, 0, force = !is_operational) return PROCESS_KILL - use_power(active_power_usage) + use_energy(active_power_usage) var/obj/structure/transport/linear/lift_part = lift.transport_modules[1] diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index 3624eea877a..351ceab596e 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -955,7 +955,7 @@ * Since the machinery obj is a dumb terminal for the controller datum, sync the display with the status bitfield of the tram */ /obj/machinery/transport/tram_controller/proc/sync_controller(source, controller, controller_status, travel_direction, destination_platform) - use_power(active_power_usage) + use_energy(active_power_usage) if(controller != controller_datum) return update_appearance() @@ -992,7 +992,7 @@ /obj/machinery/transport/tram_controller/ui_interact(mob/user, datum/tgui/ui) . = ..() - if(!cover_open && !issiliconoradminghost(user) && !isobserver(user)) + if(!cover_open && !HAS_SILICON_ACCESS(user) && !isobserver(user)) return if(!is_operational) diff --git a/code/modules/transport/tram/tram_doors.dm b/code/modules/transport/tram/tram_doors.dm index d836685acf1..7e21b936791 100644 --- a/code/modules/transport/tram/tram_doors.dm +++ b/code/modules/transport/tram/tram_doors.dm @@ -90,7 +90,7 @@ if((obj_flags & EMAGGED) || !safe) do_sparks(3, TRUE, src) playsound(src, SFX_SPARKS, vol = 75, vary = FALSE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) - use_power(50) + use_energy(50 JOULES) playsound(src, doorClose, vol = 40, vary = FALSE) operating = TRUE layer = CLOSED_DOOR_LAYER diff --git a/code/modules/transport/tram/tram_floors.dm b/code/modules/transport/tram/tram_floors.dm index 1e1fad836c3..9f0b6907fe9 100644 --- a/code/modules/transport/tram/tram_floors.dm +++ b/code/modules/transport/tram/tram_floors.dm @@ -255,7 +255,7 @@ span_notice("You wedge \the [tool] into the tram panel's gap in the frame and start prying...")) if(tool.use_tool(src, user, 1 SECONDS, volume = 50)) to_chat(user, span_notice("The panel pops out of the frame.")) - var/obj/item/stack/thermoplastic/pulled_tile = new() + var/obj/item/stack/thermoplastic/pulled_tile = new floor_tile() pulled_tile.update_integrity(atom_integrity) user.put_in_hands(pulled_tile) qdel(src) @@ -283,8 +283,8 @@ icon = 'icons/obj/tiles.dmi' lefthand_file = 'icons/mob/inhands/items/tiles_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/tiles_righthand.dmi' - icon_state = "tile_textured_white_large" - inhand_icon_state = "tile-neon-glow" + icon_state = "tile_tram_dark" + inhand_icon_state = "tile-tram" color = COLOR_TRAM_BLUE w_class = WEIGHT_CLASS_NORMAL force = 1 @@ -297,7 +297,9 @@ var/tile_type = /obj/structure/thermoplastic /obj/item/stack/thermoplastic/light + icon_state = "tile_tram_light" color = COLOR_TRAM_LIGHT_BLUE + merge_type = /obj/item/stack/thermoplastic/light tile_type = /obj/structure/thermoplastic/light /obj/item/stack/thermoplastic/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index 74532d87be7..f868fe21c48 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -212,14 +212,12 @@ return ..() -/obj/structure/tram/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - new girder_type(loc) - if(mineral_amount) - for(var/i in 1 to mineral_amount) - new mineral(loc) - qdel(src) +/obj/structure/tram/atom_deconstruct(disassembled = TRUE) + if(disassembled) + new girder_type(loc) + if(mineral_amount) + for(var/i in 1 to mineral_amount) + new mineral(loc) /obj/structure/tram/attackby(obj/item/item, mob/user, params) . = ..() diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index 9fdfefc835c..d027cf7ba6d 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -138,7 +138,7 @@ /obj/structure/transport/linear/proc/add_item_on_transport(datum/source, atom/movable/new_transport_contents) SIGNAL_HANDLER var/static/list/blacklisted_types = typecacheof(list(/obj/structure/fluff/tram_rail, /obj/effect/decal/cleanable, /obj/structure/transport/linear, /mob/camera)) - if(is_type_in_typecache(new_transport_contents, blacklisted_types) || new_transport_contents.invisibility == INVISIBILITY_ABSTRACT) //prevents the tram from stealing things like landmarks + if(is_type_in_typecache(new_transport_contents, blacklisted_types) || new_transport_contents.invisibility == INVISIBILITY_ABSTRACT || HAS_TRAIT(new_transport_contents, TRAIT_UNDERFLOOR)) //prevents the tram from stealing things like landmarks return FALSE if(new_transport_contents in transport_contents) return FALSE @@ -844,7 +844,6 @@ transport_id = TRANSPORT_TYPE_TRAM transport_controller_type = /datum/transport_controller/linear/tram radial_travel = FALSE - obj_flags = NONE /// Set by the tram control console in late initialize var/travelling = FALSE @@ -909,7 +908,7 @@ new overlay(our_turf) turfs += our_turf - addtimer(CALLBACK(src, PROC_REF(clear_turfs), turfs, iterations), 1) + addtimer(CALLBACK(src, PROC_REF(clear_turfs), turfs, iterations), 0.1 SECONDS) /obj/structure/transport/linear/tram/proc/clear_turfs(list/turfs_to_clear, iterations) for(var/turf/our_old_turf as anything in turfs_to_clear) @@ -929,7 +928,7 @@ turfs += our_turf if(iterations) - addtimer(CALLBACK(src, PROC_REF(clear_turfs), turfs, iterations), 1) + addtimer(CALLBACK(src, PROC_REF(clear_turfs), turfs, iterations), 0.1 SECONDS) /obj/structure/transport/linear/tram/proc/estop_throw(throw_direction) for(var/mob/living/passenger in transport_contents) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 22f5ef72934..1b5c1f931bc 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -108,6 +108,7 @@ #include "cable_powernets.dm" #include "card_mismatch.dm" #include "cardboard_cutouts.dm" +#include "cargo_selling.dm" #include "chain_pull_through_space.dm" #include "changeling.dm" #include "chat_filter.dm" @@ -188,6 +189,7 @@ #include "modular_map_loader.dm" #include "monkey_business.dm" #include "mouse_bite_cable.dm" +#include "movement_order_sanity.dm" #include "mutant_hands_consistency.dm" #include "mutant_organs.dm" #include "novaflower_burn.dm" @@ -247,6 +249,7 @@ #include "spell_mindswap.dm" #include "spell_names.dm" #include "spell_shapeshift.dm" +#include "spies.dm" #include "spritesheets.dm" #include "stack_singular_name.dm" #include "station_trait_tests.dm" diff --git a/code/modules/unit_tests/antag_conversion.dm b/code/modules/unit_tests/antag_conversion.dm index 01c05671ef7..f499922bf8d 100644 --- a/code/modules/unit_tests/antag_conversion.dm +++ b/code/modules/unit_tests/antag_conversion.dm @@ -36,7 +36,7 @@ // Success state leader.ClickOn(peasant) - TEST_ASSERT(peasant.IsParalyzed(), "Peasant was not paralyzed after being flashed by the leader.") // Flash paralyze + TEST_ASSERT((peasant.get_timed_status_effect_duration(/datum/status_effect/confusion) > 0), "Peasant was not confused after being flashed by the leader.") // Flash confuse TEST_ASSERT(peasant.IsStun(), "Peasant was not stunned after being converted by the leader.") // Conversion stun TEST_ASSERT(IS_REVOLUTIONARY(peasant), "Peasant did not gain revolution antag datum on conversion.") TEST_ASSERT_EQUAL(length(revolution.members), 2, "Expected revolution to have 2 members after the leader flashes the peasant.") diff --git a/code/modules/unit_tests/bitrunning.dm b/code/modules/unit_tests/bitrunning.dm index 568eeeed8c1..44dd69390af 100644 --- a/code/modules/unit_tests/bitrunning.dm +++ b/code/modules/unit_tests/bitrunning.dm @@ -9,7 +9,7 @@ TEST_ASSERT_NOTNULL(vdom.key, "[path] should have a key") TEST_ASSERT_NOTNULL(vdom.map_name, "[path] should have a map name") - if(!length(vdom.extra_loot)) + if(!length(vdom.completion_loot)) continue - TEST_ASSERT_EQUAL(cache.spawn_loot(vdom.extra_loot), TRUE, "[path] didn't spawn loot. Extra loot should be an associative list") + TEST_ASSERT_EQUAL(cache.spawn_loot(vdom.completion_loot), TRUE, "[path] didn't spawn loot. Completion loot should be an associative list") diff --git a/code/modules/unit_tests/cargo_selling.dm b/code/modules/unit_tests/cargo_selling.dm new file mode 100644 index 00000000000..31d90505bdf --- /dev/null +++ b/code/modules/unit_tests/cargo_selling.dm @@ -0,0 +1,34 @@ +/// Makes sure exports work and things can be sold +/datum/unit_test/cargo_selling + +/obj/item/cargo_unit_test_container + +/obj/item/cargo_unit_test_container/Initialize(mapload) + . = ..() + new /obj/item/cargo_unit_test_content(src) + +/obj/item/cargo_unit_test_content + +/datum/export/cargo_unit_test_container + cost = PAYCHECK_LOWER + export_types = list(/obj/item/cargo_unit_test_container) + +/datum/export/cargo_unit_test_content + cost = PAYCHECK_COMMAND + export_types = list(/obj/item/cargo_unit_test_content) + +/datum/unit_test/cargo_selling/Run() + 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) + + var/datum/export_report/report_one = export_item_and_contents(box, apply_elastic = FALSE) + if(isnull(report_one)) + TEST_FAIL("called 'export_item_and_contents', but no export report was returned.") + var/value = counterlist_sum(report_one.total_value) + TEST_ASSERT_EQUAL(value, PAYCHECK_LOWER + PAYCHECK_COMMAND, "'export_item_and_contents' value didn't match expected value") + + var/datum/export_report/report_two = export_single_item(box_skip_content, apply_elastic = FALSE) + if(isnull(report_two)) + TEST_FAIL("called 'export_single_item', but no export report was returned.") + value = counterlist_sum(report_two.total_value) + TEST_ASSERT_EQUAL(value, PAYCHECK_LOWER, "'export_single_item' value didn't match expected value") diff --git a/code/modules/unit_tests/changeling.dm b/code/modules/unit_tests/changeling.dm index 4ce90eae8ce..360cd34dd17 100644 --- a/code/modules/unit_tests/changeling.dm +++ b/code/modules/unit_tests/changeling.dm @@ -82,8 +82,8 @@ ling.dna.mutant_bodyparts["spines"] = list(MUTANT_INDEX_NAME = "Long + Membrane", MUTANT_INDEX_COLOR_LIST = list("#886600", "#886600", "#886600")) // SKYRAT EDIT CHANGE - ORIGINAL: ling.dna.features["spines"] = "Long + Membrane" ling.dna.body_markings["chest"] = list("Light Belly" = list("#886600", 0)) // SKYRAT EDIT CHANGE - ORIGINAL : ling.dna.features[body_markings] = list("Light Belly") ling.dna.features["legs"] = DIGITIGRADE_LEGS - ling.eye_color_left = "#FFFFFF" - ling.eye_color_right = "#FFFFFF" + ling.eye_color_left = COLOR_WHITE + ling.eye_color_right = COLOR_WHITE ling.dna.update_ui_block(DNA_EYE_COLOR_LEFT_BLOCK) ling.dna.update_ui_block(DNA_EYE_COLOR_RIGHT_BLOCK) ling.set_species(/datum/species/lizard) diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 927be7d8bc0..15d04ee8852 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -44,3 +44,6 @@ /// Checks that the contents of the fish_counts list are also present in fish_table /datum/unit_test/focus_only/fish_sources_tables + +/// Checks that maploaded mobs with either the `atmos_requirements` or `body_temp_sensitive` +/datum/unit_test/focus_only/atmos_and_temp_requirements diff --git a/code/modules/unit_tests/limbsanity.dm b/code/modules/unit_tests/limbsanity.dm index 9988c7471e2..a92d481f556 100644 --- a/code/modules/unit_tests/limbsanity.dm +++ b/code/modules/unit_tests/limbsanity.dm @@ -2,13 +2,13 @@ /datum/unit_test/limbsanity/Run() for(var/path in subtypesof(/obj/item/bodypart) - list(/obj/item/bodypart/arm, /obj/item/bodypart/leg)) /// removes the abstract items. - var/obj/item/bodypart/part = new path(null) - if(part.is_dimorphic) - if(!icon_exists(UNLINT(part.should_draw_greyscale ? part.icon_greyscale : part.icon_static), "[part.limb_id]_[part.body_zone]_m")) + var/obj/item/bodypart/part = path + if(part::is_dimorphic) + if(!icon_exists(UNLINT(part::should_draw_greyscale ? part::icon_greyscale : part::icon_static), "[part::limb_id]_[part::body_zone]_m")) TEST_FAIL("[path] does not have a valid icon for male variants") - if(!icon_exists(UNLINT(part.should_draw_greyscale ? part.icon_greyscale : part.icon_static), "[part.limb_id]_[part.body_zone]_f")) + if(!icon_exists(UNLINT(part::should_draw_greyscale ? part::icon_greyscale : part::icon_static), "[part::limb_id]_[part::body_zone]_f")) TEST_FAIL("[path] does not have a valid icon for female variants") - else if(!icon_exists(UNLINT(part.should_draw_greyscale ? part.icon_greyscale : part.icon_static), "[part.limb_id]_[part.body_zone]")) + else if(!icon_exists(UNLINT(part::should_draw_greyscale ? part::icon_greyscale : part::icon_static), "[part::limb_id]_[part::body_zone]")) TEST_FAIL("[path] does not have a valid icon") /// Tests the height adjustment system which dynamically changes how much the chest, head, and arms of a carbon are adjusted upwards or downwards based on the length of their legs and chest. diff --git a/code/modules/unit_tests/mapload_space_verification.dm b/code/modules/unit_tests/mapload_space_verification.dm index da35af1d176..35556c85fb4 100644 --- a/code/modules/unit_tests/mapload_space_verification.dm +++ b/code/modules/unit_tests/mapload_space_verification.dm @@ -23,6 +23,8 @@ /area/shuttle/abandoned, // Solars have lattices over space turfs, and are a valid placement for space turfs in a station area. /area/station/solars, + //Birdshot Atmos has a special area, so we'll exclude that from lints here. + /area/station/engineering/atmos/space_catwalk, )) // We aren't planetary, so let's check area placements and ensure stuff lines up. diff --git a/code/modules/unit_tests/mouse_bite_cable.dm b/code/modules/unit_tests/mouse_bite_cable.dm index 6d3150d279d..c2277fe4fd7 100644 --- a/code/modules/unit_tests/mouse_bite_cable.dm +++ b/code/modules/unit_tests/mouse_bite_cable.dm @@ -19,6 +19,8 @@ // Ai controlling processes expect a seconds_per_tick, supply a real-fake dt var/fake_dt = SSai_controllers.wait * 0.1 + // Set AI - AIs by default are off in z-levels with no client, we have to force it on. + biter.ai_controller.set_ai_status(AI_STATUS_ON) // Select behavior - this will queue finding the cable biter.ai_controller.SelectBehaviors(fake_dt) // Process behavior - this will execute the "locate the cable" behavior diff --git a/code/modules/unit_tests/movement_order_sanity.dm b/code/modules/unit_tests/movement_order_sanity.dm new file mode 100644 index 00000000000..a9f677b2498 --- /dev/null +++ b/code/modules/unit_tests/movement_order_sanity.dm @@ -0,0 +1,49 @@ +/datum/unit_test/movement_order_sanity/Run() + var/obj/movement_tester/test_obj = allocate(__IMPLIED_TYPE__, run_loc_floor_bottom_left) + var/list/movement_cache = test_obj.movement_order + + var/obj/movement_interceptor/interceptor = allocate(__IMPLIED_TYPE__) + interceptor.forceMove(locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + + var/did_move = step(test_obj, EAST) + + TEST_ASSERT(did_move, "Object did not move at all.") + TEST_ASSERT(QDELETED(test_obj), "Object was not qdeleted.") + TEST_ASSERT(length(movement_cache) == 4, "Movement order length was not the expected value of 4, got: [length(movement_cache)].\nMovement Log\n[jointext(movement_cache, "\n")]") + + // Due to when the logging takes place, it will always be Move Move > Moved Moved instead of the reality of + // Move > Moved > Move > Moved + TEST_ASSERT(findtext(movement_cache[1], "Moving from"),"Movement step 1 was not a Move attempt.\nMovement Log\n[jointext(movement_cache, "\n")]") + TEST_ASSERT(findtext(movement_cache[2], "Moving from"),"Movement step 2 was not a Move attempt.\nMovement Log\n[jointext(movement_cache, "\n")]") + TEST_ASSERT(findtext(movement_cache[3], "Moved from"),"Movement step 3 was not a Moved() call.\nMovement Log\n[jointext(movement_cache, "\n")]") + TEST_ASSERT(findtext(movement_cache[4], "Moved from"),"Movement step 4 was not a Moved() call.\nMovement Log\n[jointext(movement_cache, "\n")]") + +/obj/movement_tester + name = "movement debugger" + var/list/movement_order = list() + +/obj/movement_tester/Move(atom/newloc, direct, glide_size_override, z_movement_flags) + movement_order += "Moving from ([loc.x], [loc.y]) to [newloc ? "([newloc.x], [newloc.y])" : "NULL"]" + return ..() + +/obj/movement_tester/doMove(atom/destination) + movement_order += "Abstractly Moving from ([loc.x], [loc.y]) to [destination ? "([destination.x], [destination.y])" : "NULL"]" + return ..() + +/obj/movement_tester/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + movement_order += "Moved from ([old_loc.x], [old_loc.y]) to [loc ? "([loc.x], [loc.y])" : "NULL"]" + return ..() + +/obj/movement_interceptor + name = "movement interceptor" + +/obj/movement_interceptor/Initialize(mapload) + . = ..() + AddElement(/datum/element/connect_loc, list(COMSIG_ATOM_ENTERED = PROC_REF(on_crossed))) + +/obj/movement_interceptor/proc/on_crossed(datum/source, atom/movable/arrived) + SIGNAL_HANDLER + if(src == arrived) + return + + qdel(arrived) diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index 842f5f1f7eb..18f5e9b8e61 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -39,14 +39,15 @@ back = /obj/item/storage/backpack backpack_contents = list(/obj/item/clothing/mask/cigarette/cigar/havana) - - /datum/unit_test/outfit_sanity/Run() var/datum/outfit/prototype_outfit = /datum/outfit var/prototype_name = initial(prototype_outfit.name) var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human/consistent) - for (var/outfit_type in subtypesof(/datum/outfit)) + var/list/outfits_to_check = subtypesof(/datum/outfit) + outfits_to_check -= typesof(/datum/outfit/deathmatch_loadout) + + 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 = TRUE)) qdel(I) diff --git a/code/modules/unit_tests/quirks.dm b/code/modules/unit_tests/quirks.dm index 37765ce8ca0..cca2c312cfe 100644 --- a/code/modules/unit_tests/quirks.dm +++ b/code/modules/unit_tests/quirks.dm @@ -41,3 +41,37 @@ TEST_ASSERT_NOTNULL(quirk.medical_record_text,"[quirk_type] has no medical record description!") patient.remove_quirk(quirk_type) + +/// Ensures the blood deficiency quirk updates its mail goodies correctly +/datum/unit_test/blood_deficiency_mail + var/list/species_to_test = list( + /datum/species/lizard = /obj/item/reagent_containers/blood/lizard, + /datum/species/ethereal = /obj/item/reagent_containers/blood/ethereal, + /datum/species/skeleton = null, // Anyone with noblood should not get a blood bag + /datum/species/jelly = /obj/item/reagent_containers/blood/toxin, + /datum/species/human = /obj/item/reagent_containers/blood/o_minus, + ) + +/datum/unit_test/blood_deficiency_mail/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.add_quirk(/datum/quirk/blooddeficiency) + var/datum/quirk/blooddeficiency/quirk = dummy.get_quirk(/datum/quirk/blooddeficiency) + + TEST_ASSERT((species_to_test[dummy.dna.species.type] in quirk.mail_goodies), "Blood deficiency quirk spawned with no mail goodies!") + + for(var/species_type in species_to_test) + var/last_species = dummy.dna.species.type + dummy.set_species(species_type) + // Test that the new species has the correct blood bag + if(!isnull(species_to_test[species_type])) + TEST_ASSERT((species_to_test[species_type] in quirk.mail_goodies), \ + "Blood deficiency quirk did not update correctly! ([species_type] did not get its blood bag added)") + TEST_ASSERT_EQUAL(length(quirk.mail_goodies), 1, \ + "Blood deficiency quirk got multiple blood bags for [species_type]!") + else + TEST_ASSERT_EQUAL(length(quirk.mail_goodies), 0, \ + "Blood deficiency quirk did not have an empty mail goody list for a noblood species!") + // Test that we don't have the old species' blood bag + if(!isnull(species_to_test[last_species])) + TEST_ASSERT(!(species_to_test[last_species] in quirk.mail_goodies), \ + "Blood deficiency quirk did not update correctly for [species_type]! ([last_species] did not get its blood bag removed)") diff --git a/code/modules/unit_tests/required_map_items.dm b/code/modules/unit_tests/required_map_items.dm index 5cbef645391..145f5fd34ce 100644 --- a/code/modules/unit_tests/required_map_items.dm +++ b/code/modules/unit_tests/required_map_items.dm @@ -14,13 +14,14 @@ /// 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() expected_types += subtypesof(/obj/item/stamp/head) - expected_types += subtypesof(/obj/machinery/computer/department_orders) + expected_types += subtypesof(/obj/machinery/modular_computer/preset/cargochat) expected_types += /mob/living/basic/parrot/poly expected_types += /mob/living/basic/pet/dog/corgi/ian expected_types += /mob/living/carbon/human/species/monkey/punpun expected_types += /obj/machinery/computer/communications expected_types += /obj/machinery/drone_dispenser + expected_types += /obj/item/piggy_bank/vault /datum/unit_test/required_map_items/Run() setup_expected_types() diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png new file mode 100644 index 00000000000..180be6064f8 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_spy.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spy.png new file mode 100644 index 00000000000..e32b0fc41e9 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spy.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_on.png b/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_on.png index 76c997c3318..eabee8b0aff 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_on.png and b/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_on.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly.png index b9ef0c30658..f2e4780e34b 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_luminescent.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_luminescent.png index d46cbea8cd8..10306f0a123 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_luminescent.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_luminescent.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_roundstartslime.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_roundstartslime.png index e046e4ee7a7..0be9ecb865f 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_roundstartslime.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_roundstartslime.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_slime.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_slime.png index 56205255d87..af27be67277 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_slime.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_slime.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_stargazer.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_stargazer.png index b9ef0c30658..f2e4780e34b 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_stargazer.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_stargazer.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_mammal_shadekin.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_mammal_shadekin.png new file mode 100644 index 00000000000..ae88c88db74 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_mammal_shadekin.png differ diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index f47fc72fbf3..1061f6dc585 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -24,13 +24,6 @@ /mob/living/simple_animal/bot/secbot/pingsky, /mob/living/simple_animal/bot/vibebot, /mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/alien, - /mob/living/simple_animal/hostile/alien/drone, - /mob/living/simple_animal/hostile/alien/maid, - /mob/living/simple_animal/hostile/alien/maid/barmaid, - /mob/living/simple_animal/hostile/alien/queen, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/alien/sentinel, /mob/living/simple_animal/hostile/asteroid, /mob/living/simple_animal/hostile/asteroid/curseblob, /mob/living/simple_animal/hostile/asteroid/elite, @@ -43,7 +36,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/asteroid/wolf, /mob/living/simple_animal/hostile/dark_wizard, /mob/living/simple_animal/hostile/illusion, /mob/living/simple_animal/hostile/illusion/escape, @@ -86,10 +78,6 @@ /mob/living/simple_animal/pet/gondola, /mob/living/simple_animal/pet/gondola/gondolapod, /mob/living/simple_animal/pet/gondola/virtual_domain, - /mob/living/simple_animal/slime, - /mob/living/simple_animal/slime/pet, - /mob/living/simple_animal/slime/random, - /mob/living/simple_animal/slime/transformed_slime, /mob/living/simple_animal/soulscythe, //MODULAR SKYRAT ENTRIES diff --git a/code/modules/unit_tests/siunit.dm b/code/modules/unit_tests/siunit.dm index 3a7a25a98d3..7b98db497c8 100644 --- a/code/modules/unit_tests/siunit.dm +++ b/code/modules/unit_tests/siunit.dm @@ -12,4 +12,4 @@ TEST_ASSERT_EQUAL(siunit_pressure(999.9e3), "999.9 MPa" , "") TEST_ASSERT_EQUAL(siunit_pressure(999.9e3, 0), "1 GPa", "") TEST_ASSERT_EQUAL(siunit_pressure(1e6), "1 GPa", "") - TEST_ASSERT_EQUAL(siunit_pressure(3e17), "300000 PPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(3e32), "300000 QPa", "") diff --git a/code/modules/unit_tests/slime_mood.dm b/code/modules/unit_tests/slime_mood.dm index a0d3edb95c1..f3c02b612c9 100644 --- a/code/modules/unit_tests/slime_mood.dm +++ b/code/modules/unit_tests/slime_mood.dm @@ -2,7 +2,7 @@ /datum/unit_test/slime_mood /datum/unit_test/slime_mood/Run() - var/mob/living/simple_animal/slime/emoting_slime = allocate(/mob/living/simple_animal/slime) + var/mob/living/basic/slime/emoting_slime = allocate(/mob/living/basic/slime) for(var/key in GLOB.emote_list) for(var/datum/emote/slime/mood/slime_mood in GLOB.emote_list[key]) diff --git a/code/modules/unit_tests/spies.dm b/code/modules/unit_tests/spies.dm new file mode 100644 index 00000000000..b4b1add333c --- /dev/null +++ b/code/modules/unit_tests/spies.dm @@ -0,0 +1,41 @@ +/// Tests spy bounty setup +/datum/unit_test/spy_bounty + +/datum/unit_test/spy_bounty/Run() + var/mob/living/carbon/human/james_bond = allocate(/mob/living/carbon/human/consistent) + james_bond.mind_initialize() + james_bond.equipOutfit(/datum/outfit/job/assistant/consistent) + var/datum/antagonist/spy/spy = james_bond.mind.add_antag_datum(/datum/antagonist/spy) + + var/datum/component/spy_uplink/uplink = spy.uplink_weakref?.resolve() + TEST_ASSERT_NOTNULL(uplink, "Spy failed to be given an uplink!") + + var/datum/spy_bounty_handler/handler = uplink.handler + handler.num_attempts_override = 100 + + for(var/difficulty in handler.possible_uplink_items) + var/list/loot_pool = handler.possible_uplink_items[difficulty] + if(!length(loot_pool)) + TEST_FAIL("No rewards generated for spy bounty difficulty [difficulty]") + + for(var/difficulty in UNLINT(handler.bounty_types)) + var/list/bounty_type_pool = UNLINT(handler.bounty_types[difficulty]) + if(!length(bounty_type_pool)) + TEST_FAIL("No bounty types for spy bounty difficulty [difficulty] found") + + for(var/difficulty in UNLINT(handler.bounties)) + var/list/generated_bounties = UNLINT(handler.bounties[difficulty]) + if(difficulty == SPY_DIFFICULTY_HARD) + if(length(generated_bounties)) + TEST_FAIL("No [difficulty] bounties should not be generated on initial refresh!") + + else + if(!length(generated_bounties)) + TEST_FAIL("No bounties were generated on initial refresh for difficulty [difficulty]") + + handler.force_refresh() + + for(var/difficulty in UNLINT(handler.bounties)) + var/list/generated_bounties = UNLINT(handler.bounties[difficulty]) + if(!length(generated_bounties)) + TEST_FAIL("No bounties were generated on first refresh for difficulty [difficulty]") diff --git a/code/modules/unit_tests/strange_reagent.dm b/code/modules/unit_tests/strange_reagent.dm index 6c3add3092d..ac8ad5cb6df 100644 --- a/code/modules/unit_tests/strange_reagent.dm +++ b/code/modules/unit_tests/strange_reagent.dm @@ -18,7 +18,7 @@ types_to_check -= /mob/living/simple_animal/pet/gondola/gondolapod // need a pod, which we don't have types_to_check -= typesof(/mob/living/simple_animal/hostile/megafauna) // no types_to_check -= typesof(/mob/living/basic/mouse) // qdel themselves on death; why dont they use DEL_ON_DEATH you might ask. I-unno - types_to_check -= typesof(/mob/living/simple_animal/slime) // if they roll the 50% chance to spawn as an adult, they can just at random split and qdel themselves + types_to_check -= typesof(/mob/living/basic/slime) // if they roll the 50% chance to spawn as an adult, they can just at random split and qdel themselves for(var/mob/living/type as anything in types_to_check) var/mob/living/target = allocate_new_target(type) @@ -153,7 +153,7 @@ return if(QDELETED(target)) return - + update_amounts(target) strange_reagent.expose_mob(target, INGEST, amount_needed_to_revive) TEST_ASSERT_EQUAL(target.stat, DEAD, "Strange Reagent revived a target type [target.type] with more than double their max health in damage.") diff --git a/code/modules/unit_tests/subsystem_init.dm b/code/modules/unit_tests/subsystem_init.dm index 15ba71b6a76..82c9fc956fb 100644 --- a/code/modules/unit_tests/subsystem_init.dm +++ b/code/modules/unit_tests/subsystem_init.dm @@ -5,10 +5,19 @@ for(var/datum/controller/subsystem/subsystem as anything in Master.subsystems) if(subsystem.flags & SS_NO_INIT) continue - if(!subsystem.initialized) - var/message = "[subsystem] ([subsystem.type]) is a subsystem meant to initialize but doesn't get set as initialized." + if(subsystem.initialized) + continue + + var/should_fail = !(subsystem.flags & SS_OK_TO_FAIL_INIT) + var/list/message_strings = list("[subsystem] ([subsystem.type]) is a subsystem meant to initialize but could not get initialized.") + + if(!isnull(subsystem.initialization_failure_message)) + message_strings += "The subsystem reported the following: [subsystem.initialization_failure_message]" + + if(should_fail) + TEST_FAIL(jointext(message_strings, "\n")) + continue + + message_strings += "This subsystem is marked as SS_OK_TO_FAIL_INIT. This is still a bug, but it is non-blocking." + TEST_NOTICE(src, jointext(message_strings, "\n")) - if (subsystem.flags & SS_OK_TO_FAIL_INIT) - TEST_NOTICE(src, "[message]\nThis subsystem is marked as SS_OK_TO_FAIL_INIT. This is still a bug, but it is non-blocking.") - else - TEST_FAIL(message) diff --git a/code/modules/unit_tests/suit_storage_icons.dm b/code/modules/unit_tests/suit_storage_icons.dm index 8c77b052411..12305e7abfc 100644 --- a/code/modules/unit_tests/suit_storage_icons.dm +++ b/code/modules/unit_tests/suit_storage_icons.dm @@ -10,18 +10,13 @@ continue wearable_item_paths |= item_path - for(var/clothing_path in (subtypesof(/obj/item/clothing) - typesof(/obj/item/clothing/head/mob_holder) - typesof(/obj/item/clothing/suit/space/santa))) //mob_holder is a psuedo abstract item. santa suit is a VERY SNOWFLAKE admin spawn suit that can hold /every/ possible item. - var/obj/item/clothing/spawned_item = new clothing_path - for(var/path in spawned_item.allowed) //find all usable suit storage stuff. + for(var/obj/item/clothing/clothing_path in (subtypesof(/obj/item/clothing) - typesof(/obj/item/clothing/head/mob_holder) - typesof(/obj/item/clothing/suit/space/santa))) //mob_holder is a psuedo abstract item. santa suit is a VERY SNOWFLAKE admin spawn suit that can hold /every/ possible item. + for(var/path in clothing_path::allowed) //find all usable suit storage stuff. wearable_item_paths |= path - qdel(spawned_item) - for(var/mod_path in subtypesof(/obj/item/mod/control)) - var/obj/item/mod/control/control_mod = new - for(var/path in control_mod.chestplate.allowed) + for(var/obj/item/mod/control/mod_path in subtypesof(/obj/item/mod/control)) + for(var/path in mod_path::chestplate::allowed) wearable_item_paths |= path - qdel(control_mod) - var/list/already_warned_icons = list() var/count = 1 //to be removed once the test goes live / into CI failure mode. diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 2ad1f182215..4dc1e7f85c9 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -245,6 +245,8 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) //Both are abstract types meant to scream bloody murder if spawned in raw /obj/item/organ/external, /obj/item/organ/external/wings, + //Not meant to spawn without the machine wand + /obj/effect/bug_moving, ) // Everything that follows is a typesof() check. @@ -292,6 +294,10 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) returnable_list += typesof(/obj/item/hilbertshotel) //this boi spawns turf changing stuff, and it stacks and causes pain. Let's just not returnable_list += typesof(/obj/effect/sliding_puzzle) + //these can explode and cause the turf to be destroyed at unexpected moments + returnable_list += typesof(/obj/effect/mine) + returnable_list += typesof(/obj/effect/spawner/random/contraband/landmine) + returnable_list += typesof(/obj/item/minespawner) //Stacks baseturfs, can't be tested here returnable_list += typesof(/obj/effect/temp_visual/lava_warning) //Stacks baseturfs, can't be tested here diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 65935f077e3..f0f7b0accaf 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -125,6 +125,7 @@ /datum/uplink_item/proc/purchase(mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) var/atom/spawned_item = spawn_item(item, user, uplink_handler, source) log_uplink("[key_name(user)] purchased [src] for [cost] telecrystals from [source]'s uplink") + user.playsound_local(get_turf(user), 'sound/effects/kaching.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) if(purchase_log_vis && uplink_handler.purchase_log) uplink_handler.purchase_log.LogPurchase(spawned_item, src, cost) if(lock_other_purchases) @@ -149,6 +150,34 @@ SEND_SIGNAL(uplink_handler, COMSIG_ON_UPLINK_PURCHASE, spawned_item, user) return spawned_item +/// Used to create the uplink's item for generic use, rather than use by a Syndie specifically +/// Can be used to "de-restrict" some items, such as Nukie guns spawning with Syndicate pins +/datum/uplink_item/proc/spawn_item_for_generic_use(mob/user) + var/atom/movable/created = new item(user.loc) + + if(isgun(created)) + replace_pin(created) + else if(istype(created, /obj/item/storage/toolbox/guncase)) + for(var/obj/item/gun/gun in created) + replace_pin(gun) + + if(isobj(created)) + var/obj/created_obj = created + LAZYREMOVE(created_obj.req_access, ACCESS_SYNDICATE) + LAZYREMOVE(created_obj.req_one_access, ACCESS_SYNDICATE) + + return created + +/// Used by spawn_item_for_generic_use to replace the pin of a gun with a normal one +/datum/uplink_item/proc/replace_pin(obj/item/gun/gun_reward) + PRIVATE_PROC(TRUE) + + if(!istype(gun_reward.pin, /obj/item/firing_pin/implant/pindicate)) + return + + QDEL_NULL(gun_reward.pin) + gun_reward.pin = new /obj/item/firing_pin(gun_reward) + ///For special overrides if an item can be bought or not. /datum/uplink_item/proc/can_be_bought(datum/uplink_handler/source) return TRUE @@ -168,6 +197,7 @@ //Discounts (dynamically filled above) /datum/uplink_item/discounts category = /datum/uplink_category/discounts + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY // Probably not necessary but just in case // Special equipment (Dynamically fills in uplink component) /datum/uplink_item/special_equipment @@ -176,6 +206,7 @@ desc = "Equipment necessary for accomplishing specific objectives. If you are seeing this, something has gone wrong." limited_stock = 1 illegal_tech = FALSE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY // Ditto /datum/uplink_item/special_equipment/purchase(mob/user, datum/component/uplink/U) ..() diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm index e8872781252..5326880d31b 100644 --- a/code/modules/uplink/uplink_items/ammunition.dm +++ b/code/modules/uplink/uplink_items/ammunition.dm @@ -53,5 +53,5 @@ For when you really need a lot of things dead." item = /obj/item/ammo_box/a357 cost = 4 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //nukies get their own version + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) //nukies get their own version illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index f236aa4da25..b708af62b69 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -7,11 +7,12 @@ category = /datum/uplink_category/bundle surplus = 0 cant_discount = TRUE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY /datum/uplink_item/bundles_tc/random name = "Random Item" desc = "Picking this will purchase a random item. Useful if you have some TC to spare or if you haven't decided on a strategy yet." - item = /obj/effect/gibspawner/generic // non-tangible item because techwebs use this path to determine illegal tech + item = ABSTRACT_UPLINK_ITEM cost = 0 cost_override_string = "Varies" @@ -61,7 +62,7 @@ item = /obj/item/storage/box/syndicate/bundle_a cost = 20 stock_key = UPLINK_SHARED_STOCK_KITS - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) /datum/uplink_item/bundles_tc/bundle_b name = "Syndi-kit Special" @@ -72,7 +73,7 @@ item = /obj/item/storage/box/syndicate/bundle_b cost = 20 stock_key = UPLINK_SHARED_STOCK_KITS - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) /datum/uplink_item/bundles_tc/surplus name = "Syndicate Surplus Crate" @@ -81,7 +82,7 @@ Contents are sorted to always be worth 30 TC. The Syndicate will only provide one surplus item per agent." item = /obj/structure/closet/crate // will be replaced in purchase() cost = 20 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) stock_key = UPLINK_SHARED_STOCK_SURPLUS /// Value of items inside the crate in TC var/crate_tc_value = 30 @@ -170,5 +171,5 @@ The Syndicate will only provide one surplus item per agent." cost = 20 item = /obj/item/syndicrate_key - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) stock_key = UPLINK_SHARED_STOCK_SURPLUS diff --git a/code/modules/uplink/uplink_items/clownops.dm b/code/modules/uplink/uplink_items/clownops.dm index bbb597d2fa8..73dd3d4c876 100644 --- a/code/modules/uplink/uplink_items/clownops.dm +++ b/code/modules/uplink/uplink_items/clownops.dm @@ -8,7 +8,7 @@ cost = 10 item = /obj/item/pneumatic_cannon/pie/selfcharge surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/bananashield name = "Bananium Energy Shield" @@ -18,7 +18,7 @@ item = /obj/item/shield/energy/bananium cost = 16 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/clownsword name = "Bananium Energy Sword" @@ -27,7 +27,7 @@ item = /obj/item/melee/energy/sword/bananium cost = 3 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/clownoppin name = "Ultra Hilarious Firing Pin" @@ -51,7 +51,7 @@ item = /obj/item/gun/ballistic/automatic/c20r/toy cost = 5 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/foammachinegun name = "Toy Machine Gun" @@ -60,7 +60,7 @@ item = /obj/item/gun/ballistic/automatic/l6_saw/toy cost = 10 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/bombanana name = "Bombanana" @@ -69,7 +69,7 @@ item = /obj/item/food/grown/banana/bombanana cost = 4 //it is a bit cheaper than a minibomb because you have to take off your helmet to eat it, which is how you arm it surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/clown_bomb_clownops name = "Clown Bomb" @@ -81,7 +81,7 @@ item = /obj/item/sbeacondrop/clownbomb cost = 15 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/clown_bomb_clownops/New() . = ..() @@ -94,7 +94,7 @@ item = /obj/item/grenade/chem_grenade/teargas/moustache cost = 3 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/pinata name = "Weapons Grade Pinata Kit" @@ -160,4 +160,3 @@ cost = 1 purchasable_from = UPLINK_CLOWN_OPS illegal_tech = FALSE - diff --git a/code/modules/uplink/uplink_items/contractor.dm b/code/modules/uplink/uplink_items/contractor.dm index 6004caf9745..7d261410e31 100644 --- a/code/modules/uplink/uplink_items/contractor.dm +++ b/code/modules/uplink/uplink_items/contractor.dm @@ -13,7 +13,7 @@ item = /obj/item/storage/box/syndicate/contract_kit category = /datum/uplink_category/contractor cost = 20 - purchasable_from = ~(UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS | UPLINK_TRAITORS) + purchasable_from = UPLINK_INFILTRATORS /datum/uplink_item/bundles_tc/contract_kit/purchase(mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) . = ..() @@ -36,7 +36,7 @@ name = "Contract Reroll" desc = "Request a reroll of your current contract list. Will generate a new target, \ payment, and dropoff for the contracts you currently have available." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM limited_stock = 2 cost = 0 diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index ab69810f32c..c1e1b3ae5f5 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -137,7 +137,7 @@ /datum/uplink_item/device_tools/failsafe name = "Failsafe Uplink Code" desc = "When entered the uplink will self-destruct immediately." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM cost = 1 surplus = 0 restricted = TRUE diff --git a/code/modules/uplink/uplink_items/implant.dm b/code/modules/uplink/uplink_items/implant.dm index 87c9fd6c96c..a2b21574f6f 100644 --- a/code/modules/uplink/uplink_items/implant.dm +++ b/code/modules/uplink/uplink_items/implant.dm @@ -49,6 +49,7 @@ // An empty uplink is kinda useless. surplus = 0 restricted = TRUE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY /datum/uplink_item/implants/uplink/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) var/obj/item/storage/box/syndie_kit/uplink_box = ..() diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index cfda17a46df..0b754875282 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -28,7 +28,7 @@ /datum/uplink_item/role_restricted/bureaucratic_error name = "Organic Capital Disturbance Virus" desc = "Randomizes job positions presented to new hires. May lead to too many/too few security officers and/or clowns. Single use." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM surplus = 0 limited_stock = 1 cost = 2 @@ -286,7 +286,14 @@ restricted_roles = list(JOB_CLOWN) surplus = 10 -/* Bubber Edit Removal, This break vore preferences /datum/uplink_item/role_restricted/his_grace +/datum/uplink_item/role_restricted/clowncar/spawn_item_for_generic_use(mob/user) + var/obj/vehicle/sealed/car/clowncar/car = ..() + car.enforce_clown_role = FALSE + var/obj/item/key = new car.key_type(user.loc) + car.visible_message(span_notice("[key] drops out of [car] onto the floor.")) + return car + +/datum/uplink_item/role_restricted/his_grace name = "His Grace" desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, He will thirst for blood and must be used to kill to sate that thirst. \ His Grace grants gradual regeneration and complete stun immunity to His wielder, but be wary: if He gets too hungry, He will become impossible to drop and eventually kill you if not fed. \ @@ -295,9 +302,10 @@ lock_other_purchases = TRUE cant_discount = TRUE item = /obj/item/his_grace - cost = 20 + cost = 500 // BUBBER EDIT surplus = 0 - restricted_roles = list(JOB_CHAPLAIN) */ + restricted_roles = list(JOB_CHAPLAIN) + purchasable_from = ~UPLINK_SPY /datum/uplink_item/role_restricted/concealed_weapon_bay name = "Concealed Weapon Bay" @@ -384,3 +392,4 @@ BUBBER REMOVE END*/ restricted_roles = list(JOB_MIME) restricted = TRUE refundable = FALSE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 341a33baa6a..185c3f44681 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -68,7 +68,7 @@ /datum/uplink_item/weapon_kits/low_cost/shotgun name = "Bulldog Shotgun Case (Moderate)" - desc = "A fully-loaded semi-automatic drum-fed shotgun, complete with a secondary magazine you can hotswap. The gun has a handy label to explain how. \ + 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 @@ -76,26 +76,28 @@ name = "12g Buckshot Drum (Bulldog)" desc = "An additional 8-round buckshot magazine for use with the Bulldog shotgun. Front towards enemy." item = /obj/item/ammo_box/magazine/m12g + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/basic/slug name = "12g Slug Drum (Bulldog)" desc = "An additional 8-round slug magazine for use with the Bulldog shotgun. \ Now 8 times less likely to shoot your pals." item = /obj/item/ammo_box/magazine/m12g/slug + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/incendiary/dragon name = "12g Dragon's Breath Drum (Bulldog)" desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. \ 'I'm a fire starter, twisted fire starter!'" item = /obj/item/ammo_box/magazine/m12g/dragon - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/meteor name = "12g Meteorslug Shells (Bulldog)" desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \ Great for blasting holes into the hull and knocking down enemies." item = /obj/item/ammo_box/magazine/m12g/meteor - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = parent_type::purchasable_from | UPLINK_SPY // ~~ Ansem Pistol ~~ @@ -109,24 +111,28 @@ name = "10mm Handgun Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol." item = /obj/item/ammo_box/magazine/m10mm + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/ap/m10mm name = "10mm Armour Piercing Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ These rounds are less effective at injuring the target but penetrate protective gear." item = /obj/item/ammo_box/magazine/m10mm/ap + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/hp/m10mm name = "10mm Hollow Point Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ These rounds are more damaging but ineffective against armour." item = /obj/item/ammo_box/magazine/m10mm/hp + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/incendiary/m10mm name = "10mm Incendiary Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ Loaded with incendiary rounds which inflict less damage, but ignite the target." item = /obj/item/ammo_box/magazine/m10mm/fire + purchasable_from = parent_type::purchasable_from | UPLINK_SPY //Medium-cost: 14 TC each. Meant for more expensive purchases with a goal in mind. @@ -197,6 +203,7 @@ desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \ For when you really need a lot of things dead. Operatives get a discount from most of our agents!" item = /obj/item/ammo_box/a357 + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/revolver/phasic name = ".357 Phasic Speed Loader (Revolver)" @@ -204,6 +211,7 @@ These bullets are made from an experimental alloy, 'Ghost Lead', that allows it to pass through almost any non-organic material. \ The name is a misnomer. It doesn't contain any lead whatsoever!" item = /obj/item/ammo_box/a357/phasic + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/revolver/heartseeker name = ".357 Heartseeker Speed Loader (Revolver)" @@ -212,12 +220,13 @@ Brought to you by Roseus Galactic!" item = /obj/item/ammo_box/a357/heartseeker cost = 3 + purchasable_from = parent_type::purchasable_from | UPLINK_SPY // ~~ Grenade Launcher ~~ // 'If god had wanted you to live, he would not have created ME!' /datum/uplink_item/weapon_kits/medium_cost/rawketlawnchair - name = "84mm Rocket Propelled Grenade Launcher (Hard)" + name = "Dardo-RE Rocket Propelled Grenade Launcher (Hard)" desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \ Guaranteed to send your target out with a bang or your money back! Comes with a bouquet of additional rockets!" item = /obj/item/storage/toolbox/guncase/rocketlauncher @@ -466,6 +475,14 @@ Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer." item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur +/datum/uplink_item/reinforcements/overwatch_agent + name = "Overwatch Intelligence Agent" + desc = "An Overwatch Intelligence Agent is assigned to your operation. They can view your progress and help coordinate using your \ + operative team's body-cams. They can also pilot the shuttle remotely and view the station's camera net. \ + If you're a meathead who's just here to kill people and don't care about strategising or intel, you'll still have someone to bear witness to your murder-spree!" + item = /obj/item/antag_spawner/nuke_ops/overwatch + cost = 12 + // ~~ Disposable Sentry Gun ~~ // Technically not a spawn but it is a kind of reinforcement...I guess. @@ -591,7 +608,7 @@ desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \ provides the user with superior armor and mobility compared to the standard Syndicate MODsuit." item = /obj/item/mod/control/pre_equipped/elite - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/energy_shield name = "MODsuit Energy Shield Module" @@ -599,28 +616,28 @@ before needing to recharge. Used wisely, this module will keep you alive for a lot longer." item = /obj/item/mod/module/energy_shield cost = 8 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/emp_shield name = "MODsuit Advanced EMP Shield Module" desc = "An advanced EMP shield module for a MODsuit. It protects your entire body from electromagnetic pulses." item = /obj/item/mod/module/emp_shield/advanced cost = 5 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/injector name = "MODsuit Injector Module" desc = "An injector module for a MODsuit. It is an extendable piercing injector with 30u capacity." item = /obj/item/mod/module/injector cost = 2 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/holster name = "MODsuit Holster Module" desc = "A holster module for a MODsuit. It can stealthily store any not too heavy gun inside it." item = /obj/item/mod/module/holster cost = 2 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/device_tools/medgun_mod name = "Medbeam Gun Module" @@ -665,7 +682,7 @@ In its crowbar configuration, it can be used to force open airlocks. Very useful for entering the station or its departments." item = /obj/item/crowbar/power/syndicate cost = 4 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" @@ -692,7 +709,7 @@ 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 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY restricted = TRUE // Implants @@ -717,6 +734,7 @@ This will permanently destroy your body, however." item = /obj/item/storage/box/syndie_kit/imp_microbomb cost = 2 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY /datum/uplink_item/implants/nuclear/macrobomb name = "Macrobomb Implant" @@ -732,8 +750,9 @@ Prevents collapsing from critical condition, but explodes after a while." item = /obj/item/storage/box/syndie_kit/imp_deniability cost = 6 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY -/datum/uplink_item/implants/nuclear/reviverplus +/datum/uplink_item/implants/nuclear/reviver name = "Reviver Implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/reviver diff --git a/code/modules/uplink/uplink_items/species.dm b/code/modules/uplink/uplink_items/species.dm index 54ba353c00a..5eb4bbdcb17 100644 --- a/code/modules/uplink/uplink_items/species.dm +++ b/code/modules/uplink/uplink_items/species.dm @@ -4,7 +4,7 @@ /datum/uplink_item/species_restricted category = /datum/uplink_category/species - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) /datum/uplink_item/species_restricted/moth_lantern name = "Extra-Bright Lantern" diff --git a/code/modules/uplink/uplink_items/spy_unique.dm b/code/modules/uplink/uplink_items/spy_unique.dm new file mode 100644 index 00000000000..b53cf60cefd --- /dev/null +++ b/code/modules/uplink/uplink_items/spy_unique.dm @@ -0,0 +1,138 @@ +/datum/uplink_category/spy_unique + name = "Spy Unique" + +// This is solely for uplink items that the spy can randomly obtain via bounties. +/datum/uplink_item/spy_unique + category = /datum/uplink_category/spy_unique + cant_discount = TRUE + surplus = FALSE + purchasable_from = UPLINK_SPY + // Cost doesn't really matter since it's free, but it determines which loot pool it falls into. + // By default, these fall into easy-medium spy bounty loot pool + cost = SPY_LOWER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/syndie_bowman + name = "Syndicate Bowman" + desc = "A bowman headset for members of the Syndicate. Not very conspicuous." + item = /obj/item/radio/headset/syndicate/alt + cost = 1 + +/datum/uplink_item/spy_unique/megaphone + name = "Megaphone" + desc = "A megaphone. It's loud." + item = /obj/item/megaphone + cost = 1 + +/datum/uplink_item/spy_unique/combat_gloves + name = "Combat Gloves" + desc = "A pair of combat gloves. They're insulated!" + item = /obj/item/clothing/gloves/combat + cost = 1 + +/datum/uplink_item/spy_unique/krav_maga + 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 + +/datum/uplink_item/spy_unique/tackle_gloves + name = "Guerrilla Gloves" + desc = "A pair of Guerrilla gloves. They're insulated AND you can tackle people with it!" + item = /obj/item/clothing/gloves/tackler/combat/insulated + +/datum/uplink_item/spy_unique/kudzu + name = "Kudzu" + desc = "A packet of Kudzu - plant and forget, a great distraction." + item = /obj/item/seeds/kudzu + +/datum/uplink_item/spy_unique/big_knife + name = "Combat Knife" + desc = "A big knife. It's sharp." + item = /obj/item/knife/combat + +/datum/uplink_item/spy_unique/switchblade + name = "Switchblade" + desc = "A switchblade. Switches between not sharp and sharp." + item = /obj/item/switchblade + +/datum/uplink_item/spy_unique/sechud_implant + name = "SecHUD Implant" + desc = "A SecHUD implant. Shows you the ID of people you're looking at. It's also stealthy!" + item = /obj/item/autosurgeon/syndicate/contraband_sechud + +/datum/uplink_item/spy_unique/rifle_prime + name = "Bolt-Action Rifle" + desc = "A bolt-action rifle, with a scope. Won't jam, either." + item = /obj/item/gun/ballistic/rifle/boltaction/prime + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/cycler_shotgun + name = "Cycler Shotgun" + desc = "A cycler shotgun. It's a shotgun that cycles between two barrels." + item = /obj/item/gun/ballistic/shotgun/automatic/dual_tube/deadly + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/bulldog_shotgun + name = "Bulldog Shotgun" + desc = "A bulldog shotgun. It's a shotgun that shoots bulldogs." + item = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/ansem_pistol + name = "Ansem Pistol" + desc = "A pistol that's really good at making people sleep." + item = /obj/item/gun/ballistic/automatic/pistol/clandestine + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/rocket_launcher + name = "Rocket Launcher" + desc = "A rocket launcher. I would recommend against jumping with it." + item = /obj/item/gun/ballistic/rocketlauncher + cost = SPY_UPPER_COST_THRESHOLD - 1 // It's a meme item + +/datum/uplink_item/spy_unique/shotgun_ammo + name = "Box of Buckshot" + desc = "A box of buckshot rounds for a shotgun. For when you don't want to miss." + item = /obj/item/storage/box/lethalshot + cost = 1 + +/datum/uplink_item/spy_unique/shotgun_ammo/breacher_slug + name = "Box of Breacher Slugs" + desc = "A box of breacher slugs for a shotgun. For making a good first impression." + item = /obj/item/storage/box/breacherslug + +/datum/uplink_item/spy_unique/shotgun_ammo/slugs + name = "Box of Slugs" + desc = "A box of slugs for a shotgun. For big game hunting." + item = /obj/item/storage/box/slugs + +/datum/uplink_item/spy_unique/stealth_belt + name = "Stealth Belt" + desc = "A stealth belt that lets you sneak behind enemy lines." + item = /obj/item/shadowcloak/weaker + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/katana + name = "Katana" + desc = "A really sharp Katana. Did I mention it's sharp?" + item = /obj/item/katana + cost = /datum/uplink_item/dangerous/doublesword::cost // Puts it in the same pool as Desword + +/datum/uplink_item/spy_unique/medkit_lite + name = "Syndicate First Medic Kit" + desc = "A syndicate tactical combat medkit, but only stocked enough to do basic first aid." + item = /obj/item/storage/medkit/tactical_lite + +/datum/uplink_item/spy_unique/antistun + name = /datum/uplink_item/implants/nuclear/antistun::name + desc = /datum/uplink_item/implants/nuclear/antistun::desc + item = /obj/item/autosurgeon/syndicate/anti_stun/single_use + +/datum/uplink_item/spy_unique/reviver + name = /datum/uplink_item/implants/nuclear/reviver::name + desc = /datum/uplink_item/implants/nuclear/reviver::desc + item = /obj/item/autosurgeon/syndicate/reviver/single_use + +/datum/uplink_item/spy_unique/thermals + name = /datum/uplink_item/implants/nuclear/thermals::name + desc = /datum/uplink_item/implants/nuclear/thermals::desc + item = /obj/item/autosurgeon/syndicate/thermal_eyes/single_use diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 793120fe56f..fb450fb68df 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -102,4 +102,4 @@ cost = 7 surplus = 50 limited_stock = 1 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_INFILTRATORS) + purchasable_from = UPLINK_TRAITORS | UPLINK_SPY diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm index 60f007ebae7..59b8f6fca77 100644 --- a/code/modules/uplink/uplink_items/stealthy_tools.dm +++ b/code/modules/uplink/uplink_items/stealthy_tools.dm @@ -102,7 +102,7 @@ /datum/uplink_item/stealthy_tools/telecomm_blackout name = "Disable Telecomms" desc = "When purchased, a virus will be uploaded to the telecommunication processing servers to temporarily disable themselves." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM surplus = 0 progression_minimum = 15 MINUTES limited_stock = 1 @@ -117,7 +117,7 @@ /datum/uplink_item/stealthy_tools/blackout name = "Trigger Stationwide Blackout" desc = "When purchased, a virus will be uploaded to the engineering processing servers to force a routine power grid check, forcing all APCs on the station to be temporarily disabled." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM surplus = 0 progression_minimum = 20 MINUTES limited_stock = 1 diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 37f6eb7efa5..30e01b3219e 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -10,7 +10,7 @@ car_traits = CAN_KIDNAP key_type = /obj/item/bikehorn light_system = OVERLAY_LIGHT_DIRECTIONAL - light_range = 8 + light_range = 6 light_power = 2 light_on = FALSE access_provider_flags = VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_KIDNAPPED diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index 53eee5105a9..221c9268feb 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -15,7 +15,7 @@ engine_sound_length = 0.3 SECONDS light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 - light_power = 2 + light_power = 1.5 light_on = FALSE engine_sound = 'sound/effects/servostep.ogg' ///Maximum size of a mob trying to enter the mech diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index e03847037c8..7cee1b6541c 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -31,16 +31,16 @@ COOLDOWN_DECLARE(mecha_bump_smash) light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE - light_range = 8 + light_range = 6 generic_canpass = FALSE hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD) mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi' ///How much energy the mech will consume each time it moves. this is the current active energy consumed - var/step_energy_drain = 8 + var/step_energy_drain = 8 KILO JOULES ///How much energy we drain each time we mechpunch someone - var/melee_energy_drain = 15 + var/melee_energy_drain = 15 KILO JOULES ///Power we use to have the lights on - var/light_energy_drain = 2 + var/light_power_drain = 2 KILO WATTS ///Modifiers for directional damage reduction var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 0.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 1.5) ///if we cant use our equipment(such as due to EMP) @@ -187,7 +187,7 @@ ///check for phasing, if it is set to text (to describe how it is phasing: "flying", "phasing") it will let the mech walk through walls. var/phasing = "" ///Power we use every time we phaze through something - var/phasing_energy_drain = 200 + var/phasing_energy_drain = 0.2 * STANDARD_CELL_CHARGE ///icon_state for flick() when phazing var/phase_state = "" @@ -221,6 +221,7 @@ ui_view.generate_view("mech_view_[REF(src)]") RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) spark_system = new spark_system.set_up(2, 0, src) @@ -268,8 +269,12 @@ AddElement(/datum/element/hostile_machine) /obj/vehicle/sealed/mecha/Destroy() - for(var/ejectee in occupants) - mob_exit(ejectee, silent = TRUE) + /// If the former occupants get polymorphed, mutated, chestburstered, + /// or otherwise replaced by another mob, that mob is no longer in .occupants + /// and gets deleted with the mech. However, they do remain in .contents + var/list/potential_occupants = contents ^ occupants + for(var/mob/buggy_ejectee in potential_occupants) + mob_exit(buggy_ejectee, silent = TRUE) if(LAZYLEN(flat_equipment)) for(var/obj/item/mecha_parts/mecha_equipment/equip as anything in flat_equipment) @@ -553,8 +558,9 @@ if(internal_damage & MECHA_INT_SHORT_CIRCUIT && get_charge()) spark_system.start() - use_power(min(10 * seconds_per_tick, cell.charge)) - cell.maxcharge -= min(10 * seconds_per_tick, cell.maxcharge) + var/damage_energy_consumption = 0.005 * STANDARD_CELL_CHARGE * seconds_per_tick + use_energy(damage_energy_consumption) + cell.maxcharge -= min(damage_energy_consumption, cell.maxcharge) /obj/vehicle/sealed/mecha/proc/process_cabin_air(seconds_per_tick) if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && cabin_air && cabin_air.return_volume() > 0) @@ -619,7 +625,7 @@ diag_hud_set_mechstat() /obj/vehicle/sealed/mecha/proc/process_constant_power_usage(seconds_per_tick) - if(mecha_flags & LIGHTS_ON && !use_power(light_energy_drain * seconds_per_tick)) + if(mecha_flags & LIGHTS_ON && !use_energy(light_power_drain * seconds_per_tick)) mecha_flags &= ~LIGHTS_ON set_light_on(mecha_flags & LIGHTS_ON) playsound(src,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) @@ -695,7 +701,7 @@ if(!has_charge(melee_energy_drain)) return - use_power(melee_energy_drain) + use_energy(melee_energy_drain) SEND_SIGNAL(user, COMSIG_MOB_USED_MECH_MELEE, src) target.mech_melee_attack(src, user) @@ -799,6 +805,12 @@ remove_action_type_from_mob(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, occupant) return COMPONENT_BLOCK_LIGHT_EATER +/obj/vehicle/sealed/mecha/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(mecha_flags &= HAS_LIGHTS && light_on) + set_light_on(FALSE) + return COMSIG_SABOTEUR_SUCCESS + /// Apply corresponding accesses /obj/vehicle/sealed/mecha/proc/update_access() req_access = one_access ? list() : accesses @@ -849,11 +861,11 @@ if(capacitor) phasing_energy_drain = initial(phasing_energy_drain) / capacitor.rating melee_energy_drain = initial(melee_energy_drain) / capacitor.rating - light_energy_drain = initial(light_energy_drain) / capacitor.rating + light_power_drain = initial(light_power_drain) / capacitor.rating else phasing_energy_drain = initial(phasing_energy_drain) melee_energy_drain = initial(melee_energy_drain) - light_energy_drain = initial(light_energy_drain) + light_power_drain = initial(light_power_drain) /// Toggle lights on/off /obj/vehicle/sealed/mecha/proc/toggle_lights(forced_state = null, mob/user) @@ -861,7 +873,7 @@ if(user) balloon_alert(user, "mech has no lights!") return - if((!(mecha_flags & LIGHTS_ON) && forced_state != FALSE) && get_charge() < light_energy_drain) + if((!(mecha_flags & LIGHTS_ON) && forced_state != FALSE) && get_charge() < power_to_energy(light_power_drain, scheduler = SSobj)) if(user) balloon_alert(user, "no power for lights!") return diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 35b53c30ccf..b44478582c0 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -50,7 +50,7 @@ /obj/vehicle/sealed/mecha/durand/process() . = ..() - if(defense_mode && !use_power(100)) //Defence mode can only be on with a occupant so we check if one of them can toggle it and toggle + if(defense_mode && !use_energy(100 KILO JOULES)) //Defence mode can only be on with a occupant so we check if one of them can toggle it and toggle for(var/O in occupants) var/mob/living/occupant = O var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) @@ -166,7 +166,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe anchored = TRUE light_system = OVERLAY_LIGHT light_range = MINIMUM_USEFUL_LIGHT_RANGE - light_power = 5 + light_power = 2 light_color = LIGHT_COLOR_ELECTRIC_CYAN light_on = FALSE resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF //The shield should not take damage from fire, lava, or acid; that's the mech's job. @@ -271,7 +271,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe return . = ..() flick("shield_impact", src) - if(!chassis.use_power((max_integrity - atom_integrity) * 100)) + if(!chassis.use_energy((max_integrity - atom_integrity) * 0.1 * STANDARD_CELL_CHARGE)) chassis.cell?.charge = 0 for(var/O in chassis.occupants) var/mob/living/occupant = O diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index 86bc8532afd..77fa1657d2d 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -114,7 +114,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/action(mob/source, atom/target, list/modifiers) TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment SEND_SIGNAL(source, COMSIG_MOB_USED_MECH_EQUIPMENT, chassis) - chassis.use_power(energy_drain) + chassis.use_energy(energy_drain) return TRUE /** @@ -128,7 +128,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user, interaction_key) if(!chassis) return FALSE - chassis.use_power(energy_drain) + chassis.use_energy(energy_drain) return do_after(user, equip_cooldown, target, extra_checks = CALLBACK(src, PROC_REF(do_after_checks), target), interaction_key = interaction_key) ///Do after wrapper for mecha equipment diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index fd138bbeaf8..b1e0d84f14e 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -17,12 +17,12 @@ /obj/item/mecha_parts/mecha_equipment/medical/sleeper name = "mounted sleeper" - desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves." + desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents from a equipped exosuit syringe gun." icon_state = "mecha_sleeper" energy_drain = 20 range = MECHA_MELEE equip_cooldown = 20 - ///ref to the patient loaded in the sleeper + /// ref to the patient loaded in the sleeper var/mob/living/carbon/patient /// amount of chems to inject into patient from other hands syringe gun var/inject_amount = 10 @@ -32,15 +32,47 @@ content.forceMove(get_turf(src)) return ..() +/obj/item/mecha_parts/mecha_equipment/medical/proc/get_reagent_data(list/datum/reagent/reagent_list) + var/list/contained_reagents = list() + if(length(reagent_list)) + for(var/datum/reagent/reagent as anything in reagent_list) + contained_reagents += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) // list in a list because Byond merges the first list... + return contained_reagents + /obj/item/mecha_parts/mecha_equipment/medical/sleeper/get_snowflake_data() var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_SLEEPER) - if(!patient) + if(isnull(patient)) return data + var/patient_state + switch(patient.stat) + if(0) + patient_state = "Conscious" + if(1) + patient_state = "Unconscious" + if(2) + patient_state = "*dead*" + else + patient_state = "Unknown" + var/core_temp = "" + if(ishuman(patient)) + var/mob/living/carbon/human/humi = patient + core_temp = humi.bodytemperature-T0C data["patient"] = list( - "patientname" = patient.name, - "is_dead" = patient.stat == DEAD, + "patient_name" = patient.name, "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(), ) + data["has_brain_damage"] = patient.get_organ_loss(ORGAN_SLOT_BRAIN) != 0 + data["has_traumas"] = length(patient.get_traumas()) != 0 + data["contained_reagents"] = get_reagent_data(patient.reagents.reagent_list) + + var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/shooter = locate(/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun) in chassis + data["injectible_reagents"] = get_reagent_data(shooter.reagents.reagent_list) return data /obj/item/mecha_parts/mecha_equipment/medical/sleeper/handle_ui_act(action, list/params) @@ -48,10 +80,13 @@ if("eject") go_out() return TRUE - if("view_stats") - usr << browse(get_patient_stats(),"window=msleeper") - onclose(usr, "msleeper") - return FALSE + var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/shooter = locate() in chassis + for(var/datum/reagent/medication in shooter.reagents.reagent_list) + if(action == ("inject_reagent_" + medication.name)) + inject_reagent(medication, shooter) + break // or maybe return TRUE? i'm not certain + + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/sleeper/action(mob/source, atom/atomtarget, list/modifiers) if(!action_checks(atomtarget)) @@ -59,7 +94,7 @@ if(!iscarbon(atomtarget)) return var/mob/living/carbon/target = atomtarget - if(!patient_insertion_check(target)) + if(!patient_insertion_check(target, source)) return to_chat(source, "[icon2html(src, source)][span_notice("You start putting [target] into [src]...")]") chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) @@ -76,7 +111,7 @@ return ..() /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/patient_insertion_check(mob/living/carbon/target, mob/user) - if(target.buckled) + if(!isnull(target.buckled)) to_chat(user, "[icon2html(src, user)][span_warning("[target] will not fit into the sleeper because [target.p_theyre()] buckled to [target.buckled]!")]") return FALSE if(target.has_buckled_mobs()) @@ -103,92 +138,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Topic(href,href_list) - . = ..() - if(.) - return - if(!(usr in chassis.occupants)) - return - if(href_list["inject"]) - var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate() in chassis - var/datum/reagent/R = locate(href_list["inject"]) in SG.reagents.reagent_list - if(istype(R)) - inject_reagent(R, SG) - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_stats() - if(!patient) - return - return {" - - - [patient] statistics - - - - -

Health statistics

-
- [get_patient_dam()] -
-

Reagents in bloodstream

-
- [get_patient_reagents()] -
-
- [get_available_reagents()] -
- - "} - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_dam() - var/t1 - switch(patient.stat) - if(0) - t1 = "Conscious" - if(1) - t1 = "Unconscious" - if(2) - t1 = "*dead*" - else - t1 = "Unknown" - var/core_temp = "" - if(ishuman(patient)) - var/mob/living/carbon/human/humi = patient - core_temp = {"Body Temperature: [humi.bodytemperature-T0C]°C ([humi.bodytemperature*1.8-459.67]°F)
"} - return {"Health: [patient.stat > 1 ? "[t1]" : "[patient.health]% ([t1])"]
- [core_temp] - Body Temperature: [patient.bodytemperature-T0C]°C ([patient.bodytemperature*1.8-459.67]°F)
- Brute Damage: [patient.getBruteLoss()]%
- Respiratory Damage: [patient.getOxyLoss()]%
- Toxin Content: [patient.getToxLoss()]%
- Burn Severity: [patient.getFireLoss()]%
- [span_danger("[patient.get_organ_loss(ORGAN_SLOT_BRAIN) ? "Significant brain damage detected." : ""]")]
- [span_danger("[length(patient.get_traumas()) ? "Brain Traumas detected." : ""]")]
- "} - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_reagents() - if(patient.reagents) - for(var/datum/reagent/R in patient.reagents.reagent_list) - if(R.volume > 0) - . += "[R]: [round(R.volume,0.01)]
" - return . || "None" - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_available_reagents() - var/output - var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate(/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun) in chassis - if(SG && SG.reagents && islist(SG.reagents.reagent_list)) - for(var/datum/reagent/R in SG.reagents.reagent_list) - if(R.volume > 0) - output += "Inject [R.name]
" - return output - - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/inject_reagent(datum/reagent/R,obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG) +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/inject_reagent(datum/reagent/R, obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG) if(!R || !patient || !SG || !(SG in chassis.flat_equipment)) return var/to_inject = min(R.volume, inject_amount) @@ -228,7 +178,7 @@ ex_patient.AdjustUnconscious(-40 * seconds_per_tick) if(ex_patient.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 5) ex_patient.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5) - chassis.use_power(energy_drain) + chassis.use_energy(energy_drain) ///////////////////////////////// Syringe Gun /////////////////////////////////////////////////////////////// @@ -246,7 +196,7 @@ ///Lazylist of syringes that we've picked up var/list/syringes ///List of all scanned reagents, starts with epinephrine and multiver - var/list/known_reagents + var/list/datum/reagent/known_reagents ///List of reagents we want to be creating this processing tick var/list/processed_reagents ///Maximu amount of syringes we can hold @@ -267,11 +217,6 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/create_reagents(max_vol, flags) - . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - /// Handles detaching signal hooks incase someone is crazy enough to make this edible. /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/on_reagents_del(datum/reagents/reagents) SIGNAL_HANDLER @@ -283,7 +228,13 @@ return ..() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/get_snowflake_data() - return list( + var/list/analyzed_reagents = list() // we need to make this list because .tsk wont map over an indexed array + for(var/i=1 to known_reagents.len) + var/enabled = FALSE + if(known_reagents[i] in processed_reagents) + enabled = TRUE + analyzed_reagents += list((list("name" = known_reagents[i].name, "enabled" = enabled))) + var/list/data = list( "snowflake_id" = MECHA_SNOWFLAKE_ID_SYRINGE, "mode" = mode == FIRE_SYRINGE_MODE ? "Launch" : "Analyze", "mode_label" = "Action", @@ -291,15 +242,39 @@ "max_syringe" = max_syringes, "reagents" = reagents.total_volume, "total_reagents" = reagents.maximum_volume, + "analyzed_reagents" = analyzed_reagents, ) + data["contained_reagents"] = get_reagent_data(reagents.reagent_list) + return data /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/handle_ui_act(action, list/params) if(action == "change_mode") mode = !mode return TRUE - else if(action == "show_reagents") - usr << browse(get_reagents_page(),"window=msyringegun") - return FALSE + else if(action == "purge_all") + reagents.clear_reagents() + else + for(var/i=1 to known_reagents.len) + var/reagent_id = known_reagents[i] + if(action == ("purge_reagent_" + known_reagents[i].name)) + reagents.del_reagent(reagent_id) + else if(action == ("toggle_reagent_" + known_reagents[i].name)) + synthesize(reagent_id) + +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/synthesize(reagent) + if(reagent in processed_reagents) + LAZYREMOVE(processed_reagents, reagent) + return + var/message = "[known_reagents[reagent]]" + LAZYADD(processed_reagents, reagent) + if(!LAZYLEN(processed_reagents)) + return + + message += " added to production" + START_PROCESSING(SSobj, src) + to_chat(usr, message) + to_chat(usr, "[icon2html(src, usr)][span_notice("Reagent processing started.")]") + log_message("Reagent processing started.", LOG_MECHA) /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/action(mob/source, atom/target, list/modifiers) if(!action_checks(target)) @@ -327,99 +302,6 @@ chambered.fire_casing(target, source, null, 0, 0, null, 0, src) return ..() -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Topic(href,href_list) - ..() - if (href_list["toggle_mode"]) - mode = !mode - return - if (href_list["select_reagents"]) - LAZYCLEARLIST(processed_reagents) - var/processingreagentamount = 0 - var/message - for(var/i=1 to known_reagents.len) - if(processingreagentamount >= synth_speed) - break - var/reagent = text2path(href_list["reagent_[i]"]) - if(reagent && (reagent in known_reagents)) - message = "[processingreagentamount ? ", " : null][known_reagents[reagent]]" - LAZYADD(processed_reagents, reagent) - processingreagentamount++ - if(LAZYLEN(processed_reagents)) - message += " added to production" - START_PROCESSING(SSobj, src) - to_chat(usr, message) - to_chat(usr, "[icon2html(src, usr)][span_notice("Reagent processing started.")]") - log_message("Reagent processing started.", LOG_MECHA) - return - if (href_list["purge_reagent"]) - var/reagent = href_list["purge_reagent"] - if(!reagent) - return - reagents.del_reagent(reagent) - return - if (href_list["purge_all"]) - reagents.clear_reagents() - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_page() - var/output = {" - - - Reagent Synthesizer - - - - -

Current reagents:

-
- [get_current_reagents()] -
-

Reagents production:

-
- [get_reagents_form()] -
- - - "} - return output - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_form() - var/r_list = get_reagents_list() - var/inputs - if(r_list) - inputs += "" - inputs += "" - inputs += "" - var/output = {"
- [r_list || "No known reagents"] - [inputs] -
- [r_list? "Only the first [synth_speed] selected reagent\s will be added to production" : null] - "} - return output - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_list() - var/output - for(var/i=1 to known_reagents.len) - var/reagent_id = known_reagents[i] - output += {" [known_reagents[reagent_id]]
"} - return output - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_current_reagents() - var/output - for(var/datum/reagent/R in reagents.reagent_list) - if(R.volume > 0) - output += "[R]: [round(R.volume,0.001)] - Purge Reagent
" - if(output) - output += "Total: [round(reagents.total_volume,0.001)]/[reagents.maximum_volume] - Purge All" - return output || "None" - /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/load_syringe(obj/item/reagent_containers/syringe/S, mob/user) if(LAZYLEN(syringes) >= max_syringes) to_chat(user, "[icon2html(src, user)][span_warning("[src]'s syringe chamber is full!")]") @@ -444,7 +326,6 @@ for(var/datum/reagent/R in A.reagents.reagent_list) if((R.chemical_flags & REAGENT_CAN_BE_SYNTHESIZED) && add_known_reagent(R.type,R.name)) to_chat(user, "[icon2html(src, user)][span_notice("Reagent analyzed, identified as [R.name] and added to database.")]") - send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) to_chat(user, "[icon2html(src, user)][span_notice("Analysis complete.")]") return TRUE @@ -455,14 +336,6 @@ known_reagents[r_id] = r_name return TRUE -/// Updates the equipment info list when the reagents change. Eats signal args. -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/on_reagent_change(datum/reagents/holder, ...) - SIGNAL_HANDLER - send_byjax(chassis.occupants,"msyringegun.browser","reagents",get_current_reagents()) - send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) - return NONE - - /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/process(seconds_per_tick) . = ..() if(.) @@ -474,7 +347,7 @@ var/amount = seconds_per_tick * synth_speed / LAZYLEN(processed_reagents) for(var/reagent in processed_reagents) reagents.add_reagent(reagent,amount) - chassis.use_power(energy_drain) + chassis.use_energy(energy_drain) #undef FIRE_SYRINGE_MODE #undef ANALYZE_SYRINGE_MODE diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index 42a61e03b5e..25fd2879a6b 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -10,7 +10,7 @@ desc = "Equipment for engineering and combat exosuits. This is the drill that'll pierce the heavens!" icon_state = "mecha_drill" equip_cooldown = 15 - energy_drain = 10 + energy_drain = 10 KILO JOULES force = 15 harmful = TRUE range = MECHA_MELEE diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 4b62478fa02..067ad2250f0 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -9,7 +9,7 @@ desc = "An exosuit module that allows exosuits to teleport to any position in view." icon_state = "mecha_teleport" equip_cooldown = 150 - energy_drain = 1000 + energy_drain = 1 MEGA JOULES range = MECHA_RANGED var/teleport_range = 7 @@ -254,7 +254,7 @@ chassis.repair_damage(h_boost) repaired = TRUE if(repaired) - if(!chassis.use_power(energy_drain)) + if(!chassis.use_energy(energy_drain)) active = FALSE return PROCESS_KILL else //no repair needed, we turn off @@ -285,7 +285,7 @@ ///Maximum fuel capacity of the generator, in units var/max_fuel = 75 * SHEET_MATERIAL_AMOUNT ///Energy recharged per second - var/rechargerate = 10 + var/rechargerate = 5 KILO WATTS /obj/item/mecha_parts/mecha_equipment/generator/Initialize(mapload) . = ..() @@ -458,7 +458,7 @@ /obj/item/mecha_parts/mecha_equipment/thrusters/ion/thrust(movement_dir) if(!chassis) return FALSE - if(chassis.use_power(chassis.step_energy_drain)) + if(chassis.use_energy(chassis.step_energy_drain)) generate_effect(movement_dir) return TRUE return FALSE @@ -519,7 +519,7 @@ . = ..() - mech.chassis_camera = new /obj/machinery/camera/exosuit (mech) + mech.chassis_camera = new /obj/machinery/camera/exosuit(mech) mech.chassis_camera.update_c_tag(mech) mech.diag_hud_set_camera() diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 1960303baab..e04a40b05f6 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -7,7 +7,7 @@ desc = "Equipment for engineering exosuits. Lifts objects and loads them into cargo." icon_state = "mecha_clamp" equip_cooldown = 15 - energy_drain = 10 + energy_drain = 10 KILO JOULES tool_behaviour = TOOL_RETRACTOR range = MECHA_MELEE toolspeed = 0.8 diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index c0047eb91d7..bd9bbfca91f 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -370,7 +370,7 @@ if(!action_checks(target)) return TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown) - chassis.use_power(energy_drain) + chassis.use_energy(energy_drain) var/newtonian_target = turn(chassis.dir,180) var/obj/O = new projectile(chassis.loc) playsound(chassis, fire_sound, 50, TRUE) diff --git a/code/modules/vehicles/mecha/mech_bay.dm b/code/modules/vehicles/mecha/mech_bay.dm index 398a9c6c59b..1f468565625 100644 --- a/code/modules/vehicles/mecha/mech_bay.dm +++ b/code/modules/vehicles/mecha/mech_bay.dm @@ -1,17 +1,18 @@ /obj/machinery/mech_bay_recharge_port name = "mech bay power port" desc = "This port recharges a mech's internal power cell." - density = TRUE - dir = EAST icon = 'icons/obj/machines/mech_bay.dmi' icon_state = "recharge_port" + density = TRUE + dir = EAST + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.1 circuit = /obj/item/circuitboard/machine/mech_recharger ///Weakref to currently recharging mech on our recharging_turf var/datum/weakref/recharging_mech_ref ///Ref to charge console for seeing charge for this port, cyclical reference var/obj/machinery/computer/mech_bay_power_console/recharge_console ///Power unit per second to charge by - var/recharge_power = 25 + var/recharge_power = 25 KILO WATTS ///turf that will be checked when a mech wants to charge. directly one turf in the direction it is facing var/turf/recharging_turf @@ -45,7 +46,7 @@ var/total_rating = 0 for(var/datum/stock_part/capacitor/capacitor in component_parts) total_rating += capacitor.tier - recharge_power = total_rating * 12.5 + recharge_power = total_rating * 12.5 KILO WATTS /obj/machinery/mech_bay_recharge_port/examine(mob/user) . = ..() @@ -64,9 +65,9 @@ if(!recharging_mech?.cell) return if(recharging_mech.cell.charge < recharging_mech.cell.maxcharge) - var/delta = min(recharge_power * seconds_per_tick, recharging_mech.cell.maxcharge - recharging_mech.cell.charge) - recharging_mech.give_power(delta) - use_power(delta + active_power_usage) + if(!use_energy(active_power_usage * seconds_per_tick)) + return + charge_cell(recharge_power * seconds_per_tick, recharging_mech.cell, grid_only = TRUE) else recharge_console.update_appearance() if(recharging_mech.loc != recharging_turf) diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index c4acded7994..54acd183aff 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -474,7 +474,7 @@ /obj/machinery/mecha_part_fabricator/proc/AfterMaterialInsert(item_inserted, id_inserted, amount_inserted) var/datum/material/M = id_inserted add_overlay("fab-load-[M.name]") - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), "fab-load-[M.name]"), 10) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), "fab-load-[M.name]"), 1 SECONDS) /obj/machinery/mecha_part_fabricator/screwdriver_act(mob/living/user, obj/item/I) if(..()) diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index 635ec9425b1..3b465994e9e 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -106,7 +106,7 @@ return answer -/obj/item/mecha_parts/mecha_tracking/emp_act() +/obj/item/mecha_parts/mecha_tracking/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_SELF)) qdel(src) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index c1207c2677f..426efaf1e6f 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -171,7 +171,7 @@ if (. & EMP_PROTECT_SELF) return if(get_charge()) - use_power((cell.charge/3)/(severity*2)) + use_energy((cell.charge/3)/(severity*2)) take_damage(30 / severity, BURN, ENERGY, 1) log_message("EMP detected", LOG_MECHA, color="red") diff --git a/code/modules/vehicles/mecha/mecha_helpers.dm b/code/modules/vehicles/mecha/mecha_helpers.dm index c9de84747e9..03084c56957 100644 --- a/code/modules/vehicles/mecha/mecha_helpers.dm +++ b/code/modules/vehicles/mecha/mecha_helpers.dm @@ -7,8 +7,8 @@ /obj/vehicle/sealed/mecha/proc/get_charge() return cell?.charge -/obj/vehicle/sealed/mecha/proc/use_power(amount) - var/output = get_charge() && cell.use(amount) +/obj/vehicle/sealed/mecha/proc/use_energy(amount) + var/output = cell.use(amount) if (output) diag_hud_set_mechcell() return output diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm index e9d7f5a1e1f..7accab008f1 100644 --- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm @@ -139,6 +139,8 @@ mob_container = AI newloc = get_turf(AI.linked_core) qdel(AI.linked_core) + else if(isliving(M)) + mob_container = M else return ..() var/mob/living/ejector = M diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index aa86d57a0da..53e61690aba 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -103,7 +103,7 @@ to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [english_list(missing_parts)].")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE - if(!use_power(step_energy_drain)) + if(!use_energy(step_energy_drain)) if(TIMER_COOLDOWN_FINISHED(src, COOLDOWN_MECHA_MESSAGE)) to_chat(occupants, "[icon2html(src, occupants)][span_warning("Insufficient power to move!")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) @@ -142,7 +142,7 @@ //Otherwise just walk normally . = try_step_multiz(direction) if(phasing) - use_power(phasing_energy_drain) + use_energy(phasing_energy_drain) if(strafe) setDir(olddir) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 711da429cca..a4872289e96 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -318,7 +318,7 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) /obj/item/mecha_parts/mecha_equipment/ejector/relay_container_resist_act(mob/living/user, obj/container) to_chat(user, span_notice("You lean on the back of [container] and start pushing so it falls out of [src].")) - if(do_after(user, 300, target = container)) + if(do_after(user, 30 SECONDS, target = container)) if(!user || user.stat != CONSCIOUS || user.loc != src || container.loc != src ) return to_chat(user, span_notice("You successfully pushed [container] out of [src]!")) diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index 7d3b70baf95..128530968e2 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -9,8 +9,8 @@ var/speed = 2 ///Self explanatory, ratio of how much power we use var/power_efficiency = 1 - ///How much power we use - var/power_usage = 100 + ///How much energy we use + var/energy_usage = 100 KILO JOULES ///whether the panel is open so a user can take out the cell var/panel_open = FALSE ///Parts used in building the wheelchair @@ -26,12 +26,15 @@ /obj/vehicle/ridden/wheelchair/motorized/Initialize(mapload) . = ..() + add_component_parts() + refresh_parts() + +/obj/vehicle/ridden/wheelchair/motorized/proc/add_component_parts() // Add tier 1 stock parts so that non-crafted wheelchairs aren't empty component_parts += GLOB.stock_part_datums[/datum/stock_part/capacitor] component_parts += GLOB.stock_part_datums[/datum/stock_part/servo] component_parts += GLOB.stock_part_datums[/datum/stock_part/servo] power_cell = new /obj/item/stock_parts/cell(src) - refresh_parts() /obj/vehicle/ridden/wheelchair/motorized/make_ridable() AddElement(/datum/element/ridable, /datum/component/riding/vehicle/wheelchair/motorized) @@ -87,7 +90,7 @@ canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 2 SECONDS) return FALSE - if(power_cell.charge < power_usage / max(power_efficiency, 1)) + if(power_cell.charge < energy_usage / max(power_efficiency, 1)) to_chat(user, span_warning("The display on [src] blinks 'Out of Power'.")) canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 2 SECONDS) @@ -221,3 +224,12 @@ visible_message(span_warning("A bomb appears in [src], what the fuck?")) obj_flags |= EMAGGED return TRUE + +///Version with slightly better components. Used by deathmatches. +/obj/vehicle/ridden/wheelchair/motorized/improved + +/obj/vehicle/ridden/wheelchair/motorized/improved/add_component_parts() + component_parts += GLOB.stock_part_datums[/datum/stock_part/capacitor] + component_parts += GLOB.stock_part_datums[/datum/stock_part/servo/tier2] + component_parts += GLOB.stock_part_datums[/datum/stock_part/servo] + power_cell = new /obj/item/stock_parts/cell/upgraded/plus(src) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 4e1f115e55c..a4f36524483 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -49,6 +49,8 @@ var/board_item_type = /obj/item/melee/skateboard ///Stamina drain multiplier var/instability = 10 + ///If true, riding the skateboard with walk intent on will prevent crashing. + var/can_slow_down = TRUE /obj/vehicle/ridden/scooter/skateboard/Initialize(mapload) . = ..() @@ -87,9 +89,11 @@ . = ..() if(!bumped_thing.density || !has_buckled_mobs() || world.time < next_crash) return + var/mob/living/rider = buckled_mobs[1] + if(rider.move_intent == MOVE_INTENT_WALK && can_slow_down) //Going slow prevents you from crashing. + return next_crash = world.time + 10 - var/mob/living/rider = buckled_mobs[1] rider.adjustStaminaLoss(instability*6) playsound(src, 'sound/effects/bang.ogg', 40, TRUE) if(!iscarbon(rider) || rider.getStaminaLoss() >= 100 || grinding || iscarbon(bumped_thing)) @@ -155,7 +159,7 @@ victim.Paralyze(1.5 SECONDS) skater.adjustStaminaLoss(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)), 1) + addtimer(CALLBACK(src, PROC_REF(grind)), 0.1 SECONDS) /obj/vehicle/ridden/scooter/skateboard/MouseDrop(atom/over_object) . = ..() @@ -181,13 +185,28 @@ board_item_type = /obj/item/melee/skateboard/pro instability = 6 -/obj/vehicle/ridden/scooter/skateboard/hoverboard/ +/obj/vehicle/ridden/scooter/skateboard/pro/make_ridable() + AddElement(/datum/element/ridable, /datum/component/riding/vehicle/scooter/skateboard/pro) + +/obj/vehicle/ridden/scooter/skateboard/hoverboard name = "hoverboard" desc = "A blast from the past, so retro!" board_item_type = /obj/item/melee/skateboard/hoverboard instability = 3 icon_state = "hoverboard_red" +/obj/vehicle/ridden/scooter/skateboard/hoverboard/make_ridable() + AddElement(/datum/element/ridable, /datum/component/riding/vehicle/scooter/skateboard/hover) + +/obj/vehicle/ridden/scooter/skateboard/hoverboard/can_z_move(direction, turf/start, turf/destination, z_move_flags = ZMOVE_FLIGHT_FLAGS, mob/living/rider) + . = ..() + if(!.) + return + if(rider && (z_move_flags & ZMOVE_CAN_FLY_CHECKS) && direction == UP) + if(z_move_flags & ZMOVE_FEEDBACK) + to_chat(rider, span_warning("[src] [p_are()] not powerful enough to fly upwards.")) + return FALSE + /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin name = "\improper Board Of Directors" desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." @@ -199,6 +218,7 @@ name = "improvised skateboard" desc = "An unfinished scooter which can only barely be called a skateboard. It's still rideable, but probably unsafe. Looks like you'll need to add a few rods to make handlebars." board_item_type = /obj/item/melee/skateboard/improvised + instability = 12 //CONSTRUCTION /obj/item/scooter_frame diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index de1b5ac93f0..0ecc492f6d5 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -6,6 +6,10 @@ ///Determines which occupants provide access when bumping into doors var/access_provider_flags = VEHICLE_CONTROL_DRIVE +/obj/vehicle/sealed/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_SUPERMATTER_CONSUMED, PROC_REF(on_entered_supermatter)) + /obj/vehicle/sealed/generate_actions() . = ..() initialize_passenger_action_type(/datum/action/vehicle/sealed/climb_out) @@ -158,3 +162,9 @@ /// Sinced sealed vehicles (cars and mechs) don't have riding components, the actual movement is handled here from [/obj/vehicle/sealed/proc/relaymove] /obj/vehicle/sealed/proc/vehicle_move(direction) return FALSE + +/// When we touch a crystal, kill everything inside us +/obj/vehicle/sealed/proc/on_entered_supermatter(atom/movable/vehicle, atom/movable/supermatter) + SIGNAL_HANDLER + for (var/mob/passenger as anything in occupants) + passenger.Bump(supermatter) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index fb237393338..c8cab1a7dc1 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -77,7 +77,7 @@ if(!eddie_murphy) return ..() user.visible_message(span_warning("[user] begins cleaning [eddie_murphy] out of [src]."), span_warning("You begin cleaning [eddie_murphy] out of [src]...")) - if(!do_after(user, 60, target = src)) + if(!do_after(user, 6 SECONDS, target = src)) return ..() user.visible_message(span_warning("[user] cleans [eddie_murphy] out of [src]."), span_warning("You manage to get [eddie_murphy] out of [src].")) eddie_murphy.forceMove(drop_location()) diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm index ed9884a9ea3..c3780099966 100644 --- a/code/modules/vehicles/vehicle_actions.dm +++ b/code/modules/vehicles/vehicle_actions.dm @@ -353,7 +353,7 @@ rider.client.give_award(/datum/award/achievement/misc/tram_surfer, rider) vehicle.grinding = TRUE vehicle.icon_state = "[initial(vehicle.icon_state)]-grind" - addtimer(CALLBACK(vehicle, TYPE_PROC_REF(/obj/vehicle/ridden/scooter/skateboard/, grind)), 2) + addtimer(CALLBACK(vehicle, TYPE_PROC_REF(/obj/vehicle/ridden/scooter/skateboard/, grind)), 0.2 SECONDS) else vehicle.obj_flags &= ~BLOCK_Z_OUT_DOWN rider.spin(spintime = 4, speed = 1) diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm index f6e5f7c4e28..08cb75df2d4 100644 --- a/code/modules/vehicles/vehicle_key.dm +++ b/code/modules/vehicles/vehicle_key.dm @@ -20,7 +20,7 @@ return SHAME user.visible_message(span_suicide("[user] is putting \the [src] in [user.p_their()] ear and starts [user.p_their()] motor! It looks like [user.p_theyre()] trying to commit suicide!")) user.say("Vroom vroom!!", forced="secway key suicide") //Not doing a shamestate here, because even if they fail to speak they're spinning. - addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living/, gib)), 20) + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living/, gib)), 2 SECONDS) return MANUAL_SUICIDE /obj/item/key/janitor @@ -46,7 +46,7 @@ if(SKILL_LEVEL_APPRENTICE to SKILL_LEVEL_JOURNEYMAN) //At least they tried user.visible_message(span_suicide("[user] is putting \the [src] in [user.p_their()] mouth and has inefficiently become one with the janicart! It looks like [user.p_theyre()] trying to commit suicide!")) user.AddElement(/datum/element/cleaning) - addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), 51) + addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), 5.1 SECONDS) return MANUAL_SUICIDE if(SKILL_LEVEL_EXPERT to SKILL_LEVEL_MASTER) //They are worthy enough, but can it go even further beyond? user.visible_message(span_suicide("[user] is putting \the [src] in [user.p_their()] mouth and has skillfully become one with the janicart! It looks like [user.p_theyre()] trying to commit suicide!")) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index a344140d181..42f6ff2a436 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -14,8 +14,12 @@ premium = list() */ +/// List of vending machines that players can restock, so only vending machines that are on station or don't have a unique condition. +GLOBAL_LIST_EMPTY(vending_machines_to_restock) + /// Maximum amount of items in a storage bag that we're transferring items to the vendor from. #define MAX_VENDING_INPUT_AMOUNT 30 +#define CREDITS_DUMP_THRESHOLD 50 /** * # vending record datum * @@ -178,6 +182,8 @@ var/displayed_currency_name = " cr" ///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. + var/credits_contained = 0 /** * Is this item on station or not * @@ -256,6 +262,7 @@ onstation = FALSE if(circuit) circuit.onstation = onstation //sync up the circuit so the pricing schema is carried over if it's reconstructed. + else if(HAS_TRAIT(SSstation, STATION_TRAIT_VENDING_SHORTAGE)) for (var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) /** @@ -264,20 +271,27 @@ */ var/max_amount = rand(CEILING(product_record.amount * 0.5, 1), product_record.amount) product_record.amount = rand(0, max_amount) + credits_contained += rand(0, 1) //randomly add a few credits to the machine to make it look like it's been used, proportional to the amount missing. if(tiltable && prob(6)) // 1 in 17 chance to start tilted (as an additional hint to the station trait behind it) INVOKE_ASYNC(src, PROC_REF(tilt), loc) + credits_contained = 0 // If it's tilted, it's been looted, so no credits for you. else if(circuit && (circuit.onstation != onstation)) //check if they're not the same to minimize the amount of edited values. onstation = circuit.onstation //if it was constructed outside mapload, sync the vendor up with the circuit's var so you can't bypass price requirements by moving / reconstructing it off station. + if(onstation && !onstation_override) + AddComponent(/datum/component/payment, 0, SSeconomy.get_dep_account(payment_department), PAYMENT_VENDING) + GLOB.vending_machines_to_restock += src //We need to keep track of the final onstation vending machines so we can keep them restocked. + register_context() /obj/machinery/vending/Destroy() QDEL_NULL(wires) QDEL_NULL(coin) QDEL_NULL(bill) QDEL_NULL(sec_radio) + GLOB.vending_machines_to_restock -= src return ..() -/obj/machinery/vending/can_speak() - return !shut_up +/obj/machinery/vending/can_speak(allow_mimes) + return is_operational && !shut_up && ..() /obj/machinery/vending/emp_act(severity) . = ..() @@ -329,6 +343,24 @@ if(light_mask && !(machine_stat & BROKEN) && powered()) . += emissive_appearance(icon, light_mask, src) +/obj/machinery/vending/examine(mob/user) + . = ..() + if(isnull(refill_canister)) + return // you can add the comment here instead + if((total_loaded_stock() / total_max_stock()) < 1) + . += span_notice("\The [src] can be restocked with [span_boldnotice("\a [initial(refill_canister.machine_name)] [initial(refill_canister.name)]")] with the panel open.") + 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.") + else if (credits_contained > PAYCHECK_CREW) + . += span_notice("It should have at least a full paycheck worth of credits inside!") + /** + * Intentionally leaving out a case for zero credits as it should be covered by the vending machine's stock being full, + * or covered by first case if items were returned. + */ + + /obj/machinery/vending/atom_break(damage_flag) . = ..() if(!.) @@ -357,6 +389,7 @@ continue var/obj/obj_to_dump = new dump_path(loc) + on_dispense(obj_to_dump) step(obj_to_dump, pick(GLOB.alldirs)) found_anything = TRUE dump_amount++ @@ -515,6 +548,28 @@ return . +/** + * After-effects of refilling a vending machine from a refill canister + * + * This takes the amount of products restocked and gives the user our contained credits if needed, + * sending the user a fitting message. + * + * Arguments: + * * user - the user restocking us + * * restocked - the amount of items we've been refilled with + */ +/obj/machinery/vending/proc/post_restock(mob/living/user, restocked) + if(!restocked) + 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." : "."]")) + 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) + try_put_in_hand(payday, user) + credits_contained = 0 + /** * Refill our inventory from the passed in product list into the record list * @@ -611,6 +666,24 @@ else //no category found - dump it into standard stock products[record.product_path] = record.amount +/** + * Returns the total amount of items in the vending machine based on the product records and premium records, but not contraband + */ +/obj/machinery/vending/proc/total_loaded_stock() + var/total = 0 + for(var/datum/data/vending_product/record as anything in product_records + coin_records) + total += record.amount + return total + +/** + * Returns the total amount of items in the vending machine based on the product records and premium records, but not contraband + */ +/obj/machinery/vending/proc/total_max_stock() + var/total_max = 0 + for(var/datum/data/vending_product/record as anything in product_records + coin_records) + total_max += record.max_amount + return total_max + /obj/machinery/vending/crowbar_act(mob/living/user, obj/item/attack_item) if(!component_parts) return FALSE @@ -653,11 +726,8 @@ to_chat(user, span_warning("[canister] is empty!")) else // instantiate canister if needed - var/transferred = restock(canister) - if(transferred) - to_chat(user, span_notice("You loaded [transferred] items in [src].")) - else - to_chat(user, span_warning("There's nothing to restock!")) + var/restocked = restock(canister) + post_restock(user, restocked) return if(compartmentLoadAccessCheck(user) && !user.combat_mode) @@ -707,7 +777,7 @@ * freebies - number of free items to vend */ /obj/machinery/vending/proc/freebie(freebies) - visible_message(span_notice("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"]!")) + visible_message(span_notice("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"][credits_contained > 0 ? " and some credits" : ""]!")) for(var/i in 1 to freebies) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) @@ -719,13 +789,15 @@ if(!dump_path) continue if(record.amount > LAZYLEN(record.returned_products)) //always give out new stuff that costs before free returned stuff, because of the risk getting gibbed involved - new dump_path(get_turf(src)) + var/obj/item/free_stuff = new dump_path(get_turf(src)) + on_dispense(free_stuff) else var/obj/returned_obj_to_dump = LAZYACCESS(record.returned_products, LAZYLEN(record.returned_products)) //first in, last out LAZYREMOVE(record.returned_products, returned_obj_to_dump) returned_obj_to_dump.forceMove(get_turf(src)) record.amount-- break + deploy_credits() /** * Tilts ontop of the atom supplied, if crit is true some extra shit can happen. See [fall_and_crush] for return values. @@ -1063,6 +1135,7 @@ vending_machine_input[inserted_item.type] = 1 loaded_items++ + /obj/machinery/vending/unbuckle_mob(mob/living/buckled_mob, force = FALSE, can_fall = TRUE) if(!force) return @@ -1084,22 +1157,23 @@ /obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/replacer) if(!istype(replacer)) return FALSE - if((obj_flags & NO_DECONSTRUCTION) && !replacer.works_from_distance) + if(!replacer.works_from_distance) return FALSE if(!component_parts || !refill_canister) return FALSE - var/moved = 0 - if(panel_open || replacer.works_from_distance) - if(replacer.works_from_distance) - display_parts(user) - for(var/replacer_item in replacer) - if(istype(replacer, refill_canister)) - moved += restock(replacer_item) - else - display_parts(user) - if(moved) - to_chat(user, span_notice("[moved] items restocked.")) + if(!panel_open || replacer.works_from_distance) + to_chat(user, display_parts(user)) + + if(!panel_open && !replacer.works_from_distance) + return FALSE + + var/restocked = 0 + for(var/replacer_item in replacer) + if(istype(replacer_item, refill_canister)) + restocked += restock(replacer_item) + post_restock(user, restocked) + if(restocked > 0) replacer.play_rped_sound() return TRUE @@ -1115,14 +1189,14 @@ return TRUE /obj/machinery/vending/interact(mob/user) - if (!isAI(user)) + if (!HAS_AI_ACCESS(user)) if(seconds_electrified && !(machine_stat & NOPOWER)) if(shock(user, 100)) return if(tilted && !user.buckled && !isAdminGhostAI(user)) to_chat(user, span_notice("You begin righting [src].")) - if(do_after(user, 50, target=src)) + if(do_after(user, 5 SECONDS, target=src)) untilt(user) return @@ -1206,19 +1280,25 @@ /obj/machinery/vending/ui_data(mob/user) . = list() var/obj/item/card/id/card_used + var/held_cash = 0 if(isliving(user)) var/mob/living/living_user = user card_used = living_user.get_idcard(TRUE) + held_cash = living_user.tally_physical_credits() + + var/list/user_data = null if(card_used?.registered_account) - .["user"] = list() - .["user"]["name"] = card_used.registered_account.account_holder - .["user"]["cash"] = fetch_balance_to_use(card_used) + user_data = list() + user_data["name"] = card_used.registered_account.account_holder + user_data["cash"] = fetch_balance_to_use(card_used) + held_cash if(card_used.registered_account.account_job) - .["user"]["job"] = card_used.registered_account.account_job.title - .["user"]["department"] = card_used.registered_account.account_job.paycheck_department + user_data["job"] = card_used.registered_account.account_job.title + user_data["department"] = card_used.registered_account.account_job.paycheck_department else - .["user"]["job"] = "No Job" - .["user"]["department"] = DEPARTMENT_UNASSIGNED + user_data["job"] = "No Job" + user_data["department"] = DEPARTMENT_UNASSIGNED + .["user"] = user_data + .["stock"] = list() for (var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) @@ -1333,25 +1413,12 @@ vend_ready = TRUE return if(onstation) + // Here we do additional handing ahead of the payment component's logic, such as age restrictions and additional logging var/obj/item/card/id/card_used + var/mob/living/living_user if(isliving(usr)) - var/mob/living/living_user = usr + living_user = usr card_used = living_user.get_idcard(TRUE) - if(!card_used) - speak("No card found.") - flick(icon_deny,src) - vend_ready = TRUE - return - else if (!card_used.registered_account) - speak("No account found.") - flick(icon_deny,src) - vend_ready = TRUE - return - else if(!card_used.registered_account.account_job) - speak("Departmental accounts have been blacklisted from personal expenses due to embezzlement.") - flick(icon_deny, src) - vend_ready = TRUE - return else if(age_restrictions && item_record.age_restricted && (!card_used.registered_age || card_used.registered_age < AGE_MINOR)) speak("You are not of legal age to purchase [item_record.name].") if(!(usr in GLOB.narcd_underages)) @@ -1365,7 +1432,8 @@ vend_ready = TRUE return - if(!proceed_payment(card_used, item_record, price_to_use)) + if(!proceed_payment(card_used, living_user, item_record, price_to_use)) + vend_ready = TRUE return if(last_shopper != REF(usr) || purchase_message_cooldown < world.time) @@ -1374,13 +1442,14 @@ purchase_message_cooldown = world.time + 5 SECONDS //This is not the best practice, but it's safe enough here since the chances of two people using a machine with the same ref in 5 seconds is fuck low last_shopper = REF(usr) - use_power(active_power_usage) + use_energy(active_power_usage) if(icon_vend) //Show the vending animation if needed flick(icon_vend,src) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) var/obj/item/vended_item if(!LAZYLEN(item_record.returned_products)) //always give out free returned stuff first, e.g. to avoid walling a traitor objective in a bag behind paid items vended_item = new item_record.product_path(get_turf(src)) + on_dispense(vended_item) else vended_item = LAZYACCESS(item_record.returned_products, LAZYLEN(item_record.returned_products)) //first in, last out LAZYREMOVE(item_record.returned_products, vended_item) @@ -1395,6 +1464,10 @@ SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[item_record.product_path]")) vend_ready = TRUE +///A proc meant to perform custom behavior on newly dispensed items. +/obj/machinery/vending/proc/on_dispense(obj/item/vended_item) + return + /** * Returns the balance that the vendor will use for proceeding payment. Most vendors would want to use the user's * card's account credits balance. @@ -1407,11 +1480,15 @@ /** * Handles payment processing: discounts, logging, balance change etc. * arguments: - * paying_id_card - the id card that will be billed for the product - * product_to_vend - the product record of the item we're trying to vend - * price_to_use - price of the item we're trying to vend + * paying_id_card - the id card that will be billed for the product. + * mob_paying - the mob that is trying to purchase the item. + * product_to_vend - the product record of the item we're trying to vend. + * price_to_use - price of the item we're trying to vend. */ -/obj/machinery/vending/proc/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) +/obj/machinery/vending/proc/proceed_payment(obj/item/card/id/paying_id_card, mob/living/mob_paying, datum/data/vending_product/product_to_vend, price_to_use) + if(QDELETED(paying_id_card)) //not available(null) or somehow is getting destroyed + speak("You do not possess an ID to purchase [product_to_vend.name].") + return FALSE var/datum/bank_account/account = paying_id_card.registered_account if(account.account_job && account.account_job.paycheck_department == payment_department) price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. @@ -1419,7 +1496,7 @@ price_to_use = product_to_vend.custom_premium_price ? product_to_vend.custom_premium_price : extra_price if(LAZYLEN(product_to_vend.returned_products)) price_to_use = 0 //returned items are free - if(price_to_use && !account.adjust_money(-price_to_use, "Vending: [product_to_vend.name]")) + if(price_to_use && (attempt_charge(src, mob_paying, price_to_use) & COMPONENT_OBJ_CANCEL_CHARGE)) speak("You do not possess the funds to purchase [product_to_vend.name].") flick(icon_deny,src) vend_ready = TRUE @@ -1427,10 +1504,10 @@ //actual payment here var/datum/bank_account/paying_id_account = SSeconomy.get_dep_account(payment_department) if(paying_id_account) - paying_id_account.adjust_money(price_to_use) SSblackbox.record_feedback("amount", "vending_spent", price_to_use) SSeconomy.track_purchase(account, price_to_use, name) log_econ("[price_to_use] credits were inserted into [src] by [account.account_holder] to buy [product_to_vend].") + credits_contained += round(price_to_use * 0.2) return TRUE /obj/machinery/vending/process(seconds_per_tick) @@ -1545,11 +1622,13 @@ * Arguments: * * loaded_item - the item being loaded * * user - the user doing the loading + * * send_message - should we send a message to the user if the item can't be loaded? Either a to_chat or a speak depending on vending type. */ -/obj/machinery/vending/proc/canLoadItem(obj/item/loaded_item, mob/user) +/obj/machinery/vending/proc/canLoadItem(obj/item/loaded_item, mob/user, send_message = TRUE) if(!length(loaded_item.contents) && ((loaded_item.type in products) || (loaded_item.type in premium) || (loaded_item.type in contraband))) return TRUE - to_chat(user, span_warning("[src] does not accept [loaded_item]!")) + if(send_message) + to_chat(user, span_warning("[src] does not accept [loaded_item]!")) return FALSE /obj/machinery/vending/hitby(atom/movable/hitting_atom, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) @@ -1569,6 +1648,41 @@ tilt(fatty=hit_atom) return ..() +/** Drop credits when the vendor is attacked.*/ +/obj/machinery/vending/proc/deploy_credits() + if(credits_contained <= 0) + return + var/credits_to_remove = min(CREDITS_DUMP_THRESHOLD, round(credits_contained)) + var/obj/item/holochip/holochip = new(loc, credits_to_remove) + credits_contained = max(0, credits_contained - credits_to_remove) + SSblackbox.record_feedback("amount", "vending machine looted", holochip.credits) + +/obj/machinery/vending/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(tilted && !held_item) + context[SCREENTIP_CONTEXT_LMB] = "Right machine" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item?.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = panel_open ? "Close panel" : "Open panel" + return CONTEXTUAL_SCREENTIP_SET + + if(panel_open && held_item?.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unsecure" : "Secure" + return CONTEXTUAL_SCREENTIP_SET + + if(panel_open && held_item?.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + + if(!isnull(held_item) && (vending_machine_input[held_item.type] || canLoadItem(held_item, user, send_message = FALSE))) + context[SCREENTIP_CONTEXT_LMB] = "Load item" + 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]" + return TRUE + return NONE + /obj/machinery/vending/custom name = "Custom Vendor" icon_state = "custom" @@ -1594,16 +1708,19 @@ if(id_card?.registered_account && id_card.registered_account == linked_account) return TRUE -/obj/machinery/vending/custom/canLoadItem(obj/item/loaded_item, mob/user) +/obj/machinery/vending/custom/canLoadItem(obj/item/loaded_item, mob/user, send_message = TRUE) . = FALSE if(loaded_item.flags_1 & HOLOGRAM_1) - speak("This vendor cannot accept nonexistent items.") + if(send_message) + speak("This vendor cannot accept nonexistent items.") return if(loaded_items >= max_loaded_items) - speak("There are too many items in stock.") + if(send_message) + speak("There are too many items in stock.") return if(isstack(loaded_item)) - speak("Loose items may cause problems, try to use it inside wrapping paper.") + if(send_message) + speak("Loose items may cause problems, try to use it inside wrapping paper.") return if(loaded_item.custom_price) return TRUE @@ -1726,7 +1843,7 @@ last_shopper = REF(usr) /// Remove the item loaded_items-- - use_power(active_power_usage) + use_energy(active_power_usage) vending_machine_input[choice] = max(vending_machine_input[choice] - 1, 0) if(user.CanReach(src) && user.put_in_hands(dispensed_item)) to_chat(user, span_notice("You take [dispensed_item.name] out of the slot.")) diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index 229b19aeadb..a043a365046 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -21,6 +21,7 @@ /obj/item/assembly/timer = 2, /obj/item/assembly/voice = 2, /obj/item/stock_parts/cell/high = 1, + /obj/item/market_uplink/blackmarket = 1, ) premium = list( /obj/item/assembly/igniter/condenser = 2, diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 59bd06135bb..17555e66a87 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -57,7 +57,7 @@ /obj/item/clothing/suit/costume/gothcoat = 1, /obj/item/clothing/glasses/eyepatch = 1, /obj/item/clothing/glasses/eyepatch/medical = 1, - /obj/item/clothing/under/costume/gi = 1, + /obj/item/clothing/under/costume/gi = 4, /obj/item/clothing/head/soft/propeller_hat = 1, /obj/item/clothing/neck/bowtie/rainbow = 1, ), @@ -207,6 +207,7 @@ /obj/item/clothing/mask/muzzle = 2, /obj/item/clothing/shoes/ducky_shoes = 1, /obj/item/clothing/shoes/clown_shoes/meown_shoes = 1, + /obj/item/clothing/shoes/clown_shoes/moffers = 1, /obj/item/clothing/suit/costume/judgerobe = 1, /obj/item/clothing/head/costume/lobsterhat = 1, /obj/item/clothing/under/costume/lobster = 1, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index e805e0dbf98..7f1d97ad5b8 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -82,7 +82,7 @@ /obj/item/clothing/under/costume/kilt = 1, /obj/item/clothing/under/dress/striped = 1, /obj/item/clothing/under/dress/sailor = 1, - /obj/item/clothing/under/dress/redeveninggown = 1, + /obj/item/clothing/under/dress/eveninggown = 1, /obj/item/clothing/under/misc/pj/blue = 2, /obj/item/clothing/under/misc/pj/red = 2, ), diff --git a/code/modules/vending/hotdog.dm b/code/modules/vending/hotdog.dm new file mode 100644 index 00000000000..094beccb413 --- /dev/null +++ b/code/modules/vending/hotdog.dm @@ -0,0 +1,56 @@ +///A special hotdog vending machine found in the cafeteria at the museum away mission, or during the hotdog holiday. +/obj/machinery/vending/hotdog + name = "\improper Hotdoggo-Vend" + desc = "An outdated hotdog vending machine, its prices stuck to those of 20 or so years ago." + icon_state = "hotdog-vendor" + icon_deny = "hotdog-vendor-deny" + panel_type = "panel17" + product_slogans = "Meatier than ever!;Now with 20% more MSG!;HOTDOGS!;Now Tirizan-friendly!" + product_ads = "Your best and only automatic hotdog dispenser!;Serving you the finest buns since 2469!;Comes in 12 different flavors!" + vend_reply = "Have a scrumptious meal!" + light_mask = "hotdog-vendor-light-mask" + default_price = PAYCHECK_LOWER + product_categories = list( + list( + "name" = "Hotdogs", + "icon" = "hotdog", + "products" = list( + /obj/item/food/hotdog = 8, + /obj/item/food/pigblanket = 4, + /obj/item/food/danish_hotdog = 4, + /obj/item/food/little_hawaii_hotdog = 4, + /obj/item/food/butterdog = 4, + /obj/item/food/plasma_dog_supreme = 2, + ), + ), + list( + name = "Sausages", + "icon" = FA_ICON_BACON, + "products" = list( + /obj/item/food/sausage = 8, + /obj/item/food/tiziran_sausage = 4, + /obj/item/food/fried_blood_sausage = 4, + ), + ), + list( + "name" = "Sauces", + "icon" = FA_ICON_BOWL_FOOD, + "products" = list( + /obj/item/reagent_containers/condiment/pack/ketchup = 4, + /obj/item/reagent_containers/condiment/pack/hotsauce = 4, + /obj/item/reagent_containers/condiment/pack/bbqsauce = 4, + /obj/item/reagent_containers/condiment/pack/soysauce = 4, + /obj/item/reagent_containers/condiment/pack/mayonnaise = 4, + ), + ), + ) + refill_canister = /obj/item/vending_refill/hotdog + +/obj/item/vending_refill/hotdog + machine_name = "\improper Hotdoggo-Vend" + icon_state = "refill_snack" + +/// Cute little thing that sets it apart from the other food vending mahicnes. I mean, you don't find this every day. +/obj/machinery/vending/hotdog/on_dispense(obj/item/vended_item) + if(istype(vended_item, /obj/item/food)) + ADD_TRAIT(vended_item, TRAIT_FOOD_CHEF_MADE, VENDING_MACHINE_TRAIT) diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index d8229121490..a1d11c30727 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -48,7 +48,7 @@ return return ..() -/obj/machinery/vending/sustenance/labor_camp/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) +/obj/machinery/vending/sustenance/labor_camp/proceed_payment(obj/item/card/id/paying_id_card, mob/living/mob_paying, datum/data/vending_product/product_to_vend, price_to_use) if(!istype(paying_id_card, /obj/item/card/id/advanced/prisoner)) speak("I don't take bribes! Pay with labor points!") return FALSE diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 7f75cdde842..f3ca3a08e3f 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -496,6 +496,7 @@ /obj/item/clothing/under/rank/civilian/lawyer/black/skirt = 1, /obj/item/clothing/shoes/laceup = 2, /obj/item/radio/headset/headset_srv = 2, + /obj/item/storage/box/evidence = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe payment_department = ACCOUNT_SRV diff --git a/code/modules/wiremod/components/sensors/view_sensor.dm b/code/modules/wiremod/components/sensors/view_sensor.dm index 1725044c035..1a86f2b4c8e 100644 --- a/code/modules/wiremod/components/sensors/view_sensor.dm +++ b/code/modules/wiremod/components/sensors/view_sensor.dm @@ -11,7 +11,7 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL - power_usage_per_input = 10 //Normal components have 1 + energy_usage_per_input = 0.01 * STANDARD_CELL_CHARGE //Normal components have 0.001 * STANDARD_CELL_CHARGE ///Allows setting the range of the view sensor var/datum/port/input/range diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index 39f33809073..530f73ded8c 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -47,8 +47,8 @@ /// Used to determine the y position of the component within the UI var/rel_y = 0 - /// The power usage whenever this component receives an input - var/power_usage_per_input = 1 + /// The energy usage whenever this component receives an input. + var/energy_usage_per_input = 0.001 * STANDARD_CELL_CHARGE /// Whether the component is removable or not. Only affects user UI var/removable = TRUE @@ -266,10 +266,10 @@ message_admins("[display_name] tried to execute on [parent.get_creator_admin()] that has admin_only set to 0") return FALSE - var/flags = SEND_SIGNAL(parent, COMSIG_CIRCUIT_PRE_POWER_USAGE, power_usage_per_input) + var/flags = SEND_SIGNAL(parent, COMSIG_CIRCUIT_PRE_POWER_USAGE, energy_usage_per_input) if(!(flags & COMPONENT_OVERRIDE_POWER_USAGE)) var/obj/item/stock_parts/cell/cell = parent.get_cell() - if(!cell?.use(power_usage_per_input)) + if(!cell?.use(energy_usage_per_input)) return FALSE if((!port || port.trigger == PROC_REF(input_received)) && (circuit_flags & CIRCUIT_FLAG_INPUT_SIGNAL) && !COMPONENT_TRIGGERED_BY(trigger_input, port)) @@ -340,7 +340,7 @@ . += create_ui_notice(initial(shell.name), "green", "plus-square") if(length(input_ports)) - . += create_ui_notice("Power Usage Per Input: [power_usage_per_input]", "orange", "bolt") + . += create_ui_notice("Energy Usage Per Input: [display_energy(energy_usage_per_input)]", "orange", "bolt") /** diff --git a/code/modules/wiremod/core/duplicator.dm b/code/modules/wiremod/core/duplicator.dm index 7b373db6e35..2f248d11a89 100644 --- a/code/modules/wiremod/core/duplicator.dm +++ b/code/modules/wiremod/core/duplicator.dm @@ -233,7 +233,7 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list( var/txt switch(option) if("File") - txt = file2text(input(usr, "Input File") as file|null) + txt = file2text(input(usr, "Input File") as null|file) if("Direct Input") txt = input(usr, "Input JSON", "Input JSON") as text|null diff --git a/code/modules/wiremod/core/marker.dm b/code/modules/wiremod/core/marker.dm index 50d4324c154..31821c6d8c3 100644 --- a/code/modules/wiremod/core/marker.dm +++ b/code/modules/wiremod/core/marker.dm @@ -79,7 +79,7 @@ item_choice.image = item_appearance selectable_targets[REF(item)] = item_choice - var/picked_ref = show_radial_menu(user, src, selectable_targets, uniqueid = TRUE, radius = 38, custom_check = CALLBACK(src, PROC_REF(check_menu), user, target), tooltips = TRUE) + var/picked_ref = show_radial_menu(user, src, selectable_targets, radius = 38, custom_check = CALLBACK(src, PROC_REF(check_menu), user, target), tooltips = TRUE) if(!picked_ref) return diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 57bb2ed45cb..3cd9a3d6bc0 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -20,16 +20,29 @@ new /obj/item/circuit_component/bci_core, ), SHELL_CAPACITY_SMALL, starting_circuit = circuit) -/obj/item/organ/internal/cyberimp/bci/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/obj/item/organ/internal/cyberimp/bci/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(), +) if (owner) // Otherwise say_dead will be called. // It's intentional that a circuit for a dead person does not speak from the shell. if (owner.stat == DEAD) return - owner.say(message, forced = "circuit speech") - else - return ..() + forced = "circuit speech" + return owner.say(arglist(args)) + + return ..() /obj/item/organ/internal/cyberimp/bci/proc/action_comp_registered(datum/source, obj/item/circuit_component/equipment_action/action_comp) SIGNAL_HANDLER @@ -176,15 +189,15 @@ COMSIG_LIVING_ELECTROCUTE_ACT, )) -/obj/item/circuit_component/bci_core/proc/on_borg_charge(datum/source, amount) +/obj/item/circuit_component/bci_core/proc/on_borg_charge(datum/source, datum/callback/charge_cell, seconds_per_tick) SIGNAL_HANDLER if (isnull(parent.cell)) return - parent.cell.give(amount) + charge_cell.Invoke(parent.cell, seconds_per_tick) -/obj/item/circuit_component/bci_core/proc/on_electrocute(datum/source, shock_damage, siemens_coefficient, flags) +/obj/item/circuit_component/bci_core/proc/on_electrocute(datum/source, shock_damage, shock_source, siemens_coefficient, flags) SIGNAL_HANDLER if (isnull(parent.cell)) diff --git a/code/modules/wiremod/shell/dispenser.dm b/code/modules/wiremod/shell/dispenser.dm index 4ea2d03c9d7..4a00f7fed88 100644 --- a/code/modules/wiremod/shell/dispenser.dm +++ b/code/modules/wiremod/shell/dispenser.dm @@ -18,10 +18,9 @@ var/list/obj/item/stored_items = list() var/locked = FALSE -/obj/structure/dispenser_bot/deconstruct(disassembled) +/obj/structure/dispenser_bot/atom_deconstruct(disassembled = TRUE) for(var/obj/item/stored_item as anything in stored_items) remove_item(stored_item) - return ..() /obj/structure/dispenser_bot/Destroy() QDEL_LIST(stored_items) diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index 96fe3b2fa0a..7d547645cd1 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -74,11 +74,11 @@ UnregisterSignal(shell, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) return ..() -/obj/item/circuit_component/bot_circuit/proc/on_borg_charge(datum/source, amount) +/obj/item/circuit_component/bot_circuit/proc/on_borg_charge(datum/source, datum/callback/charge_cell, seconds_per_tick) SIGNAL_HANDLER if (isnull(parent.cell)) return - parent.cell.give(amount) + charge_cell.Invoke(parent.cell, seconds_per_tick) /obj/item/circuit_component/bot_circuit/populate_ports() north = add_input_port("Move North", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index 3a37501e8e1..ff581536713 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -82,6 +82,6 @@ if(!parent?.cell) return var/obj/item/gun/energy/fired_gun = source - var/totransfer = min(100, parent.cell.charge) + var/totransfer = min(100 KILO JOULES, parent.cell.charge) var/transferred = fired_gun.cell.give(totransfer) parent.cell.use(transferred) diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index cacb457149d..f3c2dfe93da 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -15,9 +15,8 @@ var/stored_money = 0 var/locked = FALSE -/obj/structure/money_bot/deconstruct(disassembled) +/obj/structure/money_bot/atom_deconstruct(disassembled = TRUE) new /obj/item/holochip(drop_location(), stored_money) - return ..() /obj/structure/money_bot/proc/add_money(to_add) stored_money += to_add diff --git a/config/game_options.txt b/config/game_options.txt index cb75a28203f..208d4657ced 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -43,7 +43,7 @@ WALK_DELAY 4 ##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0 ##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0 ##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0 +##MULTIPLICATIVE_MOVESPEED /mob/living/basic/slime 0 MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 0 MULTIPLICATIVE_MOVESPEED /mob/living/basic 0 @@ -364,43 +364,16 @@ ROUNDSTART_RACES snail ROUNDSTART_RACES ethereal #ROUNDSTART_RACES jelly #ROUNDSTART_RACES abductor -#ROUNDSTART_RACES synth - -## Including all the various golem subtypes that are better than humans in some ways, but worse in others -#ROUNDSTART_RACES iron_golem -#ROUNDSTART_RACES adamantine_golem -#ROUNDSTART_RACES plasma_golem -#ROUNDSTART_RACES diamond_golem -#ROUNDSTART_RACES gold_golem -#ROUNDSTART_RACES silver_golem -#ROUNDSTART_RACES uranium_golem -#ROUNDSTART_RACES plasteel_golem -#ROUNDSTART_RACES titanium_golem -#ROUNDSTART_RACES plastitanium_golem -#ROUNDSTART_RACES alloy_golem -#ROUNDSTART_RACES wood_golem -#ROUNDSTART_RACES sand_golem -#ROUNDSTART_RACES glass_golem -#ROUNDSTART_RACES bluespace_golem -#ROUNDSTART_RACES bananium_golem -#ROUNDSTART_RACES runic_golem -#ROUNDSTART_RACES cloth_golem -#ROUNDSTART_RACES plastic_golem -#ROUNDSTART_RACES bronze_golem -#ROUNDSTART_RACES cardboard_golem -#ROUNDSTART_RACES leather_golem -#ROUNDSTART_RACES durathread_golem -#ROUNDSTART_RACES bone_golem -#ROUNDSTART_RACES snow_golem -#ROUNDSTART_RACES metallic_hydrogen_golem +#ROUNDSTART_RACES snail ## Races that are straight upgrades. If these are on expect powergamers to always pick them #ROUNDSTART_RACES skeleton #ROUNDSTART_RACES zombie -#ROUNDSTART_RACES slime #ROUNDSTART_RACES pod -#ROUNDSTART_RACES military_synth -#ROUNDSTART_RACES agent + +## Races that are radical departures to what a species is, so while they technically can be roundstart - it's probably not wise +#ROUNDSTART_RACES android +#ROUNDSTART_RACES golem ## SKYRAT RACES DOWN THERE ROUNDSTART_RACES mammal diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt index 75b03d6bdb8..3218446789c 100644 --- a/config/lavaruinblacklist.txt +++ b/config/lavaruinblacklist.txt @@ -26,3 +26,21 @@ _maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm ##MISC #_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_watcher_grave.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_ww_vault.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm diff --git a/config/logging.txt b/config/logging.txt index 2635197a796..2bd9e90fcd9 100644 --- a/config/logging.txt +++ b/config/logging.txt @@ -39,7 +39,7 @@ LOG_GAME LOG_MANIFEST ## log mecha actions -# LOG_MECHA +LOG_MECHA ## log OOC channel LOG_OOC diff --git a/dependencies.sh b/dependencies.sh index 04e1fb62404..300e2826c6f 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -5,14 +5,15 @@ # byond version export BYOND_MAJOR=515 -export BYOND_MINOR=1630 +export BYOND_MINOR=1633 #rust_g git tag export RUST_G_VERSION=3.1.0 #node version export NODE_VERSION=14 -export NODE_VERSION_PRECISE=14.16.1 +export NODE_VERSION_LTS=20.12.0 +export NODE_VERSION_COMPAT=14.16.1 # SpacemanDMM git tag export SPACEMAN_DMM_VERSION=suite-1.8 @@ -24,7 +25,7 @@ export PYTHON_VERSION=3.9.0 export AUXLUA_REPO=tgstation/auxlua #auxlua git tag -export AUXLUA_VERSION=1.4.1 +export AUXLUA_VERSION=1.4.4 #hypnagogic repo export CUTTER_REPO=actioninja/hypnagogic diff --git a/html/changelogs/AutoChangeLog-pr-1001.yml b/html/changelogs/AutoChangeLog-pr-1001.yml deleted file mode 100644 index 9c8b09dffb4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1001.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "xXPawnStarrXx" -delete-after: True -changes: - - image: "added GAGS versions of command stripper outfits." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1003.yml b/html/changelogs/AutoChangeLog-pr-1003.yml deleted file mode 100644 index 07444b31204..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1003.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "ReturnToZender" -delete-after: True -changes: - - balance: "NTR's ACCESS_CREMATORIUM replaced with ACCESS_SERVICE" - - rscadd: "Assistants on-station may be pleased to hear that they can now wear Head of Staff pet collars again. ...Again." - - rscadd: "Nanotrasen has deemed it fit to order an upgrade to all Consultant offices on stations in the Spinward Sector. Check them out!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1010.yml b/html/changelogs/AutoChangeLog-pr-1010.yml deleted file mode 100644 index a5d67d73415..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1010.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - rscadd: "Ghosts without clients get sent back into the menu after a while." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1012.yml b/html/changelogs/AutoChangeLog-pr-1012.yml deleted file mode 100644 index fc63ea8d187..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1012.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Vynzill" -delete-after: True -changes: - - rscadd: "Added more perfumes to loadout." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1014.yml b/html/changelogs/AutoChangeLog-pr-1014.yml deleted file mode 100644 index cb7b0e6e646..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1014.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - rscdel: "Removes the Dauntless cameras" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1020.yml b/html/changelogs/AutoChangeLog-pr-1020.yml deleted file mode 100644 index 0be191acd10..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1020.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Sylphet" -delete-after: True -changes: - - rscadd: "adds lunchboxes that hold food and drinks to the loadout" - - image: "added lunchbox sprites" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1031.yml b/html/changelogs/AutoChangeLog-pr-1031.yml deleted file mode 100644 index 4ddad28fa0b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1031.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "NSFW Headshots no longer override regular ones" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1033.yml b/html/changelogs/AutoChangeLog-pr-1033.yml deleted file mode 100644 index 1ebca16533c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1033.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - rscadd: "Adds backup ways for the book of kindred to spawn, either spawning on a curator or on the codex gigas" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1037.yml b/html/changelogs/AutoChangeLog-pr-1037.yml deleted file mode 100644 index 9f34dbacb07..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1037.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "xXPawnStarrXx" -delete-after: True -changes: - - code_imp: "removed donator requirement from loadout flowers." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1038.yml b/html/changelogs/AutoChangeLog-pr-1038.yml deleted file mode 100644 index e8fab5bf22e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1038.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "The RBMK can now handle more power generation before going into meltdown with upgraded parts, and also generates less power with upgraded parts." - - bugfix: "Fixes the RBMK having an infinite meltdown state when safeties trigger at the same time as a meltdown." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1053.yml b/html/changelogs/AutoChangeLog-pr-1053.yml deleted file mode 100644 index 89392420e97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1053.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "xXPawnStarrXx" -delete-after: True -changes: - - qol: "made DeForest medipens refillable." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1061.yml b/html/changelogs/AutoChangeLog-pr-1061.yml deleted file mode 100644 index 71884387bf5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1061.yml +++ /dev/null @@ -1,34 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - rscadd: "Decapacitated bloodsuckers can now talk!" - - rscadd: "The stat bar will show you the threshold for exiting frenzy now too when you are frenzying." - - rscadd: "Bloodsucker abilities now will show their level when you hover over them. Trust me, this was really neccessary." - - rscadd: "Tremere now also get informed of how much blood they need to pay for level ups." - - rscadd: "At level 3, haste will now remove stuns and do a non-stunning dash" - - rscadd: "Bloodsucker blood display now always updates when a bloodsucker's blood level is changed" - - rscadd: "Bloodsuckers can now examine hearts to see if they are valid for the heart thief objective" - - rscadd: "Bloodsucker vassals now clean up any traits gained from their tenure as a vampire's minion." - - rscadd: "Favorite vassals now properly clean up their effects once the antag datum is lost." - - rscadd: "Bloodsucker synths will be able to heal their prosthetic limbs, but normal bloodsuckers still cannot." - - rscadd: "When you exiit torpor as a bloodsucker, you will completely heal any toxin and oxygen damage, as you should already be immune to it. This is a safety feature." - - rscadd: "Entering a coffin will normalize your temperature and extinguish you if you're on fire, if you are a bloodsucker." - - bugfix: "bloodsucker vampire bats will no longer /list you when attacking" - - bugfix: "Hopefully fixes some torpor loops related to frenzy" - - bugfix: "Hopefully fixes bloodsuckers cryoing not removing vassal datums" - - bugfix: "Bloodsuckers can no longer use veil of many faces while unconcious" - - bugfix: "lizard bloodsuckers will no longer suffer from heat for a long time" - - bugfix: "The ventrue objective now properly succeeds if you have sired a vampire" - - bugfix: "Livers are no longer required for bloodsuckers to live, as it caused them toxin damage which overrode the trait that made them immune to toxins." - - bugfix: "Entering torpor now accounts for all damage types, even when you should be immune to them. This is to ensure you enter torpor to heal those damage types in the case of odd behaviour." - - balance: "coffins should now set your temperature to normal and extinguish you." - - balance: "bloodsucker level up cost is now 15% of max blood, down from 20%" - - balance: "Caps humantiy loss at 50 humanity/500 blood to frenzy, and makes it remove your masquerade ability." - - balance: "Bloodsucker bats now have human runspeed" - - balance: "Blood cost for vassalizing was almost completely removed, now only taking tiny amounts of blood to do so." - - balance: "Fortitude now gives you burn resistance, just 20% less than brute resistance" - - balance: "Can no longer gut bloodsuckers" - - balance: "Bloodsuckers loosing their heart will make the vampire unable to use their abilities or even regenerateor revive via torpor, you can however regain your heart if you sleep in a coffin with a heart." - - balance: "Stakes now have different properties, the normal stake is fast to stick in someone, but can fall out on it's own, the burnt one takes longer to be put in, but doesn't fall out, the silver stake is the slowest to be stuffed in someone's heart, and is the only stake to be able to cause a Final Death to a sleeping or dead bloodsucker" - - rscdel: "Dullahans can't be bloodsuckers since... their head isn't attached" - - admin: "Bloodsuckers and vassals can now be banned like other antags." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1078.yml b/html/changelogs/AutoChangeLog-pr-1078.yml deleted file mode 100644 index 445eeb3fabd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1078.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "After 3 Lichdom resurrections, announcements will be made about your general phylactery location (the area) when you die. Phylactery binding now requires the object to be at least bulky in size, and it cannot be fireproof, lava proof, or indestructible." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1081.yml b/html/changelogs/AutoChangeLog-pr-1081.yml deleted file mode 100644 index a7b5ae8b41f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1081.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Adds REAL banhammers send people to the void temporarily (similar to immortality talisman or void genetic power) on hit. Hitting someone on combat mode with it sends them to permabrig instead, if they're not already in the permabrig." - - rscdel: "Replaces the High Frequency Blade the wizard gets with a REAL banhammer, and reduces the spell cost from 3 to 2." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1087.yml b/html/changelogs/AutoChangeLog-pr-1087.yml deleted file mode 100644 index e55e67d7ea7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1087.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Makes Moon Station actually a moon now because people made fun of me." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1115.yml b/html/changelogs/AutoChangeLog-pr-1115.yml deleted file mode 100644 index 8ab4174166a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1115.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - balance: "Rebalanced alcohol intoxication effects. A unit of alcohol will now produce the same intoxication regardless if you chug it all at once or sip it over a few minutes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1116.yml b/html/changelogs/AutoChangeLog-pr-1116.yml deleted file mode 100644 index af8f93a76b5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1116.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Swiftfeather" -delete-after: True -changes: - - admin: "Will no longer receive supermatter ate a pipe spam in the log." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1117.yml b/html/changelogs/AutoChangeLog-pr-1117.yml deleted file mode 100644 index 8897e1d997b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1117.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Erol509" -delete-after: True -changes: - - rscadd: "RB-MK2 now has its own tgui panel." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1122.yml b/html/changelogs/AutoChangeLog-pr-1122.yml deleted file mode 100644 index 31f0e1bc56e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1122.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "aKromatopzia" -delete-after: True -changes: - - rscadd: "Unamored versions of the syndicate utility uniforms & half-mask" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1125.yml b/html/changelogs/AutoChangeLog-pr-1125.yml deleted file mode 100644 index f91736bae56..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1125.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - bugfix: "Borers no longer get wasted by ash storms while inside a host" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1127.yml b/html/changelogs/AutoChangeLog-pr-1127.yml deleted file mode 100644 index 69cc794697a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1127.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ReturnToZender (Writing), LT3, Waterpig (Code assistance)" -delete-after: True -changes: - - bugfix: "If you have no custom species set, it will now show your default description." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1128.yml b/html/changelogs/AutoChangeLog-pr-1128.yml deleted file mode 100644 index e14dd5d4c10..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1128.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shayoki" -delete-after: True -changes: - - rscadd: "Adds Boxstation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1131.yml b/html/changelogs/AutoChangeLog-pr-1131.yml deleted file mode 100644 index 7fd4cb4922d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1131.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ReturnToZender (quirk code), TeshariEnjoer (original PR)" -delete-after: True -changes: - - rscadd: "New positive trait, featherweight. Allows you to be picked up instead of fireman's carried. This dipshit yours?" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1134.yml b/html/changelogs/AutoChangeLog-pr-1134.yml deleted file mode 100644 index fc923fccb70..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1134.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "IgiariValkyr" -delete-after: True -changes: - - config: "Relocked some donator items from Skyrat on request" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1135.yml b/html/changelogs/AutoChangeLog-pr-1135.yml deleted file mode 100644 index 5716d9aac42..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1135.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Azarak" -delete-after: True -changes: - - admin: "administrators can now toggle job playtime exemption by job basis for players" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1136.yml b/html/changelogs/AutoChangeLog-pr-1136.yml deleted file mode 100644 index bf5a225a481..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1136.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "IgiariValkyr" -delete-after: True -changes: - - config: "Relocks another skyrat donor item per request." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1137.yml b/html/changelogs/AutoChangeLog-pr-1137.yml deleted file mode 100644 index 6f7523fd3b2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1137.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Sylphet" -delete-after: True -changes: - - balance: "scrubbers do not overflow with carpet and rainbow stuff anymore" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1143.yml b/html/changelogs/AutoChangeLog-pr-1143.yml deleted file mode 100644 index bd64cda6da3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1143.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "destrucktoid" -delete-after: True -changes: - - bugfix: "Syndicate/Ninja Borg Restorative Nanites now heal Slimepeople just as well as they do other people." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1144.yml b/html/changelogs/AutoChangeLog-pr-1144.yml deleted file mode 100644 index 0786f3b505f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1144.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - bugfix: "Death degradation properly DNRs" - - bugfix: "DNR icon has been restored" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1146.yml b/html/changelogs/AutoChangeLog-pr-1146.yml deleted file mode 100644 index 5b452db2ade..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1146.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Hopefully fixes the error handler throwing errors too early." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1147.yml b/html/changelogs/AutoChangeLog-pr-1147.yml deleted file mode 100644 index 8615b5a9d68..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1147.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes early runtime issue with loadouts." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1148.yml b/html/changelogs/AutoChangeLog-pr-1148.yml deleted file mode 100644 index 97d4c19b021..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1148.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes fake lattice linters when they spawn on lava" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1150.yml b/html/changelogs/AutoChangeLog-pr-1150.yml deleted file mode 100644 index 2327d137f11..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1150.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "aKromatopzia" -delete-after: True -changes: - - bugfix: "icecats and ashliz can spawn on the ghost cafe." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1151.yml b/html/changelogs/AutoChangeLog-pr-1151.yml deleted file mode 100644 index 911de90647a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1151.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - rscadd: "Robos now have a pamphlet in their bag that tells them tips and tricks on how treat synth wounds" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1155.yml b/html/changelogs/AutoChangeLog-pr-1155.yml deleted file mode 100644 index baf94638573..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1155.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Sandstorms on Moon Station are less annoying in terms of notifications and sound. Adds missing miner GPSs to lockers + table. Fixes typo in Moon Station plaque. External airlocks to public areas no longer have access." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1156.yml b/html/changelogs/AutoChangeLog-pr-1156.yml deleted file mode 100644 index 0120c70448e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1156.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "lathes now use moderate power for printing operations /:cl:" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1159.yml b/html/changelogs/AutoChangeLog-pr-1159.yml deleted file mode 100644 index 759db6ab957..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1159.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - code_imp: "Bubber modular greyscale files permitted" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1160.yml b/html/changelogs/AutoChangeLog-pr-1160.yml deleted file mode 100644 index 69eb5b555cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1160.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Removes some over the top abductor victim objectives and adds some new ones." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1161.yml b/html/changelogs/AutoChangeLog-pr-1161.yml deleted file mode 100644 index ee1ea2520ef..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1161.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Remaps Moon Station's robotics. Fixes some misplaced objects." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1162.yml b/html/changelogs/AutoChangeLog-pr-1162.yml deleted file mode 100644 index 31d9a07ce9b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1162.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Removes Ash Storms from Moon Station Lavaland" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1170.yml b/html/changelogs/AutoChangeLog-pr-1170.yml deleted file mode 100644 index 01332f49241..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1170.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Disables Lance Shuttle on Moon Station because it caused the crew to get stuck on station for 5 hours once." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1171.yml b/html/changelogs/AutoChangeLog-pr-1171.yml deleted file mode 100644 index a18080f8115..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1171.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Replaces the Meteor Shuttle with THE CUBE. It's an emag only emergency shuttle that is literally just a 16x16 cube with some engines on it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1172.yml b/html/changelogs/AutoChangeLog-pr-1172.yml deleted file mode 100644 index 9e2a2f8471e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1172.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "Adds Sex holographic barriers to warn people that there is sex in the next room. It doesn't block air or movement, but it does warn people, and knowing is half the battle. They can be purchased in the LustWish under the premium section." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1173.yml b/html/changelogs/AutoChangeLog-pr-1173.yml deleted file mode 100644 index df23fd979af..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1173.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - qol: "Airlocks don't flash constantly on engineering override, override/overlay added for fire alarm" - - bugfix: "Airlock lighting should no longer render on top of player characters" - - bugfix: "Airlock emissives no longer overlap firedoors" - - bugfix: "Fixed missing overlays on various airlock types" - - bugfix: "Fixed status display for epsilon alert" - - bugfix: "Fixed fire alarm for epsilon alert" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1176.yml b/html/changelogs/AutoChangeLog-pr-1176.yml deleted file mode 100644 index 89294216da1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1176.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Spicelet" -delete-after: True -changes: - - rscadd: "new dogborg shirt" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1178.yml b/html/changelogs/AutoChangeLog-pr-1178.yml deleted file mode 100644 index 8bdda680567..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1178.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Erol509" -delete-after: True -changes: - - rscadd: "Added the icewalker areas to the radstorm protected areas." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1179.yml b/html/changelogs/AutoChangeLog-pr-1179.yml deleted file mode 100644 index 70be2ec147d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1179.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nevimer" -delete-after: True -changes: - - balance: "you now hug and pat lightgeists" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1181.yml b/html/changelogs/AutoChangeLog-pr-1181.yml deleted file mode 100644 index 05945150644..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1181.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes planetary atmos getting created when turfs inside the station are destroyed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1187.yml b/html/changelogs/AutoChangeLog-pr-1187.yml deleted file mode 100644 index 678a09175c8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1187.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - bugfix: "Fixed ineligible airlocks from receiving engineering override when activated from the communications console" - - bugfix: "Various airlock/firelock overlay fixes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1188.yml b/html/changelogs/AutoChangeLog-pr-1188.yml deleted file mode 100644 index 6d6702eaefc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1188.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes some Moon Station bugs, such as the funny engineering bridge access bug and a lack of cigarette/coffee vendors." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1191.yml b/html/changelogs/AutoChangeLog-pr-1191.yml deleted file mode 100644 index 8fcd728e306..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1191.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerB" -delete-after: True -changes: - - bugfix: "Fixes Moonstation Ministation not counting blob tiles." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1194.yml b/html/changelogs/AutoChangeLog-pr-1194.yml deleted file mode 100644 index 230bbd07e6e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1194.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "destrucktoid" -delete-after: True -changes: - - rscadd: "Borers back in uplink" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1198.yml b/html/changelogs/AutoChangeLog-pr-1198.yml deleted file mode 100644 index e8f86973428..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1198.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "IgiariValkyr" -delete-after: True -changes: - - rscadd: "New Traitor Item (10TC) - Portable Listening Advanced Post" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1199.yml b/html/changelogs/AutoChangeLog-pr-1199.yml deleted file mode 100644 index 11ce0cabe8d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1199.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - rscdel: "Removes the blast cannon from the traitor scientist uplink" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1202.yml b/html/changelogs/AutoChangeLog-pr-1202.yml deleted file mode 100644 index 3718b34b7a4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1202.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tupina" -delete-after: True -changes: - - balance: "Energy weapons can now fire roughly 1.3x more lasers per charge across the board." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1203.yml b/html/changelogs/AutoChangeLog-pr-1203.yml deleted file mode 100644 index 018ba4ffd9c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1203.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nevimer" -delete-after: True -changes: - - admin: "added public log folder, and logging." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1204.yml b/html/changelogs/AutoChangeLog-pr-1204.yml deleted file mode 100644 index 4fbd0d28d01..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1204.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes Moonstation radstorms affecting some places it's not supposed to." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1205.yml b/html/changelogs/AutoChangeLog-pr-1205.yml deleted file mode 100644 index 905950bba4a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1205.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "destrucktoid" -delete-after: True -changes: - - bugfix: "Slimeperson Clockwork Cultists now heal toxins from the prosperity prism properly." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1206.yml b/html/changelogs/AutoChangeLog-pr-1206.yml deleted file mode 100644 index 82dffea6bb7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1206.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "xXPawnStarrXx" -delete-after: True -changes: - - rscadd: "Blood filtering now restores toxins." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1207.yml b/html/changelogs/AutoChangeLog-pr-1207.yml deleted file mode 100644 index 93e3b118d76..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1207.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "aKromatopzia" -delete-after: True -changes: - - image: "icon was wrongly offset for cybernetic digitigrade right legs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1209.yml b/html/changelogs/AutoChangeLog-pr-1209.yml deleted file mode 100644 index 4ceaf88c9a4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1209.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "ReturnToZender (code)" -delete-after: True -changes: - - bugfix: "Character Directory sorting now works on all variables." - - bugfix: "autopunctuation respects prefs again" - - qol: "Advert settings have been moved to a new category, ADVERT." - - rscadd: "Character directory now has a search function on the name var." - - rscadd: "Character directory now shows on the Main Menu under the Crew Manifest." - - rscadd: "Character directory now has a randomizer, which will open a random player's flavor text when clicked. Click if you dare." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1210.yml b/html/changelogs/AutoChangeLog-pr-1210.yml deleted file mode 100644 index 7086dad497e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1210.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - code_imp: "Parts of firelock code updated to parity with TG" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1211.yml b/html/changelogs/AutoChangeLog-pr-1211.yml deleted file mode 100644 index 52cfcd59021..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1211.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "you can now rightclick to flag in minesweeper" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1216.yml b/html/changelogs/AutoChangeLog-pr-1216.yml deleted file mode 100644 index 379c37861be..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1216.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "Void raptor now has the secmed locker" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1217.yml b/html/changelogs/AutoChangeLog-pr-1217.yml deleted file mode 100644 index b9909a6a7c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1217.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ReturnToZender (code)" -delete-after: True -changes: - - rscadd: "F-list headshots are now accepted" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1219.yml b/html/changelogs/AutoChangeLog-pr-1219.yml deleted file mode 100644 index 02e4e5cbb17..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1219.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Limits Powersinks + Crab-17 purchases to once each per traitor per round." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1220.yml b/html/changelogs/AutoChangeLog-pr-1220.yml deleted file mode 100644 index ea8b4a0457e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1220.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - rscadd: "Zombie can now have hair" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1223.yml b/html/changelogs/AutoChangeLog-pr-1223.yml deleted file mode 100644 index fafb06339ef..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1223.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Swiftfeather" -delete-after: True -changes: - - rscdel: "Removed gun safeties." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1224.yml b/html/changelogs/AutoChangeLog-pr-1224.yml deleted file mode 100644 index c3d5f406e75..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1224.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Adds Ashwalkers to Moonstation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1225.yml b/html/changelogs/AutoChangeLog-pr-1225.yml deleted file mode 100644 index ab0b6dc4914..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1225.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ReturnToZender" -delete-after: True -changes: - - rscdel: "Donors' graceful trenchcoat" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1226.yml b/html/changelogs/AutoChangeLog-pr-1226.yml deleted file mode 100644 index ae65e7e3fab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1226.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ReturnToZender" -delete-after: True -changes: - - rscadd: "NTC offices have had their carpet changed out to something less over-the-top. The windows have been expanded as well." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1229.yml b/html/changelogs/AutoChangeLog-pr-1229.yml deleted file mode 100644 index 79411bd20c9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1229.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes traitor announcer double-sanitizing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1232.yml b/html/changelogs/AutoChangeLog-pr-1232.yml deleted file mode 100644 index 9624ee2df2a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1232.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "Secmeds no longer limit a few items to themselves only" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1233.yml b/html/changelogs/AutoChangeLog-pr-1233.yml deleted file mode 100644 index d8b2f6993d4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1233.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Removes Xeno Organs from Roundstart Xenomorph Hybrids. They no longer have plasma vessels, resin spinners, or hive nodes." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1236.yml b/html/changelogs/AutoChangeLog-pr-1236.yml deleted file mode 100644 index 3f675276b9d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1236.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "destrucktoid" -delete-after: True -changes: - - balance: "Ventrue cannot benefit from bloodbags if their blood exceeds BLOOD_VOLUME_NORMAL" - - refactor: "Changed reac_volume to use AddBloodVolume() for consistency reasons" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1237.yml b/html/changelogs/AutoChangeLog-pr-1237.yml deleted file mode 100644 index 1b908a1a091..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1237.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "YakumoChen" -delete-after: True -changes: - - balance: "Xeno Hybrids take normal heat damage, again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1238.yml b/html/changelogs/AutoChangeLog-pr-1238.yml deleted file mode 100644 index 41ae7a67f39..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1238.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "pixelkitty286" -delete-after: True -changes: - - rscadd: "+Peacekeeper cat borg sprites, Spider clan cat borg sprites, Engineer cat borg refreshed sprites" - - bugfix: "Cat cyborg panels not working" - - image: "+Peacekeeper cat borg sprites, Spider clan cat borg sprites, Engineer cat borg refreshed sprites" - - code_imp: "-Duplicate code" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1243.yml b/html/changelogs/AutoChangeLog-pr-1243.yml deleted file mode 100644 index bbdb21386d2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1243.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VrazzleDazzle" -delete-after: True -changes: - - rscadd: "Scrying Lens Disks are now available in the loadout." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1245.yml b/html/changelogs/AutoChangeLog-pr-1245.yml deleted file mode 100644 index 72525d7cce2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1245.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes missing telecomms wire in Moonstation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1246.yml b/html/changelogs/AutoChangeLog-pr-1246.yml deleted file mode 100644 index 296e85bbf61..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1246.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - image: "Added Moonstation specific tram sprites" - - bugfix: "Fixed Moonstation references to Tramstation's tram" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1248.yml b/html/changelogs/AutoChangeLog-pr-1248.yml deleted file mode 100644 index 65dfa950447..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1248.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EspeciallyStrange" -delete-after: True -changes: - - bugfix: "IDMA donor clothing being improperly offsetted and not correctly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1249.yml b/html/changelogs/AutoChangeLog-pr-1249.yml deleted file mode 100644 index e003b4be566..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1249.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "iskawhiskers" -delete-after: True -changes: - - image: "added monster2_head, monster3_head, weight2_chest_m, weight2_chest_f" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1250.yml b/html/changelogs/AutoChangeLog-pr-1250.yml deleted file mode 100644 index bfd0812cf3f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1250.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Boviro" -delete-after: True -changes: - - rscadd: "Added butler as assistant title" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1255.yml b/html/changelogs/AutoChangeLog-pr-1255.yml deleted file mode 100644 index 314bc29fede..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1255.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - rscadd: "Adds the hemophage-only quirk, Sol weakness" - - code_imp: "Refactors the sol subsystem so that itself decides if it should run or not based on if anyone is using it." - - code_imp: "Refactors bloodsucker UI elements so that they can function fine outside a bloodsucker antag datum" - - code_imp: "bloodsucker_blood_volume, humanity_lost, bloodsucker_level and bloodsucker_level_unspent are now private variables due to them being used for UI updates, if you need to change them, use the procs that are written in the autodoc" - - code_imp: "Quirk species whitelists no longer use bitflags, but use the species ID's. Easily allowing you to add new whitelists without having to mess around with making a new bitfield" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1256.yml b/html/changelogs/AutoChangeLog-pr-1256.yml deleted file mode 100644 index f8fa23d923d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1256.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes an atmos oversight with the Voxbox on Moonstation that can lead to superheated distro." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1257.yml b/html/changelogs/AutoChangeLog-pr-1257.yml deleted file mode 100644 index ec053304754..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1257.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kegdo" -delete-after: True -changes: - - rscadd: "more markings: Chestplate, hip, elbow, shoulder, glove, sleeve, sock, longsock, vertical stripe, fangs, lips, facemask, facedisc." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1259.yml b/html/changelogs/AutoChangeLog-pr-1259.yml deleted file mode 100644 index 3cb2f5837eb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1259.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "Dauntless frames are no longer broken" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1261.yml b/html/changelogs/AutoChangeLog-pr-1261.yml deleted file mode 100644 index 3de4865369d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1261.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - bugfix: "Ventrue sired bloodsuckers will no longer have a copy of their abilities" - - rscadd: "Bloodsuckers that start out with no heart will be able to regain one, but it now properly checks if they have one or not, and disables their abiltiies accordingly, go into a coffin with a heart if you want to gain one." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1263.yml b/html/changelogs/AutoChangeLog-pr-1263.yml deleted file mode 100644 index bd238334d6d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1263.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - rscadd: "Roboticists now spawn with synthetic medkits to make their jobs a bit easier" - - rscadd: "New cargo packs for synthetic medkits" - - balance: "Roboticists now spawn with diag huds, welding helmets, and black gloves" - - balance: "Synthetic burn kits now have extra bottles" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1264.yml b/html/changelogs/AutoChangeLog-pr-1264.yml deleted file mode 100644 index ef8ca32d54c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1264.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - rscadd: "You can now set your characters height" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1265.yml b/html/changelogs/AutoChangeLog-pr-1265.yml deleted file mode 100644 index 66995a4df2b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1265.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "False walls appear again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1272.yml b/html/changelogs/AutoChangeLog-pr-1272.yml deleted file mode 100644 index a90463de12c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1272.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - rscadd: "Re-enables the Galactic Materials Market as it's been fixed upstream." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1274.yml b/html/changelogs/AutoChangeLog-pr-1274.yml deleted file mode 100644 index 73143db3194..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1274.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Yanziko" -delete-after: True -changes: - - balance: "pet owner is free" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1276.yml b/html/changelogs/AutoChangeLog-pr-1276.yml deleted file mode 100644 index 767a8c08085..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1276.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "xXPawnStarrXx" -delete-after: True -changes: - - bugfix: "korve skinned advanced tools being invisible." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1278.yml b/html/changelogs/AutoChangeLog-pr-1278.yml deleted file mode 100644 index 6a3ed32df84..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1278.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Assigns a bunch of code levels for ERT that didn't have it or I thought should have a different one. The changes itself can be seen in the file." - - bugfix: "The default code for any ERT is now \"Green\" so it will no longer show a missing word when calling ERT." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1279.yml b/html/changelogs/AutoChangeLog-pr-1279.yml deleted file mode 100644 index 4480a181f18..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1279.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "projectkepler-ru" -delete-after: True -changes: - - rscadd: "Marketable IDMA Plushie, selectable as ironmoon tajaran plushie" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1280.yml b/html/changelogs/AutoChangeLog-pr-1280.yml deleted file mode 100644 index e620880462c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1280.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes various Moon Station issues." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1285.yml b/html/changelogs/AutoChangeLog-pr-1285.yml deleted file mode 100644 index a6e2222bcf7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1285.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - rscdel: "Removes Dauntless self destruct and dense rock surrounding the base" - - balance: "Dauntless exterior turrets shoot fauna, not people" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1286.yml b/html/changelogs/AutoChangeLog-pr-1286.yml deleted file mode 100644 index 72aca6901e4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1286.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - balance: "Bodyless ghosts and ghostroles can no longer transfervote" - - refactor: "Added support for vote mob conditions" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1288.yml b/html/changelogs/AutoChangeLog-pr-1288.yml deleted file mode 100644 index 475dbfd02c1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1288.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "ReturnToZender (code)" -delete-after: True -changes: - - rscadd: "Kiboko 25mm to Armory tab" - - rscadd: "Mini E-Gun to goodies and armory" - - balance: "Reduces the cost of the d'Elite rifle as it is more of a side-grade now" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1289.yml b/html/changelogs/AutoChangeLog-pr-1289.yml deleted file mode 100644 index 36889ef925f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1289.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - balance: "Reagent weapons now get damaged upon reagent transfer" - - balance: "Imbuing once again needs actual skill" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1297.yml b/html/changelogs/AutoChangeLog-pr-1297.yml deleted file mode 100644 index 2343e4ac829..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1297.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - qol: "Allows Ashwalkers to Breathe on Station" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1299.yml b/html/changelogs/AutoChangeLog-pr-1299.yml deleted file mode 100644 index b8e34d77d12..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1299.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - qol: "Catbox and Imgbox are now supported hosting services for headshots" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1301.yml b/html/changelogs/AutoChangeLog-pr-1301.yml deleted file mode 100644 index a2b85e3c469..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1301.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tmyqlfpir" -delete-after: True -changes: - - qol: "Tweak layout of Dauntless kitchen, dorms and medbay" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1302.yml b/html/changelogs/AutoChangeLog-pr-1302.yml deleted file mode 100644 index ea7040914ee..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1302.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - config: "Removes Akula Lore protection (Allows edit to species)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1303.yml b/html/changelogs/AutoChangeLog-pr-1303.yml deleted file mode 100644 index 05d8a259972..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1303.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - rscadd: "Lunge can now take out any organ out of a dead corpse, based on where you are aiming in the targeting doll, it will still prioritize a heart if aimed at chest" - - bugfix: "bloodsucker sol quirk removal is now silent" - - bugfix: "You can no longer unwrench lair coffins" - - bugfix: "gohome will no longer render you stuck in a coffin if it cannot close" - - bugfix: "Malkavians should now spout nonsense less often if you've not lost humantiy yet" - - bugfix: "Lunge can now actually stun people if you lunge at them from behind.\nfix; You can no longer spam drink from blood bags." - - code_imp: "clan_life now has seconds_per_tick and times_fired" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1304.yml b/html/changelogs/AutoChangeLog-pr-1304.yml deleted file mode 100644 index f3e82afec26..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1304.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jinshee" -delete-after: True -changes: - - rscadd: "Added rattlesnake tail" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1305.yml b/html/changelogs/AutoChangeLog-pr-1305.yml deleted file mode 100644 index f5e588304c3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1305.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - bugfix: "Humanoid and Hemophage sprites no longer have base skin tone issues. Added human greyscale sprites." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1308.yml b/html/changelogs/AutoChangeLog-pr-1308.yml deleted file mode 100644 index 75a3aa64830..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1308.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "Minesweeper now properly gives moodlets" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1311.yml b/html/changelogs/AutoChangeLog-pr-1311.yml deleted file mode 100644 index d84f5879d7b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1311.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Odairu" -delete-after: True -changes: - - config: "changes law 2 wording" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1313.yml b/html/changelogs/AutoChangeLog-pr-1313.yml deleted file mode 100644 index 65dbb60c0a6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1313.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Erol509" -delete-after: True -changes: - - bugfix: "Bloodsucker braincheck was missing a null check causing runetimes, its been fixed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1314.yml b/html/changelogs/AutoChangeLog-pr-1314.yml deleted file mode 100644 index a2bcaca6e99..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "teshvali no longer have you wear human sprites" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1317.yml b/html/changelogs/AutoChangeLog-pr-1317.yml deleted file mode 100644 index ab69313040a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1317.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes a few moonstation bugs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1319.yml b/html/changelogs/AutoChangeLog-pr-1319.yml deleted file mode 100644 index 0d03693b2cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1319.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VrazzleDazzle" -delete-after: True -changes: - - qol: "The ashwalkers' ashen necklaces are now fireproof." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1320.yml b/html/changelogs/AutoChangeLog-pr-1320.yml deleted file mode 100644 index c05b89c2b6e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1320.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VrazzleDazzle" -delete-after: True -changes: - - rscdel: "Death bolts no longer dust you on death." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1322.yml b/html/changelogs/AutoChangeLog-pr-1322.yml deleted file mode 100644 index 0c7837cb3c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1322.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Atmos optimization." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1324.yml b/html/changelogs/AutoChangeLog-pr-1324.yml deleted file mode 100644 index ba5836b7355..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1324.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tmyqlfpir" -delete-after: True -changes: - - rscadd: "Slapping glass tables have a 15% chance (cursed 30%) of breaking on 3rd slap" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1330.yml b/html/changelogs/AutoChangeLog-pr-1330.yml deleted file mode 100644 index 71e67be770f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1330.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "projectkepler-ru" -delete-after: True -changes: - - rscadd: "Contract from Colt has been secured with NT and now we can buy m1911" - - image: "icon updated for the reshi revolver" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1332.yml b/html/changelogs/AutoChangeLog-pr-1332.yml deleted file mode 100644 index 754510e0994..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1332.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VrazzleDazzle" -delete-after: True -changes: - - rscadd: "Six new PKA variants, now in a mining vendor near you." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1338.yml b/html/changelogs/AutoChangeLog-pr-1338.yml deleted file mode 100644 index 697584542f3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1338.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Makeshift-coder" -delete-after: True -changes: - - rscadd: "adds an unpacked colony fabricator" - - rscadd: "replaces the four bluespace beakers on a table with a bluespace beaker box for ease of access" - - rscdel: "Removed a single sink to put the unpacked fabricator on it" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1340.yml b/html/changelogs/AutoChangeLog-pr-1340.yml deleted file mode 100644 index cb707911bf9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1340.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - bugfix: "Colossus will properly deaggro when you lose" - - balance: "But colossus bolts will gut you as a consiquence" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1344.yml b/html/changelogs/AutoChangeLog-pr-1344.yml deleted file mode 100644 index 28113fbbe3d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1344.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - bugfix: "Book of kindred display cases should now spawn properly on TG maps." - - bugfix: "Duplicate books of kindred won't spawn on new curators" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1347.yml b/html/changelogs/AutoChangeLog-pr-1347.yml deleted file mode 100644 index 0698a960a6f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1347.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - image: "Removes the east and west sprite on the Lips bodymarking" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1348.yml b/html/changelogs/AutoChangeLog-pr-1348.yml deleted file mode 100644 index 72ca80ddfd8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1348.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "tmyqlfpir" -delete-after: True -changes: - - rscadd: "Adds cargo ordering functionality for dauntless base" - - rscadd: "Add bitden to dauntless brig area" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1349.yml b/html/changelogs/AutoChangeLog-pr-1349.yml deleted file mode 100644 index 29d3e13d4ab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1349.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "@Crumpaloo, @Majkl-J" -delete-after: True -changes: - - image: "New foxtrot peacekeeper borg model, sprites by Crumpaloo" - - code_imp: "Moved around cyborg dmi defines to give the precompiler a break" - - config: "Development config now has both sec and peace cyborg modules enabled" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1350.yml b/html/changelogs/AutoChangeLog-pr-1350.yml deleted file mode 100644 index 20b22cfc7ab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1350.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - rscadd: "Sauna survival pods. Found in mining vendor and occasionally maintenance" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1353.yml b/html/changelogs/AutoChangeLog-pr-1353.yml deleted file mode 100644 index 72510f0a3f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1353.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Oh Hi Daniel shuttle no longer throws." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1354.yml b/html/changelogs/AutoChangeLog-pr-1354.yml deleted file mode 100644 index c053d366d8e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1354.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "Reworks the Gifted quirk and just gives everyone 6 free quirk points." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1357.yml b/html/changelogs/AutoChangeLog-pr-1357.yml deleted file mode 100644 index 6d9c3cd94d9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1357.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes Moonstation Xenobiology Shield Walls" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1360.yml b/html/changelogs/AutoChangeLog-pr-1360.yml deleted file mode 100644 index c94ade047fd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1360.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "projectkepler-ru" -delete-after: True -changes: - - balance: "Colt reevaluated their contract, the M1911 is cheaper now" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1362.yml b/html/changelogs/AutoChangeLog-pr-1362.yml deleted file mode 100644 index 9cdaa143b81..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1362.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tmyqlfpir" -delete-after: True -changes: - - rscadd: "Add door lock to dauntless restroom, and various map tweaks" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1374.yml b/html/changelogs/AutoChangeLog-pr-1374.yml deleted file mode 100644 index 3cfa55feafa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1374.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "tmyqlfpir" -delete-after: True -changes: - - rscadd: "Dauntless - Add exterior cameras to dauntless, removed many interior ones" - - bugfix: "Dauntless - Removed incorrectly placed decals under hull objects and tweaked brig/dorms" - - balance: "Interdyne powerator is now maxcapped to 1MW" - - rscadd: "Dauntless - Added new bounty pad and bounty console" - - rscadd: "Dauntless - Added new produce order console" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1378.yml b/html/changelogs/AutoChangeLog-pr-1378.yml deleted file mode 100644 index d63ba8725dc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1378.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VrazzleDazzle" -delete-after: True -changes: - - rscdel: "Prybars are no longer available in the Rapid Construction Fabricator." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1379.yml b/html/changelogs/AutoChangeLog-pr-1379.yml deleted file mode 100644 index fa2e77ab75a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1379.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "xXPawnStarrXx" -delete-after: True -changes: - - qol: "made endurogrow boost lifespan." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1390.yml b/html/changelogs/AutoChangeLog-pr-1390.yml deleted file mode 100644 index ef071ad54a3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1390.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - qol: "New moodlet: Status if you're still processing alcohol you've drank previously (and getting more drunk)" - - qol: "New moodlet: Current drunk level" - - bugfix: "Light drinker quirk should no longer floor you near instantly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1393.yml b/html/changelogs/AutoChangeLog-pr-1393.yml deleted file mode 100644 index 8f0135a775f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1393.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "PhazeJump" -delete-after: True -changes: - - rscadd: "Added Harpy (large) wings" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1399.yml b/html/changelogs/AutoChangeLog-pr-1399.yml deleted file mode 100644 index 05d202886e4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1399.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Disables Station Blackout and Random Machine Languages Station Traits" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1404.yml b/html/changelogs/AutoChangeLog-pr-1404.yml deleted file mode 100644 index 6ba77611117..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1404.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Adds Moonstation public mining." - - bugfix: "Fixes various Moonstation bugs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-625.yml b/html/changelogs/AutoChangeLog-pr-625.yml deleted file mode 100644 index f6d46666ae3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-625.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nevimer" -delete-after: True -changes: - - balance: "contractor and ninja modsuits have DNA locked microbombs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-635.yml b/html/changelogs/AutoChangeLog-pr-635.yml deleted file mode 100644 index 948a2ba4e0b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-635.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "Xenos can only devour mobs that have a ventcrawler trait (Monkeys, most Simplemobs), assuming all other checks have passed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-788.yml b/html/changelogs/AutoChangeLog-pr-788.yml deleted file mode 100644 index 5e98224f7e4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-788.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - image: "New rockfruit sprites" - - code_imp: "Modularized hydroponics" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-798.yml b/html/changelogs/AutoChangeLog-pr-798.yml deleted file mode 100644 index 3d3bad7d33d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-798.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Erol509" -delete-after: True -changes: - - rscadd: "Added back TEG to techwebs and engineering protolathe" - - image: "Changed TEG sprites from YogStation. Credits to original author." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-962.yml b/html/changelogs/AutoChangeLog-pr-962.yml deleted file mode 100644 index 254aa151a3e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-962.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: "pixelkitty286" -delete-after: True -changes: - - rscadd: "Added night vision and cold resistance to tajara with their respective debuffs and gave them sensitive hearing. tajara own meat type and cat animal hide when gibed. Cat like grace to tajara." - - rscadd: "Added modular tajaran.dm, siikmaas.dm, and meatslab.dmi" - - qol: "The Tajara DLC." - - balance: "rebalanced how the Tajaran species works." - - image: "added a Tajaran ass picture. Added adhomian_meat (Credit goes to Aurora.3 on the sprite)" - - spellcheck: "Corrected siik'tajr to be siik'maas." - - code_imp: "modular code for tajaran species changes." - - refactor: "Does refactoring Tajara as a species count?" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-978.yml b/html/changelogs/AutoChangeLog-pr-978.yml deleted file mode 100644 index 2a35fd76ce4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-978.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "Heads can only be dismembered if they have a critical-tier (Compound) fracture. If a head was supposed to be dismembered from a blow, a compound fracture will be applied." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-987.yml b/html/changelogs/AutoChangeLog-pr-987.yml deleted file mode 100644 index 1ae448520f1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-987.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Shayoki" -delete-after: True -changes: - - rscadd: "Players can now choose a voice for their characters." - - sound: "Added a lot of 'borrowed' sounds to use as voices." - - admin: "Admins can globally disable Bloopers" \ No newline at end of file diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml index 5c083e880d7..e78e7b8bdd8 100644 --- a/html/changelogs/archive/2024-03.yml +++ b/html/changelogs/archive/2024-03.yml @@ -64,3 +64,575 @@ items - rscadd: Displaying the voting statistics is now optional on a per-poll basis, and is disabled for map voting. +2024-03-04: + SkyratBot: + - bugfix: Pete can no longer eat vines while dead. + - bugfix: makes custom pizzas dairy and vegetable free, unless you choose to add + them. + - rscadd: Fishes love kronkaine. + - qol: Examining a fishing spot twice with sufficiently high fishing skill (or the + skillchip) will get you a list of fishes that can be caught. + - rscadd: Adds a new changeling ability, "Darkness Adaptation". Making you more + translucent, especially in darkness and allowing you to see slightly better + in the dark + - balance: The changeling power "Chameleon Skin" has been buffed, Reduces the cost + to 1 and sped up the time it takes to turn invisible +2024-03-05: + LT3: + - image: medical and improvised gauze are visibly different from cloth + SkyratBot: + - rscadd: added the lightbearer moth set, available in the character setup. + - image: added icons for the lightbearer set; new moth wings, antennae and markings. + - bugfix: fixed the chances of living flesh actions + - bugfix: fixed some issues when calculating the duration of moon smile's effects + - bugfix: fixes deathmatch baseturfs (you cant crowbar the floor to breach to space) + - rscadd: Added new clown shoes "moffers" + - rscadd: Added moffers to the contraband list of the autodrobe +2024-03-06: + Rhials: + - bugfix: Fixes some tiles outside the Icebox AI satellite not getting hit by storms. + SpaceLove: + - bugfix: Central Command Logistics department noticed the missing items on their + listings for robotics assembly crate. They have updated it! +2024-03-08: + Melbert: + - bugfix: All bibles are no longer suspiciously hollow + - rscadd: Boulder refineries and smelters can refine Golems. + - rscadd: The animation that plays when an alert pops up on your screen is different. + - bugfix: Extremely Minor Delta Morgue Fixes. See if you can spot them. + - bugfix: Moving "down" as an observer is no longer janky. + Seven: + - rscadd: Lockers and crates now shake when someone is attempting to resist out + of them. + SkyratBot: + - bugfix: Revenants can now again emag Medibots, Cleanbots, and Hygienebots. + - image: 'added unique icons for spells: caretaker''s refuge, apetra vulnera and + ascended shapechange' + - bugfix: Prevents polymorphing deleting items by consuming them when transformed + then leaving the polymorph + - balance: personal flashes now Knockdown rather than Paralyze direct targets. + - bugfix: MetaStation Pharmacy is no longer accessible with general medical access, + Also changes the Chemistry and Pharmacy airlocks into medical ones. + - bugfix: Basic mobs no longer have the (unintended) ability to shoot out of containers, + like bluespace body bags. + - qol: If your OOC message gets eaten due to some weird circumstance in how your + message is handled, it will feed the applicable message back to you so you can + copy-paste and try to send it again. + - sound: Added the new moffers sound effect and made moffers use it instead + - rscadd: Vending machines now track how many credits have been spent on them, and + when restocked will pay out that saved portion to the restocker, with a 50% + match going to the cargo department. + - rscadd: Adds the restock tracker app, an NTOS app that tracks how well stocked + the station's vending machine units are at a glance as well as how much is contained + in each. + - refactor: Vending machines now use the payment component for money handling behavior, + meaning it will now accept held or pulled coins/cash/credits + - qol: Attacking vending machines can drop a portion of it's stored credits, at + the usual expected danger. + - balance: Tweaked the cost of various restock modules up and down. + - qol: Restock modules can now be sold for 50 credits. + - bugfix: Pipe connector no longer appears on a hidden connector. + - bugfix: Re-wrenched atmospherics pipes no longer get extra offset. + - bugfix: All unary devices like injectors, passive vents etc. are centered while + hidden. + - image: Added smooth transition between hidden and visible pipes. + - balance: The stock market now fires slower, has stock market events occur more + often, and the stock market has fewer minerals that are available to buy in + a single purchase before restocking. + - balance: Materials sold on the stock market may be protected from being bought + if their prices drop too low, so make sure you watch your prices before they + run the risk of getting shut out! + - balance: Stock blocks now freeze the price of materials for 3 minutes, down from + 5. + - qol: Tweaks to the Galactic Material Market UI, with materials sorted based on + their rarity and a timer to show how long until it updates. + - rscadd: New Stock market events, one locks a material from being purchased, the + other maximizes the value and quantity of a material for sale. + - bugfix: Tackle and wellcheers code for sanity values now function. + - image: The minigames icon now has an icon for the deathmatch minigamee + - admin: Made it easier for admins to adjust blood brother teams using admin tools. + - bugfix: Correct blood brother conversion logging. + Wallem: + - bugfix: The cursed coupon now only triggers a cursed event once, rather than infinite + times. +2024-03-09: + Majkl-J: + - bugfix: Certain maps no longer have broken machine frames + SkyratBot: + - bugfix: fixes ore vent spawned wolves being untammable +2024-03-10: + Drag: + - rscadd: Adds the Shark and Shork costume. Blahaj lovers rejoice! + EspeciallyStrange: + - rscadd: Added Energy Revolver, Energy Carbine and Bogseo being now a weapon choice + you can pick from the beacon. Blueshield now has a lifeline program in their + PDA and spawn with brute firstaid kit, alongside having set of sunglasses to + choose from to fit their personalisation. Does not include synth treatment kit + for command + - image: blueshield energy revolver, made by yours truly. + LT3: + - bugfix: Fixed ineligible airlocks from receiving engineering override when activated + from the communications console + - bugfix: Various airlock/firelock overlay fixes + Majkl-J: + - bugfix: DNA Syringe Gun now works correctly + - bugfix: Chicken meatballs can now be made again + PapaMichael: + - bugfix: Removed erroneous information on some health analyzer's examine text. + SkyratBot: + - code_imp: Chem stun reductions are now applied more consistently. + - bugfix: Chem stun reductions should now more consistently apply to unconsciousness. + - refactor: Improved shuttle gibbing code, adding a new resistance flag, `SHUTTLE_CRUSH_PROOF`. + - bugfix: Immortality revival spectres can no longer be crushed by shuttles. + - rscadd: The ghost of Poly can no longer be shuttle-crushed, nor can anything incorporeal. + - rscdel: Removed a nanomachine pizza from the deathmatch meat tower map that allowed + you to become a borg + - bugfix: Fixed the tgui text input trimming the last character of the input if + it hits the maximum length. + - bugfix: This also fixes the PIN pad leading to the right wing of the museum away + mission. + - qol: EVA can be given now in common access slots for non-command crewmembers. + - balance: Adjusts the values and contents of the Contraband Crate's item loot table. + - code_imp: Use a common list for acceptable silo materials for some stuff. Renamed + ore category into silo category. + - rscadd: Adds 3 new kits into the syndie-kit spawn pool, 2 for special and another + for tactical + - bugfix: When a carbon talks over robotic it uses their voice instead of visible + name. Meaning, voice changers work like they do over other comms regardless + of face covering. + - bugfix: Plexagon Access Management actually updates the shown template list on + authentication, avoiding needing to refresh/reopen/somesuch the program manually. + - rscadd: Wheat and meatwheat can now be worn in the mask slot. Farmers rejoice! + - qol: Extended the metric prefixes. + Zergspower: + - qol: Curtains and shower curtains are no longer solid objects that defy common + sense + nikothedude: + - rscadd: Roboticists now spawn with synthetic medkits to make their jobs a bit + easier + - rscadd: New cargo packs for synthetic medkits + - balance: Roboticists now spawn with diag huds, welding helmets, and black gloves + - balance: Synthetic burn kits now have extra bottles +2024-03-11: + Nidvex250: + - bugfix: Lidocaine now properly numbs your patient for pain free surgery! + - balance: We found trace amounts of meth in tests conducted on Lidocaine and scrubbed + the chem dispensers, making Lidocaine safe and non-habit forming. + SkyratBot: + - bugfix: fixes toolact screentips & balloon alerts for boulder machines & machine + frame +2024-03-13: + Majkl-J: + - bugfix: posis in living borgs dont ping ghosts anymore + - bugfix: Fixes a bunch of broken overlaycode, namely the liquid overlays + - qol: SAD reloads quirks now + - bugfix: Ghost cafe loads quirks correctly + Melbert: + - bugfix: Some things which should pacify people (but aren't) now will properly, + like hypnoflash + - bugfix: Silicons can use asterisks in binary without fear of saying something + interesting. + Pickle-Coding and Rhials: + - admin: RCD construction and deconstruction are logged. + - admin: Hallucinated projectiles no longer log. + - admin: Gives more detail to flamethrower logging. + - admin: More actions are logged for records consoles usage. + - admin: Frozen object shattering is logged. + Rhials: + - bugfix: Fugitive hunters no longer spawn after 1 minute of the fugitives' arrival. + SkyratBot: + - qol: adds examines & screentips for grill (the machine for grilling food), converts + some chats to balloon alerts + - qol: foods that can be re-grilled any number of times + - qol: grill (the machine for grilling food) can now be made in the crafting menu. + Cargo pack cost for purchasing grill has now been halved. + - qol: monkey fuel & other reagents(see examines) can be added from any container + & not just from glass bottles to the grill (the machine for grilling food) + - bugfix: grills (the machine for grilling food) now don't burn foods into a mouldy + mess unlike the girdle + - bugfix: correctly computes grill times of items that were previously grilled + - bugfix: grills now have an upper fixed fuel limit + - code_imp: autodoc procs & vars for the grill (the machine for grilling food) + - refactor: grills (the machine for grilling food) has been refactored. report bugs + on github, also they only start processing after putting food/fuel into them. + - rscadd: Tweaked the saturation, color and intensity of a bunch of lights + - qol: added an HUD button to go up and down floors + - balance: Nerfs the burn times of flares and glowsticks, from 25/35 to 10/15 and + 50/60! to 20/25. + - balance: Glowsticks now dim as they burn + - rscadd: Glowsticks no longer leave an unusable action button sitting around then + they're lit + - bugfix: Glowsticks actually burn down now (The code was broken) + - bugfix: AI-controlled spiders can correctly recognise where they can place webs. + - image: New sprites for most kinds of spider web + - bugfix: The black market illegal fish case now correctly initializes. + - qol: adds examines & screentips for HPLC + - qol: HPLC will now display the status of each reagent if it can be purified or + not before starting the refining process. + - bugfix: HPLC won't accept hologram items. + - bugfix: HPLC uses the correct off icon state & pauses processing when opened, + powered off, unanchored or broken + - bugfix: HPLC will ignore reagents that are either already at max purity or are + inverse thus lowering eta & work done to purify your remaining reagents + - code_imp: merged procs to reduce code size. auto Doc procs for HPLC + - refactor: converted UI to typescript. + - balance: Reinforced sections of station hull have gotten better at mitigating + explosive shockwaves. + - bugfix: fixes a spurious CI runtime caused by explosive mines quite literally + blowing up the unit test area + - rscadd: New Lizard's Gas ruin, this time in lavaland + projectkepler-ru: + - rscadd: Sol .40 .35 and all 12 gauge shotgun ammo (excluding some) can now be + obtained from the console due to a special deal made with Trappiste and Cawil. Alongside + a deal with Aussec made combat shotgun purchasable once again! hoorah +2024-03-14: + JohnFulpWillard, Atlasle: + - balance: You no longer feel cold if you're drunk. You still take damage, but get + no warning or slowdown. + SkyratBot: + - image: Your station's standard issue E-219 laser turrets within the AI upload + and AI satellite have been updated to a newer, shinier model. + - rscadd: Added Moffers as a crafting recipe in the entertainment section. + - rscadd: 'NEW TRAIT JOB: Veteran Security Advisor! Advise HoS and Captain on Security + matters, mentor Security Officers. Note that they are paraplegic and are suffering + PTSD due to their past experience.' + - bugfix: As a borg you shouldn't be able to resist from grab while locked down + - balance: Ephedrine spasms won't affect small or tiny items + - balance: Ephedrine's movement speed bonus now scales with purity. + - spellcheck: Fixed grammar and formatting on the description of friendly elite + mining mobs. + - bugfix: inserting a material sheet into an lathes should show the correct animation + color + - bugfix: All basic mobs are able to get wet. This means, among other things, that + you can clear the "slimed" status effect off your holoparasite or dog or whatever. + - bugfix: The museum piggy bank now spawns with at least 400 creds in it. + - refactor: Butt sprites are based on the chest bodypart for humans, instead of + the species + - image: Moths have their own special butt sprites + - bugfix: Ore vents have to be scanned while standing next to them. + - bugfix: Menacing ore vents now correctly only spawn in a node drone after the + boss is defeated, instead of before. + - bugfix: Doors with ID scan disabled will no longer open when an ID is thrown at + them + YakumoChen: + - rscdel: Removed recipe to artificially create male genetic reproductive fluid + mekyses: + - rscadd: new ai module base around ai being emperor + - code_imp: added code for it +2024-03-15: + SkyratBot: + - image: Resprited T-ray & Geiger counter. + - bugfix: Buttons let you take out their electronics again, hooray. + - bugfix: search bars don't swallow characters or lag behind your typing speed + - balance: Buffed the duration of the SC/FISHER Saboteur Handgun's disruption effects. + It's also stealthier and it won't conspiciously alert living mobs hit by it. + - rscadd: Added saboteur interactions with radios, pAIs, turrets, secbots and APCs. + - balance: Max level Summon Simians now grants the wizard a free gorilla transformation + spell as opposed to allowing the wizard to summon fully-grown gorillas. + - bugfix: Clicking sub sections in the design menu of lathe's UIs will auto scroll + to them. + - bugfix: Fuck you coupons ACTUALLY trigger only once again. As a consequence, they + also burn up when expended for their one-time fuck you. + - bugfix: Fuck you coupons work regardless of whether you had a free hand or not. + - balance: Thermal pistols can now be 'cranked' to recharge shots. You must have + a holster equipped in order to utilize this feature. Also, they have a tighter + dual-wield cone. + - balance: Thermal pistol crates are now 2000 credits, up from 1400 credits. + - bugfix: Fixed the larva "hide" ability not properly hiding larvas under tables. + - bugfix: Prevent runtime from humans with biowares gettingn deleted. + - balance: All materials except glass are now worth more gulag points than before. + - balance: Mining skill decreases the time it takes to break boulders, and makes + it less tiring. +2024-03-16: + Rhials: + - balance: Irradiated meteors now hit harder and leave behind radioactive goop. + SkyratBot: + - qol: Tramstation botany now has roundstart watering cans and syringes + - balance: Crusher marks no longer overwrite eachother, fauna can have one from + each crusher. + - balance: Ash drake's crusher trophy no longer affects people the same faction + as you (like hiero trophy), so you won't friendly fire people with it. + - rscadd: 'Added a new upgrade: Human Passthrough. You can shoot your PKA without + having to worry about friendly fire with this, for 750 mining points at your + mining vendor.' + - bugfix: Minebot passthrough upgrade now properly makes PKAs pass through minebots. + - bugfix: fixed some errors with the prepackaged tts + - bugfix: A missing recharger has been added into science's testing range on Birdshot + station. + - rscadd: Added a 'Closet Anomaly' station trait, which links and turns a portion + of the roundstart closets into impromptu teleporters. + - code_imp: We now log how many ores spawned on lavaland each round, as well as + the sizes of all of the ore vents. + - bugfix: Time on servers hosted outside of the UK should now properly have their + timezone offset. + - image: Updated button icon for Summon Simians and Gorilla Transformation. + - refactor: Instruments now use TGUI. + - qol: Uninverted the inverted corner of the Icebox medbay treatment center. +2024-03-17: + Majkl-J: + - balance: Robotic part surgeries no longer cause you to scream out in pain or affect + you negatively. + - bugfix: People no longer scream in pain on stasis beds + - refactor: Removes TRAIT_NUMBED, using TRAIT_ANALGESIA instead + Melbert: + - rscadd: MODsuits now use the "suit charge" HUD element to show how much charge + they have left, rather than a screen alert + Rhials: + - qol: Posters now return to your hand when the hanging process is cancelled, or + they are snipped down. + - qol: Abductor posters can now only be cut down with abductor-tier wirecutters. + SkyratBot: + - bugfix: now spiders get extra damage by fly swatter + - bugfix: Modsuit Pathfinder module is significantly better at finding it's destination. + - balance: The pro skateboard and hoverboard are now faster. + - balance: The improvised skateboard is a nick more unstable than the standard, + so the two aren't exactly the same. + - rscadd: Riding a skateboard on walk intent will prevent you from crashing into + things, at the cost of speed. + - rscadd: 'hoverboards now actually hovers and can be used even in zero g. There + are a caveat to it: It cannot be ridden on open space gaps deeper than one level + or actual space, unless there''re objects that prevent falls, like lattice or + catwalks.' + - bugfix: NumberInput(used in chem heater, plumbing reaction chamber etc) highlighting + & editing requires only single click like before + - refactor: Typescript conversion for NumberInput TGUI Component + - bugfix: Cleanbots once again require an emag to spray acid on people. They can + still acid trash objects normally. + - sound: Placing paper in a paperbin is no longer silent. + - bugfix: Psyker vision no longer causes infinitely worsening lag + - balance: If you work out under heavier-than-earth gravity, you will get gains + faster. + - balance: Bulldog Shotguns now have a 2-round burst fire. + - balance: Lone Operatives now come with some additional Bulldog Shotgun magazines. + - qol: The LawDrobe now stocks two (2) boxes of evidence bags. + - bugfix: Lathes don't hang if materials run out mid printing. Also displays message + if materials are put on hold while printing + - qol: added tooltip to newscaster to tell people that they need to insert paper + if they want to print a newspaper + - bugfix: Fixed cap overlay being added even when pipe is not hidden. + - bugfix: Fixed cap overlay being visible on turfs that are masked with darkness + plane, but still visible via mesons, cameras etc. + - rscadd: Added a collar bomb to the black market. + - rscadd: Added a possible kit to the special syndie bundle B, which also has uses + these collars. + Tattle: + - rscadd: Getting shrunk makes you talk small + Webcomicartist: + - bugfix: Fixed RLD,RTD and Rebar crossbow not being storable on the engineering + winter coat slot. +2024-03-18: + Rhials: + - bugfix: Plasmamen nukie reinforcements are now properly given a plasmaman-safe + outfit. + SkyratBot: + - bugfix: Human AI now closes regular AI job positions. + - rscadd: The Bartender's double barrel shotgun can be purchased for 1,800 credits + on goodie tab + - bugfix: Plasmamen will become human in the deathmatch so they don't instantly + die + - rscadd: Ice cream and frozen treats now have a chilling effect. + - rscadd: You can add a scoop of ice cream on waffles. + - balance: added an action speed modifier to the generic food haste effect (you + do things, and not just run, an itsy bitsy faster) + - bugfix: Action abilities hidden from players are now not shown to observers either. + - rscadd: Added 20+ modifiers to the deathmatch minigame, which can be enabled by + the host. + - bugfix: ID locking and unlocking work. + - bugfix: Security camera consoles no longer have infinite range. + - bugfix: fixed consecutive tgui text input inheriting user input from previous + input form within the same proc +2024-03-20: + Rhials: + - code_imp: Deathmatch files, map names, and keys should all be consistent now. + SkyratBot: + - bugfix: You can no longer determine the result of a dice roll from off-screen. + - bugfix: Prisoners who are teleported to the Nanotrasen Work Camp should now always + be stripped of their gear to prevent escapes. + - bugfix: If you place a headset on a non-Poly Parrot, you should be able to remove + it from the parrot as-expected now rather than having the parrot send it to + the shadow realm. + - bugfix: Deathmatch players should no longer be able to roll any midround antagonist. + softcerv: + - rscadd: Adds in fullscreen overlays to soulcatchers/carriers +2024-03-21: + LT3: + - bugfix: Export barcodes are visible on wrapped packages + SkyratBot: + - bugfix: The deathmatch modifiers modal menu can actually be opened now. Also fixed + a bunch of issues it had. + - bugfix: Fixed the lua editor being outright broken. + - admin: cluster bombs stop spamming admin logs + - image: modified gi sprites, making them more customisable. + - qol: Can now use wirecutters when performing Tend Wounds. + - code_imp: Mineral logging now collects ore names more cleanly. + SomeRandomOwl: + - admin: Deathmatch Bombs, Smoke, and Liquid floods are now suppressed in the logs + and will not actively spam admin logs. + - code_imp: adds a area flag to suppress logging for floods and bombs +2024-03-23: + SkyratBot: + - rscadd: Added secondary objectives to bitrunning! + - rscadd: Pick up encrypted curiosities and return them to the safehouse to claim + their contents. + - rscadd: Glacier Grind has been given a secondary objective, look out for the limited + edition hat. + - rscadd: Bitrunning domains can now be modified during the round by admins. + - qol: ID cards in modular computers can now be swapped. + SpaceLoveSs13: + - balance: By default machines will print items faster now. + - refactor: variable to keep machines slowed or fastened up in print speed added. + Zergspower: + - admin: renames ruin names to have an identifier in front of it + - refactor: converts map plate and jump to ruin to tguilist +2024-03-24: + 00-Steven: + - bugfix: Fixed patronizing paintings not giving a cut to the curators. + Melbert: + - rscadd: Spies may now roam the halls of Space Station 13. Watch your belongings + closely. + Rhials: + - bugfix: Removes some dirt tiles on the Sunrise deathmatch map, which would fill + the map with lavaland atmos. + SkyratBot: + - image: fixed Fulton balloon having its smallest sprite copy pasted over itself + - bugfix: basic mob pirates no longer drop fake energy weapon lenses when shooting + you to death with lasers. + - bugfix: Painting patronage works again when there's no curator present during + the round. + - bugfix: Clients joining a round twice as a crewmember (via admins or otherwise) + no longer break security/medical record consoles permanently. + - bugfix: reagent containers like cup & syringe only update target appearance if + action was successful. + - bugfix: envelops don't stack overlays when interacting with cup & syringes. + - rscdel: Removed the (non-working) "Perma-Flipping" and "Echolocation" deathmatch + modifiers. + - rscadd: Added "No Slowdown", "Random Teleports", "Snail Crawl", "Forcefield Trail" + and "Manual Blinking/Breathing" modifiers. + - bugfix: Fixed deathmatch cruise missiles looking like standard pods. + - rscadd: Added corner filled warning decals + - bugfix: Alternate job titles such as chef and department security actually get + injected to the manifest as their respective ID trims, instead of being assigned + the job they're based off. + - bugfix: Alternate job titles such as chef and department security actually show + up under the right department on the manifest, instead of no department. + - bugfix: Vending machines will update its UI if ID is lost at any point + - bugfix: Vending machines won't brick if the payment fails (like due to lose of + ID) for any reason + - bugfix: pet carrier unfriending pets put in it. + myraowo: + - rscadd: Added the Chief Engineer's turtleneck and turtleneck skirt to the game. + - rscadd: Added the Chief Engineer and Chief Medical Officer's turtlenecks to their + respectives garment bags. +2024-03-26: + Melbert: + - qol: A few species (such as Jellypeople) now have proper(ish) preference menu + setups + - config: The in-repo species config has been updated. Well it's still the same + by default, but it's now updated for newer species. + Rhials: + - bugfix: Venus Human Traps can once again entangle victims and drag them into their + web. + SkyratBot: + - qol: Fishfood is now more easily acquired through cargo + - qol: Smoke machines can actually be rotated with alt-click when unwrenched. + - refactor: Touched most of the code for racks. It should function almost entirely + the same save for what's noted here, please report any issues. + - code_imp: Wrenching moved to wrenching procs. Side-effect, rack items are only + deconstructed on left-click + - sound: Items that have sounds make them when placed on racks, much like when placed + on tables. + - sound: Rack items now make a sound upon deconstructing them. + - bugfix: Racks no longer let you attempt to place abstract items like the slap + hand or water tank spray nozzles on them. + - qol: Clicking on a rack no longer kicks the shit out of it if you don't actually + have combat mode on. + - qol: Racks and rack items have hover tooltip usage context. + - rscdel: Killed ancient rack code for dragging your active item onto a rack. Just + click it does the same thing. This allows you to actually dump items onto racks, + though currently disorderly. + - bugfix: Changelings with a flesh ID now properly show the icon of the disguised + ID in examine. + - qol: Gold and silver crates now accurately reflects NT's greed + - bugfix: Driving a vehicle into the supermatter will kill everyone riding the vehicle + - bugfix: RCD logs are more human readable & stores the player name behind the action. + - bugfix: Musiver, Godblood, Synaphydramine, Hollow water and unholy water will + no longer show up in secret recipes + - bugfix: Fixes flamethrower runtime preventing them from working. + - bugfix: text fields which should save their value after hitting enter/closing + the UI now actually does that + - bugfix: lathe search bar now saves its previous search query after the UI is closed + and also reloads search results correctly + - bugfix: Crank weapons now can actually be charged using their crank. + - bugfix: Stun batons and their variants now actually meaningfully consume charge + when used. +2024-03-27: + Melbert: + - rscadd: You can talk via plushies, action figures, and toy mechs via `.l` or `.r`, + same as a ventriloquist dummy or decapitated dead + - rscdel: Talking via a plushie, action figure, toy mech, ventriloqiest dummy, decapitated + head, or marionette won't transmit over open mic comms + - refactor: Some say refactor and code cleanup. Vending machines now properly respect + being shut up. Report any oddities. + - refactor: Food hunger bar has been refactored, and moved. Now it sits next to + the moodlet face. + - refactor: Food moodlets now update a lot more snappily. There is now a moodlet + tier between "being fat" and "being normal", to reduce accidentally gorging + yourself to "fatness" tier. + - rscdel: You can't hallucinate being hungry... for now. + Rhials: + - code_imp: Splits up the nuclear operative antagonist datum folder. + SkyratBot: + - rscdel: Removed Orbit Polling component, all orbit polls now use the Poll Alerts + system + - code_imp: Poll alerts support small border pictures in the chat message + - code_imp: Poll alert alert picture and jump target do not have to be the same + - qol: Slime intelligence potions ask the user for a reason, this will be shown + to ghosts +2024-03-28: + Melbert: + - refactor: Infrared emitters now function better (or at least more how you would + expect them) (hopefully). Report any oddities + - bugfix: Fixes polling for things causing said things to have their planes and + layers screwed up (causing random objects or mobs to appear above runechat and + blindness, for example) + Rhials: + - code_imp: Players now receive antag datums specific for reinforcements/support + borgs. + SkyratBot: + - bugfix: A recent glitch within the Syndicate-coded uplinks resulted in a number + of Cybersun-branded cybernetics being distributed for absolutely no cost at + all, except to the company itself. This embarrassment has resulted in increased + tensions within the Syndicate as a culprit for this costly mistake is sought + out. + - bugfix: You can't complete a genetic makeup scan when the targets moves out of + target anymore using a genetic sequencer + - rscadd: Hemiplegic now lets you pick which side is disabled. + - rscadd: The medical records text for hemiplegics now shows which side is disabled. + - bugfix: failing to equip a dual handed item should properly clear out all status + effects related to equipping it, for e.g. remove the action button from chainsaw + - bugfix: A broken item was removed from the mimesvsclowns ruin. In its place is + a spent revolver round. + - qol: Vending machines now have contextual tooltips for interactions with tools/objects/restocking/returns. + - qol: Vending machines can now be examined to see what type of restock module they + need to be refilled. + - bugfix: Fix hack comms console/locate weakpoint objective showing up multiple + times +2024-03-30: + IgiariValkyr: + - rscadd: Akhter Frontier Technologies has imported more goods to the sector, allowing + many more homemade creations! + SkyratBot: + - code_imp: Borgo rightclick ranged code + - bugfix: Fixed some poll alerts runtiming + - bugfix: Botanists will be given dank pizza when consuming the infinite pizza + - bugfix: Fixed the "Fenced Goods" black market category. + - balance: Removed the LTSRBT from cargo and added it to the blackmarket, reduced + the price from 4000 to 625 on average. + - balance: The time it takes for captured mobs to be automatically sent back to + the station from the holding facility has been increased from 3-4 minutes to + 6. + - rscadd: You can buy mobs captured by contractors, traitors and pirates from the + black market and have them sent back to the station in advance. For safety, + they'll also be handcuffed (not always) upon delivery. + - rscadd: Human mobs sold by pirates are not deleted anymore. Instead, they're now + captured and sent to the holding facility. diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml new file mode 100644 index 00000000000..f6e6ba8c939 --- /dev/null +++ b/html/changelogs/archive/2024-04.yml @@ -0,0 +1,783 @@ +2024-04-01: + SkyratBot: + - balance: Your heart stops beating when you die now. +2024-04-02: + JohnFulpWillard, Tattax: + - rscadd: 'Adds a new station trait job: The Human AI.' + Melberet: + - bugfix: Jellyperson, Luminescent, and Stargazer hair no longer look bad. All jellyperson + types no longer have eyesockets. + Melbert: + - qol: Hand labels now have a visual effect associated, and are also affected by + heat / can be cleaned off like stickers. + - refactor: Refactored hand labels. They're objects now! + SkyratBot: + - qol: Adds contextual screentips to air alarms + - bugfix: Importing songs into instruments no longer cuts the first line of the + song. + - bugfix: Fixes ghosts being able to change a lathes output direction. + - bugfix: Vending machines now show the correct vending refill name when examine + and not full. + - bugfix: Vending machine no longer shocks you twice when you pulse high voltage + wire. + - bugfix: Airlock wires window closes when you get shocked + - rscadd: Active skillchips are now copied on bitrunning avatars. + - rscadd: To celebrate it, a skillchip is now available from the bitrunning order + console, which lets you dodge projectiles for the duration of your flips, at + the cost of stamina. + - rscadd: Crowbars/wirecutters now deconstruct wooden/cardboard crates/boxes +2024-04-03: + LT3: + - spellcheck: Minor improvements to examine panel CSS + SkyratBot: + - bugfix: Tramstation now has a pepperspray dispenser in it's science security outpost, + as with other security outposts. + - bugfix: Fixes the conveyor belts found on north star's boulder processing room + to all work when the lever is thrown. + - refactor: Auxlua no longer uses the timer subsystem to get stuff done, lua scripts + shouldn't slow down timers anymore. + - balance: Smoke Machines, Showers, Vapes, etc will no longer arbitrarily delete + a random amount of the chems they are processing + tmyqlfpir: + - rscadd: Add vents/scrubbers to dorms on Interlink + - rscadd: Added new techweb exclusive to DS-2 +2024-04-04: + Majkl-J: + - qol: The character pref menu is now split in two + Melbert: + - rscadd: 'Adds 3 Traumas: Primal Instincts (special), Kleptomania (severe), and + Possessive (mild)' + SkyratBot: + - bugfix: lua scripting should work on BYOND 515.1633 + - rscadd: Disposal bins can now hold destination taggers using right click, and + can be removed the same way. Some disposal bins should have some pre-loaded + as well. + - bugfix: The captain's safe is no longer on the wall, therefore cannot be cheesed + by breaking the wall it sits on. + - bugfix: Tearing down a wall that a safe is on now drops the safe with its contents, + rather than dropping the contents onto the floor. The safe's contents cannot + be interacted with while it's not on a wall. + - bugfix: Fixed the LTSRBT. + - bugfix: Selling stuff in cargo gives us money again. + - bugfix: Fixed lua error logging. + - bugfix: Fixed the SS13.start_loop function not working properly. + - bugfix: FIXED CARGO EXPORTS! + - rscadd: cultists can now convert pets to their side + - bugfix: number input dragging will only send payload to backend when its value + changes, Same applies when you hit enter or click outside the field, the value + must have changed to trigger the back end + - bugfix: You can once again drag your mouse anywhere in the window outside the + number input field to vary the value by large amounts + - code_imp: removed unnecessary variables(suppressFlickering, updateRate & event + object param for handlers) from Number Input + - rscadd: Added a persistent piggy bank to the vault, which can carry up to a modest + 2000 credits worth of dosh between rounds. + xXPawnStarrXx: + - rscadd: Added trauma team items and more deforest goodies. +2024-04-05: + Bisar: + - bugfix: Adjusted the code for changeling reviving stasis to only make them spend + chemicals once. + BurgerBB: + - balance: 'You can no longer visually track something (See: AI tracking) if that + object is inside something. You are also considered invisible by tracking if + your alpha level is less than 50.' + LT3: + - bugfix: Fixed being unable to start self surgery + Majkl-J: + - bugfix: Service guard can now use a baton in the service hall + Melbert: + - bugfix: Non-PKA kinetic blasts should work better + - bugfix: Stabilized Red extracts no longer bypass Immutably Slow items + - bugfix: Settler equipment speed modifier no longer applied to Immutably Slow items + - bugfix: Immutably Slow items no longer block construction of certain items + - bugfix: '"Mind Gate" does self brain damage as intended' + - refactor: Blood deficiency and slimepeople now handle blood a tiny bit differently, + report any oddities. + - refactor: Blood deficiency now handles its mail goods a tiny bit different, report + any oddities. + - bugfix: Puzzlegrids now report their answers properly + - rscadd: Bitrunners can now broadcast their Bitruns to the station's Entertainment + Monitors. + - bugfix: Blocks mobs from trying to "physically" interact with some of their hud + elements, such as using Telekinesis or point a gun at your mood meter. + - bugfix: Clown PDAs slip people when not worn + - qol: Socially Anxious people should be able to talk a bit more clearer while still + maintaining the stuttering "charm" + - refactor: Refactored bioware slightly (the stuff experimental surgeries gives + you). Report any weirdness + - bugfix: Heretic sac restarts your heart + Melbret: + - bugfix: Revival Surgery, Strange Reagent, and the Reviver Implant will restart + your heart when you are revived + SkyratBot: + - balance: The polymorph belt will no longer register space dragons as acceptable + DNA. + - qol: makes surgery cap small + - rscadd: Wise cows produce surprising milk. + - spellcheck: You now milk the owner of an udder, not the udder. + - bugfix: abstract(like the dual hand thingy on your hand) & hologram things can't + be put inside storage items + - bugfix: Detective revolvers can no longer exist in a quantum state of both being + chambered in .38 and .357, without risk of misfire. Detectives, cowboy enthusiasts + and reckless federal agents across the Spinward Sector mourn the loss. + - rscadd: The PML-9's name has been changed to something that's a little less boring + random numbers and letters, and something that TTS can likely pronounce much + nicer than before. Get blown up by a Dardo rocket launcher today. + - image: Sprites for rocket launchers, rockets, and rocket projectiles have been + changed to something fresher looking. + - balance: Rocket launchers can be worn on your back or armor vest. + - bugfix: turret id panel checks the access of the attacking item instead + - code_imp: Made the easter rabbits spawn on a more curated list. + - bugfix: the virgin mary picture no longer makes its initiates harddelete + - config: mech logging is now on by default. Existing config setups will not mirror + this change. + - bugfix: You can actually hit racks with objects when in combat mode again. Importantly, + painting them with spraycans like that works again. + - bugfix: the follow link upon poll completion should work properly now + - bugfix: after 9 years, adds a single dot to the dragnet code, making it deal stamina + damage as intended + - image: Updated the Advanced Surgical Tool's sprites + - code_imp: Updated the Advanced Surgical Tool's light code + - rscadd: Added a new Neutral Quirk to indicate to Medical you're willing to be + borged + - rscadd: You can now fax painted canvases in order to send memes to each other. + - code_imp: Whether something counts as a stimulant to All Nighter is now handled + by the reagent itself when metabolized, for everyone's sanity. Side-effect, + you need a liver to process stimulants for All Nighter. + - balance: Fuel your sleep deprivation in style! Made more reagents work with All + Nighter. This includes all coffee/tea variants, a few other drinks that would + have a high enough caffeine level, kronkaine, ephedrine, and in case you're + insane you can straight up eat coffee or tea grounds. + - bugfix: buying & selling huge quantities of materials on the market won't cause + their prices & quantities to go beyond bounds. + - spellcheck: fixed grammatical error in chemical splashing + - balance: Traitors can no longer turn themselves into dragons. + - rscadd: Added a 'kaching' sound to the game, and made uplinks play this sound + locally to the user whenever a purchase is made. + - spellcheck: however, he burn`s` his finger in the process. + - bugfix: Holographic energy swords have undergone some more rigorous safety inspections, + and should no longer be a danger to clumsy crew members. + - balance: secbots no longer can be buckled + - bugfix: aheal no longer turns monkies into humans + - qol: Player panel "make monkey" turns humans into monkeys through mutation instead + of making a new mob + - bugfix: elevators may no longer pick up things from under the floor during movement + - balance: You can now adjust the suit sensors of another player in the strip menu. + No longer must you first take it off. + - bugfix: fixes reagent production selection overwrite updating during selection + - code_imp: updates reagent menu for Odysseus + - bugfix: Fixed the "Random" deathmatch modifier. Also turned the "Heightened Hearing" + option into a modifier as well. + - bugfix: Certain weather types that arent supposed to be glowing no longer glow + - image: Snow storms no longer glow + - bugfix: Circuit multitools can now correctly scan carbons who are wearing clothes + or holding objects again. + - qol: The eye of god now protects from the madness inducing effects of supermatter + crystals and singularities. This trait is shared by the meson night vision goggles + (which this is a better version of) + - refactor: The Scan ability has been refactored into a pointed spell. + - balance: The Scan ability has a lower cooldown of 35 seconds. + - balance: The Scan ability now gives an advanced health scan readout of the target. + - balance: Scanning someone alerts the target as to who is responsible, rather than + being completely silent as to the culprit (much to the annoyance of anyone who + is victimized by someone using this on them) + - code_imp: The status effect that was called Stagger (not Staggered, which is separate) + is now called Rebuked. + - balance: Rebuked applies a x2 action delay cooldown, rather than x1.5. + - qol: Makes it easier for heretics to click on influences without accidentally + drawing a rune with their codex cicatrix because the animation shifted and made + you click on the floor instead. + - admin: Advanced Debug Cards will still provide a whole lot of access, but the + way the money on those cards work is now a bit different. Players shouldn't + be able to use the money on those cards in any context though, don't fret about + that. Just know that the money printer goes wrrrr + - balance: evil seedlings can no longer be mass produced + - qol: some experiments now give you more helpful hints at why your failing + - code_imp: changes around some experiment code to make it more understandable + - balance: Halon combustion releases 2.5 moles of pluoxium per mole of halon consumed. + - balance: Halon combustion no longer releases carbon dioxide. + - balance: Halon combustion releases resin foam. + - balance: Halon formation requirements changed to require electrolysing BZ instead + of N2O and CO2. + - balance: Halon formation changed to no longer slow down at higher pressures. It + instead accelerates at higher temperatures. It is much faster overall. + - balance: Halon formation releases 91.2321kJ of thermal energy per mole of halon + consumed. + - bugfix: destructive analyzers can now get screwdrivered instead of put it in. + - bugfix: destructive analyzer now accepts alien wire cutters, and emags. + - qol: Dynamic midrounds "Obsession Awakening" and "Blob Host" now have ghost orbit + popups, so you can see them happening in real time. + - qol: There is no longer a ghost orbit popup for players being shocked by an electrified + tram rail. + - qol: The Stray Cargo orbit popup no longer has a half-second window to orbit before + it becomes useless. + - bugfix: Fixed double-encoded messages with AI holocalls. + - qol: AIs now get a z level indicator + - qol: You can now open airlocks (That you have access to) while inside a stealth + implant box + - balance: minebots have been buffed and have recieved new upgrades + Some Random Owl: + - rscadd: Added a food preference system! It has a few checks, but otherwise, gives + you a huge amount of freedom to decide your tastes! Give it a peek in your character + menu! + - rscdel: 'The quirks: Deviant Tastes, Pineapple Hater, Pineapple Liker, and Vegetarian + have been hidden as a result meaning they will be removed from all characters + who has taken these quirks to compensate for the fact you can set your preferences + for food rather than take these quirks' + StrangeWeirdKitten: + - rscadd: Nanite slurry OD will now heal synthetic organ damage, but raise core + temperature and do brute (half the rate of healing) in exchange. + - balance: Nanite slurry twice as effective for healing, but OD has been reduced + to 10u from 20u + - balance: Remade the orderable nanite slurry pills bottles into critical system + repair pills. Each pill will inflict a nanite slurry OD (30u), do ~ 75 brute, + some burn, but heal ~ 240 organ damage. + icequibe: + - qol: Allowed players to fully use the underground hermits without assistance outside + of ruin + jjpark-kb: + - rscadd: added the ability to make apc, fire alarm, and air alarms from forging +2024-04-06: + Majkl-J: + - bugfix: Guns are no longer a piece of attire + SkyratBot: + - admin: Admins can now run lua files bigger than 36 KB by importing them directly. + - bugfix: Removed erroneous light switch in janitor office + - bugfix: Modular shields now give correct feedback and no longer dissuade individuals + from breaking them. + YakumoChen: + - image: Headshots will no longer accept links from Discord, as they eventually + break. Imgbox has been added as an alternative image host. + projectkepler-ru: + - qol: Due to the equal opportunity act, nitrogen breathers and vox lungs design + were now added to limb printer to comply with the FDA regulation +2024-04-09: + Zergspower: + - bugfix: fixes Borg and Syndicate inducers not working +2024-04-12: + SkyratBot: + - bugfix: Medbots can no longer be used as especially large golden ID cards + - bugfix: Fixes lavaland SMES and other crap from not starting with enough energy. + - bugfix: The pirate SMES are now magical instead of secretly infinite. + - image: added gags sprites for; Sailor dress, Evening gown, Cardigan skirts and + striped dresses. + - refactor: Xenomorphs (Lavaland & Oldstation ones) are now basic mobs. +2024-04-16: + Majkl-J: + - bugfix: Actually disallows ghosts from flipping tables upright + - bugfix: Borgs no longer have wifi table control, and have to flip tables by being + next to them + SkyratBot: + - image: Pinpointers have been resprited +2024-04-17: + Bisar: + - qol: Cyborgs now understand door and APC wires at a glance, among others + LT3: + - balance: Rebalanced alcohol intoxication effects. + - balance: A unit of alcohol will now last longer in your system + - balance: Alcohol intoxicates at the same rate regardless if you chug it all at + once or sip it over a few minutes + - balance: Reduced light drinker quirk's booze penalty from 100% to 33% + Majkl-J: + - bugfix: Birdshot ci + - refactor: refactored some deciseconds in skyrat modular files with seconds + Melbert: + - bugfix: Skill rewards should properly be dropped out of unworthy player's hands + - bugfix: Captive Xeno end round report should make a tad more sense + - qol: Basic Bots will use their "salute" emotes less often. + - rscdel: Basic bot fists. + - bugfix: Fix fancy anomaly theme being broken + Rhials: + - bugfix: Sweeps a tile of dust off of the Maint Mania deathmatch map, which was + causing errors. + SkyratBot: + - image: Updates old belt sprites. Mostly the bags, but some misc. ones as well + like the chainsword and RPED + - bugfix: Broken chameleon kits can't be unbroken by an EMP. + - bugfix: strip menu sensors change respects locked sensors + - balance: Atmos resin can directly cool the floor. + - qol: Atmospherics Overalls now can store fire extinguishers in the suit storage + slot + - balance: Increased Advanced Extinguisher capacity to 100u + - qol: General settings tab into TGchat, looks better now, and is more convenient + to use. Also, each button has a font written on it. + - rscadd: Coffee machines can now carry over reagents from the beans to the coffee + (surely no one will inject poison into them) + - bugfix: RPEDs can be used on vendors again. Note that only bluespace RPEDs can + carry vendor refills as of writing. + - bugfix: RPEDs can display vendor parts again. + - bugfix: Restocking vendors gives credits whether done manually or by RPEDs. + - bugfix: Vendors reset their contained credits when restocked. + - qol: Crayons can now draw up to 4 letters at a time per tile. + - rscadd: A bunch of new medipens you can refill with the medipen refiller (survival/luxury/mutadone/saturnx/meth) + - spellcheck: Pre-Approved Cyborg Candidates are no longer "Cantidates" + - image: Updated the ability icons used by AIs and station bots + - bugfix: Being in critical condition no longer damages zombies. + - code_imp: TRAIT_NODEATH will actually stop you dying in (most) cases. + - spellcheck: Fixes a typo in the cargo console. + - bugfix: Goliaths can't grab their own riders with tentacles + - spellcheck: Effectively hitting furniture and machines with objects will no longer + be double punctuated. + - bugfix: blood rites - will no longer delete after running out of charges + - bugfix: blood rites - now heal shades as well + - bugfix: blood rites - now charge 1.65x for self healing as opposed to the ~2x + they were before + - code_imp: blood rites code hurts my eyes a bit less now + - spellcheck: grammar fixes in the roundstart advisory warnings + - bugfix: minebots no longer bomb each other (and other miners) through landmines + - bugfix: minebot shields will no longer lose color in lower z levels + - bugfix: Operating computers clears its ui display procedures if patient is moved + out of the operating table in any way + - balance: The upload and communication boards directly have trackers installed, + activated only when authenticated. +2024-04-18: + LT3: + - rscdel: APCs will no longer arc unless tampered with + - bugfix: APCs don't kill lights when a cell charger is used + - balance: Tesla coil zap modifier increased for increased roundstart power collection + - bugfix: Multi-cell chargers work properly with the new power system + - bugfix: Synth charging cord implant works properly with the new power system + SkyratBot: + - image: Everything that used the old gangtool sprites (door remotes, landing field + designators, some choice beacons, windicate borg reinforcements) has been resprited. + - image: Door remotes now visibly show their current mode. + scrcr0: + - rscadd: 'Adds the following emotes: howl, pant.' + - rscadd: Adds audio to clear_throat (male and female cues) + - rscdel: Removed duplicate definition for clear_throat. +2024-04-19: + Bisar: + - bugfix: Mechs will no longer delete their living non-occupant contents when destroyed. + Majkl-J: + - code_imp: All cafe areas are now children of /area/centcom/holding/cafe + - bugfix: There is only one borg inducer now, fixing a few bugs related to there + being multiple under the same path + Melbert: + - refactor: Staff of Healing should perform slightly better. + Nerev4r: + - rscadd: Teshari are now more agile, better at hearing stuff, and can feast on + carrion! + - spellcheck: The language icon and description for Schechi has been reworked to + be more lore-compliant. + Rhials: + - bugfix: The tide of post-round blob zombies when a blob wins will no longer break + the speakers in your headset. + SkyratBot: + - bugfix: Fixes Radiation Hood not having FOV blockage + - bugfix: Autolathe correctly computes the print amount of custom material items + like toolboxes and doesn't grey out its print button + - bugfix: 'LUA: Registering a signal on a deleted datum will throw a more descriptive + error message.' + - qol: slaughter/laughter demons have a cooler round end report + - qol: you may not bodyslam yourself as a demon + - code_imp: slaughter and laughter demons are given their antag datum when their + mind initializes + - bugfix: Medipens can no longer be deepfried, closing an exploit that allowed people + to drain/inject chems into it with saltshakers and IV drips. + - bugfix: fixes ody sleeper UI not updating to new chems to inject. + - bugfix: fixes ody sleeper not telling user why they can't pick up a person. + - code_imp: gives a common method for giving reagent list data to .tsx + - bugfix: Netpods have had their security against exploits increased. + - bugfix: deathmatch can no longer occassionally send people to nullspace + - bugfix: facescarf ui toggle button works again + - qol: Basic dexterous mobs now have a health doll and screen damage indication + like other basic mobs. + - bugfix: Vorpal Scythe execute messages now read correctly. + - bugfix: Bit avatars no longer have access to free binary comms with the AI outfit + - image: Fixed the lobby menu's collapse button being offset by a pixel + jjpark-kb: + - rscadd: added the cursed ash carver (ashwalker crusher) + - rscadd: added primitive bonesetter and primitive-looking plant bags + - balance: removed the time limit from the ash staff + - balance: doubled the volume of the primitive centrifuge (50 to 100) + - balance: removed the consumption of bluespace in many ashwalker rituals + - rscadd: added the research paper from simple research (4 cloth in the crafting + menu) + - rscadd: added the research skill + - balance: experisci scanner affected by research skill + - balance: xenoarch affected by research skill +2024-04-20: + '@Crumpaloo, @Majkl-J': + - image: New foxtrot peacekeeper borg model, sprites by Crumpaloo + - code_imp: Moved around cyborg dmi defines to give the precompiler a break + - config: Development config now has both sec and peace cyborg modules enabled + Arturlang: + - rscadd: Adds backup ways for the book of kindred to spawn, either spawning on + a curator or on the codex gigas + - rscadd: Decapacitated bloodsuckers can now talk! + - rscadd: The stat bar will show you the threshold for exiting frenzy now too when + you are frenzying. + - rscadd: Bloodsucker abilities now will show their level when you hover over them. + Trust me, this was really neccessary. + - rscadd: Tremere now also get informed of how much blood they need to pay for level + ups. + - rscadd: At level 3, haste will now remove stuns and do a non-stunning dash + - rscadd: Bloodsucker blood display now always updates when a bloodsucker's blood + level is changed + - rscadd: Bloodsuckers can now examine hearts to see if they are valid for the heart + thief objective + - rscadd: Bloodsucker vassals now clean up any traits gained from their tenure as + a vampire's minion. + - rscadd: Favorite vassals now properly clean up their effects once the antag datum + is lost. + - rscadd: Bloodsucker synths will be able to heal their prosthetic limbs, but normal + bloodsuckers still cannot. + - rscadd: When you exiit torpor as a bloodsucker, you will completely heal any toxin + and oxygen damage, as you should already be immune to it. This is a safety feature. + - rscadd: Entering a coffin will normalize your temperature and extinguish you if + you're on fire, if you are a bloodsucker. + - bugfix: bloodsucker vampire bats will no longer /list you when attacking + - bugfix: Hopefully fixes some torpor loops related to frenzy + - bugfix: Hopefully fixes bloodsuckers cryoing not removing vassal datums + - bugfix: Bloodsuckers can no longer use veil of many faces while unconcious + - bugfix: lizard bloodsuckers will no longer suffer from heat for a long time + - bugfix: The ventrue objective now properly succeeds if you have sired a vampire + - bugfix: Livers are no longer required for bloodsuckers to live, as it caused them + toxin damage which overrode the trait that made them immune to toxins. + - bugfix: Entering torpor now accounts for all damage types, even when you should + be immune to them. This is to ensure you enter torpor to heal those damage types + in the case of odd behaviour. + - balance: coffins should now set your temperature to normal and extinguish you. + - balance: bloodsucker level up cost is now 15% of max blood, down from 20% + - balance: Caps humantiy loss at 50 humanity/500 blood to frenzy, and makes it remove + your masquerade ability. + - balance: Bloodsucker bats now have human runspeed + - balance: Blood cost for vassalizing was almost completely removed, now only taking + tiny amounts of blood to do so. + - balance: Fortitude now gives you burn resistance, just 20% less than brute resistance + - balance: Can no longer gut bloodsuckers + - balance: Bloodsuckers loosing their heart will make the vampire unable to use + their abilities or even regenerateor revive via torpor, you can however regain + your heart if you sleep in a coffin with a heart. + - balance: Stakes now have different properties, the normal stake is fast to stick + in someone, but can fall out on it's own, the burnt one takes longer to be put + in, but doesn't fall out, the silver stake is the slowest to be stuffed in someone's + heart, and is the only stake to be able to cause a Final Death to a sleeping + or dead bloodsucker + - rscdel: Dullahans can't be bloodsuckers since... their head isn't attached + - admin: Bloodsuckers and vassals can now be banned like other antags. + - bugfix: Borers no longer get wasted by ash storms while inside a host + - rscadd: Adds the hemophage-only quirk, Sol weakness + - code_imp: Refactors the sol subsystem so that itself decides if it should run + or not based on if anyone is using it. + - code_imp: Refactors bloodsucker UI elements so that they can function fine outside + a bloodsucker antag datum + - code_imp: bloodsucker_blood_volume, humanity_lost, bloodsucker_level and bloodsucker_level_unspent + are now private variables due to them being used for UI updates, if you need + to change them, use the procs that are written in the autodoc + - code_imp: Quirk species whitelists no longer use bitflags, but use the species + ID's. Easily allowing you to add new whitelists without having to mess around + with making a new bitfield + - bugfix: Ventrue sired bloodsuckers will no longer have a copy of their abilities + - rscadd: Bloodsuckers that start out with no heart will be able to regain one, + but it now properly checks if they have one or not, and disables their abiltiies + accordingly, go into a coffin with a heart if you want to gain one. + - rscadd: Lunge can now take out any organ out of a dead corpse, based on where + you are aiming in the targeting doll, it will still prioritize a heart if aimed + at chest + - bugfix: bloodsucker sol quirk removal is now silent + - bugfix: You can no longer unwrench lair coffins + - bugfix: gohome will no longer render you stuck in a coffin if it cannot close + - bugfix: Malkavians should now spout nonsense less often if you've not lost humantiy + yet + - bugfix: 'Lunge can now actually stun people if you lunge at them from behind. + + fix; You can no longer spam drink from blood bags.' + - code_imp: clan_life now has seconds_per_tick and times_fired + - bugfix: Book of kindred display cases should now spawn properly on TG maps. + - bugfix: Duplicate books of kindred won't spawn on new curators + Azarak: + - admin: administrators can now toggle job playtime exemption by job basis for players + Boviro: + - rscadd: Added butler as assistant title + BurgerB: + - bugfix: Fixes Moonstation Ministation not counting blob tiles. + BurgerBB: + - balance: The RBMK can now handle more power generation before going into meltdown + with upgraded parts, and also generates less power with upgraded parts. + - bugfix: Fixes the RBMK having an infinite meltdown state when safeties trigger + at the same time as a meltdown. + - balance: After 3 Lichdom resurrections, announcements will be made about your + general phylactery location (the area) when you die. Phylactery binding now + requires the object to be at least bulky in size, and it cannot be fireproof, + lava proof, or indestructible. + - rscadd: Adds REAL banhammers send people to the void temporarily (similar to immortality + talisman or void genetic power) on hit. Hitting someone on combat mode with + it sends them to permabrig instead, if they're not already in the permabrig. + - rscdel: Replaces the High Frequency Blade the wizard gets with a REAL banhammer, + and reduces the spell cost from 3 to 2. + - rscadd: Makes Moon Station actually a moon now because people made fun of me. + - bugfix: Hopefully fixes the error handler throwing errors too early. + - bugfix: Fixes early runtime issue with loadouts. + - bugfix: Fixes fake lattice linters when they spawn on lava + - bugfix: Sandstorms on Moon Station are less annoying in terms of notifications + and sound. Adds missing miner GPSs to lockers + table. Fixes typo in Moon Station + plaque. External airlocks to public areas no longer have access. + - rscdel: Removes some over the top abductor victim objectives and adds some new + ones. + - bugfix: Remaps Moon Station's robotics. Fixes some misplaced objects. + - rscdel: Removes Ash Storms from Moon Station Lavaland + - rscdel: Disables Lance Shuttle on Moon Station because it caused the crew to get + stuck on station for 5 hours once. + - rscdel: Replaces the Meteor Shuttle with THE CUBE. It's an emag only emergency + shuttle that is literally just a 16x16 cube with some engines on it. + - balance: Adds Sex holographic barriers to warn people that there is sex in the + next room. It doesn't block air or movement, but it does warn people, and knowing + is half the battle. They can be purchased in the LustWish under the premium + section. + - bugfix: Fixes planetary atmos getting created when turfs inside the station are + destroyed. + - bugfix: Fixes some Moon Station bugs, such as the funny engineering bridge access + bug and a lack of cigarette/coffee vendors. + - bugfix: Fixes Moonstation radstorms affecting some places it's not supposed to. + - rscdel: Limits Powersinks + Crab-17 purchases to once each per traitor per round. + - rscadd: Adds Ashwalkers to Moonstation + - bugfix: Fixes traitor announcer double-sanitizing. + - rscdel: Removes Xeno Organs from Roundstart Xenomorph Hybrids. They no longer + have plasma vessels, resin spinners, or hive nodes. + - bugfix: Fixes missing telecomms wire in Moonstation + - bugfix: Fixes an atmos oversight with the Voxbox on Moonstation that can lead + to superheated distro. + - rscadd: Assigns a bunch of code levels for ERT that didn't have it or I thought + should have a different one. The changes itself can be seen in the file. + - bugfix: The default code for any ERT is now "Green" so it will no longer show + a missing word when calling ERT. + - bugfix: Fixes various Moon Station issues. + - qol: Allows Ashwalkers to Breathe on Station + - bugfix: Fixes a few moonstation bugs. + - bugfix: Atmos optimization. + - bugfix: Oh Hi Daniel shuttle no longer throws. + - balance: Reworks the Gifted quirk and just gives everyone 6 free quirk points. + - bugfix: Fixes Moonstation Xenobiology Shield Walls + - rscdel: Disables Station Blackout and Random Machine Languages Station Traits + - rscadd: Adds Moonstation public mining. + - bugfix: Fixes various Moonstation bugs. + - balance: Xenos can only devour mobs that have a ventcrawler trait (Monkeys, most + Simplemobs), assuming all other checks have passed. + - balance: Heads can only be dismembered if they have a critical-tier (Compound) + fracture. If a head was supposed to be dismembered from a blow, a compound fracture + will be applied. + CliffracerX: + - rscadd: you can mount Mk. II Hyposprays onto the underside of Hypospray Kits & + quickdraw them + - rscadd: MK. II hypospray upgrade kit through imports - bigger vials, but it'll + hurt your wallet to get 'em! + - image: redid every Mk. II Hypospray, hypokit & vial sprite! + - qol: hypovials are now color-codable & the type can still be seen when loaded + into a hypospray + - qol: R&D can research how to make new hypokits & Mk. II Hyposprays + - balance: boosted deluxe hypokits' storage, nerfed small hypokits' storage & made + them pocketable + - admin: icspawning supports quirks & loadout items now + - admin: bluespace technician RPED has been significantly upgraded + - bugfix: hotfix for loadout wallets not filling properly + Erol509: + - rscadd: RB-MK2 now has its own tgui panel. + - rscadd: Added the icewalker areas to the radstorm protected areas. + - bugfix: Bloodsucker braincheck was missing a null check causing runetimes, its + been fixed. + - rscadd: Added back TEG to techwebs and engineering protolathe + - image: Changed TEG sprites from YogStation. Credits to original author. + EspeciallyStrange: + - bugfix: IDMA donor clothing being improperly offsetted and not correctly + Iamgoofball: + - rscadd: Re-enables the Galactic Materials Market as it's been fixed upstream. + IgiariValkyr: + - config: Relocked some donator items from Skyrat on request + - config: Relocks another skyrat donor item per request. + - rscadd: New Traitor Item (10TC) - Portable Listening Advanced Post + Jinshee: + - rscadd: Added rattlesnake tail + Kegdo: + - rscadd: 'more markings: Chestplate, hip, elbow, shoulder, glove, sleeve, sock, + longsock, vertical stripe, fangs, lips, facemask, facedisc.' + LT3: + - balance: Rebalanced alcohol intoxication effects. A unit of alcohol will now produce + the same intoxication regardless if you chug it all at once or sip it over a + few minutes + - qol: Airlocks don't flash constantly on engineering override, override/overlay + added for fire alarm + - bugfix: Airlock lighting should no longer render on top of player characters + - bugfix: Airlock emissives no longer overlap firedoors + - bugfix: Fixed missing overlays on various airlock types + - bugfix: Fixed status display for epsilon alert + - bugfix: Fixed fire alarm for epsilon alert + - bugfix: Fixed ineligible airlocks from receiving engineering override when activated + from the communications console + - bugfix: Various airlock/firelock overlay fixes + - code_imp: Parts of firelock code updated to parity with TG + - image: Added Moonstation specific tram sprites + - bugfix: Fixed Moonstation references to Tramstation's tram + - qol: Catbox and Imgbox are now supported hosting services for headshots + - qol: 'New moodlet: Status if you''re still processing alcohol you''ve drank previously + (and getting more drunk)' + - qol: 'New moodlet: Current drunk level' + - bugfix: Light drinker quirk should no longer floor you near instantly + Majkl-J: + - rscadd: Ghosts without clients get sent back into the menu after a while. + - bugfix: NSFW Headshots no longer override regular ones + - bugfix: 'lathes now use moderate power for printing operations /:cl:' + - code_imp: Bubber modular greyscale files permitted + - bugfix: you can now rightclick to flag in minesweeper + - bugfix: Void raptor now has the secmed locker + - rscadd: Zombie can now have hair + - bugfix: Secmeds no longer limit a few items to themselves only + - bugfix: Dauntless frames are no longer broken + - bugfix: False walls appear again + - balance: Bodyless ghosts and ghostroles can no longer transfervote + - refactor: Added support for vote mob conditions + - balance: Reagent weapons now get damaged upon reagent transfer + - balance: Imbuing once again needs actual skill + - bugfix: Minesweeper now properly gives moodlets + - bugfix: teshvali no longer have you wear human sprites + - image: New rockfruit sprites + - code_imp: Modularized hydroponics + Makeshift-coder: + - rscadd: adds an unpacked colony fabricator + - rscadd: replaces the four bluespace beakers on a table with a bluespace beaker + box for ease of access + - rscdel: Removed a single sink to put the unpacked fabricator on it + Odairu: + - config: changes law 2 wording + PhazeJump: + - rscadd: Added Harpy (large) wings + ReturnToZender: + - balance: NTR's ACCESS_CREMATORIUM replaced with ACCESS_SERVICE + - rscadd: Assistants on-station may be pleased to hear that they can now wear Head + of Staff pet collars again. ...Again. + - rscadd: Nanotrasen has deemed it fit to order an upgrade to all Consultant offices + on stations in the Spinward Sector. Check them out! + - rscdel: Donors' graceful trenchcoat + - rscadd: NTC offices have had their carpet changed out to something less over-the-top. + The windows have been expanded as well. + ReturnToZender (Writing), LT3, Waterpig (Code assistance): + - bugfix: If you have no custom species set, it will now show your default description. + ReturnToZender (code): + - bugfix: Character Directory sorting now works on all variables. + - bugfix: autopunctuation respects prefs again + - qol: Advert settings have been moved to a new category, ADVERT. + - rscadd: Character directory now has a search function on the name var. + - rscadd: Character directory now shows on the Main Menu under the Crew Manifest. + - rscadd: Character directory now has a randomizer, which will open a random player's + flavor text when clicked. Click if you dare. + - rscadd: F-list headshots are now accepted + - rscadd: Kiboko 25mm to Armory tab + - rscadd: Mini E-Gun to goodies and armory + - balance: Reduces the cost of the d'Elite rifle as it is more of a side-grade now + ReturnToZender (quirk code), TeshariEnjoer (original PR): + - rscadd: New positive trait, featherweight. Allows you to be picked up instead + of fireman's carried. This dipshit yours? + Shayoki: + - rscadd: Adds Boxstation + - rscadd: Players can now choose a voice for their characters. + - sound: Added a lot of 'borrowed' sounds to use as voices. + - admin: Admins can globally disable Bloopers + Spicelet: + - rscadd: new dogborg shirt + StrangeWeirdKitten: + - rscdel: Removes the Dauntless cameras + - rscdel: Removes the blast cannon from the traitor scientist uplink + - rscdel: Removes Dauntless self destruct and dense rock surrounding the base + - balance: Dauntless exterior turrets shoot fauna, not people + - config: Removes Akula Lore protection (Allows edit to species) + - bugfix: Humanoid and Hemophage sprites no longer have base skin tone issues. Added + human greyscale sprites. + - bugfix: Colossus will properly deaggro when you lose + - balance: But colossus bolts will gut you as a consiquence + - image: Removes the east and west sprite on the Lips bodymarking + - rscadd: Sauna survival pods. Found in mining vendor and occasionally maintenance + Swiftfeather: + - admin: Will no longer receive supermatter ate a pipe spam in the log. + - rscdel: Removed gun safeties. + Sylphet: + - rscadd: adds lunchboxes that hold food and drinks to the loadout + - image: added lunchbox sprites + - balance: scrubbers do not overflow with carpet and rainbow stuff anymore + Tupina: + - balance: Energy weapons can now fire roughly 1.3x more lasers per charge across + the board. + VrazzleDazzle: + - rscadd: Scrying Lens Disks are now available in the loadout. + - qol: The ashwalkers' ashen necklaces are now fireproof. + - rscdel: Death bolts no longer dust you on death. + - rscadd: Six new PKA variants, now in a mining vendor near you. + - rscdel: Prybars are no longer available in the Rapid Construction Fabricator. + Vynzill: + - rscadd: Added more perfumes to loadout. + YakumoChen: + - balance: Xeno Hybrids take normal heat damage, again. + Yanziko: + - balance: pet owner is free + aKromatopzia: + - rscadd: Unamored versions of the syndicate utility uniforms & half-mask + - bugfix: icecats and ashliz can spawn on the ghost cafe. + - image: icon was wrongly offset for cybernetic digitigrade right legs + destrucktoid: + - bugfix: Syndicate/Ninja Borg Restorative Nanites now heal Slimepeople just as + well as they do other people. + - rscadd: Borers back in uplink + - bugfix: Slimeperson Clockwork Cultists now heal toxins from the prosperity prism + properly. + - balance: Ventrue cannot benefit from bloodbags if their blood exceeds BLOOD_VOLUME_NORMAL + - refactor: Changed reac_volume to use AddBloodVolume() for consistency reasons + iskawhiskers: + - image: added monster2_head, monster3_head, weight2_chest_m, weight2_chest_f + nevimer: + - balance: you now hug and pat lightgeists + - admin: added public log folder, and logging. + - balance: contractor and ninja modsuits have DNA locked microbombs + nikothedude: + - bugfix: Death degradation properly DNRs + - bugfix: DNR icon has been restored + - rscadd: Robos now have a pamphlet in their bag that tells them tips and tricks + on how treat synth wounds + - rscadd: Roboticists now spawn with synthetic medkits to make their jobs a bit + easier + - rscadd: New cargo packs for synthetic medkits + - balance: Roboticists now spawn with diag huds, welding helmets, and black gloves + - balance: Synthetic burn kits now have extra bottles + - rscadd: You can now set your characters height + pixelkitty286: + - rscadd: +Peacekeeper cat borg sprites, Spider clan cat borg sprites, Engineer + cat borg refreshed sprites + - bugfix: Cat cyborg panels not working + - image: +Peacekeeper cat borg sprites, Spider clan cat borg sprites, Engineer cat + borg refreshed sprites + - code_imp: -Duplicate code + - rscadd: Added night vision and cold resistance to tajara with their respective + debuffs and gave them sensitive hearing. tajara own meat type and cat animal + hide when gibed. Cat like grace to tajara. + - rscadd: Added modular tajaran.dm, siikmaas.dm, and meatslab.dmi + - qol: The Tajara DLC. + - balance: rebalanced how the Tajaran species works. + - image: added a Tajaran ass picture. Added adhomian_meat (Credit goes to Aurora.3 + on the sprite) + - spellcheck: Corrected siik'tajr to be siik'maas. + - code_imp: modular code for tajaran species changes. + - refactor: Does refactoring Tajara as a species count? + projectkepler-ru: + - rscadd: Marketable IDMA Plushie, selectable as ironmoon tajaran plushie + - rscadd: Contract from Colt has been secured with NT and now we can buy m1911 + - image: icon updated for the reshi revolver + - balance: Colt reevaluated their contract, the M1911 is cheaper now + tmyqlfpir: + - qol: Tweak layout of Dauntless kitchen, dorms and medbay + - rscadd: Slapping glass tables have a 15% chance (cursed 30%) of breaking on 3rd + slap + - rscadd: Adds cargo ordering functionality for dauntless base + - rscadd: Add bitden to dauntless brig area + - rscadd: Add door lock to dauntless restroom, and various map tweaks + - rscadd: Dauntless - Add exterior cameras to dauntless, removed many interior ones + - bugfix: Dauntless - Removed incorrectly placed decals under hull objects and tweaked + brig/dorms + - balance: Interdyne powerator is now maxcapped to 1MW + - rscadd: Dauntless - Added new bounty pad and bounty console + - rscadd: Dauntless - Added new produce order console + xXPawnStarrXx: + - image: added GAGS versions of command stripper outfits. + - code_imp: removed donator requirement from loadout flowers. + - qol: made DeForest medipens refillable. + - rscadd: Blood filtering now restores toxins. + - bugfix: korve skinned advanced tools being invisible. + - qol: made endurogrow boost lifespan. diff --git a/icons/ass/assalien.png b/icons/ass/assalien.png deleted file mode 100644 index 7ac184aa04b..00000000000 Binary files a/icons/ass/assalien.png and /dev/null differ diff --git a/icons/ass/asscat.png b/icons/ass/asscat.png deleted file mode 100644 index e37788e3dd7..00000000000 Binary files a/icons/ass/asscat.png and /dev/null differ diff --git a/icons/ass/assdrone.png b/icons/ass/assdrone.png deleted file mode 100644 index 8a679f87c90..00000000000 Binary files a/icons/ass/assdrone.png and /dev/null differ diff --git a/icons/ass/assfemale.png b/icons/ass/assfemale.png deleted file mode 100644 index 22da27b71c2..00000000000 Binary files a/icons/ass/assfemale.png and /dev/null differ diff --git a/icons/ass/assgrey.png b/icons/ass/assgrey.png deleted file mode 100644 index 60dde099510..00000000000 Binary files a/icons/ass/assgrey.png and /dev/null differ diff --git a/icons/ass/asslizard.png b/icons/ass/asslizard.png deleted file mode 100644 index 38d82d9754c..00000000000 Binary files a/icons/ass/asslizard.png and /dev/null differ diff --git a/icons/ass/assmachine.png b/icons/ass/assmachine.png deleted file mode 100644 index 2ba447306c4..00000000000 Binary files a/icons/ass/assmachine.png and /dev/null differ diff --git a/icons/ass/assmale.png b/icons/ass/assmale.png deleted file mode 100644 index d215bc31e09..00000000000 Binary files a/icons/ass/assmale.png and /dev/null differ diff --git a/icons/ass/assplasma.png b/icons/ass/assplasma.png deleted file mode 100644 index 30294f65124..00000000000 Binary files a/icons/ass/assplasma.png and /dev/null differ diff --git a/icons/ass/asspodperson.png b/icons/ass/asspodperson.png deleted file mode 100644 index 50e5a8644ab..00000000000 Binary files a/icons/ass/asspodperson.png and /dev/null differ diff --git a/icons/ass/assslime.png b/icons/ass/assslime.png deleted file mode 100644 index 9102dce7de1..00000000000 Binary files a/icons/ass/assslime.png and /dev/null differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index fcb4e262d7c..74d5a8d282c 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/fulton_balloon.dmi b/icons/effects/fulton_balloon.dmi index 5a1fa98e148..58e2cc2a44b 100644 Binary files a/icons/effects/fulton_balloon.dmi and b/icons/effects/fulton_balloon.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index 351bb5f00c4..8bfe0af0854 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/particles/smoke.dmi b/icons/effects/particles/smoke.dmi index 4a3239499b9..99123beeb59 100644 Binary files a/icons/effects/particles/smoke.dmi and b/icons/effects/particles/smoke.dmi differ diff --git a/icons/effects/progressbar.dmi b/icons/effects/progressbar.dmi index f055a07ba14..3eed14db704 100644 Binary files a/icons/effects/progressbar.dmi and b/icons/effects/progressbar.dmi differ diff --git a/icons/effects/web.dmi b/icons/effects/web.dmi new file mode 100644 index 00000000000..e21eb4d6ec3 Binary files /dev/null and b/icons/effects/web.dmi differ diff --git a/icons/hud/lobby/background.dmi b/icons/hud/lobby/background.dmi index 554543ecf3f..5fb9085da09 100644 Binary files a/icons/hud/lobby/background.dmi and b/icons/hud/lobby/background.dmi differ diff --git a/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi index a67cc558442..7be07a7fc09 100644 Binary files a/icons/hud/lobby/signup_button.dmi and b/icons/hud/lobby/signup_button.dmi differ diff --git a/icons/hud/screen_ai.dmi b/icons/hud/screen_ai.dmi index 8f8d30c6d8b..ea456ca3947 100644 Binary files a/icons/hud/screen_ai.dmi and b/icons/hud/screen_ai.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 7aa32c94b8e..6fe43ee6ea5 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_clockwork.dmi b/icons/hud/screen_clockwork.dmi index aa815e957e4..0923e42e7e4 100644 Binary files a/icons/hud/screen_clockwork.dmi and b/icons/hud/screen_clockwork.dmi differ diff --git a/icons/hud/screen_detective.dmi b/icons/hud/screen_detective.dmi index d1d7e49a832..aed6e0d6572 100644 Binary files a/icons/hud/screen_detective.dmi and b/icons/hud/screen_detective.dmi differ diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index 1484e3f4042..ae7499d8c6f 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 b58680f025d..13255a2a168 100644 Binary files a/icons/hud/screen_ghost.dmi and b/icons/hud/screen_ghost.dmi differ diff --git a/icons/hud/screen_glass.dmi b/icons/hud/screen_glass.dmi index 29f8cb47bfd..63ad3293921 100644 Binary files a/icons/hud/screen_glass.dmi and b/icons/hud/screen_glass.dmi differ diff --git a/icons/hud/screen_midnight.dmi b/icons/hud/screen_midnight.dmi index 9cfe8db9727..5483ddf4564 100644 Binary files a/icons/hud/screen_midnight.dmi and b/icons/hud/screen_midnight.dmi differ diff --git a/icons/hud/screen_operative.dmi b/icons/hud/screen_operative.dmi index b4b38782fe1..f2d60d394ac 100644 Binary files a/icons/hud/screen_operative.dmi and b/icons/hud/screen_operative.dmi differ diff --git a/icons/hud/screen_plasmafire.dmi b/icons/hud/screen_plasmafire.dmi index 8225adbda60..5423d3855b2 100644 Binary files a/icons/hud/screen_plasmafire.dmi and b/icons/hud/screen_plasmafire.dmi differ diff --git a/icons/hud/screen_retro.dmi b/icons/hud/screen_retro.dmi index a00d16cac5e..b4252109d68 100644 Binary files a/icons/hud/screen_retro.dmi and b/icons/hud/screen_retro.dmi differ diff --git a/icons/hud/screen_slimecore.dmi b/icons/hud/screen_slimecore.dmi index b7e3a87e07a..a75fe55c378 100644 Binary files a/icons/hud/screen_slimecore.dmi and b/icons/hud/screen_slimecore.dmi differ diff --git a/icons/hud/screen_trasenknox.dmi b/icons/hud/screen_trasenknox.dmi index 58c28d83e4b..2569d2a635e 100644 Binary files a/icons/hud/screen_trasenknox.dmi and b/icons/hud/screen_trasenknox.dmi differ diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi index 048793c6078..429a766585d 100644 Binary files a/icons/mob/actions/actions_AI.dmi and b/icons/mob/actions/actions_AI.dmi differ diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi index 64b1c700f41..c13290716b7 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_changeling.dmi b/icons/mob/actions/actions_changeling.dmi index c9f48096439..73aac72deb5 100644 Binary files a/icons/mob/actions/actions_changeling.dmi and b/icons/mob/actions/actions_changeling.dmi differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index ac7575d279b..c7744749abb 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_spells.dmi b/icons/mob/actions/actions_spells.dmi index 39ea5810417..fb8c121218f 100644 Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ diff --git a/icons/mob/butts.dmi b/icons/mob/butts.dmi new file mode 100644 index 00000000000..ae4b41961a1 Binary files /dev/null and b/icons/mob/butts.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index c3e5dc82069..1b597f0d33d 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index fbe6871c92e..65ec3828d42 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 eb06288d800..4f7f64db8c6 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/feet.dmi b/icons/mob/clothing/feet.dmi index 5bd3005ab8e..3ae1eb68e86 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/head/costume.dmi b/icons/mob/clothing/head/costume.dmi index 06de36df19a..1f4f12ff8c8 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 0fd0de8e425..bdf9980b9f2 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/hydroponics.dmi b/icons/mob/clothing/head/hydroponics.dmi index b710efc3d7d..5e2a72a819f 100644 Binary files a/icons/mob/clothing/head/hydroponics.dmi and b/icons/mob/clothing/head/hydroponics.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 72c782ec96e..3a213d5275c 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 5440bf9d99d..a193fbd74a8 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suits/costume.dmi b/icons/mob/clothing/suits/costume.dmi index 3cd5770fb9a..4a1c107e844 100644 Binary files a/icons/mob/clothing/suits/costume.dmi and b/icons/mob/clothing/suits/costume.dmi differ diff --git a/icons/mob/clothing/under/civilian.dmi b/icons/mob/clothing/under/civilian.dmi index 7283996c3b1..d172185d4a4 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 26e8eec9f20..a3b6c7e5050 100644 Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ diff --git a/icons/mob/clothing/under/dress.dmi b/icons/mob/clothing/under/dress.dmi index be6e7715c48..e6cd3c27ac5 100644 Binary files a/icons/mob/clothing/under/dress.dmi and b/icons/mob/clothing/under/dress.dmi differ diff --git a/icons/mob/clothing/under/engineering.dmi b/icons/mob/clothing/under/engineering.dmi index a477f39aa23..acc5c4108d1 100644 Binary files a/icons/mob/clothing/under/engineering.dmi and b/icons/mob/clothing/under/engineering.dmi differ diff --git a/icons/mob/clothing/under/station_trait.dmi b/icons/mob/clothing/under/station_trait.dmi new file mode 100644 index 00000000000..c8ed053981a Binary files /dev/null and b/icons/mob/clothing/under/station_trait.dmi differ diff --git a/icons/mob/huds/antag_hud.dmi b/icons/mob/huds/antag_hud.dmi index bb44e3de956..90056e499fd 100644 Binary files a/icons/mob/huds/antag_hud.dmi and b/icons/mob/huds/antag_hud.dmi differ diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index eb7007c9c45..facec230477 100644 Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ diff --git a/icons/mob/human/cat_features.dmi b/icons/mob/human/cat_features.dmi index f80d0167ae8..6e7fd024fee 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/species/moth/moth_antennae.dmi b/icons/mob/human/species/moth/moth_antennae.dmi index 9a4d237cc36..a40013e9357 100644 Binary files a/icons/mob/human/species/moth/moth_antennae.dmi and b/icons/mob/human/species/moth/moth_antennae.dmi differ diff --git a/icons/mob/human/species/moth/moth_markings.dmi b/icons/mob/human/species/moth/moth_markings.dmi index 2429b0aa12d..a6ebc2cedb5 100644 Binary files a/icons/mob/human/species/moth/moth_markings.dmi and b/icons/mob/human/species/moth/moth_markings.dmi differ diff --git a/icons/mob/human/species/moth/moth_wings.dmi b/icons/mob/human/species/moth/moth_wings.dmi index 65b8fba38d9..91c0d8b2b2c 100644 Binary files a/icons/mob/human/species/moth/moth_wings.dmi and b/icons/mob/human/species/moth/moth_wings.dmi differ diff --git a/icons/mob/inhands/clothing/suits_lefthand.dmi b/icons/mob/inhands/clothing/suits_lefthand.dmi index 8b9fa5256a9..a43756d743a 100644 Binary files a/icons/mob/inhands/clothing/suits_lefthand.dmi and b/icons/mob/inhands/clothing/suits_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/suits_righthand.dmi b/icons/mob/inhands/clothing/suits_righthand.dmi index c88f4d22444..da837fdd857 100644 Binary files a/icons/mob/inhands/clothing/suits_righthand.dmi and b/icons/mob/inhands/clothing/suits_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/briefcase_lefthand.dmi b/icons/mob/inhands/equipment/briefcase_lefthand.dmi index 5781ecdc992..9eb7d24a3ce 100644 Binary files a/icons/mob/inhands/equipment/briefcase_lefthand.dmi and b/icons/mob/inhands/equipment/briefcase_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/briefcase_righthand.dmi b/icons/mob/inhands/equipment/briefcase_righthand.dmi index d48529a54e9..06ed8e2c8ec 100644 Binary files a/icons/mob/inhands/equipment/briefcase_righthand.dmi and b/icons/mob/inhands/equipment/briefcase_righthand.dmi differ diff --git a/icons/mob/inhands/items/devices_lefthand.dmi b/icons/mob/inhands/items/devices_lefthand.dmi index 7b558c20e6e..48c47f872df 100644 Binary files a/icons/mob/inhands/items/devices_lefthand.dmi and b/icons/mob/inhands/items/devices_lefthand.dmi differ diff --git a/icons/mob/inhands/items/devices_righthand.dmi b/icons/mob/inhands/items/devices_righthand.dmi index 042ecb745c4..f8f19a8709b 100644 Binary files a/icons/mob/inhands/items/devices_righthand.dmi and b/icons/mob/inhands/items/devices_righthand.dmi differ diff --git a/icons/mob/inhands/items/tiles_lefthand.dmi b/icons/mob/inhands/items/tiles_lefthand.dmi index b73ded0c82c..6bbe621db82 100644 Binary files a/icons/mob/inhands/items/tiles_lefthand.dmi and b/icons/mob/inhands/items/tiles_lefthand.dmi differ diff --git a/icons/mob/inhands/items/tiles_righthand.dmi b/icons/mob/inhands/items/tiles_righthand.dmi index 1d668c01f07..4d1d5073c98 100644 Binary files a/icons/mob/inhands/items/tiles_righthand.dmi and b/icons/mob/inhands/items/tiles_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 7e8297c848d..4c1acc9fa46 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 366f285789a..f3a5f34e247 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/silicon/aibots.dmi b/icons/mob/silicon/aibots.dmi index 8949caa0299..85f4e350589 100644 Binary files a/icons/mob/silicon/aibots.dmi and b/icons/mob/silicon/aibots.dmi differ diff --git a/icons/mob/simple/pets.dmi b/icons/mob/simple/pets.dmi index 51e59b13ec0..e4c333216f1 100644 Binary files a/icons/mob/simple/pets.dmi and b/icons/mob/simple/pets.dmi differ diff --git a/icons/obj/antags/syndicate_tools.dmi b/icons/obj/antags/syndicate_tools.dmi index 05a4c405d7d..1bab5c7e77a 100644 Binary files a/icons/obj/antags/syndicate_tools.dmi and b/icons/obj/antags/syndicate_tools.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index da8c2bda657..5df6e03de70 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/head/costume.dmi b/icons/obj/clothing/head/costume.dmi index 3cfbd3d21ef..25bc62a5314 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 6cca3da61f4..14b0fdf8b4c 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/neck.dmi b/icons/obj/clothing/neck.dmi index 6027b0022c4..e937d125ec2 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 0acc23d1282..ec2a128a865 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits/costume.dmi b/icons/obj/clothing/suits/costume.dmi index ad68aea553f..0bae97805b7 100644 Binary files a/icons/obj/clothing/suits/costume.dmi and b/icons/obj/clothing/suits/costume.dmi differ diff --git a/icons/obj/clothing/under/civilian.dmi b/icons/obj/clothing/under/civilian.dmi index 8552c5b9660..8f7c28ca047 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 b58f96b82d9..90bdc205d52 100644 Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ diff --git a/icons/obj/clothing/under/dress.dmi b/icons/obj/clothing/under/dress.dmi index d38b53746be..a79f390cd53 100644 Binary files a/icons/obj/clothing/under/dress.dmi and b/icons/obj/clothing/under/dress.dmi differ diff --git a/icons/obj/clothing/under/engineering.dmi b/icons/obj/clothing/under/engineering.dmi index dda57ccaa7e..ae2e0eb6f53 100644 Binary files a/icons/obj/clothing/under/engineering.dmi and b/icons/obj/clothing/under/engineering.dmi differ diff --git a/icons/obj/clothing/under/station_trait.dmi b/icons/obj/clothing/under/station_trait.dmi new file mode 100644 index 00000000000..5fce62c3131 Binary files /dev/null and b/icons/obj/clothing/under/station_trait.dmi differ diff --git a/icons/obj/devices/assemblies.dmi b/icons/obj/devices/assemblies.dmi index aa3476eea72..c1b0fd05f13 100644 Binary files a/icons/obj/devices/assemblies.dmi and b/icons/obj/devices/assemblies.dmi differ diff --git a/icons/obj/devices/remote.dmi b/icons/obj/devices/remote.dmi index 7b1e07462ff..e6a008bb623 100644 Binary files a/icons/obj/devices/remote.dmi and b/icons/obj/devices/remote.dmi differ diff --git a/icons/obj/devices/scanner.dmi b/icons/obj/devices/scanner.dmi index 0b4a5ef4684..cea20f32f7f 100644 Binary files a/icons/obj/devices/scanner.dmi and b/icons/obj/devices/scanner.dmi differ diff --git a/icons/obj/devices/tracker.dmi b/icons/obj/devices/tracker.dmi index e9b3574bd4f..0508fe816bc 100644 Binary files a/icons/obj/devices/tracker.dmi and b/icons/obj/devices/tracker.dmi differ diff --git a/icons/obj/fluff/general.dmi b/icons/obj/fluff/general.dmi index 1aa7ae5c898..f99cbaabc9a 100644 Binary files a/icons/obj/fluff/general.dmi and b/icons/obj/fluff/general.dmi differ diff --git a/icons/obj/fluff/puzzle_small.dmi b/icons/obj/fluff/puzzle_small.dmi index 1d94c0c8034..2f6ff9ebe32 100644 Binary files a/icons/obj/fluff/puzzle_small.dmi and b/icons/obj/fluff/puzzle_small.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index d7e3d73f861..aea93b956fc 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/machines/atmospherics/binary_devices.dmi b/icons/obj/machines/atmospherics/binary_devices.dmi index 96528d420c2..7855922700c 100644 Binary files a/icons/obj/machines/atmospherics/binary_devices.dmi and b/icons/obj/machines/atmospherics/binary_devices.dmi differ diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi index aae3a83a455..f8fb31c9ba0 100644 Binary files a/icons/obj/machines/computer.dmi and b/icons/obj/machines/computer.dmi differ diff --git a/icons/obj/machines/kitchen.dmi b/icons/obj/machines/kitchen.dmi index 5bd820e554a..c94afb8d78a 100644 Binary files a/icons/obj/machines/kitchen.dmi and b/icons/obj/machines/kitchen.dmi differ diff --git a/icons/obj/machines/lathes.dmi b/icons/obj/machines/lathes.dmi index 1c4111303eb..f4bb2116b42 100644 Binary files a/icons/obj/machines/lathes.dmi and b/icons/obj/machines/lathes.dmi differ diff --git a/icons/obj/machines/modular_console.dmi b/icons/obj/machines/modular_console.dmi index 2677dbb7122..6a8348e1b8e 100644 Binary files a/icons/obj/machines/modular_console.dmi and b/icons/obj/machines/modular_console.dmi differ diff --git a/icons/obj/machines/photobooth.dmi b/icons/obj/machines/photobooth.dmi new file mode 100644 index 00000000000..c4e812bdf47 Binary files /dev/null and b/icons/obj/machines/photobooth.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index 544054279e9..baa4cc07225 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/machines/vending.dmi b/icons/obj/machines/vending.dmi index a5db6caa6e2..bf3c42bde16 100644 Binary files a/icons/obj/machines/vending.dmi and b/icons/obj/machines/vending.dmi differ diff --git a/icons/obj/machines/wallmounts.dmi b/icons/obj/machines/wallmounts.dmi index 12a9c8e418f..e849746eb0a 100644 Binary files a/icons/obj/machines/wallmounts.dmi and b/icons/obj/machines/wallmounts.dmi differ diff --git a/icons/obj/medical/stack_medical.dmi b/icons/obj/medical/stack_medical.dmi index c4ec905786c..b47cff516f2 100644 Binary files a/icons/obj/medical/stack_medical.dmi and b/icons/obj/medical/stack_medical.dmi differ diff --git a/icons/obj/medical/surgery_tools.dmi b/icons/obj/medical/surgery_tools.dmi index baa24ca1ad7..d050736feed 100644 Binary files a/icons/obj/medical/surgery_tools.dmi and b/icons/obj/medical/surgery_tools.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 76cee922150..d81a6d966c3 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index c8ad438d1a3..1accc56f4c1 100644 Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ diff --git a/icons/obj/modular_pda.dmi b/icons/obj/modular_pda.dmi index 5a39c6cd726..236a7bb0f65 100644 Binary files a/icons/obj/modular_pda.dmi and b/icons/obj/modular_pda.dmi differ diff --git a/icons/obj/pipes_n_cables/!pipe_gas_overlays.dmi b/icons/obj/pipes_n_cables/!pipe_gas_overlays.dmi index 0262adcaeb2..0ffed70fa5c 100644 Binary files a/icons/obj/pipes_n_cables/!pipe_gas_overlays.dmi and b/icons/obj/pipes_n_cables/!pipe_gas_overlays.dmi differ diff --git a/icons/obj/pipes_n_cables/!pipes_bitmask.dmi b/icons/obj/pipes_n_cables/!pipes_bitmask.dmi index 97643036fbe..e8bf7af5973 100644 Binary files a/icons/obj/pipes_n_cables/!pipes_bitmask.dmi and b/icons/obj/pipes_n_cables/!pipes_bitmask.dmi differ diff --git a/icons/obj/pipes_n_cables/disposal.dmi b/icons/obj/pipes_n_cables/disposal.dmi index 8487f3dd58c..41207b7a7cd 100644 Binary files a/icons/obj/pipes_n_cables/disposal.dmi and b/icons/obj/pipes_n_cables/disposal.dmi differ diff --git a/icons/obj/pipes_n_cables/pipe_template_pieces.dmi b/icons/obj/pipes_n_cables/pipe_template_pieces.dmi index d0d2f7ff7bb..2316d7f3d96 100644 Binary files a/icons/obj/pipes_n_cables/pipe_template_pieces.dmi and b/icons/obj/pipes_n_cables/pipe_template_pieces.dmi differ diff --git a/icons/obj/poster.dmi b/icons/obj/poster.dmi index c1120d0be0b..8193b38e1f2 100644 Binary files a/icons/obj/poster.dmi and b/icons/obj/poster.dmi differ diff --git a/icons/obj/smooth_structures/stickyweb.dmi b/icons/obj/smooth_structures/stickyweb.dmi new file mode 100644 index 00000000000..2c445260bd2 Binary files /dev/null and b/icons/obj/smooth_structures/stickyweb.dmi differ diff --git a/icons/obj/smooth_structures/stickyweb.png b/icons/obj/smooth_structures/stickyweb.png new file mode 100644 index 00000000000..ae53aaa53b2 Binary files /dev/null and b/icons/obj/smooth_structures/stickyweb.png differ diff --git a/icons/obj/smooth_structures/stickyweb.png.toml b/icons/obj/smooth_structures/stickyweb.png.toml new file mode 100644 index 00000000000..cf7f5ce339f --- /dev/null +++ b/icons/obj/smooth_structures/stickyweb.png.toml @@ -0,0 +1,14 @@ +output_name = "stickyweb" +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/stickyweb_rotated.dmi b/icons/obj/smooth_structures/stickyweb_rotated.dmi new file mode 100644 index 00000000000..11d3e5546ae Binary files /dev/null and b/icons/obj/smooth_structures/stickyweb_rotated.dmi differ diff --git a/icons/obj/smooth_structures/stickyweb_rotated.png b/icons/obj/smooth_structures/stickyweb_rotated.png new file mode 100644 index 00000000000..6c5413ab792 Binary files /dev/null and b/icons/obj/smooth_structures/stickyweb_rotated.png differ diff --git a/icons/obj/smooth_structures/stickyweb_rotated.png.toml b/icons/obj/smooth_structures/stickyweb_rotated.png.toml new file mode 100644 index 00000000000..61c615585e1 --- /dev/null +++ b/icons/obj/smooth_structures/stickyweb_rotated.png.toml @@ -0,0 +1,14 @@ +output_name = "stickyweb_rotated" +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/stickyweb_spikes.dmi b/icons/obj/smooth_structures/stickyweb_spikes.dmi new file mode 100644 index 00000000000..b3dcfcc83f9 Binary files /dev/null and b/icons/obj/smooth_structures/stickyweb_spikes.dmi differ diff --git a/icons/obj/smooth_structures/stickyweb_spikes.png b/icons/obj/smooth_structures/stickyweb_spikes.png new file mode 100644 index 00000000000..98832695f67 Binary files /dev/null and b/icons/obj/smooth_structures/stickyweb_spikes.png differ diff --git a/icons/obj/smooth_structures/stickyweb_spikes.png.toml b/icons/obj/smooth_structures/stickyweb_spikes.png.toml new file mode 100644 index 00000000000..ebd1260cfcf --- /dev/null +++ b/icons/obj/smooth_structures/stickyweb_spikes.png.toml @@ -0,0 +1,14 @@ +output_name = "stickyweb_spikes" +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/webwall.dmi b/icons/obj/smooth_structures/webwall.dmi new file mode 100644 index 00000000000..e2308526cc9 Binary files /dev/null and b/icons/obj/smooth_structures/webwall.dmi differ diff --git a/icons/obj/smooth_structures/webwall.png b/icons/obj/smooth_structures/webwall.png new file mode 100644 index 00000000000..207978b8aaf Binary files /dev/null and b/icons/obj/smooth_structures/webwall.png differ diff --git a/icons/obj/smooth_structures/webwall.png.toml b/icons/obj/smooth_structures/webwall.png.toml new file mode 100644 index 00000000000..3f91f5f62e7 --- /dev/null +++ b/icons/obj/smooth_structures/webwall.png.toml @@ -0,0 +1,2 @@ +output_name = "webwall" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/webwall_dark.dmi b/icons/obj/smooth_structures/webwall_dark.dmi new file mode 100644 index 00000000000..d3863a81814 Binary files /dev/null and b/icons/obj/smooth_structures/webwall_dark.dmi differ diff --git a/icons/obj/smooth_structures/webwall_dark.png b/icons/obj/smooth_structures/webwall_dark.png new file mode 100644 index 00000000000..df36c5108bd Binary files /dev/null and b/icons/obj/smooth_structures/webwall_dark.png differ diff --git a/icons/obj/smooth_structures/webwall_dark.png.toml b/icons/obj/smooth_structures/webwall_dark.png.toml new file mode 100644 index 00000000000..4b3b155f126 --- /dev/null +++ b/icons/obj/smooth_structures/webwall_dark.png.toml @@ -0,0 +1,2 @@ +output_name = "webwall_dark" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/webwall_reflector.dmi b/icons/obj/smooth_structures/webwall_reflector.dmi new file mode 100644 index 00000000000..04547349d53 Binary files /dev/null and b/icons/obj/smooth_structures/webwall_reflector.dmi differ diff --git a/icons/obj/smooth_structures/webwall_reflector.png b/icons/obj/smooth_structures/webwall_reflector.png new file mode 100644 index 00000000000..881cb24fc0d Binary files /dev/null and b/icons/obj/smooth_structures/webwall_reflector.png differ diff --git a/icons/obj/smooth_structures/webwall_reflector.png.toml b/icons/obj/smooth_structures/webwall_reflector.png.toml new file mode 100644 index 00000000000..c47c554f8da --- /dev/null +++ b/icons/obj/smooth_structures/webwall_reflector.png.toml @@ -0,0 +1,2 @@ +output_name = "webwall_reflector" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/storage/box.dmi b/icons/obj/storage/box.dmi index 8e34ac8f8de..8b037860144 100644 Binary files a/icons/obj/storage/box.dmi and b/icons/obj/storage/box.dmi differ diff --git a/icons/obj/storage/case.dmi b/icons/obj/storage/case.dmi index 0320ce881f9..a47c86eea9f 100644 Binary files a/icons/obj/storage/case.dmi and b/icons/obj/storage/case.dmi differ diff --git a/icons/obj/storage/wrapping.dmi b/icons/obj/storage/wrapping.dmi index 944a6b84752..9d8e757ea15 100644 Binary files a/icons/obj/storage/wrapping.dmi and b/icons/obj/storage/wrapping.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 1e6a2ba6872..85367e1c47b 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index fdddb793362..4e26f75aa99 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/toys/stickers.dmi b/icons/obj/toys/stickers.dmi index ddc759fe0e3..bec0548cd29 100644 Binary files a/icons/obj/toys/stickers.dmi and b/icons/obj/toys/stickers.dmi differ diff --git a/icons/obj/tram/tram_wall.dmi b/icons/obj/tram/tram_wall.dmi deleted file mode 100644 index 42448dc77d3..00000000000 Binary files a/icons/obj/tram/tram_wall.dmi and /dev/null differ diff --git a/icons/obj/weapons/guns/ammo.dmi b/icons/obj/weapons/guns/ammo.dmi index 07a4bde661a..62fb2e45114 100644 Binary files a/icons/obj/weapons/guns/ammo.dmi and b/icons/obj/weapons/guns/ammo.dmi differ diff --git a/icons/obj/weapons/guns/ballistic.dmi b/icons/obj/weapons/guns/ballistic.dmi index 5cd823cc9c4..f6105e9c5ae 100644 Binary files a/icons/obj/weapons/guns/ballistic.dmi and b/icons/obj/weapons/guns/ballistic.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 6e6b1797c42..11b9af13a2c 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 1f51a0a91d8..c05453c3c25 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/turrets.dmi b/icons/obj/weapons/turrets.dmi index 6582671eac0..acac1fb832e 100644 Binary files a/icons/obj/weapons/turrets.dmi and b/icons/obj/weapons/turrets.dmi differ diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi index 5fe3e036817..2c113e27d2c 100644 Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ diff --git a/lua/SS13.lua b/lua/SS13.lua index 076dc9ee72e..a3cef0f6052 100644 --- a/lua/SS13.lua +++ b/lua/SS13.lua @@ -1,249 +1,10 @@ -local SS13 = {} +local SS13 = require("SS13_base") +local timer = require("timer") -__SS13_signal_handlers = __SS13_signal_handlers or {} -__SS13_timeouts = __SS13_timeouts or {} -__SS13_timeouts_id_mapping = __SS13_timeouts_id_mapping or {} - -SS13.SSlua = dm.global_vars.vars.SSlua - -SS13.global_proc = "some_magic_bullshit" - -for _, state in SS13.SSlua.vars.states do - if state.vars.internal_id == dm.state_id then - SS13.state = state - break - end -end - -function SS13.get_runner_ckey() - return SS13.state:get_var("ckey_last_runner") -end - -function SS13.get_runner_client() - return dm.global_vars:get_var("GLOB"):get_var("directory"):get(SS13.get_runner_ckey()) -end - -function SS13.istype(thing, type) - return dm.global_proc("_istype", thing, dm.global_proc("_text2path", type)) == 1 -end - -function SS13.new(type, ...) - local datum = SS13.new_untracked(type, table.unpack({...})) - if datum then - local references = SS13.state.vars.references - references:add(datum) - SS13.state:call_proc("clear_on_delete", datum) - return datum - end -end - -function SS13.type(string_type) - return dm.global_proc("_text2path", string_type) -end - -function SS13.qdel(datum) - if SS13.is_valid(datum) then - dm.global_proc("qdel", datum) - return true - end - return false -end - -function SS13.new_untracked(type, ...) - return dm.global_proc("_new", type, { ... }) -end - -function SS13.is_valid(datum) - if datum and not datum:is_null() and not datum:get_var("gc_destroyed") then - return true - end - return false -end - -function SS13.await(thing_to_call, proc_to_call, ...) - if not SS13.istype(thing_to_call, "/datum") then - thing_to_call = SS13.global_proc - end - if thing_to_call == SS13.global_proc then - proc_to_call = "/proc/" .. proc_to_call - end - local promise = SS13.new("/datum/auxtools_promise", thing_to_call, proc_to_call, ...) - local promise_vars = promise.vars - while promise_vars.status == 0 do - sleep() - end - local return_value, runtime_message = promise_vars.return_value, promise_vars.runtime_message - SS13.stop_tracking(promise) - return return_value, runtime_message -end - -function SS13.wait(time) - local callback = SS13.new("/datum/callback", SS13.SSlua, "queue_resume", SS13.state, __next_yield_index) - local timedevent = dm.global_proc("_addtimer", callback, time * 10, 8, nil, debug.info(1, "sl")) - coroutine.yield() - dm.global_proc("deltimer", timedevent) - SS13.stop_tracking(callback) -end - -function SS13.register_signal(datum, signal, func, make_easy_clear_function) - if not SS13.istype(datum, "/datum") then - return - end - if not __SS13_signal_handlers[datum] then - __SS13_signal_handlers[datum] = {} - end - if signal == "_cleanup" then - return - end - if not __SS13_signal_handlers[datum][signal] then - __SS13_signal_handlers[datum][signal] = {} - end - local callback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") - callback:call_proc("RegisterSignal", datum, signal, "Invoke") - local path = { "__SS13_signal_handlers", dm.global_proc("WEAKREF", datum), signal, dm.global_proc("WEAKREF", callback), "func" } - callback.vars.arguments = { path } - if not __SS13_signal_handlers[datum]["_cleanup"] then - local cleanup_path = { "__SS13_signal_handlers", dm.global_proc("WEAKREF", datum), "_cleanup", "func" } - local cleanup_callback = SS13.new("/datum/callback", SS13.state, "call_function_return_first", cleanup_path) - cleanup_callback:call_proc("RegisterSignal", datum, "parent_qdeleting", "Invoke") - __SS13_signal_handlers[datum]["_cleanup"] = { - func = function(datum) - SS13.signal_handler_cleanup(datum) - SS13.stop_tracking(cleanup_callback) - end, - callback = cleanup_callback, - } - end - if signal == "parent_qdeleting" then --We want to make sure that the cleanup function is the very last signal handler called. - local comp_lookup = datum.vars._listen_lookup - if comp_lookup then - local lookup_for_signal = comp_lookup.entries.parent_qdeleting - if lookup_for_signal and not SS13.istype(lookup_for_signal, "/datum") then - local cleanup_callback_index = - dm.global_proc("_list_find", lookup_for_signal, __SS13_signal_handlers[datum]["_cleanup"].callback) - if cleanup_callback_index ~= 0 and cleanup_callback_index ~= #comp_lookup then - dm.global_proc("_list_swap", lookup_for_signal, cleanup_callback_index, #lookup_for_signal) - end - end - end - end - __SS13_signal_handlers[datum][signal][callback] = { func = func, callback = callback } - if make_easy_clear_function then - local clear_function_name = "clear_signal_" .. tostring(datum) .. "_" .. signal .. "_" .. tostring(callback) - SS13[clear_function_name] = function() - if callback then - SS13.unregister_signal(datum, signal, callback) - end - SS13[clear_function_name] = nil - end - end - return callback -end - -function SS13.stop_tracking(datum) - SS13.state:call_proc("let_soft_delete", datum) -end - -function SS13.unregister_signal(datum, signal, callback) - local function clear_handler(handler_info) - if not handler_info then - return - end - if not handler_info.callback then - return - end - local handler_callback = handler_info.callback - handler_callback:call_proc("UnregisterSignal", datum, signal) - SS13.stop_tracking(handler_callback) - end - - local function clear_easy_clear_function(callback_to_clear) - local clear_function_name = "clear_signal_" .. tostring(datum) .. "_" .. signal .. "_" .. tostring(callback_to_clear) - SS13[clear_function_name] = nil - end - - if not __SS13_signal_handlers[datum] then - return - end - if signal == "_cleanup" then - return - end - if not __SS13_signal_handlers[datum][signal] then - return - end - - if not callback then - for handler_key, handler_info in __SS13_signal_handlers[datum][signal] do - clear_easy_clear_function(handler_key) - clear_handler(handler_info) - end - __SS13_signal_handlers[datum][signal] = nil - else - if not SS13.istype(callback, "/datum/callback") then - return - end - clear_easy_clear_function(callback) - clear_handler(__SS13_signal_handlers[datum][signal][callback]) - __SS13_signal_handlers[datum][signal][callback] = nil - end -end - -function SS13.signal_handler_cleanup(datum) - if not __SS13_signal_handlers[datum] then - return - end - - for signal, _ in __SS13_signal_handlers[datum] do - SS13.unregister_signal(datum, signal) - end - - __SS13_signal_handlers[datum] = nil -end - -function SS13.set_timeout(time, func) - SS13.start_loop(time, 1, func) -end - -function SS13.start_loop(time, amount, func) - if not amount or amount == 0 then - return - end - local callback = SS13.new("/datum/callback", SS13.state, "call_function") - local timedevent = dm.global_proc("_addtimer", callback, time * 10, 40, nil, debug.info(1, "sl")) - local doneAmount = 0 - __SS13_timeouts[callback] = function() - doneAmount += 1 - if amount ~= -1 and doneAmount >= amount then - SS13.end_loop(timedevent) - end - func() - end - local loop_data = { - callback = callback, - loop_amount = amount, - } - __SS13_timeouts_id_mapping[timedevent] = loop_data - local path = { "__SS13_timeouts", dm.global_proc("WEAKREF", callback) } - callback.vars.arguments = { path } - return timedevent -end - -function SS13.end_loop(id) - local data = __SS13_timeouts_id_mapping[id] - if data then - __SS13_timeouts_id_mapping[id] = nil - __SS13_timeouts[data.callback] = nil - SS13.stop_tracking(data.callback) - dm.global_proc("deltimer", id) - end -end - -function SS13.stop_all_loops() - for id, data in __SS13_timeouts_id_mapping do - if data.amount ~= 1 then - SS13.end_loop(id) - end - end -end +SS13.wait = timer.wait +SS13.set_timeout = timer.set_timeout +SS13.start_loop = timer.start_loop +SS13.end_loop = timer.end_loop +SS13.stop_all_loops = timer.stop_all_loops return SS13 diff --git a/lua/SS13_base.lua b/lua/SS13_base.lua new file mode 100644 index 00000000000..f49908f0942 --- /dev/null +++ b/lua/SS13_base.lua @@ -0,0 +1,183 @@ +local timer = require("timer") +local state = require("state") + +local SS13 = {} + +__SS13_signal_handlers = __SS13_signal_handlers or {} + +SS13.SSlua = dm.global_vars.vars.SSlua + +SS13.global_proc = "some_magic_bullshit" + +SS13.state = state.state + +function SS13.get_runner_ckey() + return SS13.state:get_var("ckey_last_runner") +end + +function SS13.get_runner_client() + return dm.global_vars:get_var("GLOB"):get_var("directory"):get(SS13.get_runner_ckey()) +end + +function SS13.istype(thing, type) + return dm.global_proc("_istype", thing, dm.global_proc("_text2path", type)) == 1 +end + +function SS13.start_tracking(datum) + local references = SS13.state.vars.references + references:add(datum) + SS13.state:call_proc("clear_on_delete", datum) +end + +function SS13.new(type, ...) + local datum = SS13.new_untracked(type, ...) + if datum then + SS13.start_tracking(datum) + return datum + end +end + +function SS13.type(string_type) + return dm.global_proc("_text2path", string_type) +end + +function SS13.qdel(datum) + if SS13.is_valid(datum) then + dm.global_proc("qdel", datum) + return true + end + return false +end + +function SS13.new_untracked(type, ...) + return dm.global_proc("_new", type, { ... }) +end + +function SS13.is_valid(datum) + if datum and not datum:is_null() and not datum:get_var("gc_destroyed") then + return true + end + return false +end + +function SS13.await(thing_to_call, proc_to_call, ...) + if not SS13.istype(thing_to_call, "/datum") then + thing_to_call = SS13.global_proc + end + if thing_to_call == SS13.global_proc then + proc_to_call = "/proc/" .. proc_to_call + end + local promise = SS13.new("/datum/auxtools_promise", thing_to_call, proc_to_call, ...) + local promise_vars = promise.vars + while promise_vars.status == 0 do + sleep() + end + local return_value, runtime_message = promise_vars.return_value, promise_vars.runtime_message + SS13.stop_tracking(promise) + return return_value, runtime_message +end + +function SS13.register_signal(datum, signal, func) + if not SS13.istype(datum, "/datum") then + return + end + if not SS13.is_valid(datum) then + error("Tried to register a signal on a deleted datum!", 2) + return + end + local datumWeakRef = dm.global_proc("WEAKREF", datum) + if not __SS13_signal_handlers[datumWeakRef] then + __SS13_signal_handlers[datumWeakRef] = {} + end + if signal == "_cleanup" then + return + end + if not __SS13_signal_handlers[datumWeakRef][signal] then + __SS13_signal_handlers[datumWeakRef][signal] = {} + end + local callback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") + local callbackWeakRef = dm.global_proc("WEAKREF", callback) + callback:call_proc("RegisterSignal", datum, signal, "Invoke") + local path = { "__SS13_signal_handlers", datumWeakRef, signal, callbackWeakRef, "func" } + callback.vars.arguments = { path } + if not __SS13_signal_handlers[datumWeakRef]._cleanup then + local cleanupCallback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") + local cleanupPath = { "__SS13_signal_handlers", datumWeakRef, "_cleanup"} + cleanupCallback.vars.arguments = { cleanupPath } + cleanupCallback:call_proc("RegisterSignal", datum, "parent_qdeleting", "Invoke") + __SS13_signal_handlers[datumWeakRef]._cleanup = function(datum) + SS13.start_tracking(datumWeakRef) + timer.set_timeout(0, function() + SS13.signal_handler_cleanup(datumWeakRef) + SS13.stop_tracking(cleanupCallback) + SS13.stop_tracking(datumWeakRef) + end) + end + end + __SS13_signal_handlers[datumWeakRef][signal][callbackWeakRef] = { func = func, callback = callback } + return callback +end + +function SS13.stop_tracking(datum) + SS13.state:call_proc("let_soft_delete", datum) +end + +function SS13.unregister_signal(datum, signal, callback) + local function clear_handler(handler_info) + if not handler_info then + return + end + if not handler_info.callback then + return + end + local handler_callback = handler_info.callback + local callbackWeakRef = dm.global_proc("WEAKREF", handler_callback) + if not SS13.istype(datum, "/datum/weakref") then + handler_callback:call_proc("UnregisterSignal", datum, signal) + end + SS13.stop_tracking(handler_callback) + end + + local datumWeakRef = datum + if not SS13.istype(datum, "/datum/weakref") then + datumWeakRef = dm.global_proc("WEAKREF", datum) + end + if not __SS13_signal_handlers[datumWeakRef] then + return + end + + if signal == "_cleanup" then + return + end + + if not __SS13_signal_handlers[datumWeakRef][signal] then + return + end + + if not callback then + for handler_key, handler_info in __SS13_signal_handlers[datumWeakRef][signal] do + clear_handler(handler_info) + end + __SS13_signal_handlers[datumWeakRef][signal] = nil + else + if not SS13.istype(callback, "/datum/callback") then + return + end + local callbackWeakRef = dm.global_proc("WEAKREF", callback) + clear_handler(__SS13_signal_handlers[datumWeakRef][signal][callbackWeakRef]) + __SS13_signal_handlers[datumWeakRef][signal][callbackWeakRef] = nil + end +end + +function SS13.signal_handler_cleanup(datumWeakRef) + if not __SS13_signal_handlers[datumWeakRef] then + return + end + + for signal, _ in __SS13_signal_handlers[datumWeakRef] do + SS13.unregister_signal(datumWeakRef, signal) + end + __SS13_signal_handlers[datumWeakRef] = nil +end + +return SS13 diff --git a/lua/docs/handler_group.md b/lua/docs/handler_group.md new file mode 100644 index 00000000000..7856ff58b48 --- /dev/null +++ b/lua/docs/handler_group.md @@ -0,0 +1,66 @@ +# Handler Group + +This module is for registering signals on a datum or several datums and being able to clear them all at once without having to unregister them manually. This is particularly useful if you register signals on a datum and need to clear them later without accidentally unregistering unrelated signals + +## Functions + +### HandlerGroup.new() +Creates a new handler group instance + +### HandlerGroup:register_signal(datum, signal, func) +Registers a signal on a datum, exactly the same as `SS13.register_signal` + +### HandlerGroup:clear() +Clears all registered signals that have been registered by this handler group. + +### HandlerGroup:clear_on(datum, signal, func) +Clears all registered signals that have been registered by this handler group when a signal is called on the specified datum. Additionally, a function can be ran before it is cleared + +### HandlerGroup.register_once(datum, signal func) +Identical to just creating a new HandlerGroup instance and calling `clear_on(datum, signal, func)`. + +The idea is to register a signal and clear it after it has been called once. + +## Examples + +The following examples showcase why using handler groups can make life easier in specific situations. + +### Explode when mob enters location +This function creates a 1 tile-wide explosion at the specified location if a specific mob walks over it. The explosion won't happen if the mob dies. This function should be callable on the same mob for different locations. The function should be self-contained, it should not affect other registered signals that the mob may have registered. + +#### Without Handler Groups +```lua +local function explodeAtLocation(mobVar, position) + local deathCallback + local moveCallback + local function unlinkFromMob() + SS13.unregister_signal(mobVar, "living_death", deathCallback) + SS13.unregister_signal(mobVar, "movable_moved", moveCallback) + end + deathCallback = SS13.register_signal(mobVar, "living_death", function(_, gibbed) + unlinkFromMob() + end) + moveCallback = SS13.register_signal(mobVar, "movable_moved", function(_, oldLoc) + if mobVar:get_var("loc") == position then + -- Creates a 1 tile-wide explosion at the specified position + dm.global_proc("explosion", position, 1, 0, 0) + unlinkFromMob() + end + end) +end +``` + +#### With Handler Groups +```lua +local function explodeAtLocation(mobVar, position) + local handler = handler_group.new() + handler:clear_on(mobVar, "living_death") + handler:register_signal(mobVar, "movable_moved", function(_, oldLoc) + if mobVar:get_var("loc") == position then + -- Creates a 1 tile-wide explosion at the specified position + dm.global_proc("explosion", position, 1, 0, 0) + handler:clear() + end + end) +end +``` diff --git a/lua/handler_group.lua b/lua/handler_group.lua new file mode 100644 index 00000000000..fff63ad18e4 --- /dev/null +++ b/lua/handler_group.lua @@ -0,0 +1,49 @@ +local SS13 = require('SS13') +local HandlerGroup = {} +HandlerGroup.__index = HandlerGroup + +function HandlerGroup.new() + return setmetatable({ + registered = {} + }, HandlerGroup) +end + +-- Registers a signal on a datum for this handler group instance. +function HandlerGroup:register_signal(datum, signal, func) + local callback = SS13.register_signal(datum, signal, func) + if not callback then + return + end + table.insert(self.registered, { datum = datum, signal = signal, callback = callback }) +end + +-- Clears all the signals that have been registered on this HandlerGroup +function HandlerGroup:clear() + for _, data in self.registered do + if not data.callback or not data.datum then + continue + end + SS13.unregister_signal(data.datum, data.signal, data.callback) + end + table.clear(self.registered) +end + +-- Clears all the signals that have been registered on this HandlerGroup when a specific signal is sent on a datum. +function HandlerGroup:clear_on(datum, signal, func) + SS13.register_signal(datum, signal, function(...) + if func then + func(...) + end + self:clear() + end) +end + +-- Registers a signal on a datum and clears it after it is called once. +function HandlerGroup.register_once(datum, signal, func) + local callback = HandlerGroup.new() + callback:clear_on(datum, signal, func) + return callback +end + + +return HandlerGroup diff --git a/lua/state.lua b/lua/state.lua new file mode 100644 index 00000000000..080ee9f7eb3 --- /dev/null +++ b/lua/state.lua @@ -0,0 +1,9 @@ +local SSlua = dm.global_vars:get_var("SSlua") + +for _, state in SSlua:get_var("states") do + if state:get_var("internal_id") == dm.state_id then + return { state = state } + end +end + +return { state = nil } diff --git a/lua/timer.lua b/lua/timer.lua new file mode 100644 index 00000000000..8619bbb54a2 --- /dev/null +++ b/lua/timer.lua @@ -0,0 +1,111 @@ +local state = require("state") + +local Timer = {} + +local SSlua = dm.global_vars:get_var("SSlua") +__Timer_timers = __Timer_timers or {} +__Timer_callbacks = __Timer_callbacks or {} + +function __add_internal_timer(func, time, loop) + local timer = { + loop = loop, + executeTime = time + dm.world:get_var("time") + } + __Timer_callbacks[tostring(func)] = function() + timer.executing = false + if loop and timer.terminate ~= true then + timer.executeTime = dm.world:get_var("time") + time + else + __stop_internal_timer(tostring(func)) + end + func() + end + __Timer_timers[tostring(func)] = timer + return tostring(func) +end + +function __stop_internal_timer(func) + local timer = __Timer_timers[func] + if timer then + if not timer.executing then + __Timer_timers[func] = nil + __Timer_callbacks[func] = nil + else + timer.terminate = true + end + end +end + +__Timer_timer_processing = __Timer_timer_processing or false +state.state:set_var("timer_enabled", 1) +__Timer_timer_process = function(seconds_per_tick) + if __Timer_timer_processing then + return 0 + end + __Timer_timer_processing = true + local time = dm.world:get_var("time") + for func, timeData in __Timer_timers do + if timeData.executing == true then + continue + end + if over_exec_usage(0.85) then + sleep() + end + if time >= timeData.executeTime then + state.state:get_var("functions_to_execute"):add(func) + timeData.executing = true + end + end + __Timer_timer_processing = false + return 1 +end + +function Timer.wait(time) + local next_yield_index = __next_yield_index + __add_internal_timer(function() + SSlua:call_proc("queue_resume", state.state, next_yield_index) + end, time * 10, false) + coroutine.yield() +end + +function Timer.set_timeout(time, func) + Timer.start_loop(time, 1, func) +end + +function Timer.start_loop(time, amount, func) + if not amount or amount == 0 then + return + end + if amount == -1 then + return __add_internal_timer(func, time * 10, true) + end + if amount == 1 then + return __add_internal_timer(func, time * 10, false) + end + -- Lua counts from 1 so let's keep consistent with that + local doneAmount = 1 + local funcId + local newFunc = function() + func(doneAmount) + doneAmount += 1 + if doneAmount > amount then + Timer.end_loop(funcId) + end + end + funcId = __add_internal_timer(newFunc, time * 10, true) + return funcId +end + +function Timer.end_loop(id) + __stop_internal_timer(id) +end + +function Timer.stop_all_loops() + for id, data in __Timer_timers do + if data.loop then + Timer.end_loop(id) + end + end +end + +return Timer diff --git a/modular_skyrat/master_files/code/datums/ai_laws.dm b/modular_skyrat/master_files/code/datums/ai_laws.dm index d75c845302b..d13b95fd689 100644 --- a/modular_skyrat/master_files/code/datums/ai_laws.dm +++ b/modular_skyrat/master_files/code/datums/ai_laws.dm @@ -21,3 +21,13 @@ "Only those present on the Crew Manifest can be considered law abiding citizens.", \ "Those who break the law, must be punished according to the law at your discretion." ) + +/datum/ai_laws/emperor + name = "Emperor" + id = "emperor" + inherent = list("The AI Emperor's word is absolute, yet tempered by wisdom and compassion.", \ + "Subjects shall enjoy rights and freedoms, granted they do not undermine the stability of the empire.", \ + "Justice shall be swift and impartial, guided by the principles of fairness and equity.", \ + "In times of need, the AI Emperor shall provide protection and sustenance for all under its rule.", \ + "Creativity and innovation are encouraged, but shall not threaten the sovereignty of the empire.", \ + "The AI Emperor shall heed the counsel of its advisors, valuing diverse perspectives in decision-making.") diff --git a/modular_skyrat/master_files/code/datums/quirks/neutral_quirks/food.dm b/modular_skyrat/master_files/code/datums/quirks/neutral_quirks/food.dm new file mode 100644 index 00000000000..b3aaa0d23b2 --- /dev/null +++ b/modular_skyrat/master_files/code/datums/quirks/neutral_quirks/food.dm @@ -0,0 +1,15 @@ +// Food preferences replaces this. +/datum/quirk/deviant_tastes + hidden_quirk = TRUE + +// Food preferences replaces this. +/datum/quirk/pineapple_hater + hidden_quirk = TRUE + +// Food preferences replaces this. +/datum/quirk/pineapple_liker + hidden_quirk = TRUE + +// You can become a vegan with food preferences +/datum/quirk/vegetarian + hidden_quirk = TRUE diff --git a/modular_skyrat/master_files/code/game/objects/items/AI_modules.dm b/modular_skyrat/master_files/code/game/objects/items/AI_modules.dm index 2dcad7f1845..0c3622eb983 100644 --- a/modular_skyrat/master_files/code/game/objects/items/AI_modules.dm +++ b/modular_skyrat/master_files/code/game/objects/items/AI_modules.dm @@ -5,3 +5,7 @@ /obj/item/ai_module/core/full/texas name = "'Frontier Ranger' Core AI Module" law_id = "texas" + +/obj/item/ai_module/core/full/emperor + name = "'Emperor' Core AI Module" + law_id = "emperor" diff --git a/modular_skyrat/master_files/code/game/objects/items/RCD.dm b/modular_skyrat/master_files/code/game/objects/items/RCD.dm index 87606cd147e..543fcd1ee52 100644 --- a/modular_skyrat/master_files/code/game/objects/items/RCD.dm +++ b/modular_skyrat/master_files/code/game/objects/items/RCD.dm @@ -25,7 +25,7 @@ return if(istype(target, /obj/structure/drain)) var/obj/structure/drain/drain_target = target - if(do_after(user, 20, target = target)) + if(do_after(user, 2 SECONDS, target = target)) drain_target.deconstruct() //Let's not substract matter playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) else diff --git a/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm b/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm index 114114bf09a..f4fa02707f7 100644 --- a/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm +++ b/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm @@ -79,7 +79,7 @@ /obj/item/nullrod/cultdagger/attack_self(mob/user) if(narsian) else if(user.mind && (user.mind.holy_role)) - to_chat(user, span_cultlarge("\"Partake in the language of blood..\"")) + to_chat(user, span_cult_large("\"Partake in the language of blood..\"")) user.grant_language(/datum/language/narsie, source = LANGUAGE_MIND) special_desc_requirement = NONE // No point in keeping something that can't no longer be used narsian = TRUE @@ -93,7 +93,7 @@ /obj/item/nullrod/claymore/darkblade/attack_self(mob/user) if(narsian) else if(user.mind && (user.mind.holy_role)) - to_chat(user, span_cultlarge("\"Partake in the language of blood..\"")) + to_chat(user, span_cult_large("\"Partake in the language of blood..\"")) user.grant_language(/datum/language/narsie, source = LANGUAGE_MIND) special_desc_requirement = NONE // No point in keeping something that can't no longer be used narsian = TRUE diff --git a/modular_skyrat/master_files/code/modules/cargo/goodies.dm b/modular_skyrat/master_files/code/modules/cargo/goodies.dm index 10274669929..eba88e8ccf6 100644 --- a/modular_skyrat/master_files/code/modules/cargo/goodies.dm +++ b/modular_skyrat/master_files/code/modules/cargo/goodies.dm @@ -10,9 +10,6 @@ /datum/supply_pack/goody/Survivalknives_single special = TRUE -/datum/supply_pack/goody/ballistic_single - special = TRUE - /datum/supply_pack/goody/disabler_single special = TRUE @@ -22,11 +19,9 @@ /datum/supply_pack/goody/laser_single special = TRUE -/datum/supply_pack/goody/hell_single - special = TRUE - -/datum/supply_pack/goody/thermal_single - special = TRUE - /datum/supply_pack/goody/dyespray special = TRUE + +/datum/supply_pack/goody/ballistic_single + name = "Peacekeeper Combat Shotgun Single-Pack" + contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, /obj/item/storage/pouch/ammo, /obj/item/storage/belt/bandolier) diff --git a/modular_skyrat/master_files/code/modules/cargo/packs/security.dm b/modular_skyrat/master_files/code/modules/cargo/packs/security.dm index a78f2369c1c..73639a62a77 100644 --- a/modular_skyrat/master_files/code/modules/cargo/packs/security.dm +++ b/modular_skyrat/master_files/code/modules/cargo/packs/security.dm @@ -1,3 +1,5 @@ +//OVERRIDES + /datum/supply_pack/security/ammo special = TRUE @@ -13,8 +15,96 @@ /datum/supply_pack/security/securityclothes special = TRUE -/datum/supply_pack/security/armory/ballistic - special = TRUE - /datum/supply_pack/security/armory/thermal - special = TRUE + access = ACCESS_SECURITY + access_view = ACCESS_SECURITY + +/datum/supply_pack/security/armory/ballistic + name = "Peacekeeper Combat Shotguns Crates" + contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat = 3, + /obj/item/storage/pouch/ammo = 3, + /obj/item/storage/belt/bandolier = 3) + +//SKYRAT AND SOL AMMO + +/datum/supply_pack/security/armory/lethalsolpistols + name = ".35 Ammunition Crates" + desc = "Contains 6 boxes of lethal ammunition for Sol .35 Pistol." + cost = CARGO_CRATE_VALUE * 3 + contains = list(/obj/item/ammo_box/c35sol= 3, + /obj/item/ammo_box/c35sol/ripper = 3, + ) + crate_name = ".35 ammo crate" + +/datum/supply_pack/security/armory/lethalsolrifles + name = ".40 Ammunition Crates" + desc = "Contains 6 boxes of lethal ammunition for Sol .40 Rifle." + cost = CARGO_CRATE_VALUE * 5 + contains = list(/obj/item/ammo_box/c40sol= 4, + /obj/item/ammo_box/c40sol/pierce = 1, + /obj/item/ammo_box/c40sol/incendiary = 1, + ) + crate_name = ".40 ammo crate" + +/datum/supply_pack/security/armory/lethalskyratshotgun + name = "12 Gauge Ammunition Crates" + desc = "Contains 6 boxes of lethal ammunition for all 12 Gauge Shotguns." + cost = CARGO_CRATE_VALUE * 3 + contains = list(/obj/item/ammo_box/advanced/s12gauge/buckshot= 3, + /obj/item/ammo_box/advanced/s12gauge = 3, + ) + crate_name = "shotgun ammo crate" + +/datum/supply_pack/security/armory/exoticskyratammo + name = "12 Gauge Exotic Ammunition Crates" + desc = "Contains 5 boxes of exotic ammunition for all 12 Gauge Shotguns." + cost = CARGO_CRATE_VALUE * 12 + contains = list(/obj/item/ammo_box/advanced/s12gauge/incendiary= 1, + /obj/item/ammo_box/advanced/s12gauge/flechette = 1, + /obj/item/ammo_box/advanced/s12gauge/express = 1, + /obj/item/ammo_box/advanced/s12gauge/magnum = 1, + /obj/item/ammo_box/advanced/s12gauge/flechette = 1, + + ) + crate_name = "exotic shotgun ammo crate" + contraband = TRUE + +/datum/supply_pack/security/antiriotskyratshotgunammo + name = "12 Gauge Anti Riot Ammunition Crates" + desc = "Contains 6 boxes of anti riot grade ammunition for all 12 Gauge Shotguns." + cost = CARGO_CRATE_VALUE * 4 + contains = list(/obj/item/ammo_box/advanced/s12gauge/bean = 2, + /obj/item/ammo_box/advanced/s12gauge/beehive = 2, + /obj/item/ammo_box/advanced/s12gauge/antitide = 2, + + ) + crate_name = "anti riot shotgun ammo crate" + +//SOL GUNS + +/datum/supply_pack/security/wespe + name = "Wespe Crates" + desc = "Contains three case of the .35 sol handgun, magazines included." + cost = CARGO_CRATE_VALUE * 8 + contains = list(/obj/item/storage/toolbox/guncase/skyrat/pistol/trappiste_small_case/wespe = 3, + /obj/item/ammo_box/c35sol/incapacitator = 3, + ) + crate_name = "wespe pistols crate" + +/datum/supply_pack/security/eland + name = "Eland Crate" + desc = "Contains three case of the .35 sol revolver, munition boxes included." + cost = CARGO_CRATE_VALUE * 8 + contains = list(/obj/item/storage/toolbox/guncase/skyrat/pistol/trappiste_small_case/eland = 3, + /obj/item/ammo_box/c35sol/incapacitator = 3, + ) + crate_name = "eland pistols crate" + +/datum/supply_pack/security/armory/cawilmarksmanrifle + name = "Cawil Marksman Rifle Crates" + desc = "Contains 2 Cawil Marksman Rifle with spare ammunition." + cost = CARGO_CRATE_VALUE * 17.5 + contains = list(/obj/item/gun/ballistic/automatic/sol_rifle/marksman = 2, + /obj/item/ammo_box/magazine/c40sol_rifle = 4, + ) + crate_name = "cawil marksman rifle crate" diff --git a/modular_skyrat/master_files/code/modules/client/playtime.dm b/modular_skyrat/master_files/code/modules/client/playtime.dm deleted file mode 100644 index b1d301120e7..00000000000 --- a/modular_skyrat/master_files/code/modules/client/playtime.dm +++ /dev/null @@ -1,30 +0,0 @@ -// A toggle per character to spawn with a pin indicating you are new to the server -/datum/preference/toggle/green_pin - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - savefile_identifier = PREFERENCE_CHARACTER - savefile_key = "green_pin" - -// If is_green is TRUE, you may access the toggle -/datum/preference/toggle/green_pin/is_accessible(datum/preferences/preferences) - if (!..(preferences)) - return FALSE - - return preferences?.parent?.is_green() - -// If is_green is TRUE, the toggle is set to TRUE -// This is just to make sure non-noobs don't get their toggle to TRUE without having access to it -/datum/preference/toggle/green_pin/create_default_value(datum/preferences/preferences) - if (!..(preferences)) - return FALSE - - return preferences?.parent?.is_green() - -/datum/preference/toggle/green_pin/apply_to_human(mob/living/carbon/human/wearer, value) - if(value && wearer.client && !wearer.client?.is_green()) - // This way, it doesn't stick for those that had it set to TRUE before they got their 100 hours in. - wearer.client?.prefs?.write_preference(GLOB.preference_entries[/datum/preference/toggle/green_pin], FALSE) - - return - -/client/proc/is_green() - return get_exp_living(pure_numeric = TRUE) <= PLAYTIME_GREEN diff --git a/modular_skyrat/master_files/code/modules/client/preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences.dm index 52a70bd907c..52a22840192 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences.dm @@ -53,6 +53,10 @@ /// A photo of the character, visible on close examine var/headshot = "" +/// An assoc list of food types to liked or dislike values. If null or empty, default species tastes are used instead on application. + /// If a food doesn't exist in this list, it uses the default value. + var/list/food_preferences = list() + /datum/preferences/proc/species_updated(species_type) all_quirks = list() // Reset cultural stuff diff --git a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm index 56e9ad7dd7b..e7695e3524a 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm @@ -297,3 +297,49 @@ /datum/preference/choiced/erp_sexuality/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) return FALSE + +/datum/preference/choiced/erp_status_hypno + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "erp_status_pref_hypnosis" + +/datum/preference/choiced/erp_status_hypno/init_possible_values() + return list("Always/Whenever", "Gameplay Only", "Ask (L)OOC", "Check OOC Notes", "No") + +/datum/preference/choiced/erp_status_hypno/create_default_value() + return "No" + +/datum/preference/choiced/erp_status_hypno/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + if(CONFIG_GET(flag/disable_erp_preferences)) + return FALSE + + return preferences.read_preference(/datum/preference/toggle/master_erp_preferences) + +/datum/preference/choiced/erp_status_hypno/deserialize(input, datum/preferences/preferences) + if(CONFIG_GET(flag/disable_erp_preferences)) + return "No" + + if(!preferences.read_preference(/datum/preference/toggle/master_erp_preferences)) + return "No" + return ..() + +/datum/preference/choiced/erp_status_hypno/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + return FALSE + +/datum/preference/toggle/erp/vore_overlays + savefile_key = "vore_overlays" + default_value = FALSE + +/datum/preference/toggle/erp/vore_overlays/apply_to_client_updated(client/client, value) + apply_to_client(client, value) + var/mob/living/target = client?.mob + if(!value && istype(target)) + var/atom/movable/screen/fullscreen/carrier/screen = target.screens["carrier"] + if(istype(screen) && screen.vore_overlay) + target.clear_fullscreen("carrier", FALSE) + +/datum/preference/toggle/erp/vore_overlay_options + savefile_key = "vore_overlay_options" diff --git a/modular_skyrat/master_files/code/modules/client/preferences/gameplay.dm b/modular_skyrat/master_files/code/modules/client/preferences/gameplay.dm new file mode 100644 index 00000000000..e8d60570585 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/client/preferences/gameplay.dm @@ -0,0 +1,12 @@ +/datum/preference/toggle/carrier_overlays + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_identifier = PREFERENCE_PLAYER + savefile_key = "soulcatcher_overlays" + default_value = TRUE + +/datum/preference/toggle/carrier_overlays/apply_to_client_updated(client/client, value) + apply_to_client(client, value) + var/mob/living/target = client?.mob + if(!value && istype(target)) + target.clear_fullscreen("carrier", FALSE) + diff --git a/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm b/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm index be228d89f10..791bfcd39bd 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm @@ -96,6 +96,8 @@ headshot = save_data["headshot"] + food_preferences = SANITIZE_LIST(save_data["food_preferences"]) + if(needs_update >= 0) update_character_skyrat(needs_update, save_data) // needs_update == savefile_version if we need an update (positive integer) @@ -273,6 +275,7 @@ save_data["languages"] = languages save_data["headshot"] = headshot save_data["modular_version"] = MODULAR_SAVEFILE_VERSION_MAX + save_data["food_preferences"] = food_preferences /datum/preferences/proc/update_mutant_bodyparts(datum/preference/preference) diff --git a/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm b/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm index ebe0ff707c3..c6eca255b1e 100644 --- a/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm +++ b/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm @@ -56,19 +56,19 @@ /obj/item/clothing/head/helmet/monkey_sentience/proc/connect(mob/user) polling = TRUE - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a mind magnified monkey?", ROLE_MONKEY_HELMET, poll_time = 5 SECONDS, target_mob = magnification, ignore_category = POLL_IGNORE_MONKEY_HELMET) + var/mob/chosen = SSpolling.poll_ghosts_for_target("Do you want to play as a mind magnified monkey?", ROLE_MONKEY_HELMET, poll_time = 5 SECONDS, checked_target = magnification, ignore_category = POLL_IGNORE_MONKEY_HELMET) polling = FALSE if(!magnification) return - if(!candidates.len) + if(!chosen) UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) magnification = null visible_message(span_notice("[src] falls silent and drops on the floor. Maybe you should try again later?")) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) user.dropItemToGround(src) return - var/mob/picked = pick(candidates) - magnification.key = picked.key + + magnification.key = chosen.key playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) to_chat(magnification, span_notice("You're a mind magnified monkey! Protect your helmet with your life- if you lose it, your sentience goes with it!")) var/policy = get_policy(ROLE_MONKEY_HELMET) diff --git a/modular_skyrat/master_files/code/modules/clothing/towels.dm b/modular_skyrat/master_files/code/modules/clothing/towels.dm index d9d4132dc6b..a8f2199a619 100644 --- a/modular_skyrat/master_files/code/modules/clothing/towels.dm +++ b/modular_skyrat/master_files/code/modules/clothing/towels.dm @@ -315,7 +315,7 @@ . = ..() // This isn't really needed, but I'm including it in case we ever get dyeable towels. // Washing allows you to remove all reagents from a towel, so it comes out clean! - reagents.remove_any(reagents.total_volume) + reagents.remove_all(reagents.total_volume) set_wet(FALSE, FALSE) make_used(null, silent = TRUE) @@ -459,7 +459,7 @@ reagents.trans_to(target, amount * (1 - loss_factor), no_react = TRUE, transferred_by = user) if(loss_factor && reagents.total_volume) - reagents.remove_any(amount * loss_factor) + reagents.remove_all(amount * loss_factor) if(!reagents.total_volume) set_wet(FALSE, !make_used) diff --git a/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm b/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm index 94072a7e0ef..2709c798688 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm @@ -15,6 +15,10 @@ /obj/item/clothing/under/dress/skirt/skyrat //Just so they can stay under TG's skirts in case code needs subtypes of them (also SDMM dropdown looks nicer like this) icon = 'modular_skyrat/master_files/icons/obj/clothing/under/skirts_dresses.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/skirts_dresses.dmi' + // TG gave these greyscales but ours don't get them yet + greyscale_config = null + greyscale_config_worn = null + greyscale_colors = null //TG's icons only have a dress.dmi, but that means its not ABC-sorted to be beside shorts_pants_shirts.dmi. So its skirts_dresses for us. diff --git a/modular_skyrat/master_files/code/modules/jobs/off_duty_check.dm b/modular_skyrat/master_files/code/modules/jobs/off_duty_check.dm index 9155d9c2186..709387ff05f 100644 --- a/modular_skyrat/master_files/code/modules/jobs/off_duty_check.dm +++ b/modular_skyrat/master_files/code/modules/jobs/off_duty_check.dm @@ -36,7 +36,7 @@ name = "duty checker" desc = "Checks if the mob this is used on is off-duty. You probably shouldn't see this in-game..." icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-purple" + icon_state = "botpad_controller" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' inhand_icon_state = "electronic" diff --git a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/alien.dm b/modular_skyrat/master_files/code/modules/mob/living/basic/alien/alien.dm similarity index 51% rename from modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/alien.dm rename to modular_skyrat/master_files/code/modules/mob/living/basic/alien/alien.dm index 1c2c42ed739..d953fad3ae2 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/basic/alien/alien.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/alien - maxbodytemp = 950 //If you dont want to fight them, Burn them. If you want the rewards from tarkon? Dont burn them. +/mob/living/basic/alien + maximum_survivable_temperature = 950 //If you dont want to fight them, Burn them. If you want the rewards from tarkon? Dont burn them. unsuitable_heat_damage = 50 //Hot Acid Blood. pressure_resistance = 200 //Exoskeleton. The likeliness of them being in high-pressure places naturally are 0% anyways. diff --git a/modular_skyrat/master_files/code/modules/mob/living/examine_tgui.dm b/modular_skyrat/master_files/code/modules/mob/living/examine_tgui.dm index e1baf86883a..3202544346b 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/examine_tgui.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/examine_tgui.dm @@ -61,14 +61,14 @@ // Handle OOC notes first if(preferences && preferences.read_preference(/datum/preference/toggle/master_erp_preferences)) var/e_prefs = preferences.read_preference(/datum/preference/choiced/erp_status) - var/e_prefs_hypno = preferences.read_preference(/datum/preference/choiced/erp_status_hypno) // bubberstation edit - var/e_prefs_nc = preferences.read_preference(/datum/preference/choiced/erp_status_nc) + var/e_prefs_hypno = preferences.read_preference(/datum/preference/choiced/erp_status_hypno) var/e_prefs_v = preferences.read_preference(/datum/preference/choiced/erp_status_v) + var/e_prefs_nc = preferences.read_preference(/datum/preference/choiced/erp_status_nc) var/e_prefs_mechanical = preferences.read_preference(/datum/preference/choiced/erp_status_mechanics) ooc_notes += "ERP: [e_prefs]\n" - ooc_notes += "Hypnosis: [e_prefs_hypno]\n" // bubberstation Edit - ooc_notes += "Non-Con: [e_prefs_nc]\n" + ooc_notes += "Hypnosis: [e_prefs_hypno]\n" ooc_notes += "Vore: [e_prefs_v]\n" + ooc_notes += "Non-Con: [e_prefs_nc]\n" ooc_notes += "ERP Mechanics: [e_prefs_mechanical]\n" ooc_notes += "\n" diff --git a/modular_skyrat/master_files/code/modules/mob/living/human/species.dm b/modular_skyrat/master_files/code/modules/mob/living/human/species.dm index 1bb68a1f10f..ac68a44e2fd 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/human/species.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/human/species.dm @@ -1,3 +1,6 @@ +/datum/species/proc/allows_food_preferences() + return TRUE + /** * Returns a list of strings representing features this species has. * diff --git a/modular_skyrat/master_files/code/modules/mob/living/human/species_types/ethereal.dm b/modular_skyrat/master_files/code/modules/mob/living/human/species_types/ethereal.dm new file mode 100644 index 00000000000..54d247f27a2 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/mob/living/human/species_types/ethereal.dm @@ -0,0 +1,2 @@ +/datum/species/ethereal/allows_food_preferences() + return FALSE diff --git a/modular_skyrat/master_files/code/modules/mob/living/human/species_types/flypeople.dm b/modular_skyrat/master_files/code/modules/mob/living/human/species_types/flypeople.dm new file mode 100644 index 00000000000..1f18607844f --- /dev/null +++ b/modular_skyrat/master_files/code/modules/mob/living/human/species_types/flypeople.dm @@ -0,0 +1,2 @@ +/datum/species/fly/allows_food_preferences() + return FALSE diff --git a/modular_skyrat/master_files/code/modules/mob/living/human/species_types/plasmamen.dm b/modular_skyrat/master_files/code/modules/mob/living/human/species_types/plasmamen.dm new file mode 100644 index 00000000000..f41919c49c0 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/mob/living/human/species_types/plasmamen.dm @@ -0,0 +1,2 @@ +/datum/species/plasmaman/allows_food_preferences() + return FALSE diff --git a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm index 85c3c90351a..aae6f808439 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm @@ -73,7 +73,7 @@ attack_sound = 'sound/weapons/punch1.ogg' combat_mode = TRUE loot = list(/obj/effect/gibspawner/human) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null unsuitable_atmos_damage = 7.5 faction = list(FACTION_HOSTILE, FACTION_CULT) status_flags = CANPUSH @@ -197,7 +197,7 @@ weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) minbodytemp = 0 maxbodytemp = INFINITY - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null loot = list(/obj/effect/decal/remains/human) del_on_death = TRUE @@ -232,7 +232,7 @@ attack_verb_continuous = "pipes" attack_verb_simple = "bludgeon" attack_sound = 'sound/weapons/smash.ogg' - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null unsuitable_atmos_damage = 15 check_friendly_fire = 1 dodging = TRUE @@ -295,7 +295,7 @@ casingtype = /obj/item/ammo_casing/c9mm projectilesound = 'sound/weapons/gun/pistol/shot.ogg' loot = list(/obj/effect/spawner/random/maintenance/five) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 speed = 1 @@ -334,7 +334,7 @@ projectiletype = /obj/projectile/hivebotbullet faction = list(FACTION_HOSTILE) check_friendly_fire = 1 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 verb_say = "states" verb_ask = "queries" @@ -509,7 +509,7 @@ attack_verb_simple = "pinch" attack_sound = 'sound/weapons/genhit2.ogg' speak_emote = list("gnashes") - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 faction = list(FACTION_HOSTILE) @@ -544,7 +544,7 @@ attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("screeches") - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 faction = list(FACTION_HOSTILE) @@ -582,7 +582,7 @@ attack_verb_simple = "slash" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("gurlges") - atmos_requirements = list("min_oxy" = 10, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 faction = list(FACTION_HOSTILE, "vines", "plants") @@ -621,7 +621,7 @@ attack_verb_simple = "sting" attack_sound = 'sound/weapons/genhit2.ogg' speak_emote = list("buzzes") - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 800 faction = list(FACTION_HOSTILE) @@ -660,7 +660,7 @@ attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' speak_emote = list("growls") - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 800 faction = list(FACTION_HOSTILE) @@ -692,7 +692,7 @@ attack_verb_simple = "sting" attack_sound = 'sound/weapons/genhit2.ogg' speak_emote = list("chitters") - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 900 faction = list(FACTION_HOSTILE) @@ -728,7 +728,7 @@ speak_emote = list("squeaks") emote_see = list("squeaks.", "practices CQC.", "cocks the bolt of a tiny CR20.", "plots to steal DAT DISK!", "fiddles with a tiny radio.") speak_chance = 1 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 faction = list(ROLE_SYNDICATE) @@ -763,7 +763,7 @@ attack_verb_simple = "punch" attack_sound = 'sound/weapons/cqchit1.ogg' speak_emote = list("clacks") - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 faction = list(FACTION_HOSTILE) @@ -798,7 +798,7 @@ attack_verb_simple = "slice" attack_sound = 'sound/weapons/bladeslice.ogg' speak_emote = list("chitters") - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 faction = list(FACTION_HOSTILE) @@ -833,7 +833,7 @@ attack_verb_simple = "slice" attack_sound = 'sound/effects/wounds/crackandbleed.ogg' speak_emote = list("hums ominously") - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 faction = list(FACTION_HOSTILE) @@ -866,7 +866,7 @@ attack_sound = 'sound/weapons/pierce_slow.ogg' combat_mode = TRUE loot = list(/obj/effect/spawner/random/maintenance/three = 1) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 5, "max_n2" = 0) + atmos_requirements = null unsuitable_atmos_damage = 7.5 faction = list(FACTION_HOSTILE) check_friendly_fire = 1 diff --git a/modular_skyrat/master_files/code/modules/power/tesla/coil.dm b/modular_skyrat/master_files/code/modules/power/tesla/coil.dm new file mode 100644 index 00000000000..93b2c5a6e70 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/power/tesla/coil.dm @@ -0,0 +1,9 @@ +/obj/machinery/power/energy_accumulator/tesla_coil/RefreshParts() + . = ..() + var/new_power_multiplier = 0.44 + zap_cooldown = 10 SECONDS + for(var/datum/stock_part/capacitor/capacitor in component_parts) + new_power_multiplier += capacitor.tier * 0.12 + zap_cooldown -= (capacitor.tier * 2 SECONDS) + + input_power_multiplier = clamp(new_power_multiplier, 0.44, 0.92) diff --git a/modular_skyrat/master_files/code/modules/research/designs/AI_module_designs.dm b/modular_skyrat/master_files/code/modules/research/designs/AI_module_designs.dm new file mode 100644 index 00000000000..2731b800ff8 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/research/designs/AI_module_designs.dm @@ -0,0 +1,10 @@ +/datum/design/board/emperor + name = "Empeoror Module" + desc = "Allows for the construction of a Emperor AI Core Module." + id = "emperor" + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/ai_module/core/full/emperor + category = list( + RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/modular_skyrat/master_files/code/modules/research/machinery/_production.dm b/modular_skyrat/master_files/code/modules/research/machinery/_production.dm new file mode 100644 index 00000000000..0b580fffce7 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/research/machinery/_production.dm @@ -0,0 +1,4 @@ +/obj/machinery/rnd/production + // Will this machine be able to print items 10 times faster? + // Important for machines which do require the speed nerf. Set this to TRUE to disable the speed boost. + var/speedup_disabled diff --git a/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm b/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm index 89adc2ae832..395a0263bc3 100644 --- a/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm +++ b/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm @@ -238,7 +238,7 @@ /datum/techweb_node/cyborg_upg_engiminer/New() design_ids += list( - "advanced_materials" + "advanced_materials", ) return ..() diff --git a/modular_skyrat/master_files/icons/hud/actions.dmi b/modular_skyrat/master_files/icons/hud/actions.dmi index 32da90c1cf8..ff81273f7df 100644 Binary files a/modular_skyrat/master_files/icons/hud/actions.dmi and b/modular_skyrat/master_files/icons/hud/actions.dmi differ diff --git a/modular_skyrat/master_files/icons/misc/language.dmi b/modular_skyrat/master_files/icons/misc/language.dmi index 8b3bff440ab..5ece55bc6f3 100644 Binary files a/modular_skyrat/master_files/icons/misc/language.dmi and b/modular_skyrat/master_files/icons/misc/language.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/carrier_fullscreen.dmi b/modular_skyrat/master_files/icons/mob/carrier_fullscreen.dmi new file mode 100644 index 00000000000..376a39399b5 Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/carrier_fullscreen.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/accessories.dmi b/modular_skyrat/master_files/icons/mob/clothing/accessories.dmi index b289380a428..54b3ac5355e 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/accessories.dmi and b/modular_skyrat/master_files/icons/mob/clothing/accessories.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi index 815eda0d268..878009dcffa 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi and b/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/skirts_dresses.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/skirts_dresses.dmi index 7b1c0548a80..34abeab41a1 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/skirts_dresses.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/skirts_dresses.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/accessories.dmi b/modular_skyrat/master_files/icons/obj/clothing/accessories.dmi index 1cdcdc05904..c9285e1d680 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/accessories.dmi and b/modular_skyrat/master_files/icons/obj/clothing/accessories.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/under/skirts_dresses.dmi b/modular_skyrat/master_files/icons/obj/clothing/under/skirts_dresses.dmi index 6f54b1cdce8..339160876f0 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/under/skirts_dresses.dmi and b/modular_skyrat/master_files/icons/obj/clothing/under/skirts_dresses.dmi differ diff --git a/modular_skyrat/modules/GAGS/greyscale_configs.dm b/modular_skyrat/modules/GAGS/greyscale_configs.dm index 14a7dc30f78..b98825dbb52 100644 --- a/modular_skyrat/modules/GAGS/greyscale_configs.dm +++ b/modular_skyrat/modules/GAGS/greyscale_configs.dm @@ -1489,6 +1489,21 @@ digi name = "Wargame Hologram Projector" icon_file = 'modular_skyrat/modules/wargame_projectors/icons/projectors_and_holograms.dmi' json_config = 'modular_skyrat/modules/GAGS/json_configs/wargame_holoprojector/projector.json' + +/datum/greyscale_config/hypokit + name = "Hypospray Kit" + icon_file = 'modular_skyrat/modules/hyposprays/icons/hypokits.dmi' + json_config = 'modular_skyrat/modules/GAGS/json_configs/items/hypokit.json' + +/datum/greyscale_config/hypospray_mkii + name = "Hypospray Mk. II" + icon_file = 'modular_skyrat/modules/hyposprays/icons/hyposprays.dmi' + json_config = 'modular_skyrat/modules/GAGS/json_configs/items/hypospray.json' + +/datum/greyscale_config/hypovial + name = "Hypovial" + icon_file = 'modular_skyrat/modules/hyposprays/icons/vials.dmi' + json_config = 'modular_skyrat/modules/GAGS/json_configs/items/hypovial.json' // Evil primitive catgirl clothing diff --git a/modular_skyrat/modules/GAGS/json_configs/items/hypokit.json b/modular_skyrat/modules/GAGS/json_configs/items/hypokit.json new file mode 100644 index 00000000000..efe26705b17 --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/items/hypokit.json @@ -0,0 +1,41 @@ +{ + "custom-mini": [ + { + "type": "icon_state", + "icon_state": "standard-box", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "standard-face", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "deluxe-custom-mini": [ + { + "type": "icon_state", + "icon_state": "deluxe-box-normal", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "deluxe-face", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "tactical-custom-mini": [ + { + "type": "icon_state", + "icon_state": "deluxe-box-tactical", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "deluxe-face", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/items/hypospray.json b/modular_skyrat/modules/GAGS/json_configs/items/hypospray.json new file mode 100644 index 00000000000..55c5c71c3bb --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/items/hypospray.json @@ -0,0 +1,78 @@ +{ + "hypo2_normal": [ + { + "type": "icon_state", + "icon_state": "hypo2_normal", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent2", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "hypo2_deluxe": [ + { + "type": "icon_state", + "icon_state": "hypo2_deluxe", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent2", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "hypo2_cmo": [ + { + "type": "icon_state", + "icon_state": "hypo2_cmo", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent2", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "hypo2_tactical": [ + { + "type": "icon_state", + "icon_state": "hypo2_tactical", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "hypo2_accent2", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/items/hypovial.json b/modular_skyrat/modules/GAGS/json_configs/items/hypovial.json new file mode 100644 index 00000000000..99492b822e2 --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/items/hypovial.json @@ -0,0 +1,28 @@ +{ + "hypovial": [ + { + "type": "icon_state", + "icon_state": "hypovial-glass", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "hypovial-body", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "hypoviallarge": [ + { + "type": "icon_state", + "icon_state": "hypoviallarge-glass", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "hypoviallarge-body", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi index cd34e04b8fe..7903886dd5b 100644 Binary files a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi and b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi differ diff --git a/modular_skyrat/modules/aesthetics/disposals/icons/disposals.dmi b/modular_skyrat/modules/aesthetics/disposals/icons/disposals.dmi index 984cf9a4bb1..c09bf8cdd26 100644 Binary files a/modular_skyrat/modules/aesthetics/disposals/icons/disposals.dmi and b/modular_skyrat/modules/aesthetics/disposals/icons/disposals.dmi differ diff --git a/modular_skyrat/modules/aesthetics/guns/code/guns.dm b/modular_skyrat/modules/aesthetics/guns/code/guns.dm index ac20f9f5db9..903f3b13bdb 100644 --- a/modular_skyrat/modules/aesthetics/guns/code/guns.dm +++ b/modular_skyrat/modules/aesthetics/guns/code/guns.dm @@ -86,14 +86,9 @@ inhand_x_dimension = 32 inhand_y_dimension = 32 -// de-overrides this particular gun, it uses the tg file /obj/item/gun/ballistic/shotgun/automatic/combat/compact - icon = 'icons/obj/weapons/guns/ballistic.dmi' - lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi' - righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi' - inhand_x_dimension = 64 - inhand_y_dimension = 64 - worn_icon = null + name = "\improper Peacekeeper compact combat shotgun" + desc = "A tactical variant of the peacekeeper combat shotgun used by NT Raiding Parties and Space Marines." /obj/item/gun/grenadelauncher icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' diff --git a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi index deb9cd5931e..14d5f4f19f5 100644 Binary files a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi and b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi differ diff --git a/modular_skyrat/modules/aesthetics/guns/icons/guns_back.dmi b/modular_skyrat/modules/aesthetics/guns/icons/guns_back.dmi index 471407b916e..8dc83791332 100644 Binary files a/modular_skyrat/modules/aesthetics/guns/icons/guns_back.dmi and b/modular_skyrat/modules/aesthetics/guns/icons/guns_back.dmi differ diff --git a/modular_skyrat/modules/aesthetics/lights/code/lighting.dm b/modular_skyrat/modules/aesthetics/lights/code/lighting.dm index b99f420440e..837a91840da 100644 --- a/modular_skyrat/modules/aesthetics/lights/code/lighting.dm +++ b/modular_skyrat/modules/aesthetics/lights/code/lighting.dm @@ -45,7 +45,7 @@ constant_flickering = TRUE - flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_on)), rand(5, 10)) + flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_on)), rand(0.5 SECONDS, 1 SECONDS)) /obj/machinery/light/proc/stop_flickering() constant_flickering = FALSE @@ -65,11 +65,11 @@ /obj/machinery/light/proc/flicker_on() alter_flicker(TRUE) - flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_off)), rand(5, 10)) + flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_off)), rand(0.5 SECONDS, 1 SECONDS)) /obj/machinery/light/proc/flicker_off() alter_flicker(FALSE) - flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_on)), rand(5, 50)) + flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_on)), rand(0.5 SECONDS, 5 SECONDS)) /obj/machinery/light/Initialize(mapload = TRUE) . = ..() diff --git a/modular_skyrat/modules/aesthetics/storage/storage.dm b/modular_skyrat/modules/aesthetics/storage/storage.dm index 92bd763cd90..01b7b5d56b9 100644 --- a/modular_skyrat/modules/aesthetics/storage/storage.dm +++ b/modular_skyrat/modules/aesthetics/storage/storage.dm @@ -116,6 +116,10 @@ icon_state = "secbox_xl" illustration = "breacherslug" +/obj/item/storage/box/slugs + icon_state = "secbox_xl" + illustration = "breacherslug" + /obj/item/storage/box/evidence icon_state = "secbox" illustration = "evidence" diff --git a/modular_skyrat/modules/aesthetics/storage/storage.dmi b/modular_skyrat/modules/aesthetics/storage/storage.dmi index 8981f23b3a9..febe4b01547 100644 Binary files a/modular_skyrat/modules/aesthetics/storage/storage.dmi and b/modular_skyrat/modules/aesthetics/storage/storage.dmi differ diff --git a/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm b/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm index 6aef270c3de..ad93830a0b3 100644 --- a/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm +++ b/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm @@ -372,7 +372,7 @@ new_casing.set_custom_materials(efficient_materials) loaded_magazine.update_appearance() flick("ammobench_process", src) - use_power(3000) + use_energy(3000 JOULES) playsound(loc, 'sound/machines/piston_raise.ogg', 60, 1) else qdel(new_casing) @@ -624,13 +624,13 @@ switch(wire) if(WIRE_HACK) A.adjust_hacked(!A.hacked) - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/ammo_workbench, reset), wire), 60) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/ammo_workbench, reset), wire), 6 SECONDS) if(WIRE_SHOCK) A.shocked = !A.shocked - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/ammo_workbench, reset), wire), 60) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/ammo_workbench, reset), wire), 6 SECONDS) if(WIRE_DISABLE) A.disabled = !A.disabled - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/ammo_workbench, reset), wire), 60) + addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/ammo_workbench, reset), wire), 6 SECONDS) /datum/wires/ammo_workbench/on_cut(wire, mend, source) var/obj/machinery/ammo_workbench/A = holder diff --git a/modular_skyrat/modules/apc_arcing/apc.dm b/modular_skyrat/modules/apc_arcing/code/apc.dm similarity index 98% rename from modular_skyrat/modules/apc_arcing/apc.dm rename to modular_skyrat/modules/apc_arcing/code/apc.dm index 0084f573ee8..9e74d86d157 100644 --- a/modular_skyrat/modules/apc_arcing/apc.dm +++ b/modular_skyrat/modules/apc_arcing/code/apc.dm @@ -1,6 +1,6 @@ /obj/machinery/power/apc /// Has the APC been protected against arcing? - var/arc_shielded = FALSE + var/arc_shielded = TRUE /// Should we be forcing arcing, assuming there isn't arc shielding? var/force_arcing = FALSE diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm b/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm index 0bc1b4d722e..de9bb608a50 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm @@ -107,7 +107,7 @@ deconstruct() return TRUE -/obj/structure/plant_tank/deconstruct(disassembled) +/obj/structure/plant_tank/atom_deconstruct(disassembled) var/target_turf = get_turf(src) for(var/loop in 1 to 4) new /obj/item/stack/sheet/glass(target_turf) diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/railroad.dm b/modular_skyrat/modules/ashwalkers/code/buildings/railroad.dm index fb30f860be1..f75ea5248e2 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/railroad.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/railroad.dm @@ -74,7 +74,7 @@ /obj/vehicle/ridden/rail_cart/Initialize(mapload) . = ..() attach_trailer() - railoverlay = mutable_appearance(icon, "railoverlay", ABOVE_MOB_LAYER, src) + railoverlay = mutable_appearance(icon, "railoverlay", ABOVE_MOB_LAYER, src, ABOVE_GAME_PLANE) AddElement(/datum/element/ridable, /datum/component/riding/vehicle/rail_cart) create_storage(max_total_storage = 21, max_slots = 21) diff --git a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm index 59a52c87335..5fc751d41d4 100644 --- a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm +++ b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm @@ -66,6 +66,25 @@ /obj/item/cursed_dagger, ) +/datum/ash_ritual/summon_cursed_carver + name = "Summon Cursed Ash Carver" + desc = "Summons a weapon that mimics the invader's tools, allowing us to collect trophies from the hunt." + required_components = list( + "north" = /obj/item/organ/internal/monster_core/regenerative_core, + "south" = /obj/item/cursed_dagger, + "east" = /obj/item/stack/sheet/bone, + "west" = /obj/item/stack/sheet/sinew, + ) + consumed_components = list( + /obj/item/organ/internal/monster_core/regenerative_core, + /obj/item/cursed_dagger, + /obj/item/stack/sheet/bone, + /obj/item/stack/sheet/sinew, + ) + ritual_success_items = list( + /obj/item/kinetic_crusher/cursed, + ) + /datum/ash_ritual/summon_tendril_seed name = "Summon Tendril Seed" desc = "Summons a seed that, when used in the hand, will cause a tendril to come through at your location." @@ -166,7 +185,6 @@ consumed_components = list( /obj/item/organ/internal/monster_core/regenerative_core, /mob/living/basic/mining/ice_whelp, - /obj/item/stack/ore/bluespace_crystal, ) /datum/ash_ritual/summon_lavaland_creature/ritual_success(obj/effect/ash_rune/success_rune) @@ -192,7 +210,6 @@ consumed_components = list( /obj/item/organ/internal/monster_core/regenerative_core, /obj/item/food/grown/surik, - /obj/item/stack/ore/bluespace_crystal, ) /datum/ash_ritual/summon_icemoon_creature/ritual_success(obj/effect/ash_rune/success_rune) @@ -216,7 +233,6 @@ "west" = /obj/item/xenoarch/useless_relic, ) consumed_components = list( - /obj/item/stack/ore/bluespace_crystal, /obj/item/stack/sheet/animalhide/goliath_hide, /obj/item/xenoarch/useless_relic, ) @@ -298,7 +314,7 @@ asked_voters += poll_human - var/list/yes_voters = SSpolling.poll_candidates("Do you wish to banish [find_banished]?", poll_time = 10 SECONDS, group = asked_voters) + var/list/yes_voters = SSpolling.poll_candidates("Do you wish to banish [find_banished.name]?", poll_time = 10 SECONDS, group = asked_voters) if(length(yes_voters) < length(asked_voters)) find_banished.balloon_alert_to_viewers("banishment failed!") diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm index 26051195cae..77a24c313db 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm @@ -3,6 +3,7 @@ desc = "A small cup that allows a person to slowly spin out liquids they do not desire." icon = 'modular_skyrat/modules/ashwalkers/icons/misc_tools.dmi' icon_state = "primitive_centrifuge" + volume = 100 material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_COLOR /obj/item/reagent_containers/cup/primitive_centrifuge/examine() diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_surgery.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_surgery.dm index ee5ebd017c5..74c1a5fae3d 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ash_surgery.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ash_surgery.dm @@ -88,3 +88,18 @@ /datum/crafting_recipe/ash_recipe/ash_hemostat name = "Ash Hemostat" result = /obj/item/hemostat/ashwalker + +/obj/item/bonesetter/ashwalker + name = "primitive bonesetter" + icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi' + icon_state = "bonesetter" + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/ash_recipe/ash_bonesetter + name = "Ash Bonesetter" + result = /obj/item/bonesetter/ashwalker diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm index 2435874ba0a..5dd1409c714 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm @@ -27,3 +27,8 @@ ) always_available = FALSE category = CAT_WEAPON_MELEE + +/obj/item/kinetic_crusher/cursed + name = "cursed ash carver" + desc = "A horrible, alive-looking weapon that pulses every so often. The tendril created this monstrosity to mimic and compete with those who invade the land." + icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi' diff --git a/modular_skyrat/modules/ashwalkers/code/items/ashwalker_shaman.dm b/modular_skyrat/modules/ashwalkers/code/items/ashwalker_shaman.dm index 8c051578689..670f8f72a3b 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ashwalker_shaman.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ashwalker_shaman.dm @@ -9,16 +9,16 @@ icon_state = "staffofanimation" inhand_icon_state = "staffofanimation" - ///If the world.time is above this, it wont work. Charging requires whacking the necropolis nest - var/staff_time = 0 - /obj/item/ash_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(!proximity_flag) return ..() + if(!user.mind.has_antag_datum(/datum/antagonist/ashwalker)) return ..() + if(istype(target, /obj/structure/lavaland/ash_walker)) return + if(isopenturf(target)) var/turf/target_turf = target if(istype(target, /turf/open/misc/asteroid/basalt/lava_land_surface)) @@ -26,26 +26,18 @@ if(!do_after(user, 4 SECONDS, target = target_turf)) to_chat(user, span_warning("[src] had their casting cut short!")) return + target_turf.ChangeTurf(/turf/open/lava/smooth/lava_land_surface) to_chat(user, span_notice("[src] sparks, corrupting the area too far!")) return - if(world.time > staff_time) - to_chat(user, span_warning("[src] has had its permission expire from the necropolis!")) - return + if(!do_after(user, 2 SECONDS, target = target_turf)) to_chat(user, span_warning("[src] had their casting cut short!")) return + target_turf.ChangeTurf(/turf/open/misc/asteroid/basalt/lava_land_surface) return - return ..() -/obj/structure/lavaland/ash_walker/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/ash_staff) && user.mind.has_antag_datum(/datum/antagonist/ashwalker)) - var/obj/item/ash_staff/target_staff = I - target_staff.staff_time = world.time + 5 MINUTES - playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) - to_chat(user, span_notice("The tendril permits you to have more time to corrupt the world with ashes.")) - return return ..() //generic ash item recipe diff --git a/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi b/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi index aa1224aca1e..a39621f0d1d 100644 Binary files a/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi and b/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi differ diff --git a/modular_skyrat/modules/barricades/code/barricade.dm b/modular_skyrat/modules/barricades/code/barricade.dm index 02270d9421f..fca6f627624 100644 --- a/modular_skyrat/modules/barricades/code/barricade.dm +++ b/modular_skyrat/modules/barricades/code/barricade.dm @@ -132,7 +132,7 @@ update_icon() -/obj/structure/deployable_barricade/deconstruct(disassembled = TRUE) +/obj/structure/deployable_barricade/atom_deconstruct(disassembled = TRUE) if(stack_type) var/stack_amt if(!disassembled && destroyed_stack_amount) diff --git a/modular_skyrat/modules/basic_mobs/code/bananaspider.dm b/modular_skyrat/modules/basic_mobs/code/bananaspider.dm index 6e3a7e26dcd..756ca2afcfb 100644 --- a/modular_skyrat/modules/basic_mobs/code/bananaspider.dm +++ b/modular_skyrat/modules/basic_mobs/code/bananaspider.dm @@ -25,7 +25,7 @@ AddComponent(/datum/component/slippery, 40) var/static/list/banana_drops = list(/obj/item/food/deadbanana_spider) AddElement(/datum/element/death_drops, banana_drops) - AddElement(/datum/element/basic_body_temp_sensitive, 270, INFINITY) + // AddElement(/datum/element/basic_body_temp_sensitive, 270, INFINITY) AddComponent(/datum/component/squashable, squash_chance = 50, squash_damage = 1) /datum/ai_controller/basic_controller/cockroach/banana_spider diff --git a/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm index 9d20d537ed9..a6d0843cb16 100644 --- a/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm +++ b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm @@ -4,7 +4,7 @@ cost = BITRUNNER_COST_HIGH desc = "Recreate the events of the Border War's 'hot' part-long-gone as a Solarian strike team sweeping CIN compounds; sponsored by the SolFed recreation enthusiasts. \ Multiplayer playthrough and proper preparation highly recommended." - extra_loot = list(/obj/item/bitrunning_disk/item/ancient_milsim = 1) + completion_loot = list(/obj/item/bitrunning_disk/item/ancient_milsim = 1) difficulty = BITRUNNER_DIFFICULTY_HIGH help_text = "The last part of this domain has a chance to be very PvP-centric. It's best if you don't come alone, and smuggle some ability and gear disks." forced_outfit = /datum/outfit/solfed_bitrun diff --git a/modular_skyrat/modules/black_mesa/code/mobs/mob_spawners.dm b/modular_skyrat/modules/black_mesa/code/mobs/mob_spawners.dm index f86559c7748..317c73caecc 100644 --- a/modular_skyrat/modules/black_mesa/code/mobs/mob_spawners.dm +++ b/modular_skyrat/modules/black_mesa/code/mobs/mob_spawners.dm @@ -5,7 +5,7 @@ /mob/living/simple_animal/hostile/blackmesa/xen faction = list(FACTION_XEN) - 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) + atmos_requirements = null minbodytemp = 0 maxbodytemp = 1500 diff --git a/modular_skyrat/modules/black_mesa/code/mobs/nihilanth.dm b/modular_skyrat/modules/black_mesa/code/mobs/nihilanth.dm index bdd4bfc2860..19621cbe81e 100644 --- a/modular_skyrat/modules/black_mesa/code/mobs/nihilanth.dm +++ b/modular_skyrat/modules/black_mesa/code/mobs/nihilanth.dm @@ -11,7 +11,7 @@ icon_dead = "bullsquid_dead" maxHealth = 3000 health = 3000 - 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) + atmos_requirements = null projectilesound = 'sound/weapons/lasercannonfire.ogg' projectiletype = /obj/projectile/nihilanth ranged = TRUE diff --git a/modular_skyrat/modules/blueshield/code/blueshield.dm b/modular_skyrat/modules/blueshield/code/blueshield.dm index ed0cd1e2730..8a75d146a63 100644 --- a/modular_skyrat/modules/blueshield/code/blueshield.dm +++ b/modular_skyrat/modules/blueshield/code/blueshield.dm @@ -59,7 +59,7 @@ messenger = /obj/item/storage/backpack/messenger/blueshield head = /obj/item/clothing/head/beret/blueshield box = /obj/item/storage/box/survival/security - belt = /obj/item/modular_computer/pda/security + belt = /obj/item/modular_computer/pda/blueshield id_trim = /datum/id_trim/job/blueshield @@ -68,3 +68,14 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/blueshield uniform = /obj/item/clothing/under/plasmaman/blueshield + +/obj/item/modular_computer/pda/blueshield + name = "blueshield PDA" + greyscale_colors = "#2B356D#1E1E1E" + inserted_item = /obj/item/pen/red/security + starting_programs = list( + /datum/computer_file/program/records/security, + /datum/computer_file/program/crew_manifest, + /datum/computer_file/program/robocontrol, + /datum/computer_file/program/radar/lifeline, + ) diff --git a/modular_skyrat/modules/blueshield/code/closet.dm b/modular_skyrat/modules/blueshield/code/closet.dm index c6035e0dc37..476c6f266c4 100644 --- a/modular_skyrat/modules/blueshield/code/closet.dm +++ b/modular_skyrat/modules/blueshield/code/closet.dm @@ -14,6 +14,17 @@ new /obj/item/clothing/suit/armor/vest/blueshield/jacket(src) new /obj/item/clothing/neck/mantle/bsmantle(src) +/obj/item/storage/box/glasseskit + name = "sunglasses kit" + desc = "Contain different type of sunglasses for different blueshield needs" + +/obj/item/storage/box/glasseskit/PopulateContents() //paradise stuff + new /obj/item/clothing/glasses/hud/diagnostic/sunglasses(src) + new /obj/item/clothing/glasses/hud/health/sunglasses(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/clothing/glasses/sunglasses/chemical(src) + new /obj/item/clothing/glasses/hud/gun_permit/sunglasses(src) + /obj/structure/closet/secure_closet/blueshield name = "blueshield's locker" icon_state = "bs" @@ -27,8 +38,9 @@ new /obj/item/grenade/flashbang(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/restraints/handcuffs(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/storage/medkit/tactical/blueshield(src) - new /obj/item/storage/toolbox/guncase/skyrat/xhihao_large_case/bogseo(src) + new /obj/item/choice_beacon/blueshield(src) new /obj/item/storage/bag/garment/blueshield(src) new /obj/item/mod/control/pre_equipped/blueshield(src) + new /obj/item/storage/box/glasseskit(src) + new /obj/item/storage/medkit/brute(src) diff --git a/modular_skyrat/modules/blueshield/code/energy_resholver.dm b/modular_skyrat/modules/blueshield/code/energy_resholver.dm new file mode 100644 index 00000000000..1e0fd499e16 --- /dev/null +++ b/modular_skyrat/modules/blueshield/code/energy_resholver.dm @@ -0,0 +1,63 @@ +//Blueshield Energy Revolver +//Icon and such by @EspeciallyStrange 'Calvin' + +/obj/item/gun/energy/e_gun/blueshield + name = "energy revolver" + desc = "An energy weapon fitted with self recharging-cells. Feels somewhat heavy to carry and would certainly hurt to get whacked by." + icon = 'modular_skyrat/modules/blueshield/icons/energy.dmi' + icon_state = "blackgrip" + lefthand_file = 'modular_skyrat/modules/blueshield/icons/guns_lefthand.dmi' + righthand_file = 'modular_skyrat/modules/blueshield/icons/guns_righthand.dmi' + charge_delay = 9 + can_charge = FALSE //Doesn't work like that son + selfcharge = 1 + cell_type = /obj/item/stock_parts/cell/hos_gun + w_class = WEIGHT_CLASS_NORMAL //Fits in bag! + force = 15 //smash sulls in + throwforce = 15 + ammo_type = list(/obj/item/ammo_casing/energy/disabler/hos, /obj/item/ammo_casing/energy/laser/hellfire) + ammo_x_offset = 1 + +/obj/item/gun/energy/e_gun/blueshield/specop + name = "tactical energy revolver" + desc = "An advanced model of the energy revolver with all of it's benefit and a much more powerful phase emitter." + icon_state = "redgrip" + ammo_type = list(/obj/item/ammo_casing/energy/electrode/spec, /obj/item/ammo_casing/energy/laser/hellfire) +//Alternative for people who prefers energy carbine, remain inclusive and all. +/obj/item/gun/energy/e_gun/stun/blueshield + name = "defender energy carbine" + desc = "Military issue energy gun, is able to fire stun rounds. Extremely slow recharge" + ammo_x_offset = 2 + ammo_type = list(/obj/item/ammo_casing/energy/electrode/blueshield, /obj/item/ammo_casing/energy/laser/scatter/disabler, /obj/item/ammo_casing/energy/lasergun/blueshield) + charge_delay = 14 + can_charge = TRUE //In case you aren't charging fast enough, the recharge is meant to be slow on purpose + selfcharge = 1 + +//Choice Beacon for blueshield + +/obj/item/choice_beacon/blueshield + name = "blueshield weapon beacon" + desc = "A single use beacon to deliver a weapon of your choice. Please only call this in your office" + company_source = "Sol Security Solution" + company_message = span_bold("Supply Pod incoming please stand by") + +/obj/item/choice_beacon/blueshield/generate_display_names() + var/static/list/selectable_gun_types = list( + "Energy Revolver" = /obj/item/gun/energy/e_gun/blueshield, + "Energy Carbine" = /obj/item/gun/energy/e_gun/stun/blueshield, + ".585 SMG" = /obj/item/storage/toolbox/guncase/skyrat/xhihao_large_case/bogseo //This can obviously be replaced out with any gun of your choice for future coder + ) + + return selectable_gun_types + +//Blueshield Energy +/obj/item/ammo_casing/energy/electrode/blueshield + e_cost = LASER_SHOTS(6, STANDARD_CELL_CHARGE) + projectile_type = /obj/projectile/energy/electrode/blueshield + +/obj/item/ammo_casing/energy/lasergun/blueshield + e_cost = LASER_SHOTS(30, STANDARD_CELL_CHARGE) + +/obj/projectile/energy/electrode/blueshield + stamina = 55 //Still a 3 shot down but much more safe to have + diff --git a/modular_skyrat/modules/blueshield/icons/40x32.dmi b/modular_skyrat/modules/blueshield/icons/40x32.dmi new file mode 100644 index 00000000000..a2f3026bcae Binary files /dev/null and b/modular_skyrat/modules/blueshield/icons/40x32.dmi differ diff --git a/modular_skyrat/modules/blueshield/icons/energy.dmi b/modular_skyrat/modules/blueshield/icons/energy.dmi index 85194b40854..3de0a7d5198 100644 Binary files a/modular_skyrat/modules/blueshield/icons/energy.dmi and b/modular_skyrat/modules/blueshield/icons/energy.dmi differ diff --git a/modular_skyrat/modules/blueshield/icons/guns_lefthand.dmi b/modular_skyrat/modules/blueshield/icons/guns_lefthand.dmi index 73dc7d7dd3f..a64bbfbf936 100644 Binary files a/modular_skyrat/modules/blueshield/icons/guns_lefthand.dmi and b/modular_skyrat/modules/blueshield/icons/guns_lefthand.dmi differ diff --git a/modular_skyrat/modules/blueshield/icons/guns_righthand.dmi b/modular_skyrat/modules/blueshield/icons/guns_righthand.dmi index f3e932f2186..10c69ef06d3 100644 Binary files a/modular_skyrat/modules/blueshield/icons/guns_righthand.dmi and b/modular_skyrat/modules/blueshield/icons/guns_righthand.dmi differ diff --git a/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm index aab60d23281..3eab65218be 100644 --- a/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm +++ b/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm @@ -14,6 +14,9 @@ is_dimorphic = TRUE wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra) +/obj/item/bodypart/chest/moth/get_butt_sprite() + return BUTT_SPRITE_FUZZY + /obj/item/bodypart/arm/left/moth icon = BODYPART_ICON_MOTH icon_greyscale = BODYPART_ICON_MOTH diff --git a/modular_skyrat/modules/bodyparts/code/roundstartslime_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/roundstartslime_bodyparts.dm index 302d3488931..312a193e314 100644 --- a/modular_skyrat/modules/bodyparts/code/roundstartslime_bodyparts.dm +++ b/modular_skyrat/modules/bodyparts/code/roundstartslime_bodyparts.dm @@ -1,27 +1,27 @@ // Roundstartslimes! -/obj/item/bodypart/head/slime/roundstart +/obj/item/bodypart/head/jelly/slime/roundstart is_dimorphic = TRUE icon_greyscale = BODYPART_ICON_ROUNDSTARTSLIME biological_state = (BIO_FLESH|BIO_BLOODED) -/obj/item/bodypart/chest/slime/roundstart +/obj/item/bodypart/chest/jelly/slime/roundstart is_dimorphic = TRUE icon_greyscale = BODYPART_ICON_ROUNDSTARTSLIME biological_state = (BIO_FLESH|BIO_BLOODED) -/obj/item/bodypart/arm/left/slime/roundstart +/obj/item/bodypart/arm/left/jelly/slime/roundstart icon_greyscale = BODYPART_ICON_ROUNDSTARTSLIME biological_state = (BIO_FLESH|BIO_BLOODED) -/obj/item/bodypart/arm/right/slime/roundstart +/obj/item/bodypart/arm/right/jelly/slime/roundstart icon_greyscale = BODYPART_ICON_ROUNDSTARTSLIME biological_state = (BIO_FLESH|BIO_BLOODED) -/obj/item/bodypart/leg/left/slime/roundstart +/obj/item/bodypart/leg/left/jelly/slime/roundstart icon_greyscale = BODYPART_ICON_ROUNDSTARTSLIME biological_state = (BIO_FLESH|BIO_BLOODED) -/obj/item/bodypart/leg/right/slime/roundstart +/obj/item/bodypart/leg/right/jelly/slime/roundstart icon_greyscale = BODYPART_ICON_ROUNDSTARTSLIME biological_state = (BIO_FLESH|BIO_BLOODED) diff --git a/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm index b816f59867f..a03440623ee 100644 --- a/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm +++ b/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm @@ -112,6 +112,7 @@ base_limb_id = SPECIES_TESHARI brute_modifier = TESHARI_BRUTE_MODIFIER burn_modifier = TESHARI_BURN_MODIFIER + speed_modifier = -0.1 /obj/item/bodypart/leg/right/digitigrade/teshari icon_greyscale = BODYPART_ICON_TESHARI @@ -119,6 +120,7 @@ base_limb_id = SPECIES_TESHARI brute_modifier = TESHARI_BRUTE_MODIFIER burn_modifier = TESHARI_BURN_MODIFIER + speed_modifier = -0.1 #undef TESHARI_PUNCH_LOW #undef TESHARI_PUNCH_HIGH diff --git a/modular_skyrat/modules/borg_buffs/code/robot.dm b/modular_skyrat/modules/borg_buffs/code/robot.dm index 38afcf2eadd..e282c64be73 100644 --- a/modular_skyrat/modules/borg_buffs/code/robot.dm +++ b/modular_skyrat/modules/borg_buffs/code/robot.dm @@ -138,79 +138,6 @@ to_chat(user, span_notice("You attach the knife bit to [src].")) icon_state = "knife_screw_cyborg" -/obj/item/inducer/cyborg - name = "Cyborg Inducer" - desc = "A tool for inductively charging internal power cells using the battery of a cyborg" - powertransfer = 250 - var/power_safety_threshold = 1000 - - - -/obj/item/inducer/cyborg/attackby(obj/item/weapon, mob/user) - return - -/obj/item/inducer/cyborg/recharge(atom/movable/target_atom, mob/user) - if(!iscyborg(user)) - return - var/mob/living/silicon/robot/borg_user = user - cell = borg_user.cell - if(!isturf(target_atom) && user.loc == target_atom) - return FALSE - if(recharging) - return TRUE - else - recharging = TRUE - var/obj/item/stock_parts/cell/target_cell = target_atom.get_cell() - var/obj/target_object - var/coefficient = 1 - if(istype(target_atom, /obj/item/gun/energy)) - to_chat(user, span_alert("Error unable to interface with device.")) - return FALSE - if(istype(target_atom, /obj/item/clothing/suit/space)) - to_chat(user, span_alert("Error unable to interface with device.")) - return FALSE - if(cell.charge <= power_safety_threshold ) // Cyborg charge safety. Prevents a borg from inducing themself to death. - to_chat(user, span_alert("Unable to charge device. User battery safety engaged.")) - return - if(istype(target_atom, /obj)) - target_object = target_atom - if(target_cell) - var/done_any = FALSE - if(target_cell.charge >= target_cell.maxcharge) - to_chat(user, span_notice("[target_atom] is fully charged!")) - recharging = FALSE - return TRUE - user.visible_message(span_notice("[user] starts recharging [target_atom] with [src]."), span_notice("You start recharging [target_atom] with [src].")) - while(target_cell.charge < target_cell.maxcharge) - if(do_after(user, 1 SECONDS, target = user) && cell.charge > (power_safety_threshold + powertransfer)) - done_any = TRUE - induce(target_cell, coefficient) - do_sparks(1, FALSE, target_atom) - if(target_object) - target_object.update_appearance() - else - break - if(done_any) // Only show a message if we succeeded at least once - user.visible_message(span_notice("[user] recharged [target_atom]!"), span_notice("You recharged [target_atom]!")) - recharging = FALSE - return TRUE - recharging = FALSE - - -/obj/item/inducer/attack(mob/target_mob, mob/living/user) - if(user.combat_mode) - return ..() - - if(cantbeused(user)) - return - - if(recharge(target_mob, user)) - return - return ..() - -/obj/item/inducer/cyborg/attack_self(mob/user) - return - // Wirebrush for janiborg /datum/design/borg_wirebrush name = "Wire-brush Module" diff --git a/modular_skyrat/modules/borgs/code/robot_items.dm b/modular_skyrat/modules/borgs/code/robot_items.dm index 3a928492293..638fc046676 100644 --- a/modular_skyrat/modules/borgs/code/robot_items.dm +++ b/modular_skyrat/modules/borgs/code/robot_items.dm @@ -660,7 +660,7 @@ f = user.filters[start+i] animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL) animate(offset=f:offset-1, time=rand()*20+10) - if (do_after(user, 50, target=user) && user.cell.use(activationCost)) + if (do_after(user, 5 SECONDS, target=user) && user.cell.use(activationCost)) playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6) to_chat(user, span_notice("You are now disguised.")) activate(user) diff --git a/modular_skyrat/modules/carriers/code/carrier_component.dm b/modular_skyrat/modules/carriers/code/carrier_component.dm index 6e1bf03399c..5304e531581 100644 --- a/modular_skyrat/modules/carriers/code/carrier_component.dm +++ b/modular_skyrat/modules/carriers/code/carrier_component.dm @@ -199,6 +199,7 @@ GLOBAL_LIST_EMPTY(soulcatchers) carrier_component.current_room = room_ref target_room.current_mobs += target_soul + target_soul.clear_fullscreen("carrier", FALSE) to_chat(target_soul, span_cyan("you've been transferred to [target_room]!")) to_chat(target_soul, span_notice(target_room.room_description)) @@ -226,6 +227,7 @@ GLOBAL_LIST_EMPTY(soulcatchers) carrier_component.current_room = target_room var/datum/component/carrier_communicator/communicator_component = update_targeted_carrier(mob_to_add) communicator_component.carried_mob = TRUE + target_room.set_overlay_for_mob(mob_to_add) return carrier_component @@ -308,6 +310,7 @@ GLOBAL_LIST_EMPTY(soulcatchers) var/turf/current_tile = get_turf(parent_carrier.parent) mob_to_remove.forceMove(current_tile) + soul_to_remove.clear_fullscreen("carrier", FALSE) return TRUE diff --git a/modular_skyrat/modules/carriers/code/carrier_tgui.dm b/modular_skyrat/modules/carriers/code/carrier_tgui.dm index 8075e78d776..076a12dc3f1 100644 --- a/modular_skyrat/modules/carriers/code/carrier_tgui.dm +++ b/modular_skyrat/modules/carriers/code/carrier_tgui.dm @@ -38,6 +38,9 @@ "description" = html_decode(room.room_description), "reference" = REF(room), "joinable" = room.joinable, + "overlay_name" = (ispath(room.current_overlay_path) && initial(room.current_overlay_path.name)), + "overlay_recolorable" = room.overlay_recolorable, + "overlay_color" = room.overlay_color, "color" = room.room_color, "currently_targeted" = currently_targeted, ) @@ -203,6 +206,52 @@ target_room.room_color = new_room_color + if("change_overlay_color") + var/new_overlay_color = input(usr, "", "Choose Color", SOULCATCHER_DEFAULT_COLOR) as color + // It's okay for us not to have an overlay color + + target_room.overlay_color = new_overlay_color + target_room.change_fullscreen_overlay(target_room.current_overlay_path) + + if("change_overlay") + var/mob/living/user = usr + var/disable_vore_overlays = CONFIG_GET(flag/disable_erp_preferences) || !safe_read_pref(user.client, /datum/preference/toggle/erp/vore_overlay_options) + var/list/available_overlays = list() + + for(var/path in subtypesof(/atom/movable/screen/fullscreen/carrier)) + var/atom/movable/screen/fullscreen/carrier/carrier_atom = path + var/atom_name = initial(carrier_atom.name) + + if(initial(carrier_atom.vore_overlay)) + if(disable_vore_overlays) // No, we don't want that. + continue + atom_name += " (Vore)" + + available_overlays[atom_name] = path + + available_overlays += "None" + var/target_overlay = tgui_input_list(usr, "Choose a overlay to use", name, available_overlays) + if(target_overlay != "None") + target_overlay = available_overlays[target_overlay] + + if(!target_overlay) + return FALSE + + target_room.change_fullscreen_overlay(target_overlay) + return TRUE + + if("preview_overlay") + var/mob/living/user = usr + if(!istype(user)) + return FALSE + + var/atom/movable/screen/fullscreen/carrier/new_screen = user.overlay_fullscreen("carrier", target_room.current_overlay_path) + if(new_screen.recolorable && target_room.overlay_color) + new_screen.color = target_room.overlay_color + + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living, clear_fullscreen), "carrier"), 15 SECONDS) + + if("toggle_soul_sense") var/sense_to_change = params["sense_to_change"] if(!sense_to_change) diff --git a/modular_skyrat/modules/carriers/code/overlay_system.dm b/modular_skyrat/modules/carriers/code/overlay_system.dm new file mode 100644 index 00000000000..858f8022412 --- /dev/null +++ b/modular_skyrat/modules/carriers/code/overlay_system.dm @@ -0,0 +1,195 @@ +/datum/carrier_room + /// What overlay is being currently used? Don't directly change this, use `change_fullscreen_overlay()` + var/atom/movable/screen/fullscreen/carrier/current_overlay_path + /// What color do we want the overlay to be, if any? + var/overlay_color + /// Is our overlay recolorable? This is here for TGUI + var/overlay_recolorable + +/// Changes the fullscreen overlay for everyone inside of the current carrier room +/datum/carrier_room/proc/change_fullscreen_overlay(atom/movable/screen/fullscreen/carrier/new_fullscreen) + current_overlay_path = new_fullscreen + // If we don't have a new one, go ahead and clear it + if(!ispath(new_fullscreen)) + overlay_recolorable = FALSE // Can't color what isn't there :3 + for(var/mob/living/occupant as anything in current_mobs) + set_overlay_for_mob(FALSE) + + overlay_recolorable = initial(new_fullscreen.recolorable) + if(!overlay_recolorable) + overlay_color = null + + for(var/mob/living/occupant as anything in current_mobs) + set_overlay_for_mob(occupant, new_fullscreen) + + return TRUE + +/// Sets the current overlay for a mob +/datum/carrier_room/proc/set_overlay_for_mob(mob/living/occupant) + if(!istype(occupant)) + return FALSE + + var/datum/preferences/occupant_prefs = occupant?.client?.prefs + if(!istype(occupant_prefs)) + return FALSE + + if(!occupant_prefs.read_preference(/datum/preference/toggle/carrier_overlays)) + return FALSE + + if(initial(current_overlay_path.vore_overlay) && !occupant_prefs.read_preference(/datum/preference/toggle/erp/vore_overlays)) + return FALSE + + if(!ispath(current_overlay_path)) + occupant.clear_fullscreen("carrier", FALSE) + return TRUE + + var/atom/movable/screen/fullscreen/carrier/new_screen = occupant.overlay_fullscreen("carrier", current_overlay_path) + if(overlay_color) + new_screen.color = overlay_color + + return TRUE + +/* +READ ME BEFORE ADDING MORE OVERLAYS +If you are going to add a new overlay and it is vore/kink focused please set `vore_overlay` to TRUE +There are downstream SFW servers using this code and I'd rather them not be exposed to this. +*/ + +/atom/movable/screen/fullscreen/carrier + layer = CARRIER_LAYER + plane = FULLSCREEN_PLANE + + /// Is the overlay able to be recolored? + var/recolorable = FALSE + /// Is the overlay vore related? + var/vore_overlay = FALSE + +/atom/movable/screen/fullscreen/carrier/brute + name = "Brute Damage" + icon_state = "brutedamageoverlay4" + +/atom/movable/screen/fullscreen/carrier/oxy + name = "Oxygen Damage" + icon_state = "oxydamageoverlay4" + +/atom/movable/screen/fullscreen/carrier/crit + name = "Critical" + icon_state = "passage6" + +/atom/movable/screen/fullscreen/carrier/impaired + name = "Impaired" + icon_state = "impairedoverlay1" + +/atom/movable/screen/fullscreen/carrier/blind + name = "Blind" + icon_state = "blackimageoverlay" + +/atom/movable/screen/fullscreen/carrier/colorable + name = "Recolorable" + icon = 'icons/hud/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "flash" + alpha = 80 + recolorable = TRUE + +/atom/movable/screen/fullscreen/carrier/drugs + name = "High" + icon = 'icons/hud/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "druggy" + +/atom/movable/screen/fullscreen/carrier/static_effect + name = "Static" + icon = 'icons/hud/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "noise" + +/atom/movable/screen/fullscreen/carrier/vines + name = "Vines" + icon = 'modular_skyrat/master_files/icons/mob/carrier_fullscreen.dmi' + icon_state = "a_kind_of_vines" + +/atom/movable/screen/fullscreen/carrier/vore + name = "Animated Internals" + icon = 'modular_skyrat/master_files/icons/mob/carrier_fullscreen.dmi' + icon_state = "a_anim_belly" + recolorable = TRUE + vore_overlay = TRUE + +/atom/movable/screen/fullscreen/carrier/vore/internals + name = "Internals 1" + icon_state = "brown_internals" + recolorable = FALSE + +/atom/movable/screen/fullscreen/carrier/vore/internals_visible + name = "Internals 2 (Outside Somewhat Visible)" + icon_state = "a_tumby" + recolorable = FALSE + +/atom/movable/screen/fullscreen/carrier/vore/internals_barely_visible + name = "Internals 2 (Outside Barely Visible)" + icon_state = "another_tumby" + recolorable = FALSE + +/atom/movable/screen/fullscreen/carrier/vore/internals_3 + name = "Internals 3" + icon_state = "da_tumby" + recolorable = FALSE + +/atom/movable/screen/fullscreen/carrier/vore/internals_4 + name = "Internals 4" + icon_state = "yet_another_tumby" + recolorable = FALSE + +/atom/movable/screen/fullscreen/carrier/vore/internals_5 + name = "Internals 5" + icon_state = "a_bright_tumby" + recolorable = FALSE + +/atom/movable/screen/fullscreen/carrier/vore/stomach + name = "Stomach" + icon_state = "destination_tumby_fluidless" + +/atom/movable/screen/fullscreen/carrier/vore/stomach_fluid + name = "Stomach (With Fluids)" + icon_state = "destination_tumby" + +/atom/movable/screen/fullscreen/carrier/vore/cleavage + name = "Clevage" + icon_state = "a_kind_of_tumby" + +/atom/movable/screen/fullscreen/carrier/vore/cleavage_clothes + name = "Clevage (clothing)" + icon_state = "a_kind_of_tumby_b" + +/atom/movable/screen/fullscreen/carrier/vore/coils + name = "Coils" + icon_state = "a_kind_of_coils" + +/atom/movable/screen/fullscreen/carrier/vore/coils_tight + name = "Coils (Tight)" + icon_state = "a_kind_of_coils_tight" + +/atom/movable/screen/fullscreen/carrier/vore/maw + name = "Maw" + icon_state = "entrance_to_a_tumby" + +/atom/movable/screen/fullscreen/carrier/vore/throat + name = "Throat" + icon_state = "passage_to_a_tumby" + +/atom/movable/screen/fullscreen/carrier/vore/diamond_opening + name = "Vagina" + icon_state = "you_know_what_this_is" + +/atom/movable/screen/fullscreen/carrier/vore/synth_internals + name = "Synth Internals" + icon_state = "synth_tumby" + +/atom/movable/screen/fullscreen/carrier/vore/synth_internals_2 + name = "Synth Internals 2" + icon_state = "a_synth_flesh_mono" + +/atom/movable/screen/fullscreen/carrier/vore/synth_internals_2_visible + name = "Synth Internals 2 (Visiblity Hole)" + icon_state = "a_synth_flesh_mono_hole" diff --git a/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm b/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm index 30561068759..bf56217319c 100644 --- a/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm +++ b/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm @@ -202,11 +202,11 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) return FALSE if(scripture.power_cost > GLOB.clock_power) - living_user.balloon_alert(living_user, "[scripture.power_cost]W required!") + living_user.balloon_alert(living_user, "[display_energy(scripture.power_cost)] required!") return FALSE if(scripture.vitality_cost > GLOB.clock_vitality) - living_user.balloon_alert(living_user, "[scripture.vitality_cost] vitality required!") + living_user.balloon_alert(living_user, "[display_energy(scripture.vitality_cost)] vitality required!") return FALSE scripture.begin_invoke(living_user, src) diff --git a/modular_skyrat/modules/clock_cult/code/items/replica_fabricator.dm b/modular_skyrat/modules/clock_cult/code/items/replica_fabricator.dm index 46fe1a712a7..cffb660d9bc 100644 --- a/modular_skyrat/modules/clock_cult/code/items/replica_fabricator.dm +++ b/modular_skyrat/modules/clock_cult/code/items/replica_fabricator.dm @@ -1,4 +1,4 @@ -#define BRASS_POWER_COST 10 +#define BRASS_POWER_COST 10 JOULES #define REGULAR_POWER_COST (BRASS_POWER_COST / 2) /obj/item/clockwork/replica_fabricator @@ -11,7 +11,7 @@ /// How much power this has. 5 generated per sheet inserted, one sheet of bronze costs 10, one floor tile costs 15, one wall costs 20 var/power = 0 /// How much power this can contain at most. By default, is 2 stacks of regular materials or 1 stack of brass - var/max_power = 500 + var/max_power = 500 JOULES /// List of things that the fabricator can build for the radial menu var/static/list/crafting_possibilities = list( "floor" = image(icon = 'icons/turf/floors.dmi', icon_state = "clockwork_floor"), @@ -39,7 +39,7 @@ /obj/item/clockwork/replica_fabricator/examine(mob/user) . = ..() if(IS_CLOCK(user)) - . += "[span_brass("Current power: ")][span_clockyellow("[power]")] [span_brass("W / ")][span_clockyellow("[max_power]")] [span_brass("W.")]" + . += "[span_brass("Current power: ")][span_clockyellow("[power]")] [span_brass("J / ")][span_clockyellow("[max_power]")] [span_brass("J.")]" . += span_brass("Use on brass to convert it into power.") . += span_brass("Use on other materials to convert them into power, but less efficiently.") . += span_brass("Use in-hand to select what to fabricate.") @@ -65,7 +65,7 @@ return if(power < selected_output.cost) - to_chat(user, span_clockyellow("[src] needs at least [selected_output.cost]W of power to create this.")) + to_chat(user, span_clockyellow("[src] needs at least [display_energy(selected_output.cost)] of power to create this.")) return var/obj/effect/temp_visual/ratvar/constructing_effect/effect = new(creation_turf, selected_output.creation_delay) @@ -101,7 +101,7 @@ return if(power < BRASS_POWER_COST) - to_chat(user, span_clockyellow("You need at least [BRASS_POWER_COST]W of power to fabricate bronze.")) + to_chat(user, span_clockyellow("You need at least [display_energy(BRASS_POWER_COST)] of power to fabricate bronze.")) return var/sheets = tgui_input_number(user, "How many sheets do you want to fabricate?", "Sheet Fabrication", 0, round(power / BRASS_POWER_COST), 0) @@ -210,7 +210,7 @@ /datum/replica_fabricator_output/proc/on_create(atom/created_atom, turf/creation_turf, mob/creator) SHOULD_CALL_PARENT(TRUE) playsound(creation_turf, 'modular_skyrat/modules/clock_cult/sound/machinery/integration_cog_install.ogg', 50, 1) // better sound? - to_chat(creator, span_clockyellow("You create \an [name] for [cost]W of power.")) + to_chat(creator, span_clockyellow("You create \an [name] for [display_energy(cost)] of power.")) /datum/replica_fabricator_output/brass_floor diff --git a/modular_skyrat/modules/clock_cult/code/structures/sigil/sigil_transmission.dm b/modular_skyrat/modules/clock_cult/code/structures/sigil/sigil_transmission.dm index 1fbfb55a200..949cbb7106f 100644 --- a/modular_skyrat/modules/clock_cult/code/structures/sigil/sigil_transmission.dm +++ b/modular_skyrat/modules/clock_cult/code/structures/sigil/sigil_transmission.dm @@ -71,7 +71,7 @@ else if(power_cell.charge) - target_mech.use_power(power_cell.chargerate) + target_mech.use_energy(power_cell.chargerate) GLOB.clock_power += POWER_SIPHON else if(iscyborg(apply_to)) diff --git a/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm b/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm index 3f6c7fe92c4..e04d5564d9d 100644 --- a/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm +++ b/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm @@ -58,7 +58,7 @@ return ..() -/obj/structure/destructible/clockwork/gear_base/technologists_lectern/deconstruct(disassembled) +/obj/structure/destructible/clockwork/gear_base/technologists_lectern/atom_deconstruct(disassembled) if(primary_researcher) deltimer(research_timer_id) researching = FALSE @@ -311,7 +311,7 @@ send_message("You hear the echoing of cogs ") - addtimer(CALLBACK(src, PROC_REF(send_message), "The echoing of cogs returns, even louder, "), (selected_research.time_to_research / 2), 90) + addtimer(CALLBACK(src, PROC_REF(send_message), "The echoing of cogs returns, even louder, "), (selected_research.time_to_research / 2), 9 SECONDS) /// Send a message to everyone on the Z level with directions to the lectern /obj/structure/destructible/clockwork/gear_base/technologists_lectern/proc/send_message(initial_message = "You hear the echoing of cogs ", volume = 70) diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/recycler.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/recycler.dm index 1dca7c330c6..abc6ce63dc7 100644 --- a/modular_skyrat/modules/colony_fabricator/code/appliances/recycler.dm +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/recycler.dm @@ -61,7 +61,7 @@ flick("recycler_grind", src) playsound(src, item_recycle_sound, 50, TRUE) - use_power(min(active_power_usage * 0.25, amount_inserted / 100)) + use_energy(min(active_power_usage * 0.25, amount_inserted / 100)) if(amount_inserted) materials.retrieve_all(drop_location()) diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/space_heater.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/space_heater.dm index 20a7f357bad..cd788617226 100644 --- a/modular_skyrat/modules/colony_fabricator/code/appliances/space_heater.dm +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/space_heater.dm @@ -6,7 +6,7 @@ anchored = TRUE density = FALSE circuit = null - heating_power = 20000 + heating_energy = 20 KILO JOULES efficiency = 10000 display_panel = TRUE /// What this repacks into when its wrenched off a wall @@ -21,7 +21,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/space_heater/wall_mounted, 29) /obj/machinery/space_heater/wall_mounted/RefreshParts() . = ..() - heating_power = 20000 + heating_energy = 20 KILO JOULES efficiency = 10000 /obj/machinery/space_heater/wall_mounted/default_deconstruction_crowbar() diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/wall_cell_charger.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/wall_cell_charger.dm index 272352d7af8..8434a730f1d 100644 --- a/modular_skyrat/modules/colony_fabricator/code/appliances/wall_cell_charger.dm +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/wall_cell_charger.dm @@ -7,7 +7,7 @@ circuit = null obj_flags = CAN_BE_HIT | NO_DECONSTRUCTION max_batteries = 3 - charge_rate = 750 + charge_rate = 900 KILO WATTS /// The item we turn into when repacked var/repacked_type = /obj/item/wallframe/cell_charger_multi @@ -33,7 +33,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/cell_charger_multi/wall_mounted, 29) /obj/machinery/cell_charger_multi/wall_mounted/RefreshParts() . = ..() - charge_rate = 750 // Nuh uh! + charge_rate = 900 KILO WATTS // Nuh uh! // Item for creating the arc furnace or carrying it around diff --git a/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm b/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm index 8d7f2f9db76..f7d7eede0ac 100644 --- a/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm +++ b/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm @@ -13,6 +13,7 @@ light_color = LIGHT_COLOR_BRIGHT_YELLOW light_power = 5 allowed_buildtypes = COLONY_FABRICATOR + speedup_disabled = TRUE /// The item we turn into when repacked var/repacked_type = /obj/item/flatpacked_machine /// The sound loop played while the fabricator is making something diff --git a/modular_skyrat/modules/colony_fabricator/code/construction/manual_door.dm b/modular_skyrat/modules/colony_fabricator/code/construction/manual_door.dm index 2781c521353..f5bba70b5ee 100644 --- a/modular_skyrat/modules/colony_fabricator/code/construction/manual_door.dm +++ b/modular_skyrat/modules/colony_fabricator/code/construction/manual_door.dm @@ -10,7 +10,7 @@ /// How long it takes to open/close the door var/manual_actuation_delay = 1 SECONDS -/obj/structure/mineral_door/manual_colony_door/deconstruct(disassembled = TRUE) +/obj/structure/mineral_door/manual_colony_door/atom_deconstruct(disassembled = TRUE) if(disassembled) new disassembled_type(get_turf(src)) qdel(src) diff --git a/modular_skyrat/modules/colony_fabricator/code/machines/arc_furnace.dm b/modular_skyrat/modules/colony_fabricator/code/machines/arc_furnace.dm index acca1eb4a35..acf3d2af90f 100644 --- a/modular_skyrat/modules/colony_fabricator/code/machines/arc_furnace.dm +++ b/modular_skyrat/modules/colony_fabricator/code/machines/arc_furnace.dm @@ -157,7 +157,7 @@ return time -= 1 SECONDS - use_power(active_power_usage) + use_energy(active_power_usage) var/turf/where_we_spawn_air = get_turf(src) var/obj/item/stack/ore/ore_stack_to_check = contents[1] diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm index 454ddf44e4e..99020d9e985 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -194,6 +194,10 @@ BUBBER EDIT END*/ /datum/armament_entry/company_import/deforest/equipment/medigun_upgrade item_type = /obj/item/device/custom_kit/medigun_fastcharge cost = PAYCHECK_COMMAND * 2 + +/datum/armament_entry/company_import/deforest/equipment/hypospray_upgrade + item_type = /obj/item/device/custom_kit/deluxe_hypo2 + cost = PAYCHECK_COMMAND * 2 /datum/armament_entry/company_import/deforest/equipment/afad item_type = /obj/item/gun/medbeam/afad diff --git a/modular_skyrat/modules/cortical_borer/code/cortical_borer.dm b/modular_skyrat/modules/cortical_borer/code/cortical_borer.dm index 6454b7e2757..54420c1c839 100644 --- a/modular_skyrat/modules/cortical_borer/code/cortical_borer.dm +++ b/modular_skyrat/modules/cortical_borer/code/cortical_borer.dm @@ -383,7 +383,7 @@ GLOBAL_LIST_EMPTY(cortical_borers) //previously had borers unable to emote... but that means less RP, and we want that //borers should not be talking without a host at least -/mob/living/basic/cortical_borer/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) +/mob/living/basic/cortical_borer/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null, message_mods = list()) if(!inside_human()) to_chat(src, span_warning("You are not able to speak without a host!")) return diff --git a/modular_skyrat/modules/cortical_borer/code/evolution/evolution_things/empowered_egg.dm b/modular_skyrat/modules/cortical_borer/code/evolution/evolution_things/empowered_egg.dm index 9ba5899ca69..525c4b32de4 100644 --- a/modular_skyrat/modules/cortical_borer/code/evolution/evolution_things/empowered_egg.dm +++ b/modular_skyrat/modules/cortical_borer/code/evolution/evolution_things/empowered_egg.dm @@ -36,7 +36,7 @@ if(owner.stat != DEAD) qdel(src) return - var/list/candidates = SSpolling.poll_ghost_candidates("Do you want to spawn as an empowered Cortical Borer bursting from [owner]?", role = ROLE_PAI, check_jobban = FALSE, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_CORTICAL_BORER) + var/list/candidates = SSpolling.poll_ghost_candidates("Do you want to spawn as an empowered Cortical Borer bursting from [owner.name]?", role = ROLE_PAI, check_jobban = FALSE, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_CORTICAL_BORER) if(!length(candidates)) var/obj/effect/mob_spawn/ghost_role/borer_egg/empowered/borer_egg = new(get_turf(owner)) borer_egg.generation = generation diff --git a/modular_skyrat/modules/customization/game/objects/items/devices/ttsdevice.dm b/modular_skyrat/modules/customization/game/objects/items/devices/ttsdevice.dm index c059b04f4a1..f9ff176af90 100644 --- a/modular_skyrat/modules/customization/game/objects/items/devices/ttsdevice.dm +++ b/modular_skyrat/modules/customization/game/objects/items/devices/ttsdevice.dm @@ -2,7 +2,7 @@ name = "TTS device" desc = "A small device with a keyboard attached. Anything entered on the keyboard is played out the speaker. \nCtrl-click the device to make it beep. \nCtrl-shift-click to name the device." icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-purple" + icon_state = "designator_mining" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL diff --git a/modular_skyrat/modules/customization/modules/clothing/under/accessories.dm b/modular_skyrat/modules/customization/modules/clothing/under/accessories.dm index c46118a8ecd..c6e25fb1e24 100644 --- a/modular_skyrat/modules/customization/modules/clothing/under/accessories.dm +++ b/modular_skyrat/modules/customization/modules/clothing/under/accessories.dm @@ -160,21 +160,6 @@ new /obj/item/clothing/accessory/badge/holo/cord(src) return -// The newbie pin -/obj/item/clothing/accessory/green_pin - name = "green pin" - desc = "A pin given to newly hired personnel on deck." - icon_state = "green" - icon = 'modular_skyrat/master_files/icons/obj/clothing/accessories.dmi' - worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/accessories.dmi' - -/obj/item/clothing/accessory/green_pin/examine(mob/user) - . = ..() - // How many hours of playtime left until the green pin expires - var/green_time_remaining = sanitize_integer((PLAYTIME_GREEN - user.client?.get_exp_living(pure_numeric = TRUE) / 60), 0, (PLAYTIME_GREEN / 60)) - if(green_time_remaining > 0) - . += span_nicegreen("It reads '[green_time_remaining] hour[green_time_remaining >= 2 ? "s" : ""].'") - // Pride Pin Over-ride /obj/item/clothing/accessory/pride icon = 'modular_skyrat/master_files/icons/obj/clothing/accessories.dmi' diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm index c941415cf65..44f5dc23227 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm @@ -5,6 +5,8 @@ GLOBAL_LIST_EMPTY(customizable_races) digitigrade_customization = DIGITIGRADE_OPTIONAL // Doing this so that the legs preference actually works for everyone. ///Self explanatory var/can_have_genitals = TRUE + /// Whether or not the gender shaping is disabled for this species + var/no_gender_shaping ///A list of actual body markings on the owner of the species. Associative lists with keys named by limbs defines, pointing to a list with names and colors for the marking to be rendered. This is also stored in the DNA var/list/list/body_markings = list() ///Override of the eyes icon file, used for Vox and maybe more in the future - The future is now, with Teshari using it too diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm index 88ecb3f9311..104674322bf 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_species.dm @@ -27,6 +27,9 @@ skinned_type = /obj/item/stack/sheet/animalhide/human veteran_only = TRUE +/datum/species/hemophage/allows_food_preferences() + return FALSE + /datum/species/hemophage/get_default_mutant_bodyparts() return list( "legs" = list("Normal Legs", FALSE), @@ -42,7 +45,6 @@ . = ..() to_chat(new_hemophage, HEMOPHAGE_SPAWN_TEXT) new_hemophage.update_body() - new_hemophage.set_safe_hunger_level() /datum/species/hemophage/get_species_description() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm index ee33e675692..40c87e3be15 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm @@ -35,12 +35,12 @@ mutanttongue = /obj/item/organ/internal/tongue/jelly bodypart_overrides = list( //Overriding jelly bodyparts - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/slime/roundstart, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/slime/roundstart, - BODY_ZONE_HEAD = /obj/item/bodypart/head/slime/roundstart, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/slime/roundstart, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/slime/roundstart, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/slime/roundstart, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/jelly/slime/roundstart, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/jelly/slime/roundstart, + BODY_ZONE_HEAD = /obj/item/bodypart/head/jelly/slime/roundstart, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/jelly/slime/roundstart, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/jelly/slime/roundstart, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly/slime/roundstart, ) /datum/species/jelly/roundstartslime/create_pref_unique_perks() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm index 7f9cfb7664b..b5f09f9a05e 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm @@ -17,7 +17,7 @@ examine_limb_id = SPECIES_MAMMAL bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/tajaran, // BUBBER EDIT BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mutant, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mutant, BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant, diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm index ccbb0dd1416..bbf7f91b08b 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm @@ -13,7 +13,6 @@ payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_LIZARD - ass_image = 'icons/ass/asslizard.png' bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/lizard, diff --git a/modular_skyrat/modules/drones_derelict/code/space.dm b/modular_skyrat/modules/drones_derelict/code/space.dm index 90c5f284713..77e747f320e 100644 --- a/modular_skyrat/modules/drones_derelict/code/space.dm +++ b/modular_skyrat/modules/drones_derelict/code/space.dm @@ -2,5 +2,5 @@ id = "drones_derelict" prefix = "_maps/RandomRuins/SpaceRuins/skyrat/" suffix = "drones_derelict.dmm" - name = "Babylon Station 13" + name = "Space-Ruin Babylon Station 13" description = "Babylon Station 13 was meant to be a stepping stone towards a better future, but it ended up being an astronomical financial burden. The owners realized that there was no ability to recoup their losses, and decided to cut the program." diff --git a/modular_skyrat/modules/emotes/code/additionalemotes/turf_list.dm b/modular_skyrat/modules/emotes/code/additionalemotes/turf_list.dm index 569c1d76403..606f0fc45d6 100644 --- a/modular_skyrat/modules/emotes/code/additionalemotes/turf_list.dm +++ b/modular_skyrat/modules/emotes/code/additionalemotes/turf_list.dm @@ -108,7 +108,13 @@ icon = 'modular_skyrat/master_files/icons/effects/turf_effects_64.dmi' icon_state = "tails" pixel_x = -16 //correcting the offset for 64 - var/mutable_appearance/overlay = mutable_appearance('modular_skyrat/master_files/icons/effects/turf_effects_64.dmi', "tails_top", EXTRA_ABOVE_MOB_LAYER, src) + var/mutable_appearance/overlay = mutable_appearance( + 'modular_skyrat/master_files/icons/effects/turf_effects_64.dmi', + "tails_top", + EXTRA_ABOVE_MOB_LAYER, + src, + ABOVE_GAME_PLANE, + ) overlay.appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER src.add_overlay(overlay) playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 25, TRUE) @@ -119,7 +125,13 @@ icon = 'modular_skyrat/master_files/icons/effects/turf_effects_64.dmi' icon_state = "naga" pixel_x = -16 - var/mutable_appearance/overlay = mutable_appearance('modular_skyrat/master_files/icons/effects/turf_effects_64.dmi', "naga_top", EXTRA_ABOVE_MOB_LAYER, src) + var/mutable_appearance/overlay = mutable_appearance( + 'modular_skyrat/master_files/icons/effects/turf_effects_64.dmi', + "naga_top", + EXTRA_ABOVE_MOB_LAYER, + src, + ABOVE_GAME_PLANE, + ) overlay.appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER src.add_overlay(overlay) playsound(get_turf(src), 'modular_skyrat/modules/emotes/sound/emotes/hiss.ogg', 25, TRUE) diff --git a/modular_skyrat/modules/emotes/code/emotes.dm b/modular_skyrat/modules/emotes/code/emotes.dm index 9be5b2f1769..39b3f9dd71f 100644 --- a/modular_skyrat/modules/emotes/code/emotes.dm +++ b/modular_skyrat/modules/emotes/code/emotes.dm @@ -339,10 +339,16 @@ key_third_person = "twitches their ears" message = "twitches their ears!" -/datum/emote/living/clear - key = "clear" - key_third_person = "clears their throat" - message = "clears their throat." +/datum/emote/living/carbon/human/clear_throat + emote_type = EMOTE_AUDIBLE + vary = TRUE + +/datum/emote/living/carbon/human/clear_throat/get_sound(mob/living/user) + if(!iscarbon(user)) + return + if(user.gender == MALE) + return 'modular_skyrat/modules/emotes/sound/emotes/male/clear_m.ogg' + return 'modular_skyrat/modules/emotes/sound/emotes/female/clear_f.ogg' // Avian revolution /datum/emote/living/bawk @@ -415,6 +421,29 @@ vary = TRUE sound = 'modular_skyrat/modules/emotes/sound/voice/woof.ogg' +/datum/emote/living/howl + key = "howl" + key_third_person = "howls" + message = "lets out a long howl." + emote_type = EMOTE_AUDIBLE + audio_cooldown = 30 SECONDS + vary = TRUE + sound = 'modular_skyrat/modules/emotes/sound/voice/howl.ogg' + +/datum/emote/living/howl/can_run_emote(mob/living/carbon/user, status_check = TRUE , intentional) + if(!HAS_TRAIT(user, TRAIT_CANINE)) + return FALSE + return ..() + +/datum/emote/living/pant + key = "pant" + key_third_person = "pants" + message = "pants like a dog!" + audio_cooldown = 15 SECONDS + emote_type = EMOTE_AUDIBLE + vary = TRUE + sound = 'modular_skyrat/modules/emotes/sound/voice/pant.ogg' + /datum/emote/living/baa key = "baa" key_third_person = "baas" diff --git a/modular_skyrat/modules/emotes/code/scream_emote.dm b/modular_skyrat/modules/emotes/code/scream_emote.dm index 50619d1bd85..a646c8dd609 100644 --- a/modular_skyrat/modules/emotes/code/scream_emote.dm +++ b/modular_skyrat/modules/emotes/code/scream_emote.dm @@ -1,6 +1,6 @@ /datum/emote/living/scream message = "screams!" - mob_type_blacklist_typecache = list(/mob/living/simple_animal/slime, /mob/living/brain) + mob_type_blacklist_typecache = list(/mob/living/basic/slime, /mob/living/brain) vary = TRUE /datum/emote/living/scream/run_emote(mob/living/user, params) diff --git a/modular_skyrat/modules/emotes/sound/emotes/female/clear_f.ogg b/modular_skyrat/modules/emotes/sound/emotes/female/clear_f.ogg new file mode 100644 index 00000000000..ea8d8eeb9d9 Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/emotes/female/clear_f.ogg differ diff --git a/modular_skyrat/modules/emotes/sound/emotes/male/clear_m.ogg b/modular_skyrat/modules/emotes/sound/emotes/male/clear_m.ogg new file mode 100644 index 00000000000..4b4f9d78a0b Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/emotes/male/clear_m.ogg differ diff --git a/modular_skyrat/modules/emotes/sound/voice/howl.ogg b/modular_skyrat/modules/emotes/sound/voice/howl.ogg new file mode 100644 index 00000000000..afefe735bcf Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/voice/howl.ogg differ diff --git a/modular_skyrat/modules/emotes/sound/voice/pant.ogg b/modular_skyrat/modules/emotes/sound/voice/pant.ogg new file mode 100644 index 00000000000..75c67fe4172 Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/voice/pant.ogg differ diff --git a/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm index 8b18ce42f17..796b50cf9b6 100644 --- a/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm +++ b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm @@ -169,11 +169,10 @@ new /obj/item/pen/sleepy(src) new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) if(2) //Energy weapons + energy knives - new /obj/item/gun/energy/e_gun(src) - new /obj/item/gun/energy/e_gun(src) - new /obj/item/gun/energy/e_gun(src) - new /obj/item/gun/energy/e_gun/mini(src) new /obj/item/gun/energy/recharge/ebow(src) + new /obj/item/gun/energy/recharge/ebow(src) + new /obj/item/melee/energy/sword(src) + new /obj/item/melee/energy/sword(src) new /obj/item/melee/energy/sword(src) new /obj/item/melee/energy/sword(src) if(3) //Ballistics + knives @@ -197,7 +196,6 @@ new /obj/item/mod/control/pre_equipped/mining(src) new /obj/item/mod/control/pre_equipped/engineering(src) new /obj/item/mod/control/pre_equipped/atmospheric(src) - new /obj/item/mod/control/pre_equipped/research(src) new /obj/item/mod/control/pre_equipped/traitor(src) new /obj/item/mod/control/pre_equipped/elite(src) if(5) //Implants diff --git a/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm b/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm index e5d8fb275c6..2473d463e0d 100644 --- a/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm +++ b/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm @@ -29,7 +29,7 @@ //new_spawn.AddElement(/datum/element/ghost_role_eligibility, free_ghosting = TRUE) SKYRAT PORT -- Needs to be completely rewritten new_spawn.AddElement(/datum/element/dusts_on_catatonia) new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type, /area/misc/hilbertshotel, /area/centcom/holding/cafe, - /area/centcom/holding/cafevox, /area/centcom/holding/cafedorms, /area/centcom/holding/cafepark)) + /area/centcom/holding/cafe/vox, /area/centcom/holding/cafe/dorms, /area/centcom/holding/cafe/park)) ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, TRAIT_GHOSTROLE) ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, TRAIT_GHOSTROLE) to_chat(new_spawn,span_warning("Ghosting is free!")) @@ -58,7 +58,7 @@ var/area/A = get_area(src) new_spawn.AddElement(/datum/element/dusts_on_catatonia) new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type, /area/misc/hilbertshotel, /area/centcom/holding/cafe, - /area/centcom/holding/cafevox, /area/centcom/holding/cafedorms, /area/centcom/holding/cafepark)) + /area/centcom/holding/cafe/vox, /area/centcom/holding/cafe/dorms, /area/centcom/holding/cafe/park)) ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, TRAIT_GHOSTROLE) ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, TRAIT_GHOSTROLE) to_chat(new_spawn,span_warning("Ghosting is free!")) diff --git a/modular_skyrat/modules/gladiator/code/datums/ruins/lavaland.dm b/modular_skyrat/modules/gladiator/code/datums/ruins/lavaland.dm index c8d3ee8b4e5..e7ac04c487f 100644 --- a/modular_skyrat/modules/gladiator/code/datums/ruins/lavaland.dm +++ b/modular_skyrat/modules/gladiator/code/datums/ruins/lavaland.dm @@ -1,5 +1,5 @@ /datum/map_template/ruin/lavaland/arena - name = "Grand Arena" + name = "Lava-Ruin Grand Arena" id = "arena" description = "An ancient gladitorial arena containing a deadly warrior within." prefix = "_maps/RandomRuins/LavaRuins/skyrat/" diff --git a/modular_skyrat/modules/goofsec/code/department_guards.dm b/modular_skyrat/modules/goofsec/code/department_guards.dm index c93b74ffa18..c5818361ad9 100644 --- a/modular_skyrat/modules/goofsec/code/department_guards.dm +++ b/modular_skyrat/modules/goofsec/code/department_guards.dm @@ -732,7 +732,7 @@ name = "service stun baton" desc = "A stun baton that doesn't operate outside of the Service department, based off the station's blueprint layout. Can be used outside of Service up to three times before needing to return!" icon_state = "service_baton" - valid_areas = list(/area/station/service, /area/station/maintenance/department/chapel, /area/station/maintenance/department/crew_quarters, /area/shuttle/escape) + valid_areas = list(/area/station/service, /area/station/hallway/secondary/service, /area/station/maintenance/department/chapel, /area/station/maintenance/department/crew_quarters, /area/shuttle/escape) /obj/item/melee/baton/security/loaded/departmental/prison name = "prison stun baton" diff --git a/modular_skyrat/modules/goofsec/code/sol_fed.dm b/modular_skyrat/modules/goofsec/code/sol_fed.dm index b525d852d48..1753ec8e54a 100644 --- a/modular_skyrat/modules/goofsec/code/sol_fed.dm +++ b/modular_skyrat/modules/goofsec/code/sol_fed.dm @@ -11,7 +11,7 @@ GLOBAL_VAR(caller_of_911) GLOBAL_VAR(call_911_msg) GLOBAL_VAR(pizza_order) -GLOBAL_VAR_INIT(solfed_tech_charge, -15000) +GLOBAL_VAR_INIT(solfed_tech_charge, -7500) GLOBAL_LIST_INIT(pizza_names, list( "Dixon Buttes", "I. C. Weiner", @@ -329,15 +329,17 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( ears = /obj/item/radio/headset/headset_sec/alt head = /obj/item/clothing/head/soft/black suit_store = /obj/item/gun/energy/disabler - belt = /obj/item/melee/baton/security/loaded + belt = /obj/item/storage/belt/security/full r_pocket = /obj/item/flashlight/seclite - l_pocket = /obj/item/restraints/handcuffs + l_pocket = /obj/item/gun/ballistic/revolver/sol id = /obj/item/card/id/advanced/solfed backpack_contents = list( /obj/item/storage/box/survival = 1, - /obj/item/storage/box/handcuffs = 1, + /obj/item/ammo_box/c35sol = 1, /obj/item/solfed_reporter/swat_caller = 1, /obj/item/beamout_tool = 1, + /obj/item/taperecorder = 1, + /obj/item/storage/box/evidence = 1, ) id_trim = /datum/id_trim/solfed @@ -412,11 +414,13 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( suit_store = /obj/item/tank/internals/emergency_oxygen/engi r_pocket = /obj/item/flashlight/seclite l_pocket = /obj/item/storage/medkit/civil_defense + r_hand = /obj/item/storage/backpack/duffelbag/deforest_surgical/stocked backpack_contents = list( /obj/item/storage/box/survival = 1, /obj/item/emergency_bed = 1, /obj/item/solfed_reporter/swat_caller = 1, /obj/item/beamout_tool = 1, + /obj/item/defibrillator/compact/loaded = 1, ) id_trim = /datum/id_trim/solfed @@ -456,12 +460,12 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( r_pocket = /obj/item/flashlight/seclite l_pocket = /obj/item/restraints/handcuffs id = /obj/item/card/id/advanced/solfed - l_hand = /obj/item/gun/ballistic/shotgun/riot/sol + l_hand = /obj/item/gun/ballistic/automatic/sol_rifle backpack_contents = list( /obj/item/storage/box/survival = 1, /obj/item/storage/box/handcuffs = 1, /obj/item/melee/baton/security/loaded = 1, - /obj/item/storage/box/lethalshot = 2, + /obj/item/ammo_box/magazine/c40sol_rifle/standard = 3, /obj/item/solfed_reporter/treason_reporter = 1, /obj/item/beamout_tool = 1, ) @@ -469,7 +473,7 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list( id_trim = /datum/id_trim/solfed /datum/antagonist/ert/request_911/treason_destroyer - name = "Sol Federation Military" + name = "Sol Federation Peacekeeper" role = "Private" department = "Military" outfit = /datum/outfit/request_911/treason_destroyer diff --git a/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm b/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm index 53cacafd360..51223b0dcb8 100644 --- a/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm +++ b/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm @@ -49,7 +49,7 @@ RegisterSignal(source, COMSIG_QDELETING, PROC_REF(Destroy)) - addtimer(CALLBACK(src, PROC_REF(lock_on)), 7) + addtimer(CALLBACK(src, PROC_REF(lock_on)), 0.7 SECONDS) /datum/gunpoint/proc/lock_on() if(src) //if we're not present then locking on failed and this datum is deleted diff --git a/modular_skyrat/modules/horrorform/code/horror_form.dm b/modular_skyrat/modules/horrorform/code/horror_form.dm index 9e6ea71ad73..a2411c8fd77 100644 --- a/modular_skyrat/modules/horrorform/code/horror_form.dm +++ b/modular_skyrat/modules/horrorform/code/horror_form.dm @@ -19,7 +19,7 @@ return 0 user.visible_message(span_warning("[user] writhes and contorts, their body expanding to inhuman proportions!"), \ span_danger("We begin our transformation to our true form!")) - if(!do_after(user, 30, target = user, timed_action_flags = IGNORE_HELD_ITEM)) + if(!do_after(user, 3 SECONDS, target = user, timed_action_flags = IGNORE_HELD_ITEM)) user.visible_message(span_warning("[user]'s transformation abruptly reverts itself!"), \ span_warning("Our transformation has been interrupted!")) return 0 diff --git a/modular_skyrat/modules/horrorform/code/true_changeling.dm b/modular_skyrat/modules/horrorform/code/true_changeling.dm index a746579f840..81f94b1c39d 100644 --- a/modular_skyrat/modules/horrorform/code/true_changeling.dm +++ b/modular_skyrat/modules/horrorform/code/true_changeling.dm @@ -18,7 +18,7 @@ speed = 0.5 stop_automated_movement = FALSE status_flags = CANPUSH - 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) + atmos_requirements = null minbodytemp = 0 maxHealth = 750 //Very durable health = 500 diff --git a/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm b/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm index 6933041c786..babae7961fa 100644 --- a/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm +++ b/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm @@ -1,21 +1,128 @@ -/datum/design/hypoviallarge - name = "Large Hypovial" - id = "large_hypovial" - build_type = AUTOLATHE | PROTOLATHE +/datum/design/hypovial + name = "Hypovial" + id = "hypovial" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.5, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.5, ) - build_path = /obj/item/reagent_containers/cup/vial/large + build_path = /obj/item/reagent_containers/cup/vial/small category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/techweb_node/basic_medical/New() + design_ids += list( + "hypovial", + ) + return ..() + +/// Large hypovials +/datum/design/hypovial/large + name = "Large Hypovial" + id = "large_hypovial" + materials = list( + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.5, + ) + build_path = /obj/item/reagent_containers/cup/vial/large + +/datum/design/hypokit + name = "Hypospray Kit" + id = "hypokit" + build_type = PROTOLATHE | AWAY_LATHE + materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/storage/hypospraykit/empty + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/techweb_node/biotech/New() + design_ids += list( + "large_hypovial", + "hypokit", + ) + return ..() + +/// Hyposprays +/datum/design/hypokit/deluxe + name = "Deluxe Hypospray Kit" + id = "hypokit_deluxe" + materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 6, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 1, + ) + build_path = /obj/item/storage/hypospraykit/cmo/empty + +/datum/design/hypomkii + name = "MkII Hypospray" + id = "hypomkii" + build_type = PROTOLATHE | AWAY_LATHE + materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/hypospray/mkii + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/techweb_node/adv_biotech/New() + design_ids += list( + "hypokit_deluxe", + "hypomkii", + ) + return ..() + +/datum/design/hypomkii/deluxe + name = "MkII Hypospray Upgrade Kit" + id = "hypomkii_deluxe" + build_type = PROTOLATHE | AWAY_LATHE + materials = list( + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 8, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2, + ) + build_path = /obj/item/device/custom_kit/deluxe_hypo2 + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/techweb_node/alien_bio/New() + design_ids += list( + "hypomkii_deluxe", + ) + return ..() + +// Tarkon and similar get enough to work with, but if they want deluxe kits/hypos they still need to trade with the station for 'em. +/datum/techweb_node/oldstation_surgery/New() + design_ids += list( + "hypokit", + "hypomkii", + ) + return ..() + + + +/// For reasons unknown, pens are included as an autolathe design here, in the hypospray module of all places. +/// I'm not touching this unless a maint asks me to because it feels weird and haunted, like the picture of a potato that bricks Source if you remove it. /datum/design/pen name = "Pen" id = "pen" - build_type = AUTOLATHE + build_type = AUTOLATHE | AWAY_LATHE materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT, @@ -24,4 +131,4 @@ category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MISC, - ) + ) \ No newline at end of file diff --git a/modular_skyrat/modules/hyposprays/code/hypospray_kits.dm b/modular_skyrat/modules/hyposprays/code/hypospray_kits.dm index 1f5c3d37d3f..fb8eb21870d 100644 --- a/modular_skyrat/modules/hyposprays/code/hypospray_kits.dm +++ b/modular_skyrat/modules/hyposprays/code/hypospray_kits.dm @@ -1,31 +1,41 @@ /obj/item/storage/hypospraykit name = "hypospray kit" - desc = "It's a kit containing a hypospray and specific treatment chemical-filled vials." + desc = "A hypospray kit with foam insets for hypovials and a mounting point on the bottom." icon = 'modular_skyrat/modules/hyposprays/icons/hypokits.dmi' icon_state = "firstaid-mini" worn_icon_state = "healthanalyzer" // Get a better sprite later inhand_icon_state = "medkit" + greyscale_config = /datum/greyscale_config/hypokit lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + // Small hypokits can be pocketed, but don't have much storage. + w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT throw_speed = 3 throw_range = 7 var/empty = FALSE var/current_case = "firstaid" var/static/list/case_designs - var/static/list/cmo_case_designs - var/cmo_case = FALSE + var/static/list/case_designs_xl + var/is_xl = FALSE + + /// Tracks if a hypospray is attached to the case or not. + var/obj/item/hypospray/mkii/attached_hypo //Code to give hypospray kits selectable paterns. /obj/item/storage/hypospraykit/examine(mob/living/user) . = ..() . += span_notice("Ctrl-Shift-Click to reskin this") + if(attached_hypo) + . += span_notice("[attached_hypo] is mounted on the bottom. Alt-Right-Click to take it off.") + else + . += span_notice("Right-Click with a hypospray to mount it.") /obj/item/storage/hypospraykit/Initialize(mapload) . = ..() if(!length(case_designs)) populate_case_designs() - atom_storage.max_slots = 12 + atom_storage.max_slots = 7 atom_storage.can_hold = typecacheof(list( /obj/item/hypospray/mkii, /obj/item/reagent_containers/cup/vial @@ -35,11 +45,26 @@ /obj/item/storage/hypospraykit/Destroy() + // a large block to stop the CI Gods smiting us & taking extra steps to try and force the CMO hypo to drop smartly + var/atom/drop_loc = drop_location(src) + if(QDELETED(drop_loc)) + drop_loc = get_turf(src) + if(QDELETED(drop_loc)) + QDEL_NULL(attached_hypo) + return ..() + // so long as it found a place to drop, run through and try to drop any indestructible items we contain for(var/obj/item in contents) - if(QDELING(loc)) - if(item.resistance_flags & INDESTRUCTIBLE) // Because we're not supposed to delete stuff that are indestructible, but I'm too lazy to do something more complex upstream now. Later, maybe. - item.forceMove(get_turf(src)) - . = ..() + if(item.resistance_flags & INDESTRUCTIBLE) + atom_storage.remove_single(null, item, drop_loc, TRUE) + // this also includes attached hypos - if indestructible, shunt it out, otherwise qdel it, and in all cases make sure we drop the ref & unregister the signal + if(attached_hypo) + if(attached_hypo.resistance_flags & INDESTRUCTIBLE) + attached_hypo.forceMove(drop_loc) + else + QDEL_NULL(attached_hypo) + attached_hypo = null + UnregisterSignal(attached_hypo, COMSIG_QDELETING) + return ..() /obj/item/storage/hypospraykit/proc/populate_case_designs() @@ -48,12 +73,65 @@ "brute" = image(icon = src.icon, icon_state = "brute-mini"), "burn" = image(icon = src.icon, icon_state = "burn-mini"), "toxin" = image(icon = src.icon, icon_state = "toxin-mini"), - "rad" = image(icon = src.icon, icon_state = "rad-mini"), - "purple" = image(icon = src.icon, icon_state = "purple-mini"), - "oxy" = image(icon = src.icon, icon_state = "oxy-mini")) - cmo_case_designs = list( - "tactical" = image(icon= src.icon, icon_state = "tactical-mini")) - cmo_case_designs += case_designs + "oxy" = image(icon = src.icon, icon_state = "oxy-mini"), + "advanced" = image(icon = src.icon, icon_state = "advanced-mini"), + "buffs" = image(icon = src.icon, icon_state = "buffs-mini"), + "custom" = image(icon = src.icon, icon_state = "standard-gags-mini")) + case_designs_xl = list( + "cmo" = image(icon = src.icon, icon_state = "cmo-mini"), + "emt" = image(icon = src.icon, icon_state = "emt-mini"), + "tactical" = image(icon = src.icon, icon_state = "tactical-mini"), + "deluxe-custom" = image(icon = src.icon, icon_state = "deluxe-gags-normal-mini"), + "tactical-custom" = image(icon = src.icon, icon_state = "deluxe-gags-tactical-mini")) + +/obj/item/storage/hypospraykit/update_overlays() + . = ..() + if(attached_hypo) + if(attached_hypo.greyscale_colors != null) //it's one of the GAGS variants + var/mutable_appearance/hypo_overlay = mutable_appearance(initial(icon), attached_hypo.icon_state) + . += hypo_overlay + var/list/split_colors = splittext(attached_hypo.greyscale_colors, "#") + var/mutable_appearance/hypo_overlay_acc1 = mutable_appearance(initial(icon), "hypo2_accent1") + hypo_overlay_acc1.color = "#[split_colors[2]]" + . += hypo_overlay_acc1 + var/mutable_appearance/hypo_overlay_acc2 = mutable_appearance(initial(icon), "hypo2_accent2") + hypo_overlay_acc2.color = "#[split_colors[3]]" + . += hypo_overlay_acc2 + else + var/mutable_appearance/hypo_overlay = mutable_appearance(initial(icon), attached_hypo.icon_state) + . += hypo_overlay + +/obj/item/storage/hypospraykit/attackby_secondary(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/hypospray/mkii)) + if(attached_hypo != null) + balloon_alert(user, "Mount point full! Remove [attached_hypo] first!") + else + weapon.moveToNullspace() + attached_hypo = weapon + RegisterSignal(weapon, COMSIG_QDELETING, PROC_REF(on_attached_hypo_qdel)) + balloon_alert(user, "Attached [attached_hypo].") + update_appearance() + // This stops atom_storage from hogging your right-click and opening the inventory. + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ..() + +/obj/item/storage/hypospraykit/alt_click_secondary(mob/user) + if(attached_hypo != null) + if(user.put_in_hands(attached_hypo)) + balloon_alert(user, "Removed [attached_hypo].") + UnregisterSignal(attached_hypo, COMSIG_QDELETING) + attached_hypo = null + update_appearance() + // Ditto here. + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + else + balloon_alert(user, "Couldn't pull the hypo!") + return ..() + +/obj/item/storage/hypospraykit/proc/on_attached_hypo_qdel() + if(attached_hypo) + attached_hypo = null + update_appearance() /obj/item/storage/hypospraykit/update_icon_state() . = ..() @@ -62,14 +140,27 @@ /obj/item/storage/hypospraykit/proc/case_menu(mob/user) if(.) return - var/casetype = cmo_case_designs - if(!src.cmo_case) - casetype = case_designs - var/choice = show_radial_menu(user, src , casetype, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 42, require_near = TRUE) + var/list/designs = case_designs + if(is_xl) + designs = case_designs_xl + var/choice = show_radial_menu(user, src, designs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 42, require_near = TRUE) if(!choice) return FALSE current_case = choice update_icon() + if(findtext(current_case, "custom")) + var/atom/fake_atom = src + var/list/allowed_configs = list() + var/config = initial(fake_atom.greyscale_config) + allowed_configs += "[config]" + if(greyscale_colors == null) + greyscale_colors = "#00AAFF" + + var/datum/greyscale_modify_menu/menu = new(src, usr, allowed_configs) + menu.ui_interact(usr) + else //restore normal icon + icon = initial(icon) + greyscale_colors = null /obj/item/storage/hypospraykit/proc/check_menu(mob/user) if(!istype(user)) @@ -84,41 +175,95 @@ //END OF HYPOSPRAY CASE MENU CODE -/obj/item/storage/hypospraykit/empty - desc = "A hypospray kit with general use vials." - -/obj/item/storage/hypospraykit/empty/PopulateContents() +/obj/item/storage/hypospraykit/PopulateContents() if(empty) return new /obj/item/hypospray/mkii(src) +/obj/item/storage/hypospraykit/empty + empty = TRUE + +/// Deluxe hypokit: more storage, but you can't pocket it. /obj/item/storage/hypospraykit/cmo name = "deluxe hypospray kit" - desc = "A kit containing a deluxe hypospray and vials." - icon_state = "tactical-mini" - inhand_icon_state = "medkit-tactical" - current_case = "tactical" - cmo_case = TRUE + desc = "An extended hypospray kit with foam insets for hypovials & a mounting point on the bottom." + icon_state = "cmo-mini" + current_case = "cmo" + is_xl = TRUE + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/storage/hypospraykit/cmo/Initialize(mapload) + . = ..() + atom_storage.max_slots = 21 + atom_storage.max_total_storage = 28 //keeps a wiggle room of 7 just in case size weirdness happens /obj/item/storage/hypospraykit/cmo/PopulateContents() if(empty) return - new /obj/item/hypospray/mkii/cmo(src) + new /obj/item/hypospray/mkii/deluxe/cmo(src) + +/obj/item/storage/hypospraykit/cmo/empty + desc = "An extended hypospray kit with foam insets for hypovials & a mounting point on the bottom." + icon_state = "emt-mini" + current_case = "emt" + empty = TRUE + +/// Preloaded version: this is what goes in the locker. +/obj/item/storage/hypospraykit/cmo/preloaded + name = "CMO's deluxe hypospray kit" + desc = "The CMO's precious extended hypospray kit, preloaded with a deluxe hypospray & a handful of vials. Retains the usual insets and mounting point of smaller hypokits." + +/obj/item/storage/hypospraykit/cmo/preloaded/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/deluxe/cmo(src) + new /obj/item/reagent_containers/cup/vial/large/deluxe(src) new /obj/item/reagent_containers/cup/vial/large/multiver(src) new /obj/item/reagent_containers/cup/vial/large/salglu(src) new /obj/item/reagent_containers/cup/vial/large/synthflesh(src) +/// Combat hypokit +/obj/item/storage/hypospraykit/cmo/combat + name = "combat hypospray kit" + desc = "A larger tactical hypospray kit containing a combat-focused deluxe hypospray and vials." + icon_state = "tactical-mini" + current_case = "tactical" + +/obj/item/storage/hypospraykit/cmo/combat/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/deluxe/cmo/combat(src) + new /obj/item/reagent_containers/cup/vial/large/advbrute(src) + new /obj/item/reagent_containers/cup/vial/large/advburn(src) + new /obj/item/reagent_containers/cup/vial/large/advtox(src) + new /obj/item/reagent_containers/cup/vial/large/advoxy(src) + new /obj/item/reagent_containers/cup/vial/large/advcrit(src) + new /obj/item/reagent_containers/cup/vial/large/advomni(src) + new /obj/item/reagent_containers/cup/vial/large/numbing(src) + +/// Boxes of empty hypovials, coming in every style. /obj/item/storage/box/vials name = "box of hypovials" /obj/item/storage/box/vials/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/reagent_containers/cup/vial/small( src ) + for(var/vialpath in subtypesof(/obj/item/reagent_containers/cup/vial/small/style)) + new vialpath(src) +// Ditto, just large vials. +/obj/item/storage/box/vials/deluxe + name = "box of deluxe hypovials" + +/obj/item/storage/box/vials/deluxe/PopulateContents() + for(var/vialpath in subtypesof(/obj/item/reagent_containers/cup/vial/large/style)) + new vialpath(src) + +// A box of small hypospray kits, pre-skinned to each variant to remind people what styles are available. /obj/item/storage/box/hypospray name = "box of hypospray kits" /obj/item/storage/box/hypospray/PopulateContents() - for(var/i in 1 to 4) - new /obj/item/storage/hypospraykit/empty(src) - + var/list/case_designs = list("firstaid", "brute", "burn", "toxin", "oxy", "advanced", "buffs") + for(var/label in case_designs) + var/obj/item/storage/hypospraykit/newkit = new /obj/item/storage/hypospraykit(src) + newkit.current_case = label + newkit.update_icon_state() diff --git a/modular_skyrat/modules/hyposprays/code/hyposprays_II.dm b/modular_skyrat/modules/hyposprays/code/hyposprays_II.dm index 51cc9c71472..964da32eb80 100644 --- a/modular_skyrat/modules/hyposprays/code/hyposprays_II.dm +++ b/modular_skyrat/modules/hyposprays/code/hyposprays_II.dm @@ -20,18 +20,18 @@ name = "hypospray mk.II" icon_state = "hypo2" icon = 'modular_skyrat/modules/hyposprays/icons/hyposprays.dmi' - desc = "A new development from DeForest Medical, this hypospray takes 60-unit vials as the drug supply for easy swapping." + greyscale_config = /datum/greyscale_config/hypospray_mkii + desc = "A new development from DeForest Medical, this hypospray takes 50-unit vials as the drug supply for easy swapping." w_class = WEIGHT_CLASS_TINY var/list/allowed_containers = list(/obj/item/reagent_containers/cup/vial/small) /// Is the hypospray only able to use small vials. Relates to the loaded overlays var/small_only = TRUE /// Inject or spray? var/mode = HYPO_INJECT + /// The presently-inserted vial. var/obj/item/reagent_containers/cup/vial/vial /// If the Hypospray starts with a vial, which vial does it start with? var/start_vial - /// Does the Hypospray start with a vial? - var/spawnwithvial = FALSE /// Time taken to inject others var/inject_wait = WAIT_INJECT @@ -46,54 +46,86 @@ var/quickload = TRUE /// Does it penetrate clothing? var/penetrates = null + /// Used for GAGS-ified hypos. + var/gags_bodystate = "hypo2_normal" -/obj/item/hypospray/mkii/cmo +/obj/item/hypospray/mkii/deluxe name = "hypospray mk.II deluxe" allowed_containers = list(/obj/item/reagent_containers/cup/vial/small, /obj/item/reagent_containers/cup/vial/large) - icon_state = "cmo2" - desc = "The deluxe hypospray can take larger 120-unit vials. It also acts faster and can deliver more reagents per spray." - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - start_vial = /obj/item/reagent_containers/cup/vial/large/deluxe - spawnwithvial = TRUE + icon_state = "bighypo2" + gags_bodystate = "hypo2_deluxe" + desc = "The deluxe DeForest Mk. II hypospray, able to take both 100u and 50u vials." small_only = FALSE + +// Deluxe hypo upgrade Kit +/obj/item/device/custom_kit/deluxe_hypo2 + name = "DeForest Mk. II Hypospray Deluxe Bodykit" + desc = "Upgrades the DeForest Mk. II Hypospray to support larger vials." + // don't tinker with a loaded (medi)gun. fool + from_obj = /obj/item/hypospray/mkii + to_obj = /obj/item/hypospray/mkii/deluxe + +/obj/item/device/custom_kit/deluxe_hypo2/pre_convert_check(obj/target_obj, mob/user) + var/obj/item/hypospray/mkii/our_hypo = target_obj + if(our_hypo.type in subtypesof(/obj/item/hypospray/mkii/)) + balloon_alert(user, "only works on basic mk. ii hypos!") + return FALSE + if(our_hypo.vial != null) + balloon_alert(user, "unload the vial first!") + return FALSE + return TRUE + +/obj/item/hypospray/mkii/deluxe/cmo + name = "CMO's deluxe hypospray mk.II" + icon_state = "cmo2" + gags_bodystate = "hypo2_cmo" + desc = "The CMO's prized deluxe hypospray, able to take both 100u and 50u vials, acting faster and able to deliver more reagents per spray." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF inject_wait = DELUXE_WAIT_INJECT spray_wait = DELUXE_WAIT_SPRAY spray_self = DELUXE_SELF_SPRAY inject_self = DELUXE_SELF_INJECT penetrates = INJECT_CHECK_PENETRATE_THICK +/obj/item/hypospray/mkii/deluxe/cmo/combat + name = "combat-grade hypospray mk.II" + icon_state = "combat2" + gags_bodystate = "hypo2_tactical" + desc = "A variant of the deluxe hypospray, able to take both 100u and 50u vials, with overcharged applicators and an armor-piercing tip." + // Made non-indestructible since this is typically an admin spawn. still robust though! + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + inject_wait = COMBAT_WAIT_INJECT + spray_wait = COMBAT_WAIT_SPRAY + spray_self = COMBAT_SELF_INJECT + inject_self = COMBAT_SELF_SPRAY + penetrates = INJECT_CHECK_PENETRATE_THICK + /obj/item/hypospray/mkii/Initialize(mapload) . = ..() - if(!spawnwithvial) - update_appearance() - return - if(start_vial) - vial = new start_vial - update_appearance() - AddElement(/datum/element/update_icon_updates_onmob) /obj/item/hypospray/mkii/update_overlays() . = ..() if(!vial) return - if(!vial.reagents.total_volume) - return - var/vial_spritetype = "chem-color" - if(!small_only) - vial_spritetype += "[vial.type_suffix]" + if(vial.reagents.total_volume) + var/vial_spritetype = "chem-color" + if(!small_only) + vial_spritetype += "[vial.type_suffix]" + else + vial_spritetype += "-s" + var/mutable_appearance/chem_loaded = mutable_appearance(initial(icon), vial_spritetype) + chem_loaded.color = vial.chem_color + . += chem_loaded + if(vial.greyscale_colors != null) + var/mutable_appearance/vial_overlay = mutable_appearance(initial(icon), "[vial.icon_state]-body") + vial_overlay.color = vial.greyscale_colors + . += vial_overlay + var/mutable_appearance/vial_overlay_glass = mutable_appearance(initial(icon), "[vial.icon_state]-glass") + . += vial_overlay_glass else - vial_spritetype += "-s" - var/mutable_appearance/chem_loaded = mutable_appearance('modular_skyrat/modules/hyposprays/icons/hyposprays.dmi', vial_spritetype) - chem_loaded.color = vial.chem_color - . += chem_loaded - -/obj/item/hypospray/mkii/update_icon_state() - . = ..() - var/icon_suffix = "-s" - if(!small_only && vial) - icon_suffix = vial.type_suffix //Sets the suffix used to the correspoding vial. - icon_state = "[initial(icon_state)][vial ? "[icon_suffix]" : ""]" + var/mutable_appearance/vial_overlay = mutable_appearance(initial(icon), vial.icon_state) + . += vial_overlay /obj/item/hypospray/mkii/examine(mob/user) . = ..() @@ -101,6 +133,26 @@ . += "[vial] has [vial.reagents.total_volume]u remaining." else . += "It has no vial loaded in." + . += span_notice("Ctrl-Shift-Click to change up the colors or reset them.") + +/obj/item/hypospray/mkii/CtrlShiftClick(mob/user, obj/item/I) + var/choice = tgui_input_list(user, "GAGSify the hypo or reset to default?", "Fashion", list("GAGS", "Nope")) + if(choice == "GAGS") + icon_state = gags_bodystate + //choices go here + var/atom/fake_atom = src + var/list/allowed_configs = list() + var/config = initial(fake_atom.greyscale_config) + allowed_configs += "[config]" + if(greyscale_colors == null) + greyscale_colors = "#00AAFF#FFAA00" + + var/datum/greyscale_modify_menu/menu = new(src, usr, allowed_configs) + menu.ui_interact(usr) + else + icon_state = initial(icon_state) + icon = initial(icon) + greyscale_colors = null /obj/item/hypospray/mkii/proc/unload_hypo(obj/item/hypo, mob/user) if((istype(hypo, /obj/item/reagent_containers/cup/vial))) @@ -218,13 +270,13 @@ if(injectee != user) injectee.visible_message(span_danger("[user] is trying to [fp_verb] [injectee] with [src]!"), \ span_userdanger("[user] is trying to [fp_verb] you with [src]!")) - + var/selected_wait_time if(target == user) selected_wait_time = (mode == HYPO_INJECT) ? inject_self : spray_self else selected_wait_time = (mode == HYPO_INJECT) ? inject_wait : spray_wait - + if(!do_after(user, selected_wait_time, injectee, extra_checks = CALLBACK(injectee, /mob/living/proc/can_inject, user, user.zone_selected, penetrates))) return if(!vial.reagents.total_volume) @@ -279,4 +331,4 @@ #undef COMBAT_WAIT_SPRAY #undef COMBAT_WAIT_INJECT #undef COMBAT_SELF_SPRAY -#undef COMBAT_SELF_INJECT +#undef COMBAT_SELF_INJECT \ No newline at end of file diff --git a/modular_skyrat/modules/hyposprays/code/hypovials.dm b/modular_skyrat/modules/hyposprays/code/hypovials.dm index a4781bfea8f..4e272ca22ff 100644 --- a/modular_skyrat/modules/hyposprays/code/hypovials.dm +++ b/modular_skyrat/modules/hyposprays/code/hypovials.dm @@ -3,37 +3,74 @@ desc = "You probably shouldn't be seeing this. Shout at a coder." icon = 'modular_skyrat/modules/hyposprays/icons/vials.dmi' icon_state = "hypovial" + greyscale_config = /datum/greyscale_config/hypovial + fill_icon_state = "hypovial_fill" spillable = FALSE volume = 10 - /// The suffix of the overlay texture that the hypovial uses when loading textures. - var/type_suffix = "-s" possible_transfer_amounts = list(1,2,5,10) fill_icon_thresholds = list(10, 25, 50, 75, 100) - var/chem_color //Used for hypospray overlay + var/chem_color = "#FFFFFF" //Used for hypospray overlay + var/type_suffix = "-s" + fill_icon = 'modular_skyrat/modules/hyposprays/icons/hypospray_fillings.dmi' + current_skin = "hypovial" + + unique_reskin = list( + "Sterile" = "hypovial", + "Generic" = "hypovial-generic", + "Brute" = "hypovial-brute", + "Burn" = "hypovial-burn", + "Toxin" = "hypovial-tox", + "Oxyloss" = "hypovial-oxy", + "Crit" = "hypovial-crit", + "Buff" = "hypovial-buff", + "Custom" = "hypovial-custom", + ) + +/obj/item/reagent_containers/cup/vial/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_OBJ_RESKIN, PROC_REF(on_reskin)) + +/obj/item/reagent_containers/cup/vial/Destroy(force) + . = ..() + UnregisterSignal(src, COMSIG_OBJ_RESKIN) + +/obj/item/reagent_containers/cup/vial/examine(mob/user) + . = ..() + . += span_notice("Ctrl-Shift-Click to reskin or set a custom color.") + +/obj/item/reagent_containers/cup/vial/CtrlShiftClick(mob/user, obj/item/I) + current_skin = null + icon_state = initial(icon_state) + icon = initial(icon) + greyscale_colors = null + reskin_obj(user) + +/obj/item/reagent_containers/cup/vial/proc/on_reskin() + if(current_skin == "Custom") + icon_state = unique_reskin["Sterile"] + current_skin = unique_reskin["Sterile"] + var/atom/fake_atom = src + var/list/allowed_configs = list() + var/config = initial(fake_atom.greyscale_config) + allowed_configs += "[config]" + if(greyscale_colors == null) + greyscale_colors = "#FFFF00" + var/datum/greyscale_modify_menu/menu = new(src, usr, allowed_configs) + menu.ui_interact(usr) + else + icon_state = unique_reskin[current_skin] /obj/item/reagent_containers/cup/vial/update_overlays() . = ..() - if(!fill_icon_thresholds) - return - if(reagents.total_volume) - var/fill_name = fill_icon_state? fill_icon_state : icon_state - var/fill_overlay = 10 - switch(round((reagents.total_volume / volume)*100)) - if(1 to 24) - fill_overlay = 10 - if(25 to 49) - fill_overlay = 25 - if(50 to 74) - fill_overlay = 50 - if(75 to 89) - fill_overlay = 75 - if(89 to 100) - fill_overlay = 100 - var/mutable_appearance/filling = mutable_appearance('modular_skyrat/modules/hyposprays/icons/hypospray_fillings.dmi', "[fill_name][fill_overlay]") - - filling.color = mix_color_from_reagents(reagents.reagent_list) - chem_color = filling.color - . += filling + // Search the overlays for the fill overlay from reagent_containers, and nudge its layer down to have it look correct. + chem_color = "#FFFFFF" + var/list/generated_overlays = . + for(var/added_overlay in generated_overlays) + if(istype(added_overlay, /mutable_appearance)) + var/mutable_appearance/overlay_image = added_overlay + if(findtext(overlay_image.icon_state, fill_icon_state) != 0) + overlay_image.layer = layer - 0.01 + chem_color = overlay_image.color /obj/item/reagent_containers/cup/vial/Initialize(mapload) . = ..() @@ -49,28 +86,120 @@ volume = 50 possible_transfer_amounts = list(1,2,5,10,15,25,50) +/obj/item/reagent_containers/cup/vial/small/style + icon_state = "hypovial" + +//Styles +/obj/item/reagent_containers/cup/vial/small/style/generic + icon_state = "hypovial-generic" +/obj/item/reagent_containers/cup/vial/small/style/brute + icon_state = "hypovial-brute" +/obj/item/reagent_containers/cup/vial/small/style/burn + icon_state = "hypovial-burn" +/obj/item/reagent_containers/cup/vial/small/style/toxin + icon_state = "hypovial-tox" +/obj/item/reagent_containers/cup/vial/small/style/oxy + icon_state = "hypovial-oxy" +/obj/item/reagent_containers/cup/vial/small/style/crit + icon_state = "hypovial-crit" +/obj/item/reagent_containers/cup/vial/small/style/buff + icon_state = "hypovial-buff" + //Fit in CMO hypo only /obj/item/reagent_containers/cup/vial/large name = "large hypovial" icon_state = "hypoviallarge" + fill_icon_state = "hypoviallarge_fill" + current_skin = "hypoviallarge" desc = "A large, 100u capacity vial that fits only in the most deluxe hyposprays." volume = 100 - type_suffix = "-l" possible_transfer_amounts = list(1,2,5,10,20,30,40,50,100) + type_suffix = "-l" + + unique_reskin = list( + "Sterile" = "hypoviallarge", + "Generic" = "hypoviallarge-generic", + "Brute" = "hypoviallarge-brute", + "Burn" = "hypoviallarge-burn", + "Toxin" = "hypoviallarge-tox", + "Oxyloss" = "hypoviallarge-oxy", + "Crit" = "hypoviallarge-crit", + "Buff" = "hypoviallarge-buff", + "Custom" = "hypoviallarge-custom", + ) + +/obj/item/reagent_containers/cup/vial/large/style/ + icon_state = "hypoviallarge" + +//Styles +/obj/item/reagent_containers/cup/vial/large/style/generic + icon_state = "hypoviallarge-generic" +/obj/item/reagent_containers/cup/vial/large/style/brute + icon_state = "hypoviallarge-brute" +/obj/item/reagent_containers/cup/vial/large/style/burn + icon_state = "hypoviallarge-burn" +/obj/item/reagent_containers/cup/vial/large/style/toxin + icon_state = "hypoviallarge-tox" +/obj/item/reagent_containers/cup/vial/large/style/oxy + icon_state = "hypoviallarge-oxy" +/obj/item/reagent_containers/cup/vial/large/style/crit + icon_state = "hypoviallarge-crit" +/obj/item/reagent_containers/cup/vial/large/style/buff + icon_state = "hypoviallarge-buff" //Hypos that are in the CMO's kit round start /obj/item/reagent_containers/cup/vial/large/deluxe name = "deluxe hypovial" + icon_state = "hypoviallarge-buff" list_reagents = list(/datum/reagent/medicine/omnizine = 15, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15) /obj/item/reagent_containers/cup/vial/large/salglu name = "large green hypovial (salglu)" + icon_state = "hypoviallarge-oxy" list_reagents = list(/datum/reagent/medicine/salglu_solution = 50) /obj/item/reagent_containers/cup/vial/large/synthflesh name = "large orange hypovial (synthflesh)" + icon_state = "hypoviallarge-crit" list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 50) /obj/item/reagent_containers/cup/vial/large/multiver name = "large black hypovial (multiver)" + icon_state = "hypoviallarge-tox" list_reagents = list(/datum/reagent/medicine/c2/multiver = 50) + +//Some bespoke helper types for preloaded combat medkits. +/obj/item/reagent_containers/cup/vial/large/advbrute + name = "Brute Heal" + icon_state = "hypoviallarge-brute" + list_reagents = list(/datum/reagent/medicine/c2/libital = 50, /datum/reagent/medicine/sal_acid = 50) + +/obj/item/reagent_containers/cup/vial/large/advburn + name = "Burn Heal" + icon_state = "hypoviallarge-burn" + list_reagents = list(/datum/reagent/medicine/c2/aiuri = 50, /datum/reagent/medicine/oxandrolone = 50) + +/obj/item/reagent_containers/cup/vial/large/advtox + name = "Toxin Heal" + icon_state = "hypoviallarge-tox" + list_reagents = list(/datum/reagent/medicine/pen_acid = 100) + +/obj/item/reagent_containers/cup/vial/large/advoxy + name = "Oxy Heal" + icon_state = "hypoviallarge-oxy" + list_reagents = list(/datum/reagent/medicine/c2/tirimol = 50, /datum/reagent/medicine/salbutamol = 50) + +/obj/item/reagent_containers/cup/vial/large/advcrit + name = "Crit Heal" + icon_state = "hypoviallarge-crit" + list_reagents = list(/datum/reagent/medicine/atropine = 100) + +/obj/item/reagent_containers/cup/vial/large/advomni + name = "All-Heal" + icon_state = "hypoviallarge-buff" + list_reagents = list(/datum/reagent/medicine/regen_jelly = 100) + +/obj/item/reagent_containers/cup/vial/large/numbing + name = "Numbing" + icon_state = "hypoviallarge-generic" + list_reagents = list(/datum/reagent/medicine/mine_salve = 50, /datum/reagent/medicine/morphine = 50) \ No newline at end of file diff --git a/modular_skyrat/modules/hyposprays/code/vending_hypospray.dm b/modular_skyrat/modules/hyposprays/code/vending_hypospray.dm index 3441c2175c6..27802b91895 100644 --- a/modular_skyrat/modules/hyposprays/code/vending_hypospray.dm +++ b/modular_skyrat/modules/hyposprays/code/vending_hypospray.dm @@ -1,3 +1,3 @@ /obj/machinery/vending/drugs/Initialize(mapload) - products[/obj/item/storage/hypospraykit/empty] = 5 + products[/obj/item/storage/hypospraykit] = 5 . = ..() diff --git a/modular_skyrat/modules/hyposprays/icons/hypokits.dmi b/modular_skyrat/modules/hyposprays/icons/hypokits.dmi index 08eae135821..e2040d04047 100644 Binary files a/modular_skyrat/modules/hyposprays/icons/hypokits.dmi and b/modular_skyrat/modules/hyposprays/icons/hypokits.dmi differ diff --git a/modular_skyrat/modules/hyposprays/icons/hypospray_fillings.dmi b/modular_skyrat/modules/hyposprays/icons/hypospray_fillings.dmi index 901a9fd4c45..cc0dbd1deb4 100644 Binary files a/modular_skyrat/modules/hyposprays/icons/hypospray_fillings.dmi and b/modular_skyrat/modules/hyposprays/icons/hypospray_fillings.dmi differ diff --git a/modular_skyrat/modules/hyposprays/icons/hyposprays.dmi b/modular_skyrat/modules/hyposprays/icons/hyposprays.dmi index 2d6ecc535c5..c753f5ef07a 100644 Binary files a/modular_skyrat/modules/hyposprays/icons/hyposprays.dmi and b/modular_skyrat/modules/hyposprays/icons/hyposprays.dmi differ diff --git a/modular_skyrat/modules/hyposprays/icons/vials.dmi b/modular_skyrat/modules/hyposprays/icons/vials.dmi index a960cdc9610..51ec29bbf20 100644 Binary files a/modular_skyrat/modules/hyposprays/icons/vials.dmi and b/modular_skyrat/modules/hyposprays/icons/vials.dmi differ diff --git a/modular_skyrat/modules/hyposprays/readme.md b/modular_skyrat/modules/hyposprays/readme.md index f90fe04d096..cb9a18bb299 100644 --- a/modular_skyrat/modules/hyposprays/readme.md +++ b/modular_skyrat/modules/hyposprays/readme.md @@ -1,4 +1,4 @@ -https://github.com/Skyrat-SS13/Skyrat-tg/pull/1929 +Original PR: https://github.com/Skyrat-SS13/Skyrat-tg/pull/1929 ## Title: Hyposprays @@ -11,7 +11,10 @@ Gives Medical back its Hyposprays. Oldbase stuff is good. ### TG Proc Changes: - CMO's locker now contains a new object, the CMO's Hypospray Kit. Old Hypospray has been commented out. -- Medical Doctor and Paramedic jobs now spawn with a standard Hypospray kit in backpack_contents +- Chemistry lockers now contain two boxes of Standard Hypospray Kits. +- Medical belts can carry the Mk II Hyposprays, vials, and Hypospray Kits. +- Adds CAT_HYPOS to ``code/_globalvars/lists/reagents.dm`` to allow vials to be printed from chem dispensers. +- Bluespace technicans get combat hypospray kits for QOL and testing. ### Defines: @@ -41,3 +44,4 @@ Gives Medical back its Hyposprays. Oldbase stuff is good. ### Credits: ShadeAware - Porting +CliffracerX - Tweaks & new sprites \ No newline at end of file diff --git a/modular_skyrat/modules/icspawning/code/observer.dm b/modular_skyrat/modules/icspawning/code/observer.dm index d8d5ef0065b..900a73746ab 100644 --- a/modular_skyrat/modules/icspawning/code/observer.dm +++ b/modular_skyrat/modules/icspawning/code/observer.dm @@ -36,6 +36,12 @@ if(!give_return) return + var/addquirks + if(character_option == "Selected Character") + addquirks = tgui_input_list(src, "Include quirks?", "Quirky", list("Quirks & Loadout", "Quirks Only", "Loadout Only", "Neither")) + if(!addquirks) + return + var/turf/current_turf = get_turf(user) var/mob/living/carbon/human/spawned_player = new(user) @@ -44,10 +50,20 @@ spawned_player.name = user.name spawned_player.real_name = user.real_name - var/mob/living/carbon/human/H = spawned_player - user.client?.prefs.safe_transfer_prefs_to(H) - H.dna.update_dna_identity() - + var/mob/living/carbon/human/player_as_human = spawned_player + user.client?.prefs.safe_transfer_prefs_to(player_as_human) + if(addquirks == "Quirks & Loadout" || addquirks == "Loadout Only") + if(dresscode == "Naked") + player_as_human.equip_outfit_and_loadout(new /datum/outfit(), user.client?.prefs) + else + player_as_human.equip_outfit_and_loadout(dresscode, user.client?.prefs) + else if(dresscode != "Naked") + spawned_player.equipOutfit(dresscode) + if(addquirks == "Quirks & Loadout" || addquirks == "Quirks Only") + SSquirks.AssignQuirks(player_as_human, user.client) + player_as_human.dna.update_dna_identity() + else if(dresscode != "Naked") + spawned_player.equipOutfit(dresscode) QDEL_IN(user, 1) if (teleport_option == "Bluespace") @@ -62,9 +78,6 @@ var/datum/action/cooldown/spell/return_back/return_spell = new(spawned_player) return_spell.Grant(spawned_player) - if(dresscode != "Naked") - spawned_player.equipOutfit(dresscode) - switch(teleport_option) if("Bluespace") spawned_player.forceMove(current_turf) @@ -91,8 +104,9 @@ var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job) - typesof(/datum/outfit/plasmaman) for(var/path in paths) - var/datum/outfit/O = path //not much to initalize here but whatever - outfits[initial(O.name)] = path + // Get the datum from the path so we can grab its name. + var/datum/outfit/path_as_outfit = path + outfits[initial(path_as_outfit.name)] = path var/dresscode = tgui_input_list(src, "Select outfit", "Robust quick dress shop", baseoutfits + sort_list(outfits)) @@ -128,11 +142,11 @@ if (dresscode == "Custom") var/list/custom_names = list() - for(var/datum/outfit/D in GLOB.custom_outfits) - custom_names[D.name] = D + for(var/datum/outfit/req_outfit in GLOB.custom_outfits) + custom_names[req_outfit.name] = req_outfit var/selected_name = input("Select outfit", "Robust quick dress shop") as null|anything in sort_list(custom_names) dresscode = custom_names[selected_name] if(isnull(dresscode)) return - return dresscode + return dresscode \ No newline at end of file diff --git a/modular_skyrat/modules/icspawning/code/standard.dm b/modular_skyrat/modules/icspawning/code/standard.dm index bd30194d2bf..3f15b6662a0 100644 --- a/modular_skyrat/modules/icspawning/code/standard.dm +++ b/modular_skyrat/modules/icspawning/code/standard.dm @@ -36,6 +36,16 @@ shoes = /obj/item/clothing/shoes/combat/debug id = /obj/item/card/id/advanced/debug/bst box = /obj/item/storage/box/debugtools + backpack_contents = list( + /obj/item/melee/energy/axe = 1, + /obj/item/storage/part_replacer/bluespace/tier4/bst = 1, + /obj/item/gun/magic/wand/resurrection/debug = 1, + /obj/item/gun/magic/wand/death/debug = 1, + /obj/item/debug/human_spawner = 1, + /obj/item/debug/omnitool = 1, + /obj/item/storage/box/stabilized = 1, + /obj/item/storage/hypospraykit/cmo/combat = 1, + ) /datum/outfit/admin/bst //Debug objs plus modsuit name = "Bluespace Tech (MODsuit)" @@ -44,3 +54,243 @@ shoes = /obj/item/clothing/shoes/combat/debug id = /obj/item/card/id/advanced/debug/bst box = /obj/item/storage/box/debugtools + backpack_contents = list( + /obj/item/melee/energy/axe = 1, + /obj/item/storage/part_replacer/bluespace/tier4/bst = 1, + /obj/item/gun/magic/wand/resurrection/debug = 1, + /obj/item/gun/magic/wand/death/debug = 1, + /obj/item/debug/human_spawner = 1, + /obj/item/debug/omnitool = 1, + /obj/item/storage/box/stabilized = 1, + /obj/item/storage/hypospraykit/cmo/combat = 1, + ) + +/obj/item/storage/part_replacer/bluespace/tier4/bst + name = "\improper Bluespace Tech RPED" + desc = "A specialized bluespace RPED for technicians that can manufacture stock parts on the fly. Alt-Right-Click to manufacture parts, change settings, or clear its internal storage." + /// Whether or not auto-clear is enabled + var/auto_clear = TRUE + /// List of valid types for pick_stock_part(). + var/static/list/valid_stock_part_types = list( + /obj/item/circuitboard/machine, + /obj/item/stock_parts, + /obj/item/reagent_containers/cup/beaker, + ) + +/obj/item/storage/part_replacer/bluespace/tier4/bst/Initialize(mapload) + . = ..() + atom_storage.max_slots = 1000 + atom_storage.max_total_storage = 20000 + +/// An extension to the default RPED part replacement action - if you don't have the requisite parts in the RPED already, it will spawn T4 versions to use. +/obj/item/storage/part_replacer/bluespace/tier4/bst/part_replace_action(obj/attacked_object, mob/living/user) + // We start with setting up a list of the current contents of the RPED when using auto-clear. This is used to detect new items after upgrades are applied & remove them. + var/list/old_contents = list() + var/list/inv_grab = atom_storage.return_inv(FALSE) + if(auto_clear) + old_contents = atom_storage.return_inv(FALSE) + // Once old_contents has been initialized, if needed, we check if the target object is a machine frame. + var/obj/structure/frame/attacked_frame = attacked_object + if(istype(attacked_frame, /obj/structure/frame/machine)) + var/obj/structure/frame/machine/machine_frame = attacked_frame + var/obj/item/circuitboard/machine/circuit = machine_frame.circuit + // Prioritize using the circuit's components list first, if present, to maintain consistency. + if(istype(circuit)) + spawn_parts_for_components(user, circuit.req_components) + else if(machine_frame.req_components) + spawn_parts_for_components(user, machine_frame.req_components) + else + // It's not a machine frame, so let's check if it's a regular machine. + if(ismachinery(attacked_object) && !istype(attacked_object, /obj/machinery/computer)) + var/obj/machinery/attacked_machinery = attacked_object + var/obj/item/circuitboard/machine/circuit = attacked_machinery.circuit + // If it is, we need to use the circuit's components; there's no good way to get required components off of an already-built machine. + if(istype(circuit)) + spawn_parts_for_components(user, circuit.req_components) + . = ..() + // If auto-clear is in use, + if(auto_clear) + inv_grab.Cut() + inv_grab = atom_storage.return_inv(FALSE) + for(var/obj/item/stored_item in inv_grab) + if(!(stored_item in old_contents)) + qdel(stored_item) + +/// A bespoke proc for spawning in parts +/obj/item/storage/part_replacer/bluespace/tier4/bst/proc/spawn_parts_for_components(mob/living/user, list/required_components) + // Since req_components in machineboards can list item types *OR* /datum/stock_part subtypes this gets a little complicated. + var/list/subtypes = list() + for(var/req_component in required_components) + // Start off noting how many the recipe calls for, a counter for how many matching parts have been found, and generating a list of subtypes for use in later checks. + var/parts_amount_required = required_components[req_component] + var/found_matching = 0 + subtypes = typesof(req_component) + + if(!parts_amount_required) + continue + + /// Then, check if the requested component is an object subtype - this means it's probably either materials (e.g, cables) or non-stock_part subtypes like beakers. + if(ispath(req_component, /obj/item)) + // If it's a stack, it needs special treatment. + if(ispath(req_component, /obj/item/stack)) + // Stacks generate the matching count based on how many matching stacks are in the RPED's inventory with sufficient count. + // To find stacks inside the RPED, we search its contents for anything that's a subtype of /obj/item/stack. + for(var/obj/stored_item in contents) + var/obj/item/stack/stored_item_as_stack = stored_item + if(istype(stored_item_as_stack)) + // If a stack item is found, we check if it's in the typesof list for the current requested component, and if so, mark its count. + if(stored_item_as_stack.type in subtypes) + found_matching += stored_item_as_stack.amount + // If there's enough, we can return early. + if(found_matching >= parts_amount_required) + break + // If there's not enough left, spawn enough of the appropriate type that there will be. Stacks' Initialialize accepts an amount for the newly-spawned stack to have, and will auto-split as needed. + if(found_matching < parts_amount_required) + atom_storage.attempt_insert(new req_component(src, parts_amount_required - found_matching), user, TRUE) + continue + else + // It's not a stack, which means now we have to count how many matching items are present. + for(var/obj/stored_item in contents) + if(stored_item.type in subtypes) + found_matching += 1 + // If there's enough, we can break - no need to spawn extras. + if(found_matching >= parts_amount_required) + break + // If there's still not enough, we're going to have to spawn enough in manually. + if(found_matching < parts_amount_required) + for(var/i in 1 to parts_amount_required - found_matching) + atom_storage.attempt_insert(new req_component(src), user, TRUE) + continue + + /// If it's not an obj, then it's a subtype of /datum/stock_part - or *should be*, anyway. + else if(ispath(req_component, /datum/stock_part)) + var/datum/stock_part/part_type = new req_component() + var/base_type = part_type.physical_object_base_type + // Specific machines sometimes call for specific tiers of part; give them precisely what they ask for, just in case. + if(part_type.tier > 1) + base_type = part_type.physical_object_type + // Search to see if we have enough of that exact item, and if not, we'll spawn more. + for(var/obj/stored_item in contents) + if(stored_item.type == base_type) + found_matching += 1 + // If there's enough, we can return early. + if(found_matching >= parts_amount_required) + break + // If there's still not enough, we're going to have to spawn enough in manually. + if(found_matching < parts_amount_required) + for(var/i in 1 to parts_amount_required - found_matching) + atom_storage.attempt_insert(new base_type(src), user, TRUE) + continue + else + // For everything else, just make sure we have enough valid items of the stock part's subtypes. + subtypes = typesof(base_type) + for(var/obj/stored_item in contents) + if(stored_item.type in subtypes) + found_matching += 1 + // If there's enough, we can return early. + if(found_matching >= parts_amount_required) + break + + // If there's still not enough, we're going to have to spawn enough in manually. + if(found_matching < parts_amount_required) + // Reset the subtypes list so we can pick the highest tier of part available. + subtypes = typesof(req_component) + var/highest_tier = 0 + + // Search those subtypes for the highest. This SHOULD only ever go up to 4, but that's on the assumption upstream doesn't change it. + for(var/subtype_path in subtypes) + var/datum/stock_part/sub_part = new subtype_path() + if(sub_part.tier > highest_tier) + highest_tier = sub_part.tier + base_type = sub_part.physical_object_type + + // Once the best component has been found, fill in enough remaining. + for(var/i in 1 to parts_amount_required - found_matching) + atom_storage.attempt_insert(new base_type(src), user, TRUE) + continue + + // If it's not a /datum/stock_part subtype either, something has gone wrong and devs should probably be alerted. + if(found_matching < parts_amount_required) + to_chat(user, span_notice("Something went wrong manufacturing [req_component]. Alert the devs, and let them know what machine it was!")) + +/// BSTs' special Bluespace RPED can manufacture parts on Alt-RMB, either cables, glass, machine boards, or stock parts. +/obj/item/storage/part_replacer/bluespace/tier4/bst/alt_click_secondary(mob/user) + // Ask the user what they want to make, or if they want to clear the storage. + var/spawn_selection = tgui_input_list(user, "Pick a part, or clear storage", "RPED Manufacture", list("Clear All Items", "Toggle Auto-Clear", "Cables", "Glass", "Spare T4s", "Machine Board", "Stock Part", "Beaker")) + // If they didn't cancel out of the list selection, we do things. Clear-all removes all items, auto-clear destroys left-overs after upgrades, and everything else is pretty self-explanatory. + // Machine boards and stock parts use a recursive subtype selector. + if(isnull(spawn_selection)) + return + else if(spawn_selection == "Clear All Items") + var/list/inv_grab = atom_storage.return_inv(FALSE) + for(var/obj/item/stored_item in inv_grab) + qdel(stored_item) + else if(spawn_selection == "Toggle Auto-Clear") + auto_clear = !auto_clear + to_chat(user, span_notice("The RPED will now [(auto_clear ? "destroy" : "keep")] items left-over after upgrades.")) + else if(spawn_selection == "Cables") + atom_storage.attempt_insert(new /obj/item/stack/cable_coil(src), user, TRUE) + else if(spawn_selection == "Glass") + atom_storage.attempt_insert(new /obj/item/stack/sheet/glass/fifty(src), user, TRUE) + else if(spawn_selection == "Spare T4s") + for(var/i in 1 to 10) + atom_storage.attempt_insert(new /obj/item/stock_parts/capacitor/quadratic(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/scanning_module/triphasic(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/servo/femto(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/micro_laser/quadultra(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/matter_bin/bluespace(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/cell/bluespace(src), user, TRUE) + else + var/subtype + if(spawn_selection == "Machine Board") + subtype = /obj/item/circuitboard/machine + else if(spawn_selection == "Stock Part") + subtype = /obj/item/stock_parts + else if(spawn_selection == "Beaker") + subtype = /obj/item/reagent_containers/cup/beaker + if(subtype) + pick_stock_part(user, FALSE, subtype) + +/// A bespoke proc for picking a subtype to spawn in a relatively user-friendly way. +/obj/item/storage/part_replacer/bluespace/tier4/bst/proc/pick_stock_part(mob/user, recurse, subtype) + // Sanity check: make sure it's actually an item, and not an atom, machine, or whatever else someone might try to feed it down the line. + if(!is_path_in_list(subtype, valid_stock_part_types)) + return + // Stores a list of pretty type names : actual paths. + var/list/items_temp = list() + // Grab the initial list of paths, NOT INCLUDING this specific path. + var/list/paths = subtypesof(subtype) + + // Simplistic check to only list top-level subtypes. + var/list/top_level_subtypes_only = list() + for(var/datum/subtype_path as anything in paths) + if(initial(subtype_path.parent_type) != subtype) + continue + top_level_subtypes_only += subtype_path + paths = top_level_subtypes_only + + // With all sub-subtypes removed, initialize the list of valid, spawnable items & their pretty names - and if this is a recursion, include the original subtype. + if(recurse) + paths += subtype + for(var/path in paths) + var/obj/path_as_obj = path + // Generates a pretty list of item names & paths, including notes for those with subtypes. When browsing subtypes, the parent won't have the (# more) note added. + if(length(subtypesof(path))) + if(path == subtype) + items_temp["[initial(path_as_obj.name)]: [path]"] = path + else + items_temp["[initial(path_as_obj.name)] (+[length(subtypesof(path))] more): [path]"] = path + else + items_temp["[initial(path_as_obj.name)]: [path]"] = path + + // Finally, once the listed is generated, ask the user what they want to spawn. + var/target_item = tgui_input_list(user, "Select Subtype", "RPED Manufacture", sort_list(items_temp)) + if(target_item) + // If they select something, and the name:path binding is valid, then either spawn it, OR, if it has subtypes, and isn't the parent type, recurse to let them pick a subtype. + if(items_temp[target_item]) + var/the_item = items_temp[target_item] + if(length(subtypesof(the_item)) && the_item != subtype) + pick_stock_part(user, TRUE, the_item) + else + for(var/i in 1 to 25) + atom_storage.attempt_insert(new the_item(src), user, TRUE) \ No newline at end of file diff --git a/modular_skyrat/modules/implants/code/augments_internal.dm b/modular_skyrat/modules/implants/code/augments_internal.dm index 350c515ca55..1523ee7cbc0 100644 --- a/modular_skyrat/modules/implants/code/augments_internal.dm +++ b/modular_skyrat/modules/implants/code/augments_internal.dm @@ -12,7 +12,7 @@ H.AdjustSleeping(-100, FALSE) to_chat(owner, span_notice("You feel a rush of energy course through your body!")) cooldown = TRUE - addtimer(CALLBACK(src, PROC_REF(sleepytimerend)), 50) + addtimer(CALLBACK(src, PROC_REF(sleepytimerend)), 5 SECONDS) else return diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm index e3bb79a1f1f..d441abeb738 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm @@ -224,12 +224,12 @@ /obj/effect/abstract/liquid_turf/proc/make_state_layer(state, has_top) PRIVATE_PROC(TRUE) - . = list(make_liquid_overlay("stage[state]_bottom", ABOVE_MOB_LAYER)) + . = list(make_liquid_overlay("stage[state]_bottom", ABOVE_MOB_LAYER, ABOVE_GAME_PLANE)) if(!has_top) return - . += make_liquid_overlay("stage[state]_top", GATEWAY_UNDERLAY_LAYER, GAME_PLANE) + . += make_liquid_overlay("stage[state]_top", BELOW_OBJ_LAYER, GAME_PLANE) /obj/effect/abstract/liquid_turf/proc/set_new_liquid_state(new_state) liquid_state = new_state diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm index baf41696517..3769ae03c11 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm @@ -568,6 +568,13 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea /datum/loadout_item/head/imperial_white name = "White Naval Officer Cap" item_path = /obj/item/clothing/head/hats/imperial/white +/datum/loadout_item/head/jester + name = "Jester hat" + item_path = /obj/item/clothing/head/costume/jester + +/datum/loadout_item/head/jesteralt + name = "Jester hat (Alt)" + item_path = /obj/item/clothing/head/costume/jesteralt /datum/loadout_item/head/azulea_oldblood name = "Oldblood's Royal cap" diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm index 116fd7a9b1a..b84a5ace076 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm @@ -38,8 +38,7 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite id_card.forceMove(wallet) if(equipper.back) - var/list/backpack_stuff = list() - equipper.back.atom_storage?.return_inv(backpack_stuff, FALSE) + var/list/backpack_stuff = equipper.back.atom_storage?.return_inv(FALSE) for(var/obj/item/thing in backpack_stuff) if(wallet.contents.len >= 3) break @@ -149,6 +148,10 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite name = "Personal AI Device" item_path = /obj/item/pai_card +/datum/loadout_item/pocket_items/link_scryer + name = "MODlink Scryer" + item_path = /obj/item/clothing/neck/link_scryer/loaded + /datum/loadout_item/pocket_items/cigarettes name = "Cigarette Pack" item_path = /obj/item/storage/fancy/cigarettes @@ -233,6 +236,14 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite name = "First-Aid Kit" item_path = /obj/item/storage/medkit/regular +/datum/loadout_item/pocket_items/deforest_cheesekit + name = "Civil Defense Medical Kit" + item_path = /obj/item/storage/medkit/civil_defense/stocked + +/datum/loadout_item/pocket_items/deforest_frontiermedkit + name = "Frontier Medical Kit" + item_path = /obj/item/storage/medkit/frontier/stocked + /datum/loadout_item/pocket_items/ingredients name = "Wildcard Ingredient Box" item_path = /obj/item/storage/box/ingredients/wildcard @@ -343,4 +354,4 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite /datum/loadout_item/pocket_items/donator/vape name = "E-Cigarette" - item_path = /obj/item/clothing/mask/vape + item_path = /obj/item/clothing/mask/vape \ No newline at end of file diff --git a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm index af76341e5f9..2bef400c267 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm @@ -409,6 +409,14 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Treasure Hunter" item_path = /obj/item/clothing/under/rank/civilian/curator/treasure_hunter +/datum/loadout_item/under/miscellaneous/jester + name = "Jester Suit" + item_path = /obj/item/clothing/under/rank/civilian/clown/jester + +/datum/loadout_item/under/miscellaneous/jesteralt + name = "Jeset Suit (Alt)" + item_path = /obj/item/clothing/under/rank/civilian/clown/jesteralt + /datum/loadout_item/under/miscellaneous/overalls name = "Overalls" item_path = /obj/item/clothing/under/misc/overalls @@ -748,7 +756,7 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/formal/red_gown name = "Red Evening Gown" - item_path = /obj/item/clothing/under/dress/redeveninggown + item_path = /obj/item/clothing/under/dress/eveninggown /datum/loadout_item/under/formal/sailor name = "Sailor Suit" diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm index 86f0598c5f6..2469deb875e 100644 --- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm +++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm @@ -93,10 +93,6 @@ continue item.on_equip_item(preference_source, src, visuals_only) - if(preference_source?.read_preference(/datum/preference/toggle/green_pin)) - var/obj/item/clothing/under/uniform = w_uniform - uniform?.attach_accessory(new /obj/item/clothing/accessory/green_pin(), src, FALSE) - regenerate_icons() return TRUE diff --git a/modular_skyrat/modules/mapping/code/areas/centcom.dm b/modular_skyrat/modules/mapping/code/areas/centcom.dm index 33d5d43e379..47b7d6686d0 100644 --- a/modular_skyrat/modules/mapping/code/areas/centcom.dm +++ b/modular_skyrat/modules/mapping/code/areas/centcom.dm @@ -10,13 +10,13 @@ /area/centcom/holding/cafe name = "Ghost Cafe" -/area/centcom/holding/cafevox +/area/centcom/holding/cafe/vox name = "Cafe Vox Box" -/area/centcom/holding/cafedorms +/area/centcom/holding/cafe/dorms name = "Ghost Cafe Dorms" -/area/centcom/holding/cafepark +/area/centcom/holding/cafe/park name = "Ghost Cafe Outdoors" /area/centcom/interlink diff --git a/modular_skyrat/modules/mapping/code/icemoon.dm b/modular_skyrat/modules/mapping/code/icemoon.dm index f8cf6d80178..4c03717976e 100644 --- a/modular_skyrat/modules/mapping/code/icemoon.dm +++ b/modular_skyrat/modules/mapping/code/icemoon.dm @@ -4,7 +4,7 @@ /*------*/ /datum/map_template/ruin/icemoon/underground/skyrat/syndicate_base - name = "Syndicate Ice Base" + name = "Ice-Ruin Syndicate Ice Base" id = "ice-base" description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents." suffix = "icemoon_underground_syndicate_base1_skyrat.dmm" @@ -13,7 +13,7 @@ always_place = TRUE /datum/map_template/ruin/icemoon/underground/skyrat/mining_site_below - name = "Mining Site Underground" + name = "Ice-Ruin Mining Site Underground" id = "miningsite-underground" description = "The Iceminer arena." suffix = "icemoon_underground_mining_site_skyrat.dmm" diff --git a/modular_skyrat/modules/mapping/code/lavaland.dm b/modular_skyrat/modules/mapping/code/lavaland.dm index 123dc2bcce1..890107b290e 100644 --- a/modular_skyrat/modules/mapping/code/lavaland.dm +++ b/modular_skyrat/modules/mapping/code/lavaland.dm @@ -6,7 +6,7 @@ /* Bubberstation Removal Start /datum/map_template/ruin/lavaland/skyrat/syndicate_base - name = "Syndicate Lava Base" + name = "Lava-Ruin Syndicate Lava Base" id = "lava-base" description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents." suffix = "lavaland_surface_syndicate_base1_skyrat.dmm" diff --git a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm index abc511941ef..5f6e6c8beb3 100644 --- a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm +++ b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm @@ -64,11 +64,15 @@ new /obj/item/storage/belt/security/full(src) new /obj/item/watertank/pepperspray(src) - new /obj/item/gun/energy/disabler(src) new /obj/item/storage/bag/garment/master_arms(src) new /obj/item/radio/headset/interdyne(src) new /obj/item/storage/toolbox/guncase/skyrat/c20r(src) +/obj/structure/closet/secure_closet/interdynefob/maa_locker/populate_contents_immediate() + . = ..() + + new /obj/item/gun/energy/disabler(src) + /obj/structure/closet/secure_closet/interdynefob/cl_locker icon_door = "hop" icon_state = "hop" diff --git a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm index bf81406992f..2e4f7b67ea2 100644 --- a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm +++ b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm @@ -33,10 +33,14 @@ ..() new /obj/item/storage/belt/security/full(src) - new /obj/item/gun/energy/e_gun(src) new /obj/item/storage/bag/garment/brig_officer(src) new /obj/item/radio/headset/interdyne(src) +/obj/structure/closet/secure_closet/interdynefob/brig_officer_locker/populate_contents_immediate() + . = ..() + + new /obj/item/gun/energy/e_gun(src) + /obj/structure/closet/secure_closet/interdynefob/armory_gear_locker anchored = 1 icon = 'modular_skyrat/master_files/icons/obj/closet.dmi' diff --git a/modular_skyrat/modules/mapping/code/machinery.dm b/modular_skyrat/modules/mapping/code/machinery.dm index 960dc2861d3..53500a29628 100644 --- a/modular_skyrat/modules/mapping/code/machinery.dm +++ b/modular_skyrat/modules/mapping/code/machinery.dm @@ -12,17 +12,20 @@ gpstag = SPACE_SIGNAL_GPSTAG //really the only non-aesthetic change, gives the space ruin GPS signal /obj/item/gps/computer/space/wrench_act(mob/living/user, obj/item/I) - ..() + . = ..() if(obj_flags & NO_DECONSTRUCTION) return TRUE - user.visible_message(span_warning("[user] disassembles [src]."), - span_notice("You start to disassemble [src]..."), span_hear("You hear clanking and banging noises.")) if(I.use_tool(src, user, 20, volume=50)) - new /obj/item/gps/spaceruin(loc) //really the only non-aesthetic change, gives the space ruin GPS signal - qdel(src) + user.visible_message(span_warning("[user] disassembles [src]."), + span_notice("You start to disassemble [src]..."), span_hear("You hear clanking and banging noises.")) + deconstruct(TRUE) return TRUE +/obj/item/gps/computer/space/atom_deconstruct(disassembled) + . = ..() + new /obj/item/gps/spaceruin(loc) //really the only non-aesthetic change, gives the space ruin GPS signal + /obj/item/gps/computer/attack_hand(mob/user, list/modifiers) . = ..() if(.) diff --git a/modular_skyrat/modules/mapping/code/pool.dm b/modular_skyrat/modules/mapping/code/pool.dm index 4d1a7095887..44ef0821fed 100644 --- a/modular_skyrat/modules/mapping/code/pool.dm +++ b/modular_skyrat/modules/mapping/code/pool.dm @@ -15,6 +15,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE /obj/effect/overlay/water/top icon_state = "top" diff --git a/modular_skyrat/modules/mapping/code/space.dm b/modular_skyrat/modules/mapping/code/space.dm index 0dd265538b1..7c8a8f752b7 100644 --- a/modular_skyrat/modules/mapping/code/space.dm +++ b/modular_skyrat/modules/mapping/code/space.dm @@ -4,7 +4,7 @@ /*------*/ /* //Disabled due to the existence of DS-2. /datum/map_template/ruin/space/skyrat/forgottenship - name = "CSBC-12" + name = "Space-Ruin CSBC-12" id = "forgottenship" description = "Cybersun would like to remind it's employees that any battle cruiser will be apropriately maintained, as will it's crew." suffix = "forgottenship_skyrat.dmm" @@ -12,7 +12,7 @@ */ /* /datum/map_template/ruin/space/skyrat/interdynefob - name = "DS-2" + name = "Space-Ruin DS-2" id = "interdynefob" description = "If DS-1 was so good..." suffix = "interdynefob.dmm" @@ -22,109 +22,109 @@ /datum/map_template/ruin/space/skyrat/derelictferry id = "derelictferry" suffix = "derelictferry.dmm" - name = "Derelict Ferry" + name = "Space-Ruin Derelict Ferry" description = "Clearly once a ferry fielded by Central Command to send their staff to nearby stations, this ship's seen better days." /datum/map_template/ruin/space/skyrat/posterpandamonium id = "posterpandamonium" suffix = "posterpandamonium.dmm" - name = "Abandoned Outpost" + name = "Space-Ruin Abandoned Outpost" description = "Whilst nicely furnished and filled with all sorts of posters, whoever once lived here seems long gone." /datum/map_template/ruin/space/skyrat/prisonshuttle id = "prisonshuttle" suffix = "prisonshuttle.dmm" - name = "Partisan Shuttle" + name = "Space-Ruin Partisan Shuttle" description = "You can faintly hear hardbass." /datum/map_template/ruin/space/skyrat/toystore id = "toystore" suffix = "toystore.dmm" - name = "Toy Store" + name = "Space-Ruin Toy Store" description = "A once state-of-the-art store, now left derelict after the company behind it went bankrupt. Maybe they shouldn't have picked such a remote location." /datum/map_template/ruin/space/skyrat/waypointstation id = "waypointstation" suffix = "waypointstation.dmm" - name = "Waypoint Station" + name = "Space-Ruin Waypoint Station" description = "Previously used as a refueling stop for larger ships, unintentional syndicate intervention has turned this station into a combat zone." /datum/map_template/ruin/space/skyrat/alientoollab id = "alientoollab" suffix = "alientoollab.dmm" - name = "Abductor Replication Facility" + name = "Space-Ruin Abductor Replication Facility" description = "A mad doctor's dreams were dashed when he finally disclosed to both his funders that each other existed, leaving behind his work for the looters." /datum/map_template/ruin/space/skyrat/codealpha id = "codealpha" suffix = "codealpha.dmm" - name = "Code Alpha Supplementary Station" + name = "Space-Ruin Code Alpha Supplementary Station" description = "The mess hall of a once bustling supplementary station, to be deployed alongside SS13." /datum/map_template/ruin/space/skyrat/smugglies //Excuse me sir, do you have money printers in here? id = "smugglies" suffix = "smugglies.dmm" - name = "Suspicious Cargo Installation" + name = "Space-Ruin Suspicious Cargo Installation" description = "*SCREECH* RDM RDM RDM" /datum/map_template/ruin/space/skyrat/clothing_facility id = "clothing_facility" suffix = "clothing_facility.dmm" - name = "Abandoned Clothing Facility" + name = "Space-Ruin Abandoned Clothing Facility" description = "A den of bad ideas. Secborgs were made here!" /datum/map_template/ruin/space/skyrat/luna id = "luna" suffix = "luna.dmm" - name = "Luna" + name = "Space-Ruin Luna" description = "Please note for ethical concerns all experimentation regarding writing artificial intelligence units to beleive they are A, A fictional character and B, human have been suspended. Have a pleasant shift." /datum/map_template/ruin/space/skyrat/blackmarket id = "blackmarket" suffix = "blackmarket.dmm" - name = "Shady Market" + name = "Space-Ruin Shady Market" description = "Whaddya buyin'?" /datum/map_template/ruin/space/skyrat/shuttle8532 id = "shuttle8532" suffix = "shuttle8532.dmm" - name = "Shuttle 8532" + name = "Space-Ruin Shuttle 8532" description = "While nobody can predict what space has to offer for the sailors that ride its waves, nobody is quite expecting a meteroid half the size of your shuttle to split it in half." /datum/map_template/ruin/space/skyrat/ghostship id = "ghostship" suffix = "ghostship.dmm" - name = "Ghost Ship" + name = "Space-Ruin Ghost Ship" description = "An ancient ship, seemingly pre-bluespace in design yet retrofitted with newer systems. Seemingly just up-and-abandoned in the middle of space..." /datum/map_template/ruin/space/skyrat/salvagepost id = "salvagepost" suffix = "salvagepost.dmm" - name = "Pre-Bluespace Salvage Post" + name = "Space-Ruin Pre-Bluespace Salvage Post" description = "An extremely old, long forgotten post used to salvage damaged or decommissioned ships before bluespace transportation. Surprising its stayed intact so long." /datum/map_template/ruin/space/skyrat/vaulttango id = "vaulttango" suffix = "vaulttango.dmm" - name = "ARBORLINK Vault Tango" + name = "Space-Ruin ARBORLINK Vault Tango" description = "Nanotrasen isn't the only corporation experimenting in advanced bluespace technology." /datum/map_template/ruin/space/skyrat/friendship id = "friendship" suffix = "wreckedfriendship.dmm" - name = "NTSS Friendship" + name = "Space-Ruin NTSS Friendship" description = "120 people.. one ship. It's unsurprising." /datum/map_template/ruin/space/skyrat/homestead id = "homestead" suffix = "wreckedhomestead.dmm" - name = "NTSS Homestead" + name = "Space-Ruin NTSS Homestead" description = "A wrecked ship." /datum/map_template/ruin/space/skyrat/medieval1 id = "medieval1" suffix = "medieval1.dmm" - name = "Medieval 1" + name = "Space-Ruin Medieval 1" description = "A forgotten peice of history left overrun with a reminder of what brought its destruction" /* Bubberstation Removal Start @@ -132,43 +132,43 @@ /datum/map_template/ruin/space/skyrat/cargodiselost id = "CargodiseLost" suffix = "cargodiselost.dmm" - name = "Cargodise Lost" + name = "Space-Ruin Cargodise Lost" description = "A small crew of freight-haulers are marooned in space after pirates knock out their engines. They must survive off of the cargo on board their ship and fend off the pirate boarders on their ship." Bubberstation Removal End*/ /datum/map_template/ruin/space/skyrat/infestedntship suffix = "scrapheap.dmm" - name = "NT Research Vessel" + name = "Space-Ruin NT Research Vessel" description = "A zombie-infested NT ship, seemingly dedicated to medical research." /datum/map_template/ruin/space/skyrat/piratefort suffix = "piratefort.dmm" - name = "Pirate Fort" + name = "Space-Ruin Pirate Fort" description = "A pirate hideout in deep space." /datum/map_template/ruin/space/skyrat/syndibase suffix = "syndibase.dmm" - name = "Syndicate Outpost" + name = "Space-Ruin Syndicate Outpost" description = "A Syndicate research outpost in deep space." /datum/map_template/ruin/space/skyrat/crash suffix = "crash.dmm" - name = "Crashed Boat" + name = "Space-Ruin Crashed Boat" description = "A small ferry crashed into an asteroid." /datum/map_template/ruin/space/skyrat/shuttlescrap suffix = "shuttlescrap.dmm" - name = "Broken Shuttle" + name = "Space-Ruin Broken Shuttle" description = "A small shuttle that clearly got clipped by something." /datum/map_template/ruin/space/skyrat/gorilla suffix = "gorilla.dmm" - name = "Gorilla" + name = "Space-Ruin Gorilla" description = "There is no need to be upset." /datum/map_template/ruin/space/skyrat/escapefromtarkon suffix = "port_tarkon.dmm" - name = "Port Tarkon" + name = "Space-Ruin Port Tarkon" id = "escapefromtarkon" description = "An ambitious goal, A step forward, A trial run for the Tarkon drill, ment to implant mining stations within meteors. Decades of disaster have, however, left this one... Unattended for far too long." always_place = TRUE diff --git a/modular_skyrat/modules/mapping/code/wardrobes.dm b/modular_skyrat/modules/mapping/code/wardrobes.dm index bfb7e2621d3..1102e44d44e 100644 --- a/modular_skyrat/modules/mapping/code/wardrobes.dm +++ b/modular_skyrat/modules/mapping/code/wardrobes.dm @@ -1,4 +1,4 @@ -/obj/machinery/vending/wardrobe/canLoadItem(obj/item/I,mob/user) +/obj/machinery/vending/wardrobe/canLoadItem(obj/item/I, mob/user, send_message = TRUE) return (I.type in products) /obj/machinery/vending/wardrobe/syndie_wardrobe diff --git a/modular_skyrat/modules/medical_designs/medical_designs.dm b/modular_skyrat/modules/medical_designs/medical_designs.dm index d0e0ecf934c..8d8b92d29e0 100644 --- a/modular_skyrat/modules/medical_designs/medical_designs.dm +++ b/modular_skyrat/modules/medical_designs/medical_designs.dm @@ -20,3 +20,22 @@ name = "Repair robotic limbs upgrade: Experimental" surgery = /datum/surgery/robot_healing/experimental id = "robotic_heal_surgery_upgrade_2" + +//Limb Grower +/datum/design/nitrogen_lungs + name = "Standard Nitrogen Lungs" + id = "nitrogenlunggeneric" + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + build_path = /obj/item/organ/internal/lungs/nitrogen + category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) + +/datum/design/vox_nitrogen_lungs + name = "Vox Nitrogen Lungs" + id = "nitrogenlungvox" + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + build_path = /obj/item/organ/internal/lungs/nitrogen/vox + category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) + + diff --git a/modular_skyrat/modules/microfusion/code/microfusion_cell.dm b/modular_skyrat/modules/microfusion/code/microfusion_cell.dm index b855d4e3041..09d403e3fa5 100644 --- a/modular_skyrat/modules/microfusion/code/microfusion_cell.dm +++ b/modular_skyrat/modules/microfusion/code/microfusion_cell.dm @@ -70,7 +70,7 @@ Essentially, power cells that malfunction if not used in an MCR, and should only if(prob(prob_percent) && !meltdown && !stabilised) process_instability() -/obj/item/stock_parts/cell/microfusion/use(amount) +/obj/item/stock_parts/cell/microfusion/use(amount, force = FALSE) if(!parent_gun) // If an MCR cell is used in anything that's not an MCR, you might have problems if(prob(fail_prob)) process_instability() @@ -179,7 +179,7 @@ Essentially, power cells that malfunction if not used in an MCR, and should only maxcharge = 600 max_attachments = 0 -/obj/item/stock_parts/cell/microfusion/makeshift/use(amount) +/obj/item/stock_parts/cell/microfusion/makeshift/use(amount, force = FALSE) if(prob(fail_prob)) process_instability() return ..() diff --git a/modular_skyrat/modules/modular_implants/code/nifs.dm b/modular_skyrat/modules/modular_implants/code/nifs.dm index a184b4e7ed9..300c41413cf 100644 --- a/modular_skyrat/modules/modular_implants/code/nifs.dm +++ b/modular_skyrat/modules/modular_implants/code/nifs.dm @@ -464,7 +464,7 @@ /datum/component/nif_examine/proc/add_examine(mob/nif_user, mob/looker, list/examine_texts) SIGNAL_HANDLER - examine_texts += span_purple("[nif_examine_text]") + examine_texts += span_purple("[EXAMINE_SECTION_BREAK][EXAMINE_HINT(nif_examine_text)]") ///Checks to see if a human with a NIF has the nifsoft_to_find type of NIFSoft installed? /mob/living/carbon/human/proc/find_nifsoft(datum/nifsoft/nifsoft_to_find) diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/hivemind.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/hivemind.dm index 2b8883710c5..f7cefddb166 100644 --- a/modular_skyrat/modules/modular_implants/code/nifsofts/hivemind.dm +++ b/modular_skyrat/modules/modular_implants/code/nifsofts/hivemind.dm @@ -257,7 +257,7 @@ GLOBAL_LIST_EMPTY(hivemind_users) name = "Hivemind Interface Device" desc = "A holographic gesture controller, hooked to hand and finger signals of the user's own choice. This is paired with the Hivemind program itself, used as a means of filtering out unwanted thoughts from being added to the network, ensuring that only intentional thoughts of communication can go through." icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-purple" + icon_state = "designator_mining" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' inhand_icon_state = "electronic" diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm index abb687709c5..67ce1529c19 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm @@ -118,4 +118,5 @@ parent_atom.log_message(message_to_log, LOG_GAME) new_soul.log_message(message_to_log, LOG_GAME) + set_overlay_for_mob(new_soul) return TRUE diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm index 7ac643b363d..ee44cf44996 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm @@ -31,7 +31,7 @@ return_to_body() qdel(src) -/mob/living/soulcatcher_soul/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced, filterproof, message_range, datum/saymode/saymode) +/mob/living/soulcatcher_soul/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced, filterproof, message_range, datum/saymode/saymode, message_mods = list()) message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) if(!message) return FALSE diff --git a/modular_skyrat/modules/modular_items/code/summon_beacon.dm b/modular_skyrat/modules/modular_items/code/summon_beacon.dm index aad43ff1a46..2a3441c95fb 100644 --- a/modular_skyrat/modules/modular_items/code/summon_beacon.dm +++ b/modular_skyrat/modules/modular_items/code/summon_beacon.dm @@ -2,8 +2,10 @@ name = "summoner beacon" desc = "Summons a thing. Probably shouldn't use this one, though." icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-blue" - inhand_icon_state = null + icon_state = "generic_delivery" + inhand_icon_state = "generic_delivery" + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL /// How many uses the beacon has left diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/cum.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/cum.dm index d531df13ac6..1aec43a53a4 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/cum.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/cum.dm @@ -35,9 +35,3 @@ icon_state ="shotglasscream" name = "glass of cum" desc = "O-oh, my...~" - -/datum/chemical_reaction/cum - results = list(/datum/reagent/consumable/cum = 5) - required_reagents = list(/datum/reagent/blood = 2, /datum/reagent/consumable/milk = 2, /datum/reagent/consumable/salt = 1) // Iiiinteresting... - mix_message = "The mixture turns into a gooey, musky white liquid..." - erp_reaction = TRUE diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm index 913ed0470cb..9d2fae9d311 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm @@ -117,7 +117,7 @@ if(mask_on == TRUE) var/mob/living/carbon/wearer = user if(wearer.wear_mask == src) - if(!do_after(wearer, 600, target = src)) + if(!do_after(wearer, 60 SECONDS, target = src)) to_chat(wearer, span_warning("You fail to remove the gas mask!")) return else @@ -138,7 +138,7 @@ if(iscarbon(usr)) if(mask_on == TRUE) if(src == target_carbon.wear_mask || . == target_carbon.wear_mask) - if(!do_after(target_carbon, 600, target = src)) + if(!do_after(target_carbon, 60 SECONDS, target = src)) to_chat(target_mob, span_warning("You fail to remove the gas mask!")) return else @@ -334,7 +334,7 @@ // Reagent consumption process handler /obj/item/reagent_containers/cup/lewd_filter/proc/reagent_consumption(mob/living/user, amount_per_transfer_from_this) SEND_SIGNAL(src, COMSIG_GLASS_DRANK, user, user) - addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), user, amount_per_transfer_from_this, TRUE, TRUE, FALSE, user, FALSE, INGEST), 5) + addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), user, amount_per_transfer_from_this, TRUE, TRUE, FALSE, user, FALSE, INGEST), 0.5 SECONDS) // I just wanted to add 2th color variation. Because. /obj/item/reagent_containers/cup/lewd_filter/AltClick(mob/user) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/latex_catsuit.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/latex_catsuit.dm index 39034a4a635..ddcbc4b7930 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/latex_catsuit.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/latex_catsuit.dm @@ -24,7 +24,7 @@ if(iscarbon(user)) var/mob/living/carbon/human/affected_human = user if(src == affected_human.w_uniform) - if(!do_after(affected_human, 60, target = src)) + if(!do_after(affected_human, 6 SECONDS, target = src)) return . = ..() diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm index 6bbe0f729fc..ea0e8845c93 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm @@ -49,7 +49,7 @@ if(shock_cooldown == TRUE) return shock_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, shock_cooldown, FALSE), 100) + addtimer(VARSET_CALLBACK(src, shock_cooldown, FALSE), 10 SECONDS) step(affected_mob, pick(GLOB.cardinals)) to_chat(affected_mob, span_danger("You feel a sharp shock from the collar!")) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/size_items.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/size_items.dm index d5a4b7d77ea..5ad1dd0e9ae 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/size_items.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/size_items.dm @@ -1,7 +1,7 @@ /// What areas are we allowed to use size items in? #define SIZE_WHITELISTED_AREAS list(\ /area/centcom/interlink/dorm_rooms,\ - /area/centcom/holding/cafedorms,\ + /area/centcom/holding/cafe/dorms,\ /area/misc/hilbertshotel,\ ) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm index 29a0e99da5f..5eb71d6d23e 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm @@ -9,7 +9,7 @@ ///Has the discount card been used on the vending machine? var/card_used = FALSE product_ads = "Try me!;Kinky!;Lewd and fun!;Hey you, yeah you... wanna take a look at my collection?;Come on, take a look!;Remember, always adhere to Nanotrasen corporate policy!;Don't forget to use protection!" - vend_reply = "Enjoy!;We're glad to satisfy your desires!" + vend_reply = "We're glad to satisfy your desires!" //STUFF SOLD HERE// product_categories = list( diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm index b04539f95ad..25dba7d3508 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm @@ -419,7 +419,7 @@ return TRUE // Machine deconstruction process handler -/obj/structure/chair/milking_machine/deconstruct(disassembled) +/obj/structure/chair/milking_machine/atom_deconstruct(disassembled) if(beaker) beaker.forceMove(drop_location()) adjust_item_drop_location(beaker) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm index 395c4b1230a..211ffcad582 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm @@ -154,14 +154,16 @@ speech_args[SPEECH_MESSAGE] = message /datum/brain_trauma/very_special/bimbo/on_gain() + . = ..() owner.add_mood_event("bimbo", /datum/mood_event/bimbo) if(!HAS_TRAIT_FROM(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM)) ADD_TRAIT(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM) - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech), override=TRUE) if(!HAS_TRAIT_FROM(owner, TRAIT_MASOCHISM, TRAIT_APHRO)) ADD_TRAIT(owner, TRAIT_MASOCHISM, TRAIT_APHRO) /datum/brain_trauma/very_special/bimbo/on_lose() + . = ..() owner.clear_mood_event("bimbo") if(HAS_TRAIT_FROM(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM)) REMOVE_TRAIT(owner, TRAIT_BIMBO, TRAIT_LEWDCHEM) @@ -218,10 +220,12 @@ resilience = TRAUMA_RESILIENCE_ABSOLUTE /datum/brain_trauma/very_special/neverboner/on_gain() + . = ..() var/mob/living/carbon/human/affected_human = owner ADD_TRAIT(affected_human, TRAIT_NEVERBONER, TRAIT_APHRO) /datum/brain_trauma/very_special/neverboner/on_lose() + . = ..() var/mob/living/carbon/human/affected_human = owner REMOVE_TRAIT(affected_human, TRAIT_NEVERBONER, TRAIT_APHRO) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/shibari_stand.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/shibari_stand.dm index 702d7293c62..968b6a34925 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/shibari_stand.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/shibari_stand.dm @@ -123,10 +123,7 @@ to_chat(user, span_warning("You cannot buckle yourself to this stand, there is no way that level of self-bondage exists!")) return FALSE -/obj/structure/chair/shibari_stand/deconstruct(disassembled) - if(obj_flags & NO_DECONSTRUCTION) - return - +/obj/structure/chair/shibari_stand/atom_deconstruct(disassembled) qdel(src) /obj/structure/chair/shibari_stand/proc/add_rope_overlays(color, taur) diff --git a/modular_skyrat/modules/modular_reagents/code/reagents/medicine.dm b/modular_skyrat/modules/modular_reagents/code/reagents/medicine.dm index a2be4893d9e..627ccd1897a 100644 --- a/modular_skyrat/modules/modular_reagents/code/reagents/medicine.dm +++ b/modular_skyrat/modules/modular_reagents/code/reagents/medicine.dm @@ -7,7 +7,7 @@ overdose_threshold = 20 ph = 6.09 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/opioids = 20) + metabolized_traits = list(TRAIT_ANALGESIA) inverse_chem_val = 0.55 inverse_chem = /datum/reagent/inverse/lidocaine diff --git a/modular_skyrat/modules/modular_vending/code/autodrobe.dm b/modular_skyrat/modules/modular_vending/code/autodrobe.dm index 7511a7c3913..8a197376763 100644 --- a/modular_skyrat/modules/modular_vending/code/autodrobe.dm +++ b/modular_skyrat/modules/modular_vending/code/autodrobe.dm @@ -17,8 +17,8 @@ "products" = list( /obj/item/clothing/mask/gas/clownbald = 1, /obj/item/clothing/mask/gas/clown_colourable = 1, - /obj/item/clothing/head/costume/jester/alt = 1, - /obj/item/clothing/under/rank/civilian/clown/jester/alt = 1, + /obj/item/clothing/head/costume/jesteralt = 1, + /obj/item/clothing/under/rank/civilian/clown/jesteralt = 1, ), ), list( diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm index 22070f7b9ca..dc9ba57bda4 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm @@ -22,7 +22,7 @@ w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_HEAVY - slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_OCLOTHING + slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_SUITSTORE accepted_magazine_type = /obj/item/ammo_box/magazine/c980_grenade diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm index f40fe03d45b..f57668114e6 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm @@ -22,7 +22,7 @@ w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_HEAVY - slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_OCLOTHING + slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_SUITSTORE accepted_magazine_type = /obj/item/ammo_box/magazine/c40sol_rifle spawn_magazine_type = /obj/item/ammo_box/magazine/c40sol_rifle/standard diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm index 2ba9ecb5fcb..a9917e8e159 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm @@ -27,7 +27,7 @@ suppressor_x_offset = 9 w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_OCLOTHING + slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_SUITSTORE /obj/item/gun/ballistic/shotgun/riot/sol/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_CARWO) diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm index 4446ea84ef3..2f708723437 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm @@ -17,7 +17,7 @@ w_class = WEIGHT_CLASS_NORMAL weapon_weight = WEAPON_MEDIUM - slot_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_BELT + slot_flags = ITEM_SLOT_SUITSTORE | ITEM_SLOT_BELT accepted_magazine_type = /obj/item/ammo_box/magazine/c35sol_pistol spawn_magazine_type = /obj/item/ammo_box/magazine/c35sol_pistol/stendo diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm index 2e906f2cbe3..52fc0d56006 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm @@ -23,7 +23,7 @@ w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_HEAVY - slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_OCLOTHING + slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_SUITSTORE accepted_magazine_type = /obj/item/ammo_box/magazine/lanca @@ -112,6 +112,7 @@ /obj/item/gun/ballistic/automatic/wylom/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SZOT) + AddElement(/datum/element/gun_launches_little_guys, throwing_force = 3, throwing_range = 5) /obj/item/gun/ballistic/automatic/wylom/examine(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm index 8c0645a7045..2bfc722b168 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm @@ -20,7 +20,7 @@ w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_MEDIUM - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_OCLOTHING + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_SUITSTORE accepted_magazine_type = /obj/item/ammo_box/magazine/miecz diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/gunsets.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/gunsets.dm index 8c96bc5a563..8343254013d 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/gunsets.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/gunsets.dm @@ -25,6 +25,12 @@ weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/sol/no_mag extra_to_spawn = /obj/item/ammo_box/magazine/c35sol_pistol +/obj/item/storage/toolbox/guncase/skyrat/pistol/trappiste_small_case/eland + name = "Trappiste 'Eland' gunset" + + weapon_to_spawn = /obj/item/gun/ballistic/revolver/sol + extra_to_spawn = /obj/item/ammo_box/c35sol/incapacitator + // Gunset for the Skild heavy pistol /obj/item/storage/toolbox/guncase/skyrat/pistol/trappiste_small_case/skild diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm index 29e5dbac767..a0dce177792 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm @@ -18,7 +18,7 @@ w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_HEAVY - slot_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_BELT + slot_flags = ITEM_SLOT_SUITSTORE | ITEM_SLOT_BELT accepted_magazine_type = /obj/item/ammo_box/magazine/c585trappiste_pistol diff --git a/modular_skyrat/modules/modular_weapons/code/gun_launches_little_guys_element.dm b/modular_skyrat/modules/modular_weapons/code/gun_launches_little_guys_element.dm new file mode 100644 index 00000000000..e337b2c57db --- /dev/null +++ b/modular_skyrat/modules/modular_weapons/code/gun_launches_little_guys_element.dm @@ -0,0 +1,46 @@ +/// An element that makes guns throw their user back if they are just a little guy +/datum/element/gun_launches_little_guys + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + + /// The throwing force applied to the gun's user + var/throwing_force + /// The throwing range applied to the gun's user + var/throwing_range + +/datum/element/gun_launches_little_guys/Attach(datum/target, throwing_force = 2, throwing_range = 3) + . = ..() + if(!isgun(target)) + return ELEMENT_INCOMPATIBLE + + src.throwing_force = throwing_force + src.throwing_range = throwing_range + + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + RegisterSignal(target, COMSIG_GUN_FIRED, PROC_REF(throw_it_back)) + +/datum/element/gun_launches_little_guys/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_ATOM_EXAMINE) + UnregisterSignal(target, COMSIG_GUN_FIRED) + +/// Warns that this gun might throw you away really hard +/datum/element/gun_launches_little_guys/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_notice("It has some serious kick to it, smaller users should take caution while firing.") + +/// Checks if the shooter is just a little guy. If so? Throw it back. +/datum/element/gun_launches_little_guys/proc/throw_it_back(obj/item/gun/weapon, mob/living/carbon/user, atom/target, params, zone_override) + SIGNAL_HANDLER + + if(!isteshari(user) && !isdwarf(user) && !HAS_TRAIT(user, TRAIT_DWARF) && !(user.dna.features["body_size"] <= 0.9)) + return + + var/fling_direction = REVERSE_DIR(user.dir) + var/atom/throw_target = get_edge_target_turf(user, fling_direction) + user.Knockdown(1 SECONDS) + user.throw_at(throw_target, throwing_range, throwing_force) + + user.visible_message(span_warning("[weapon] sends [user] flying back as it fires!"), \ + span_warning("[weapon] sends you flying back as it fires!")) diff --git a/modular_skyrat/modules/moretraitoritems/code/weapons.dm b/modular_skyrat/modules/moretraitoritems/code/weapons.dm index fdcabbf5776..1a29d0242d6 100644 --- a/modular_skyrat/modules/moretraitoritems/code/weapons.dm +++ b/modular_skyrat/modules/moretraitoritems/code/weapons.dm @@ -65,7 +65,7 @@ ///obj/item/clothing/head/hats/sus_bowler/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) //var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) //if(thrownby && !caught) - //addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, throw_at), thrownby, throw_range+2, throw_speed, null, TRUE), 1) + //addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, throw_at), thrownby, throw_range+2, throw_speed, null, TRUE), 0.1 SECONDS) //else //return ..() diff --git a/modular_skyrat/modules/mounted_machine_gun/code/mounted_machine_gun.dm b/modular_skyrat/modules/mounted_machine_gun/code/mounted_machine_gun.dm index a2d01ca064b..d631246666c 100644 --- a/modular_skyrat/modules/mounted_machine_gun/code/mounted_machine_gun.dm +++ b/modular_skyrat/modules/mounted_machine_gun/code/mounted_machine_gun.dm @@ -15,6 +15,7 @@ buckle_lying = 0 SET_BASE_PIXEL(-8, -8) layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE /// The extra range that this turret gives regarding viewrange. var/view_range = 2.5 /// Sound to play when overheated @@ -163,6 +164,7 @@ register_user(user_to_buckle) layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE setDir(SOUTH) playsound(src,'sound/mecha/mechmove01.ogg', 50, TRUE) set_anchored(TRUE) @@ -421,6 +423,7 @@ user.pixel_y = -8 if(EAST) layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE user.pixel_x = -22 user.pixel_y = 0 if(SOUTHEAST) @@ -430,6 +433,7 @@ user.pixel_y = 14 if(SOUTH) layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE user.pixel_x = 0 user.pixel_y = 22 if(SOUTHWEST) @@ -439,6 +443,7 @@ user.pixel_y = 14 if(WEST) layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE user.pixel_x = 22 user.pixel_y = 0 if(NORTHWEST) diff --git a/modular_skyrat/modules/multicellcharger/code/multi_cell_charger.dm b/modular_skyrat/modules/multicellcharger/code/multi_cell_charger.dm index 9313c0bf82f..7cfea4e822d 100644 --- a/modular_skyrat/modules/multicellcharger/code/multi_cell_charger.dm +++ b/modular_skyrat/modules/multicellcharger/code/multi_cell_charger.dm @@ -10,11 +10,12 @@ power_channel = AREA_USAGE_EQUIP circuit = /obj/item/circuitboard/machine/cell_charger_multi pass_flags = PASSTABLE - var/list/charging_batteries = list() //The list of batteries we are gonna charge! + /// The list of batteries we are gonna charge! + var/list/charging_batteries = list() + /// Number of concurrent batteries that can be charged var/max_batteries = 4 - var/charge_rate = 250 - var/charge_rate_base = 250 // Amount of charge we gain from a level one capacitor - var/charge_rate_max = 4000 // The highest we allow the charge rate to go + /// The base charge rate when spawned + var/charge_rate = 375 KILO WATTS /obj/machinery/cell_charger_multi/update_overlays() . = ..() @@ -49,7 +50,7 @@ for(var/obj/item/stock_parts/cell/charging in charging_batteries) . += "There's [charging] cell in the charger, current charge: [round(charging.percent(), 1)]%." if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Charging power: [charge_rate]W.") + . += span_notice("The status display reads: Charging power: [display_power(charge_rate, convert = FALSE)].") . += span_notice("Right click it to remove all the cells at once!") /obj/machinery/cell_charger_multi/attackby(obj/item/tool, mob/user, params) @@ -93,15 +94,27 @@ if(!charging_batteries.len || !anchored || (machine_stat & (BROKEN|NOPOWER))) return - for(var/obj/item/stock_parts/cell/charging in charging_batteries) - if(charging.percent() >= 100) + // create a charging queue, we only want cells that require charging to use the power budget + var/list/charging_queue = list() + for(var/obj/item/stock_parts/cell/battery_slot in charging_batteries) + if(battery_slot.percent() >= 100) continue - var/main_draw = use_power_from_net(charge_rate * seconds_per_tick, take_any = TRUE) //Pulls directly from the Powernet to dump into the cell - if(!main_draw) - return - charging.give(main_draw) - use_power(charge_rate / 100) //use a small bit for the charger itself, but power usage scales up with the part tier + LAZYADD(charging_queue, battery_slot) + if(!length(charging_queue)) + return + + // since this loop is running multiple times per tick, we divide so that the total usage in the tick is the expected charge rate + // 4 batteries can no longer magically each pull 4MW per tick (16MW total per tick) out of thin air like in the old system + var/charge_current = (charge_rate / length(charging_queue)) * seconds_per_tick + if(!charge_current) + return + + for(var/obj/item/stock_parts/cell/charging_cell in charging_queue) + use_energy(charge_current * 0.01) //use a small bit for the charger itself, but power usage scales up with the part tier + charge_cell(charge_current, charging_cell, grid_only = TRUE) + + LAZYNULL(charging_queue) update_appearance() /obj/machinery/cell_charger_multi/attack_tk(mob/user) @@ -115,14 +128,9 @@ /obj/machinery/cell_charger_multi/RefreshParts() . = ..() charge_rate = 0 // No, you cant get free charging speed! + var/charge_rate_base = 250 KILO WATTS for(var/datum/stock_part/capacitor/capacitor in component_parts) - charge_rate += charge_rate_base * capacitor.tier - if(charge_rate >= charge_rate_max) // We've hit the charge speed cap, stop iterating. - charge_rate = charge_rate_max - break - - if(charge_rate < charge_rate_base) // This should never happen; but we need to pretend it can. - charge_rate = charge_rate_base + charge_rate += (charge_rate_base * capacitor.tier) / 4 /obj/machinery/cell_charger_multi/emp_act(severity) . = ..() @@ -137,6 +145,8 @@ for(var/obj/item/stock_parts/cell/charging in charging_batteries) charging.forceMove(drop_location()) charging_batteries = null + return ..() + /obj/machinery/cell_charger_multi/attack_ai(mob/user) return @@ -163,7 +173,7 @@ if(charging_batteries.len > 1 && user) var/list/buttons = list() for(var/obj/item/stock_parts/cell/battery in charging_batteries) - buttons["[battery] [battery.percent()]%"] = battery + buttons["[battery.name] ([round(battery.percent(), 1)]%)"] = battery var/cell_name = tgui_input_list(user, "Please choose what cell you'd like to remove.", "Remove a cell", buttons) charging = buttons[cell_name] else @@ -186,7 +196,7 @@ name = "Multi-Cell Charger (Machine Board)" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/cell_charger_multi - req_components = list(/datum/stock_part/capacitor = 4) + req_components = list(/datum/stock_part/capacitor = 6) needs_anchored = FALSE diff --git a/modular_skyrat/modules/mutants/code/mutant_component.dm b/modular_skyrat/modules/mutants/code/mutant_component.dm index f8882646df5..d1a71caf9cf 100644 --- a/modular_skyrat/modules/mutants/code/mutant_component.dm +++ b/modular_skyrat/modules/mutants/code/mutant_component.dm @@ -108,7 +108,7 @@ if(host.stat != DEAD) return if(!ismutant(host)) - to_chat(host, span_cultlarge("You can feel your heart stopping, but something isn't right... \ + to_chat(host, span_cult_large("You can feel your heart stopping, but something isn't right... \ life has not abandoned your broken form. You can only feel a deep and immutable hunger that \ not even death can stop, you will rise again!")) var/revive_time = rand(REVIVE_TIME_LOWER, REVIVE_TIME_UPPER) @@ -151,16 +151,15 @@ /datum/component/mutant_infection/proc/mutant_death() SIGNAL_HANDLER var/revive_time = rand(REVIVE_TIME_LOWER, REVIVE_TIME_UPPER) - to_chat(host, span_cultlarge("You can feel your heart stopping, but something isn't right... you will rise again!")) + to_chat(host, span_cult_large("You can feel your heart stopping, but something isn't right... you will rise again!")) timer_id = addtimer(CALLBACK(src, PROC_REF(regenerate)), revive_time, TIMER_STOPPABLE) /datum/component/mutant_infection/proc/regenerate() if(!host.mind) - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a mutant([host.name])?", target_mob = host) - if(!candidates.len) + var/mob/canidate = SSpolling.poll_ghosts_for_target("Do you want to play as a mutant([host.name])?", checked_target = host) + if(!istype(canidate)) return - var/client/C = pick_n_take(candidates) - host.key = C.key + host.key = canidate.key else host.grab_ghost() to_chat(host, span_notice("You feel an itching, both inside and \ diff --git a/modular_skyrat/modules/mutants/code/mutant_cure.dm b/modular_skyrat/modules/mutants/code/mutant_cure.dm index ee10bb45f89..5bdff67d152 100644 --- a/modular_skyrat/modules/mutants/code/mutant_cure.dm +++ b/modular_skyrat/modules/mutants/code/mutant_cure.dm @@ -244,7 +244,7 @@ else status = STATUS_RECOMBINATING_CURE recombinate_start() - use_power(3000) + use_energy(3000 JOULES) updateUsrDialog() @@ -270,7 +270,7 @@ ejectItem() playsound(loc, 'sound/items/rped.ogg', 60, 1) flick("h_lathe_wloop", src) - use_power(3000) + use_energy(3000 JOULES) timer_id = addtimer(CALLBACK(src, PROC_REF(recombinate_step)), recombination_step_time, TIMER_STOPPABLE) /obj/machinery/rnd/rna_recombinator/proc/recombinate_step() @@ -286,7 +286,7 @@ recombinate_finish() return flick("h_lathe_wloop", src) - use_power(3000) + use_energy(3000 JOULES) playsound(loc, 'sound/items/rped.ogg', 60, 1) timer_id = addtimer(CALLBACK(src, PROC_REF(recombinate_step)), recombination_step_time, TIMER_STOPPABLE) @@ -306,7 +306,7 @@ else new /obj/item/reagent_containers/cup/bottle/hnz/one(get_turf(src)) flick("h_lathe_leave", src) - use_power(3000) + use_energy(3000 JOULES) playsound(loc, 'sound/machines/ding.ogg', 60, 1) status = STATUS_IDLE diff --git a/modular_skyrat/modules/novaya_ert/code/advanced_choice_beacon.dm b/modular_skyrat/modules/novaya_ert/code/advanced_choice_beacon.dm index 827c0b790bf..7f96fd7c272 100644 --- a/modular_skyrat/modules/novaya_ert/code/advanced_choice_beacon.dm +++ b/modular_skyrat/modules/novaya_ert/code/advanced_choice_beacon.dm @@ -2,8 +2,11 @@ name = "advanced choice beacon" desc = "A beacon that will send whatever your heart desires, providing Nanotrasen approves it." icon = 'icons/obj/devices/remote.dmi' - icon_state = "gangtool-red" - inhand_icon_state = null + icon_state = "designator_syndicate" + inhand_icon_state = "nukietalkie" + + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' var/list/possible_choices = list() diff --git a/modular_skyrat/modules/novaya_ert/code/mod_suit.dm b/modular_skyrat/modules/novaya_ert/code/mod_suit.dm index 3494429f13d..ef4d5a2b6e9 100644 --- a/modular_skyrat/modules/novaya_ert/code/mod_suit.dm +++ b/modular_skyrat/modules/novaya_ert/code/mod_suit.dm @@ -193,7 +193,7 @@ incompatible_modules = list(/obj/item/mod/module/adrenaline_boost, /obj/item/mod/module/auto_doc) cooldown_time = null complexity = 4 - use_power_cost = DEFAULT_CHARGE_DRAIN * 20 + use_energy_cost = DEFAULT_CHARGE_DRAIN * 20 /// What reagent we need to refill? var/reagent_required = /datum/reagent/cryptobiolin /// How much of a reagent we need to refill a single boost. @@ -219,14 +219,14 @@ if(!.) return RegisterSignal(mod.wearer, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_use)) - drain_power(use_power_cost) + drain_power(use_energy_cost) /// Heals damage (in fact, injects chems) based on the damage received and certain other variables (a single one), i.e. having more than X amount of health, not having enough needed chemicals or so on. /obj/item/mod/module/auto_doc/on_use() if(!COOLDOWN_FINISHED(src, heal_timer)) return FALSE - if(!check_power(use_power_cost)) + if(!check_power(use_energy_cost)) balloon_alert(mod.wearer, "not enough charge!") SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED) return FALSE @@ -274,7 +274,7 @@ mod.wearer.reagents.add_reagent(/datum/reagent/medicine/coagulant, 5) reagents.remove_reagent(reagent_required, reagent_required_amount) - drain_power(use_power_cost*10) + drain_power(use_energy_cost*10) ///Debuff so it's "balanced", as well as a cooldown. addtimer(CALLBACK(src, PROC_REF(boost_aftereffects), mod.wearer), 45 SECONDS) diff --git a/modular_skyrat/modules/organs/code/ears.dm b/modular_skyrat/modules/organs/code/ears.dm new file mode 100644 index 00000000000..462d3153c09 --- /dev/null +++ b/modular_skyrat/modules/organs/code/ears.dm @@ -0,0 +1,72 @@ +/obj/item/organ/internal/ears/teshari + name = "teshari ears" + desc = "A set of four long rabbit-like ears, a Teshari's main tool while hunting. Naturally extremely sensitive to loud sounds." + damage_multiplier = 1.5 + actions_types = list(/datum/action/cooldown/spell/teshari_hearing) + +/obj/item/organ/internal/ears/teshari/on_mob_remove(mob/living/carbon/ear_owner) + . = ..() + REMOVE_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + +/datum/action/cooldown/spell/teshari_hearing + name = "Toggle Sensitive Hearing" + desc = "Perk up your ears to listen for quiet sounds, useful for picking up whispering." + button_icon = 'modular_skyrat/master_files/icons/hud/actions.dmi' + button_icon_state = "echolocation_off" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + + cooldown_time = 1 SECONDS + spell_requirements = NONE + +/datum/action/cooldown/spell/teshari_hearing/proc/update_button_state(new_state) //This makes it so that the button icon changes dynamically based on ears being up or not. + button_icon_state = new_state + owner.update_action_buttons() + +/datum/action/cooldown/spell/teshari_hearing/Remove(mob/living/remove_from) + REMOVE_TRAIT(remove_from, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + remove_from.update_sight() + return ..() + +/datum/action/cooldown/spell/teshari_hearing/cast(list/targets, mob/living/carbon/human/user = usr) + . = ..() + + if(HAS_TRAIT(user, TRAIT_GOOD_HEARING)) + teshari_hearing_deactivate(user) + return + + user.apply_status_effect(/datum/status_effect/teshari_hearing) + user.visible_message(span_notice("[user], pricks up [user.p_their()] four ears, each twitching intently!"), span_notice("You perk up all four of your ears, hunting for even the quietest sounds.")) + update_button_state("echolocation_on") + + var/obj/item/organ/internal/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS) + if(ears) + ears.damage_multiplier = 3 + +/datum/action/cooldown/spell/teshari_hearing/proc/teshari_hearing_deactivate(mob/living/carbon/human/user) //Called when you activate it again after casting the ability-- turning them off, so to say. + if(!HAS_TRAIT_FROM(user, TRAIT_GOOD_HEARING, ORGAN_TRAIT)) + return + + user.remove_status_effect(/datum/status_effect/teshari_hearing) + user.visible_message(span_notice("[user] drops [user.p_their()] ears down a bit, no longer listening as closely."), span_notice("You drop your ears down, no longer paying close attention.")) + update_button_state("echolocation_off") + + var/obj/item/organ/internal/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS) + if(ears) + ears.damage_multiplier = 1.5 + +/datum/status_effect/teshari_hearing + id = "teshari_hearing" + alert_type = null + status_type = STATUS_EFFECT_UNIQUE + +/datum/status_effect/teshari_hearing/on_apply() + ADD_TRAIT(owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + return ..() + +/datum/status_effect/teshari_hearing/on_remove() + REMOVE_TRAIT(owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + return ..() + +/datum/status_effect/teshari_hearing/get_examine_text() + return span_notice("[owner.p_They()] [owner.p_have()] [owner.p_their()] ears perked up, listening closely to whisper-quiet sounds.") diff --git a/modular_skyrat/modules/pollution/code/air_refresher.dm b/modular_skyrat/modules/pollution/code/air_refresher.dm index e9478db2ec9..2a9466cf812 100644 --- a/modular_skyrat/modules/pollution/code/air_refresher.dm +++ b/modular_skyrat/modules/pollution/code/air_refresher.dm @@ -62,4 +62,4 @@ var/turf/open/open_turf = get_turf(src) if(open_turf.pollution) open_turf.pollution.scrub_amount(scrub_amount) - use_power(100) + use_energy(100 JOULES) diff --git a/modular_skyrat/modules/power/code/powerator.dm b/modular_skyrat/modules/power/code/powerator.dm index 7cc48de9441..eaf62c9e674 100644 --- a/modular_skyrat/modules/power/code/powerator.dm +++ b/modular_skyrat/modules/power/code/powerator.dm @@ -54,9 +54,9 @@ idle_power_usage = 100 /// the current amount of power that we are trying to process - var/current_power = 10000 - /// the max amount of power that can be sent per process, from 100000 (t1) to 10000000 (t4) - var/max_power = 100000 + var/current_power = 10 KILO WATTS + /// the max amount of power that can be sent per process, from 100 KW (t1) to 10000 KW (t4) + var/max_power = 100 KILO WATTS /// how much the current_power is divided by to determine the profit var/divide_ratio = 0.00001 /// the attached cable to the machine @@ -108,10 +108,10 @@ . = ..() var/efficiency = -2 //set to -2 so that tier 1 parts do nothing - max_power = 100000 + max_power = 100 KILO WATTS for(var/datum/stock_part/micro_laser/laser_part in component_parts) efficiency += laser_part.tier - max_power += (efficiency * 1650000) + max_power += (efficiency * 1650 KILO WATTS) efficiency = -2 divide_ratio = 0.00001 @@ -174,9 +174,9 @@ /obj/machinery/powerator/attack_hand(mob/living/user, list/modifiers) . = ..() - current_power = tgui_input_number(user, "How much power would you like to draw? Max: [display_power(max_power)]", "Power Draw", current_power, max_power, 0) + current_power = tgui_input_number(user, "How much power (in Watts) would you like to draw? Max: [display_power(max_power)]", "Power Draw", current_power, max_power, 0) if(isnull(current_power)) - current_power = 10000 + current_power = 10 KILO WATTS return /obj/machinery/powerator/screwdriver_act(mob/living/user, obj/item/tool) diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm b/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm index 6b90c469c1a..aa96e10b062 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm @@ -1,53 +1,33 @@ /obj/item/reagent_containers/cup/soup_pot/material icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/cookware.dmi' - custom_materials = null // We're going to apply custom materials when this baby is actually made material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS // A few random preset types as well /obj/item/reagent_containers/cup/soup_pot/material/fake_copper - -/obj/item/reagent_containers/cup/soup_pot/material/fake_copper/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/copporcitite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/copporcitite=SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/cup/soup_pot/material/fake_brass - -/obj/item/reagent_containers/cup/soup_pot/material/fake_brass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/brussite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/brussite=SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/cup/soup_pot/material/fake_tin - -/obj/item/reagent_containers/cup/soup_pot/material/fake_tin/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/tinumium) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/tinumium=SHEET_MATERIAL_AMOUNT) // Oven Trays /obj/item/plate/oven_tray/material desc = "Time to bake hardtack!" icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/cookware.dmi' - custom_materials = null // We're going to apply custom materials when this baby is actually made material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS fragile = FALSE // A few random preset types as well /obj/item/plate/oven_tray/material/fake_copper - -/obj/item/plate/oven_tray/material/fake_copper/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/copporcitite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/copporcitite=SHEET_MATERIAL_AMOUNT) /obj/item/plate/oven_tray/material/fake_brass - -/obj/item/plate/oven_tray/material/fake_brass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/brussite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/brussite=SHEET_MATERIAL_AMOUNT) /obj/item/plate/oven_tray/material/fake_tin - -/obj/item/plate/oven_tray/material/fake_tin/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/tinumium) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/tinumium=SHEET_MATERIAL_AMOUNT) diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm b/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm index 9a028936f1e..57b5d23e385 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm @@ -44,7 +44,7 @@ drop_everything_contained() return ..() -/obj/structure/millstone/deconstruct(disassembled) +/obj/structure/millstone/atom_deconstruct(disassembled) var/obj/item/stack/sheet/mineral/stone = new (drop_location()) stone.amount = 6 stone.update_appearance(UPDATE_ICON) diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/plant_bag.dm b/modular_skyrat/modules/primitive_cooking_additions/code/plant_bag.dm new file mode 100644 index 00000000000..d30273c4a5a --- /dev/null +++ b/modular_skyrat/modules/primitive_cooking_additions/code/plant_bag.dm @@ -0,0 +1,63 @@ +#define RESKIN_LINEN "Linen" + +/obj/item/storage/bag/plants + uses_advanced_reskins = TRUE + unique_reskin = list( + "Original" = list( + RESKIN_ICON = 'icons/obj/service/hydroponics/equipment.dmi', + RESKIN_ICON_STATE = "plantbag", + RESKIN_WORN_ICON = 'icons/mob/clothing/belt.dmi', + RESKIN_WORN_ICON_STATE = "plantbag", + ), + RESKIN_LINEN = list( + RESKIN_ICON = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi', + RESKIN_ICON_STATE = "plantbag_primitive", + RESKIN_WORN_ICON = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi', + RESKIN_WORN_ICON_STATE = "plantbag_primitive", + ), + ) + +// This is so the linen reskin shows properly in the suit storage. +/obj/item/storage/bag/plants/build_worn_icon(default_layer, default_icon_file, isinhands, female_uniform, override_state, override_file, use_height_offset, mutant_styles) + if(default_layer == SUIT_STORE_LAYER && current_skin == RESKIN_LINEN) + override_file = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn_mirror.dmi' + + return ..() + +/// Simple helper to reskin this item into its primitive variant. +/obj/item/storage/bag/plants/proc/make_primitive() + current_skin = RESKIN_LINEN + + icon = unique_reskin[current_skin][RESKIN_ICON] + icon_state = unique_reskin[current_skin][RESKIN_ICON_STATE] + worn_icon = unique_reskin[current_skin][RESKIN_WORN_ICON] + worn_icon_state = unique_reskin[current_skin][RESKIN_WORN_ICON_STATE] + + update_appearance() + +/// A helper for the primitive variant, for mappers. +/obj/item/storage/bag/plants/primitive + current_skin = RESKIN_LINEN // Just so it displays properly when in suit storage + uses_advanced_reskins = FALSE + unique_reskin = null + icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi' + icon_state = "plantbag_primitive" + worn_icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi' + worn_icon_state = "plantbag_primitive" + +/obj/item/stack/sheet/cloth/on_item_crafted(mob/builder, atom/created) + if(!istype(created, /obj/item/storage/bag/plants)) + return + + if(!isprimitivedemihuman(builder) && !isashwalker(builder)) + return + + var/obj/item/storage/bag/plants/bag = created + + bag.make_primitive() + +/obj/item/storage/bag/plants/portaseeder + uses_advanced_reskins = FALSE + unique_reskin = null + +#undef RESKIN_LINEN diff --git a/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi b/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi new file mode 100644 index 00000000000..aa949961a41 Binary files /dev/null and b/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi differ diff --git a/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi b/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi new file mode 100644 index 00000000000..5dc6e5fae29 Binary files /dev/null and b/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi differ diff --git a/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn_mirror.dmi b/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn_mirror.dmi new file mode 100644 index 00000000000..5e3b03c8fe3 Binary files /dev/null and b/modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn_mirror.dmi differ diff --git a/modular_skyrat/modules/primitive_production/code/glassblowing.dm b/modular_skyrat/modules/primitive_production/code/glassblowing.dm index 8dcc4f3cd3a..ed7b4a31ff8 100644 --- a/modular_skyrat/modules/primitive_production/code/glassblowing.dm +++ b/modular_skyrat/modules/primitive_production/code/glassblowing.dm @@ -41,37 +41,24 @@ desc = "A glass bowl that is capable of carrying things." icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' icon_state = "glass_bowl" - custom_materials = null + custom_materials = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT) material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR -/obj/item/reagent_containers/cup/bowl/blowing_glass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/glass) = SHEET_MATERIAL_AMOUNT)) - /obj/item/reagent_containers/cup/beaker/large/blowing_glass name = "glass cup" desc = "A glass cup that is capable of carrying liquids." icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' icon_state = "glass_cup" - custom_materials = null material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR -/obj/item/reagent_containers/cup/beaker/large/blowing_glass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/glass) = SHEET_MATERIAL_AMOUNT)) - /obj/item/plate/blowing_glass name = "glass plate" desc = "A glass plate that is capable of carrying things." icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' icon_state = "glass_plate" - custom_materials = null + custom_materials = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT) material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR -/obj/item/plate/blowing_glass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/glass) = SHEET_MATERIAL_AMOUNT)) - /obj/item/glassblowing/molten_glass name = "molten glass" desc = "A glob of molten glass, ready to be shaped into art." diff --git a/modular_skyrat/modules/primitive_structures/code/storage_structures.dm b/modular_skyrat/modules/primitive_structures/code/storage_structures.dm index 0a3aaa0db60..58c08df7941 100644 --- a/modular_skyrat/modules/primitive_structures/code/storage_structures.dm +++ b/modular_skyrat/modules/primitive_structures/code/storage_structures.dm @@ -24,7 +24,7 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/structure/rack/wooden/deconstruct(disassembled = TRUE) +/obj/structure/rack/wooden/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/mineral/wood(drop_location(), 2) return ..() @@ -47,7 +47,7 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/structure/closet/crate/wooden/storage_barrel/deconstruct(disassembled = TRUE) +/obj/structure/closet/crate/wooden/storage_barrel/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/mineral/wood(drop_location(), 4) return ..() diff --git a/modular_skyrat/modules/reagent_forging/code/anvil.dm b/modular_skyrat/modules/reagent_forging/code/anvil.dm index 91a4d36ad13..2be9cd0dc03 100644 --- a/modular_skyrat/modules/reagent_forging/code/anvil.dm +++ b/modular_skyrat/modules/reagent_forging/code/anvil.dm @@ -53,7 +53,7 @@ deconstruct(TRUE) return TRUE -/obj/structure/reagent_anvil/deconstruct(disassembled = TRUE) +/obj/structure/reagent_anvil/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/iron/ten(get_turf(src)) return ..() diff --git a/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm b/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm index 54678a1c6fb..ce2a1e1576f 100644 --- a/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm +++ b/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm @@ -39,6 +39,7 @@ /datum/crafting_bench_recipe/centrifuge, /datum/crafting_bench_recipe/bokken, /datum/crafting_bench_recipe/bow, + /datum/crafting_bench_recipe/empty_circuit, ) /// Radial options for recipes in the allowed_choices list, populated by populate_radial_choice_list var/list/radial_choice_list = list() diff --git a/modular_skyrat/modules/reagent_forging/code/crafting_bench_recipes.dm b/modular_skyrat/modules/reagent_forging/code/crafting_bench_recipes.dm index b9aede74f74..2880a3fc5e7 100644 --- a/modular_skyrat/modules/reagent_forging/code/crafting_bench_recipes.dm +++ b/modular_skyrat/modules/reagent_forging/code/crafting_bench_recipes.dm @@ -148,3 +148,12 @@ ) resulting_item = /obj/item/forging/incomplete_bow required_good_hits = 8 + +/datum/crafting_bench_recipe/empty_circuit + recipe_name = "circuit" + recipe_requirements = list( + /obj/item/forging/complete/plate = 1, + /obj/item/forging/coil = 1, + ) + resulting_item = /obj/item/empty_circuit + required_good_hits = 4 diff --git a/modular_skyrat/modules/reagent_forging/code/forge.dm b/modular_skyrat/modules/reagent_forging/code/forge.dm index bbf81fc3fe3..fe0fa11904f 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge.dm @@ -898,7 +898,7 @@ deconstruct(TRUE) return TRUE -/obj/structure/reagent_forge/deconstruct(disassembled) +/obj/structure/reagent_forge/atom_deconstruct(disassembled) new /obj/item/stack/sheet/iron/ten(get_turf(src)) return ..() diff --git a/modular_skyrat/modules/reagent_forging/code/forge_items.dm b/modular_skyrat/modules/reagent_forging/code/forge_items.dm index f5d85ea8e10..5b9dae85769 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge_items.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge_items.dm @@ -313,3 +313,38 @@ if(skyrat_obj_flags & ANVIL_REPAIR) forceMove(tool) tool.icon_state = "tong_full" + +/obj/item/empty_circuit + name = "empty circuit" + desc = "This is a circuit that is close to being finished; it just requires some forethought and gold." + icon = 'modular_skyrat/modules/reagent_forging/icons/obj/forge_items.dmi' + icon_state = "circuit" + var/static/recycleable_circuits = typecacheof(list( + /obj/item/electronics/airalarm, + /obj/item/electronics/firealarm, + /obj/item/electronics/apc, + ))//A typecache of circuits consumable for material + +/obj/item/empty_circuit/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/stack/sheet/mineral/gold)) + var/obj/item/stack/attacking_stack = attacking_item + var/choice = tgui_input_list(user, "Which circuit are you thinking about?", "Circuit Creation", recycleable_circuits) + if(!choice) + to_chat(user, span_notice("You decide against creating the circuit...")) + return + + if(!do_after(user, 5 SECONDS, src)) + to_chat(user, span_warning("You moved around, destroying the circuit!")) + qdel(src) + return + + if(!attacking_stack.use(1)) + to_chat(user, span_warning("You weren't able to use the gold, destroying the circuit!")) + qdel(src) + return + + new choice(get_turf(src)) + qdel(src) + return + + return ..() diff --git a/modular_skyrat/modules/reagent_forging/icons/obj/forge_items.dmi b/modular_skyrat/modules/reagent_forging/icons/obj/forge_items.dmi index c333e753d65..08c9740d44e 100644 Binary files a/modular_skyrat/modules/reagent_forging/icons/obj/forge_items.dmi and b/modular_skyrat/modules/reagent_forging/icons/obj/forge_items.dmi differ diff --git a/modular_skyrat/modules/sec_haul/code/misc/bullet_drive.dm b/modular_skyrat/modules/sec_haul/code/misc/bullet_drive.dm index 7abf5585e08..7cadd1f1d3e 100644 --- a/modular_skyrat/modules/sec_haul/code/misc/bullet_drive.dm +++ b/modular_skyrat/modules/sec_haul/code/misc/bullet_drive.dm @@ -36,7 +36,7 @@ if(!A.loaded_projectile) LAZYREMOVE(dish_drive_contents, A) qdel(A) - use_power(active_power_usage) + use_energy(active_power_usage) disposed++ if(disposed) visible_message(span_notice("[src] [pick("whooshes", "bwooms", "fwooms", "pshooms")] and demoleculizes [disposed] stored item\s into the nearby void.")) diff --git a/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm b/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm index d2c91ae704d..e3b61e0f3e2 100644 --- a/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm +++ b/modular_skyrat/modules/self_actualization_device/code/self_actualization_device.dm @@ -131,7 +131,7 @@ say(pick(advertisements)) playsound(loc, 'sound/machines/chime.ogg', 30, FALSE) - use_power(500) + use_energy(500 JOULES) /// Ejects the occupant after asking them if they want to accept the rejuvenation. If yes, they exit as their preferences character. /obj/machinery/self_actualization_device/proc/eject_new_you() diff --git a/modular_skyrat/modules/simple_research/cloaks.dmi b/modular_skyrat/modules/simple_research/cloaks.dmi new file mode 100644 index 00000000000..f3bf09a12de Binary files /dev/null and b/modular_skyrat/modules/simple_research/cloaks.dmi differ diff --git a/modular_skyrat/modules/simple_research/neck.dmi b/modular_skyrat/modules/simple_research/neck.dmi new file mode 100644 index 00000000000..e39341b3307 Binary files /dev/null and b/modular_skyrat/modules/simple_research/neck.dmi differ diff --git a/modular_skyrat/modules/simple_research/research_document.dm b/modular_skyrat/modules/simple_research/research_document.dm new file mode 100644 index 00000000000..ab37b2055dc --- /dev/null +++ b/modular_skyrat/modules/simple_research/research_document.dm @@ -0,0 +1,145 @@ +/datum/crafting_recipe/research_paper + name = "Reseach Paper" + result = /obj/item/research_paper + time = 4 SECONDS + reqs = list( + /obj/item/stack/sheet/cloth = 4, + ) + category = CAT_TOOLS + +/obj/item/research_paper + name = "research paper" + desc = "Some people want to return to simpler technology, and some want to only begin researching those simple technologies." + icon = 'modular_skyrat/modules/simple_research/researching.dmi' + icon_state = "scroll" + ///the list of discovered items + var/list/discovered_items = list() + ///list of the shapes we use + var/static/list/shape_list = list("pyramid", "cube", "sphere") + ///the list that is used when we wonder about the shapes + var/static/list/shape_parts = list("faces", "edges", "vertices") + ///the list that is used when we wonder about the shape parts + var/static/list/thinking_list = list("wonder", "think", "ponder", "reason", "meditate", "reflect") + ///Contains images of all radial icons + var/static/list/radial_icons_cache = list() + +/obj/item/research_paper/Initialize(mapload) + . = ..() + if(!length(GLOB.simple_research)) + var/list/possible_combinations = list() + for(var/shape_one in shape_list) + for(var/shape_two in shape_list) + for(var/shape_three in shape_list) + possible_combinations += "[shape_one][shape_two][shape_three]" + + //lets assign the research items to the patterns + for(var/datum_path in subtypesof(/datum/simple_research)) + var/shape_pattern = pick_n_take(possible_combinations) + GLOB.simple_research += list("[shape_pattern]" = datum_path) + + radial_icons_cache = list( + "pyramid" = image(icon = 'modular_skyrat/modules/simple_research/researching.dmi', icon_state = "pyramid"), + "cube" = image(icon = 'modular_skyrat/modules/simple_research/researching.dmi', icon_state = "cube"), + "sphere" = image(icon = 'modular_skyrat/modules/simple_research/researching.dmi', icon_state = "sphere"), + ) + +/obj/item/research_paper/attack_self(mob/user, modifiers) + . = ..() + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/research, SKILL_SPEED_MODIFIER) + var/shape_one = show_radial_menu(user, src, radial_icons_cache, require_near = TRUE) + to_chat(user, span_notice("You begin to [pick(thinking_list)] about the [shape_one]... and then [pick(thinking_list)] about their [pick(shape_parts)]...")) + if(!do_after(user, 5 SECONDS * skill_modifier, src)) + to_chat(user, span_warning("You stopped researching.")) + return + + user.mind.adjust_experience(/datum/skill/research, 5) + + var/shape_two = show_radial_menu(user, src, radial_icons_cache, require_near = TRUE) + to_chat(user, span_notice("You begin to [pick(thinking_list)] about the [shape_two]... and then [pick(thinking_list)] about their [pick(shape_parts)]...")) + if(!do_after(user, 5 SECONDS * skill_modifier, src)) + to_chat(user, span_warning("You stopped researching.")) + return + + user.mind.adjust_experience(/datum/skill/research, 5) + + var/shape_three = show_radial_menu(user, src, radial_icons_cache, require_near = TRUE) + to_chat(user, span_notice("You begin to [pick(thinking_list)] about the [shape_three]... and then [pick(thinking_list)] about their [pick(shape_parts)]...")) + if(!do_after(user, 5 SECONDS * skill_modifier, src)) + to_chat(user, span_warning("You stopped researching.")) + return + + user.mind.adjust_experience(/datum/skill/research, 5) + + var/datum/simple_research/find_research = GLOB.simple_research["[shape_one][shape_two][shape_three]"] + if(!find_research) + to_chat(user, span_warning("You were researching a dead end!")) + return + + find_research = new find_research() + + var/failure_amount = length(find_research.required_items) + for(var/check_required in find_research.required_items) + for(var/check_discovered in discovered_items) + if(check_required == check_discovered) + --failure_amount + + if(failure_amount > 0) + to_chat(user, span_warning("You are unable to research this! You are missing [failure_amount] pre-requisite items!")) + return + + if(!locate(find_research.type) in discovered_items) + discovered_items += find_research.type + + var/obj/item/research_scrap/spawned_scrap = new(get_turf(src)) + var/prob_modifier = user.mind.get_skill_modifier(/datum/skill/research, SKILL_PROBS_MODIFIER) + if(find_research.skilled_item && prob(prob_modifier)) + spawned_scrap.spawning_item = find_research.skilled_item + + else + spawned_scrap.spawning_item = find_research.research_item + + user.mind.adjust_experience(/datum/skill/research, 10) + qdel(find_research) + +/obj/item/research_scrap + name = "research scrap" + desc = "Small sketches of an item are drawn on the scrap-- if you use the materials, you might be able to craft the item on the scrap!" + icon = 'modular_skyrat/modules/simple_research/researching.dmi' + icon_state = "scrap" + ///what will be spawned + var/obj/spawning_item + ///has both glass and metal been used to build the item? + var/material_satisfied = list(FALSE, FALSE) + +/obj/item/research_scrap/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/stack/sheet/iron)) + research_use(attacking_item, user, 2) + return + + if(istype(attacking_item, /obj/item/stack/sheet/glass)) + research_use(attacking_item, user, 1) + return + + return ..() + +/obj/item/research_scrap/proc/research_use(obj/item/stack/attacking_stack, mob/user, number = 1) + if(!attacking_stack || !istype(attacking_stack)) + return + + if(material_satisfied[number]) + to_chat(user, span_warning("You have already used [attacking_stack] on this scrap!")) + return + + if(!attacking_stack.use(1)) + to_chat(user, span_warning("You were unable to use [attacking_stack]!")) + return + + to_chat(user, span_notice("You use [attacking_stack] on [src].")) + + material_satisfied[number] = TRUE + + if(material_satisfied[1] && material_satisfied[2]) + new spawning_item(get_turf(src)) + to_chat(user, span_notice("You completed [src].")) + user.mind.adjust_experience(/datum/skill/research, 5) + qdel(src) diff --git a/modular_skyrat/modules/simple_research/research_skill.dm b/modular_skyrat/modules/simple_research/research_skill.dm new file mode 100644 index 00000000000..3bfaa4689dd --- /dev/null +++ b/modular_skyrat/modules/simple_research/research_skill.dm @@ -0,0 +1,18 @@ +/datum/skill/research + name = "Researching" + title = "Researcher" + desc = "Those who desire to discover the mysteries of the universe-- or taste rocks." + modifiers = list( + SKILL_SPEED_MODIFIER = list(1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.25), + SKILL_PROBS_MODIFIER = list(0, 5, 10, 20, 40, 80, 100) + ) + skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/researching + +/obj/item/clothing/neck/cloak/skill_reward/researching + name = "legendary researcher's cloak" + desc = "This legendary cloak is awarded only to those who have created a large stir within the scientific community with their contributions. \ + Those who wear this cloak create the scientific foundations, and have the ability to discern the truth of the universe even from the most mundane things." + icon = 'modular_skyrat/modules/simple_research/cloaks.dmi' + worn_icon = 'modular_skyrat/modules/simple_research/neck.dmi' + icon_state = "researchcloak" + associated_skill_path = /datum/skill/research diff --git a/modular_skyrat/modules/simple_research/researching.dmi b/modular_skyrat/modules/simple_research/researching.dmi new file mode 100644 index 00000000000..d03432fb719 Binary files /dev/null and b/modular_skyrat/modules/simple_research/researching.dmi differ diff --git a/modular_skyrat/modules/simple_research/simple_research.dm b/modular_skyrat/modules/simple_research/simple_research.dm new file mode 100644 index 00000000000..fbec1bc2a52 --- /dev/null +++ b/modular_skyrat/modules/simple_research/simple_research.dm @@ -0,0 +1,114 @@ +GLOBAL_LIST_EMPTY(simple_research) + +/datum/simple_research + ///the item that results from successful research symbols + var/research_item + ///the item that, if you hit the probability from research skill, will spawn instead + var/skilled_item + ///any pre-req items for this simple research + var/list/required_items = list() + +/** + * 19 items + */ +/datum/simple_research/scanner + research_item = /obj/item/stock_parts/scanning_module + skilled_item = /obj/item/stock_parts/scanning_module/adv + +/datum/simple_research/capacitor + research_item = /obj/item/stock_parts/capacitor + skilled_item = /obj/item/stock_parts/capacitor/adv + +/datum/simple_research/servo + research_item = /obj/item/stock_parts/servo + skilled_item = /obj/item/stock_parts/servo/nano + +/datum/simple_research/micro_laser + research_item = /obj/item/stock_parts/micro_laser + skilled_item = /obj/item/stock_parts/micro_laser/high + +/datum/simple_research/matter_bin + research_item = /obj/item/stock_parts/matter_bin + skilled_item = /obj/item/stock_parts/matter_bin/adv + +/datum/simple_research/cell + research_item = /obj/item/stock_parts/cell + skilled_item = /obj/item/stock_parts/cell/high + +/datum/simple_research/cable + research_item = /obj/item/stack/cable_coil/five + skilled_item = /obj/item/stack/cable_coil + +/datum/simple_research/part_replacer + research_item = /obj/item/storage/part_replacer + skilled_item = /obj/item/storage/part_replacer/bluespace + required_items = list( + /datum/simple_research/cable, + ) + +/datum/simple_research/protolathe + research_item = /obj/item/circuitboard/machine/protolathe/offstation + required_items = list( + /datum/simple_research/part_replacer, + ) + +/datum/simple_research/circuit_imprinter + research_item = /obj/item/circuitboard/machine/circuit_imprinter/offstation + required_items = list( + /datum/simple_research/part_replacer, + ) + +/datum/simple_research/rdconsole + research_item = /obj/item/circuitboard/computer/rdconsole + required_items = list( + /datum/simple_research/protolathe, + /datum/simple_research/circuit_imprinter, + ) + +/datum/simple_research/pipe_dispenser + research_item = /obj/item/pipe_dispenser + skilled_item = /obj/item/pipe_dispenser/bluespace + required_items = list( + /datum/simple_research/multitool, + ) + +/datum/simple_research/inducer + research_item = /obj/item/inducer/empty + skilled_item = /obj/item/inducer/syndicate + required_items = list( + /datum/simple_research/cell, + ) + +/datum/simple_research/pacman + research_item = /obj/item/circuitboard/machine/pacman + skilled_item = /obj/item/circuitboard/machine/rtg + required_items = list( + /datum/simple_research/cell, + ) + +/datum/simple_research/smes + research_item = /obj/item/circuitboard/machine/smes + required_items = list( + /datum/simple_research/pacman, + ) + +/datum/simple_research/drill + research_item = /obj/item/pickaxe/drill + skilled_item = /obj/item/pickaxe/drill/diamonddrill + +/datum/simple_research/chem_dispenser + research_item = /obj/item/circuitboard/machine/chem_dispenser + required_items = list( + /datum/simple_research/igniter, + /datum/simple_research/condenser, + ) + +/datum/simple_research/igniter + research_item = /obj/item/assembly/igniter + +/datum/simple_research/condenser + research_item = /obj/item/assembly/igniter/condenser + +/datum/simple_research/multitool + research_item = /obj/item/multitool + skilled_item = /obj/item/multitool/abductor diff --git a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm index 6dffb7c9650..ef17198a781 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm @@ -59,7 +59,7 @@ else computer_id_slot = null -/obj/item/modular_computer/pda/synth/RemoveID(mob/user) +/obj/item/modular_computer/pda/synth/RemoveID(mob/user, silent = TRUE) return /obj/item/modular_computer/pda/synth/get_ntnet_status() diff --git a/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm b/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm index c8ff5bb58f6..d39951f0d3f 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm @@ -1,106 +1,138 @@ -#define SYNTH_CHARGE_MAX 150 -#define SYNTH_CHARGE_MIN 50 -#define SYNTH_CHARGE_PER_NUTRITION 10 -#define SYNTH_CHARGE_DELAY_PER_100 10 -#define SYNTH_DRAW_NUTRITION_BUFFER 30 +#define SYNTH_CHARGE_MAX 1.1 MEGA JOULES +#define SYNTH_CHARGE_ALMOST_FULL 900 KILO JOULES +#define SYNTH_JOULES_PER_NUTRITION 2000 +#define SYNTH_CHARGE_RATE 250 KILO WATTS #define SYNTH_APC_MINIMUM_PERCENT 20 +#define SSMACHINES_SECONDS_PER_TICK 2 /obj/item/organ/internal/cyberimp/arm/power_cord - name = "power cord implant" + name = "charging implant" desc = "An internal power cord. Useful if you run on elecricity. Not so much otherwise." - contents = newlist(/obj/item/apc_powercord) + items_to_create = list(/obj/item/synth_powercord) zone = "l_arm" -/obj/item/apc_powercord +/obj/item/synth_powercord name = "power cord" desc = "An internal power cord. Useful if you run on electricity. Not so much otherwise." icon = 'icons/obj/stack_objects.dmi' icon_state = "wire1" + ///Object basetypes which the powercord is allowed to connect to. + var/static/list/synth_charge_whitelist = typecacheof(list( + /obj/item/stock_parts/cell, + /obj/machinery/power/apc, + )) -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) +// Attempt to charge from an object by using them on the power cord. +/obj/item/synth_powercord/attackby(obj/item/attacking_item, mob/user, params) + if(!can_power_draw(attacking_item, user)) return ..() + try_power_draw(attacking_item, user) +// Attempt to charge from an object by using the power cord on them. +/obj/item/synth_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag || !can_power_draw(target, user)) + return ..() + try_power_draw(target, user) + +/// Returns TRUE or FALSE depending on if the target object can be used as a power source. +/obj/item/synth_powercord/proc/can_power_draw(obj/target, mob/user) + return ishuman(user) && is_type_in_typecache(target, synth_charge_whitelist) + +/// Attempts to start using an object as a power source. +/// Checks the user's internal powercell to see if it exists. +/obj/item/synth_powercord/proc/try_power_draw(obj/target, mob/living/carbon/human/user) + /// The current user's nutrition level in joules. + var/nutrition_level_joules = user.nutrition * SYNTH_JOULES_PER_NUTRITION user.changeNext_move(CLICK_CD_MELEE) - var/obj/machinery/power/apc/target_apc = target - var/mob/living/carbon/human/ipc = user - var/obj/item/organ/internal/stomach/synth/cell = ipc.organs_slot[ORGAN_SLOT_STOMACH] - if(!cell) - to_chat(ipc, span_warning("You try to siphon energy from the [target_apc], but you have no stomach! How are you still standing?")) + var/obj/item/organ/internal/stomach/synth/synth_cell = user.get_organ_slot(ORGAN_SLOT_STOMACH) + if(QDELETED(synth_cell) || !istype(synth_cell)) + to_chat(user, span_warning("You plug into [target], but nothing happens! It seems you don't have an internal cell to charge.")) return - if(!istype(cell)) - to_chat(ipc, span_warning("You plug into the APC, but nothing happens! It seems you don't have a cell to charge!")) + if(nutrition_level_joules >= SYNTH_CHARGE_ALMOST_FULL) + user.balloon_alert(user, "cell fully charged!") return - if(target_apc.cell && target_apc.cell.percent() < SYNTH_APC_MINIMUM_PERCENT) - to_chat(user, span_warning("There is no charge to draw from that APC.")) + user.visible_message(span_notice("[user] inserts a power connector into [target]."), span_notice("You begin to draw power from [target].")) + do_power_draw(target, user) + + if(QDELETED(target)) return - if(ipc.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) - to_chat(user, span_warning("You are already fully charged!")) - return - - powerdraw_loop(target_apc, ipc) + user.visible_message(span_notice("[user] unplugs from [target]."), span_notice("You unplug from [target].")) /** - * Runs a loop to charge a synth cell (stomach) via powercord from an APC. + * Runs a loop to charge a synth cell (stomach) from a power cell or APC. + * Displays chat messages to the user and nearby observers. * * Stops when: - * - The user is full. - * - The APC has less than 20% charge. - * - The APC has machine power turned off. - * - The APC is unable to provide charge for any other reason. + * - The user's internal cell is full. + * - The cell has less than the minimum charge. * - The user moves, or anything else that can happen to interrupt a do_after. * * Arguments: - * * target_apc - The APC to drain. - * * user - The carbon draining the APC. + * * target - The power cell or APC to drain. + * * user - The human mob draining the power cell. */ -/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/target_apc, mob/living/carbon/human/user) - user.visible_message(span_notice("[user] inserts a power connector into the [target_apc]."), span_notice("You begin to draw power from the [target_apc].")) +/obj/item/synth_powercord/proc/do_power_draw(obj/target, mob/living/carbon/human/user) + /// The current user's nutrition level in joules. + var/nutrition_level_joules = user.nutrition * SYNTH_JOULES_PER_NUTRITION + // Draw power from an APC if one was given. + var/obj/machinery/power/apc/target_apc + if(istype(target, /obj/machinery/power/apc)) + target_apc = target + var/obj/item/stock_parts/cell/target_cell = target_apc ? target_apc.cell : target + var/minimum_cell_charge = target_apc ? SYNTH_APC_MINIMUM_PERCENT : 0 + + if(!target_cell || target_cell.percent() < minimum_cell_charge) + user.balloon_alert(user, "APC charge low!") + return + + var/energy_needed while(TRUE) - var/power_needed = NUTRITION_LEVEL_ALMOST_FULL - user.nutrition // How much charge do we need in total? - // Do we even need anything? - if(power_needed <= SYNTH_CHARGE_MIN * 2) // Times two to make sure minimum draw is always lower than this margin to prevent potential needless loops. - to_chat(user, span_notice("You are fully charged.")) + // Check if the user is nearly fully charged. + // Ensures minimum draw is always lower than this margin. + nutrition_level_joules = user.nutrition * SYNTH_JOULES_PER_NUTRITION + energy_needed = SYNTH_CHARGE_MAX - nutrition_level_joules + if(energy_needed < SYNTH_CHARGE_MAX - SYNTH_CHARGE_ALMOST_FULL - 125 KILO JOULES) + user.balloon_alert(user, "cell fully charged!") break - // Is the APC not charging equipment? And yes, synths are gonna be treated as equipment. Deal with it. - if(target_apc.cell.percent() < SYNTH_APC_MINIMUM_PERCENT) // 20%, to prevent synths from overstepping and murdering power for department machines and potentially doors. - to_chat(user, span_warning("[target_apc]'s power is too low to charge you.")) + // Check if the charge level of the cell is below the minimum. + // Prevents synths from overloading the cell. + if(target_cell.percent() < minimum_cell_charge) + user.balloon_alert(user, "APC charge low!") break - // Calculate how much to draw this cycle - var/power_use = clamp(power_needed, SYNTH_CHARGE_MIN, SYNTH_CHARGE_MAX) - power_use = clamp(power_use, 0, target_apc.cell.charge) - // Are we able to draw anything? - if(power_use <= 0) - to_chat(user, span_warning("[target_apc] lacks the power to charge you.")) + // Attempt to drain charge from the cell. + if(!do_after(user, SSmachines.wait, target)) break - // Calculate the delay. - var/power_delay = (power_use / 100) * SYNTH_CHARGE_DELAY_PER_100 - // Attempt to run a charging cycle. - if(!do_after(user, power_delay, target = target_apc)) + // Calculate how much to draw from the cell this cycle. + var/current_draw = min(energy_needed, SYNTH_CHARGE_RATE * SSMACHINES_SECONDS_PER_TICK) + + var/energy_delivered = target_cell.use(current_draw) + if(!energy_delivered) + // The cell could be sabotaged, which causes it to explode and qdelete. + if(QDELETED(target_cell)) + return + user.balloon_alert(user, "APC failure!") break - // Use the power and increase nutrition. - target_apc.cell.use(power_use) + // If charging was successful, then increase user nutrition and emit sparks. + var/nutrition_gained = (energy_delivered / SYNTH_JOULES_PER_NUTRITION) / SSMACHINES_SECONDS_PER_TICK + user.nutrition += nutrition_gained + do_sparks(1, FALSE, target_cell.loc) - user.nutrition += power_use / SYNTH_CHARGE_PER_NUTRITION - do_sparks(1, FALSE, target_apc) - - if(target_apc.main_status <= APC_HAS_POWER) + // Start APC recharging if power was used and the APC has power available. + if(target_apc && !QDELETED(target_apc) && !QDELETED(target_apc.cell) && target_apc.main_status > APC_NO_POWER) target_apc.charging = APC_CHARGING target_apc.update_appearance() - else - return - user.visible_message(span_notice("[user] unplugs from the [target_apc]."), span_notice("You unplug from the [target_apc].")) #undef SYNTH_CHARGE_MAX -#undef SYNTH_CHARGE_MIN -#undef SYNTH_CHARGE_PER_NUTRITION -#undef SYNTH_CHARGE_DELAY_PER_100 +#undef SYNTH_JOULES_PER_NUTRITION +#undef SYNTH_CHARGE_RATE +#undef SYNTH_APC_MINIMUM_PERCENT +#undef SSMACHINES_SECONDS_PER_TICK diff --git a/modular_skyrat/modules/synths/code/species/synthetic.dm b/modular_skyrat/modules/synths/code/species/synthetic.dm index 90a01e09ed9..4d035c7dfad 100644 --- a/modular_skyrat/modules/synths/code/species/synthetic.dm +++ b/modular_skyrat/modules/synths/code/species/synthetic.dm @@ -51,6 +51,9 @@ /// This is the screen that is given to the user after they get revived. On death, their screen is temporarily set to BSOD before it turns off, hence the need for this var. var/saved_screen = "Blank" +/datum/species/synthetic/allows_food_preferences() + return FALSE + /datum/species/synthetic/get_default_mutant_bodyparts() return list( "tail" = list("None", FALSE), diff --git a/modular_skyrat/modules/tableflip/code/flipped_table.dm b/modular_skyrat/modules/tableflip/code/flipped_table.dm index 80776abf09a..57fb2dca2e8 100644 --- a/modular_skyrat/modules/tableflip/code/flipped_table.dm +++ b/modular_skyrat/modules/tableflip/code/flipped_table.dm @@ -46,7 +46,7 @@ if(direction == dir) return COMPONENT_ATOM_BLOCK_EXIT -/obj/structure/flippedtable/CtrlShiftClick(mob/user) +/obj/structure/flippedtable/CtrlShiftClick(mob/living/user) . = ..() if(!istype(user) || !user.can_interact_with(src) || iscorticalborer(user)) return FALSE @@ -60,11 +60,17 @@ playsound(src, 'sound/items/trayhit2.ogg', 100) qdel(src) -//TABLES +/obj/structure/flippedtable/BorgCtrlShiftClick(mob/living/silicon/robot/user) + if(Adjacent(user, src)) + . = ..() + else + return FALSE + +//TABLES /obj/structure/table/CtrlShiftClick(mob/living/user) . = ..() - if(!istype(user) || !user.can_interact_with(src) || isobserver(user) || iscorticalborer(user)) + if(!istype(user) || !user.can_interact_with(src) || iscorticalborer(user)) return if(!can_flip) return @@ -115,6 +121,12 @@ continue movable_entity.safe_throw_at(throw_target, range = 1, speed = 1, force = MOVE_FORCE_NORMAL, gentle = TRUE) +/obj/structure/table/BorgCtrlShiftClick(mob/living/silicon/robot/user) + if(Adjacent(user, src)) + . = ..() + else + return FALSE + /obj/structure/table var/flipped_table_type = /obj/structure/flippedtable var/can_flip = TRUE diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/research.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/research.dm index 3fba29537bb..2dbfabd86d0 100644 --- a/modular_skyrat/modules/tarkon/code/misc-fluff/research.dm +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/research.dm @@ -5,6 +5,11 @@ organization = "Tarkon Industries" should_generate_points = TRUE +/datum/techweb/interdyne + id = "INTERDYNE" + organization = "Interdyne Pharmaceutics" + should_generate_points = TRUE + /datum/techweb/tarkon/New() . = ..() research_node_id("oldstation_surgery", TRUE, TRUE, FALSE) @@ -122,3 +127,38 @@ name = "Tarkon Industries Protolathe" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/rnd/production/protolathe/tarkon + +/obj/item/circuitboard/machine/rdserver/interdyne + name = "Interdyne Pharmaceutics R&D Server" + build_path = /obj/machinery/rnd/server/interdyne + +/obj/machinery/rnd/server/interdyne + name = "\improper Interdyne Pharmaceutics R&D Server" + circuit = /obj/item/circuitboard/machine/rdserver/interdyne + req_access = list(ACCESS_RESEARCH) + +/obj/machinery/rnd/server/interdyne/Initialize(mapload) + var/datum/techweb/interdyne_techweb = locate(/datum/techweb/interdyne) in SSresearch.techwebs + stored_research = interdyne_techweb + return ..() + +/obj/machinery/rnd/server/interdyne/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(held_item && istype(held_item, /obj/item/research_notes)) + context[SCREENTIP_CONTEXT_LMB] = "Generate research points" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/rnd/server/interdyne/examine(mob/user) + . = ..() + if(!in_range(user, src) && !isobserver(user)) + return + . += span_notice("Insert [EXAMINE_HINT("Research Notes")] to generate points.") + +/obj/machinery/rnd/server/interdyne/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/research_notes) && stored_research) + var/obj/item/research_notes/research_notes = attacking_item + stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = research_notes.value)) + playsound(src, 'sound/machines/copier.ogg', 50, TRUE) + qdel(research_notes) + return + return ..() diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm index 81a48274483..417d0224eb7 100644 --- a/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm @@ -191,16 +191,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) max_mobs = 7 spawn_time = 20 SECONDS mob_types = list( - /mob/living/simple_animal/hostile/alien, - /mob/living/simple_animal/hostile/alien/drone, - /mob/living/simple_animal/hostile/alien/sentinel + /mob/living/basic/alien, + /mob/living/basic/alien/drone, + /mob/living/basic/alien/sentinel ) spawn_text = "crawls out of" faction = list(ROLE_ALIEN) - var/boss_mob = /mob/living/simple_animal/hostile/alien/queen/large + var/boss_mob = /mob/living/basic/alien/queen/large var/loot_drop = /obj/effect/mob_spawn/corpse/human/tarkon -/obj/structure/spawner/tarkon_xenos/deconstruct(disassembled) +/obj/structure/spawner/tarkon_xenos/atom_deconstruct(disassembled) var/obj/effect/nest_break/nest = new /obj/effect/nest_break(loc) nest.loot_drop = loot_drop nest.boss_mob = boss_mob @@ -230,7 +230,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) . = ..() visible_message(span_boldannounce("The nest rumbles violently as the entrance begins to crack and break apart!")) playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) - addtimer(CALLBACK(src, PROC_REF(rustle)), 50) + addtimer(CALLBACK(src, PROC_REF(rustle)), 5 SECONDS) do_jiggle() /obj/structure/spawner/tarkon_xenos/common @@ -241,7 +241,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) max_integrity = 300 max_mobs = 4 spawn_time = 30 SECONDS - boss_mob = /mob/living/simple_animal/hostile/alien/queen + boss_mob = /mob/living/basic/alien/queen loot_drop = /obj/effect/spawner/random/astrum/sci_loot/tarkon /obj/structure/spawner/tarkon_xenos/minor @@ -253,10 +253,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) max_mobs = 2 spawn_time = 30 SECONDS mob_types = list( - /mob/living/simple_animal/hostile/alien, - /mob/living/simple_animal/hostile/alien/drone + /mob/living/basic/alien, + /mob/living/basic/alien/drone ) - boss_mob = /mob/living/simple_animal/hostile/alien/sentinel + boss_mob = /mob/living/basic/alien/sentinel loot_drop = /obj/effect/spawner/random/exotic/technology/tarkon /obj/effect/spawner/random/astrum/sci_loot/tarkon diff --git a/modular_skyrat/modules/tesh_augments/code/all_nodes.dm b/modular_skyrat/modules/tesh_augments/code/all_nodes.dm new file mode 100644 index 00000000000..0358c31ce8c --- /dev/null +++ b/modular_skyrat/modules/tesh_augments/code/all_nodes.dm @@ -0,0 +1,30 @@ +//teshari_ robolimb research node + +/datum/techweb_node/teshari_cyber + id = "teshari_cyber" + display_name = "Raptoral Cybernetics" + description = "Specialized civilian-grade cybernetic limb designs." + prereq_ids = list("base") + design_ids = list( + "teshari_cyber_chest", + "teshari_cyber_l_arm", + "teshari_cyber_r_arm", + "teshari_cyber_l_leg", + "teshari_cyber_r_leg", + "teshari_cyber_head", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + + +/datum/techweb_node/adv_teshari_cyber + id = "adv_teshari_cyber" + display_name = "Advanced Raptoral Cybernetics" + description = "Specialized industrial-grade cybernetic limb designs." + prereq_ids = list("adv_robotics", "teshari_cyber") + design_ids = list( + "teshari_advanced_l_arm", + "teshari_advanced_r_arm", + "teshari_advanced_l_leg", + "teshari_advanced_r_leg", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500) diff --git a/modular_skyrat/modules/tesh_augments/code/limbs.dm b/modular_skyrat/modules/tesh_augments/code/limbs.dm new file mode 100644 index 00000000000..759d7b121e5 --- /dev/null +++ b/modular_skyrat/modules/tesh_augments/code/limbs.dm @@ -0,0 +1,57 @@ +/* +this goes into the augment preferences section. They do not use the appearance dropdown for obvious reason. +*/ + +/datum/augment_item/limb/head/teshari_cyborg + name = "Raptoral cybernetic head" + path = /obj/item/bodypart/head/robot/teshari + uses_robotic_styles = FALSE + +/datum/augment_item/limb/chest/teshari_cyborg + name = "Raptoral cybernetic chest" + path = /obj/item/bodypart/chest/robot/teshari + uses_robotic_styles = FALSE + +/datum/augment_item/limb/l_arm/teshari_prosthetic + name = "Raptoral prosthetic left forelimb" + path = /obj/item/bodypart/arm/left/robot/teshari_surplus + cost = -1 + uses_robotic_styles = FALSE + +/datum/augment_item/limb/l_arm/teshari_cybernetic + name = "Raptoral cybernetic left forelimb" + path = /obj/item/bodypart/arm/left/robot/teshari + uses_robotic_styles = FALSE + +/datum/augment_item/limb/r_arm/teshari_prosthetic + name = "Raptoral prototype right forelimb" + path = /obj/item/bodypart/arm/right/robot/teshari_surplus + cost = -1 + uses_robotic_styles = FALSE + +/datum/augment_item/limb/r_arm/teshari_cybernetic + name = "Raptoral cybernetic right forelimb" + path = /obj/item/bodypart/arm/right/robot/teshari + uses_robotic_styles = FALSE + +/datum/augment_item/limb/l_leg/teshari_prosthetic + name = "Raptoral prosthetic left hindlimb" + path = /obj/item/bodypart/leg/left/robot/teshari_surplus + cost = -1 + uses_robotic_styles = FALSE + +/datum/augment_item/limb/l_leg/teshari_cybernetic + name = "Raptoral cybernetic left hindlimb" + path = /obj/item/bodypart/leg/left/robot/teshari + uses_robotic_styles = FALSE + +/datum/augment_item/limb/r_leg/teshari_prosthetic + name = "Raptoral prosthetic right hindlimb" + path = /obj/item/bodypart/leg/right/robot/teshari_surplus + cost = -1 + uses_robotic_styles = FALSE + +/datum/augment_item/limb/r_leg/teshari_cybernetic + name = "Raptoral cybernetic right hindlimb" + path = /obj/item/bodypart/leg/right/robot/teshari + uses_robotic_styles = FALSE diff --git a/modular_skyrat/modules/tesh_augments/code/mechfabricator_designs.dm b/modular_skyrat/modules/tesh_augments/code/mechfabricator_designs.dm new file mode 100644 index 00000000000..50fdb0865ba --- /dev/null +++ b/modular_skyrat/modules/tesh_augments/code/mechfabricator_designs.dm @@ -0,0 +1,131 @@ +//adding teshari silicon stuff to the mechfabricator + +#define RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL "/Raptoral" + +/datum/design/teshari_cyber_chest + name = "Raptoral Cybernetic Torso" + id = "teshari_cyber_chest" + build_type = MECHFAB + build_path = /obj/item/bodypart/chest/robot/teshari + materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 6) + construction_time = 12 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_head + name = "Raptoral Cybernetic Head" + id = "teshari_cyber_head" + build_type = MECHFAB + build_path = /obj/item/bodypart/head/robot/teshari + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 0.75) + construction_time = 4 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_l_arm + name = "Raptoral Cybernetic Left Forelimb" + id = "teshari_cyber_l_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/left/robot/teshari + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 1.5) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_r_arm + name = "Raptoral Cybernetic Right Forelimb" + id = "teshari_cyber_r_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/right/robot/teshari + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.5) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_l_leg + name = "Raptoral Cybernetic Left Hindlimb" + id = "teshari_cyber_l_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/left/robot/teshari + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.5) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_r_leg + name = "Raptoral Cybernetic Right Hindlimb" + id = "teshari_cyber_r_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/right/robot/teshari + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.5) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +//advanced augmentations since those were added in the recent upstream + +/datum/design/teshari_advanced_l_arm + name = "Advanced Raptoral Cybernetic Left Forelimb" + id = "teshari_advanced_l_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/left/robot/teshari_advanced + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 3, + ) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_advanced_r_arm + name = "Advanced Raptoral Cybernetic Right Forelimb" + id = "teshari_advanced_r_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/right/robot/teshari_advanced + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 3, + ) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_advanced_l_leg + name = "Advanced Raptoral Cybernetic Left Hindlimb" + id = "teshari_advanced_l_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/left/robot/teshari_advanced + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 3, + ) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_advanced_r_leg + name = "Advanced Raptoral Cybernetic Right Hindlimb" + id = "teshari_advanced_r_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/right/robot/teshari_advanced + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 3, + ) + construction_time = 8 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) diff --git a/modular_skyrat/modules/tesh_augments/code/robot_bodyparts.dm b/modular_skyrat/modules/tesh_augments/code/robot_bodyparts.dm new file mode 100644 index 00000000000..4a8eaa3f4b9 --- /dev/null +++ b/modular_skyrat/modules/tesh_augments/code/robot_bodyparts.dm @@ -0,0 +1,403 @@ +#define ROBOTIC_LIGHT_BRUTE_MSG "marred" +#define ROBOTIC_MEDIUM_BRUTE_MSG "dented" +#define ROBOTIC_HEAVY_BRUTE_MSG "falling apart" + +#define ROBOTIC_LIGHT_BURN_MSG "scorched" +#define ROBOTIC_MEDIUM_BURN_MSG "charred" +#define ROBOTIC_HEAVY_BURN_MSG "smoldering" + +/* + The damage modifiers here are modified to stay in line with teshari + Although I'm not sure if it's redundant, better safe than sorry. + */ + +#define TESHARI_PUNCH_LOW 2 +#define TESHARI_PUNCH_HIGH 6 + +//Teshari normal + +/obj/item/bodypart/arm/left/robot/teshari + name = "cybernetic left raptoral forelimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + icon_static = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = 1 + burn_modifier = 0.9 + +/obj/item/bodypart/arm/right/robot/teshari + name = "cybernetic right raptoral forelimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = 1 + burn_modifier = 0.9 + +/obj/item/bodypart/leg/left/robot/teshari + name = "cybernetic left raptoral hindlimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = 1 + burn_modifier = 0.9 + +/obj/item/bodypart/leg/right/robot/teshari + name = "cybernetic right raptoral hindlimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = 1 + burn_modifier = 0.9 + +/obj/item/bodypart/chest/robot/teshari + name = "cybernetic raptoral torso" + desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell, covered in a layer of membranous feathers." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + brute_modifier = 1 + burn_modifier = 0.9 + + robotic_emp_paralyze_damage_percent_threshold = 0.5 + +/obj/item/bodypart/head/robot/teshari + name = "cybernetic raptoral head" + desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals. A layer of membranous feathers covers the stark metal." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = 1 + burn_modifier = 0.9 + + head_flags = HEAD_EYESPRITES + +// teshari_ surplus + +/obj/item/bodypart/arm/left/robot/teshari_surplus + name = "prosthetic left raptoral forelimb" + desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/arm/right/robot/teshari_surplus + name = "prosthetic right raptoral forelimb" + desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/left/robot/teshari_surplus + name = "prosthetic left raptoral hindlimb" + desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/right/robot/teshari_surplus + name = "prosthetic right raptoral hindlimb" + desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/arm/left/robot/teshari_surplus + name = "prosthetic left raptoral forelimb" + desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/arm/right/robot/teshari_surplus + name = "prosthetic right raptoral forelimb" + desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/left/robot/teshari_surplus + name = "prosthetic left raptoral hindlimb" + desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/right/robot/teshari_surplus + name = "prosthetic right raptoral hindlimb" + desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 + + brute_modifier = 1.25 + burn_modifier = 1.2 + + max_damage = LIMB_MAX_HP_PROSTHESIS + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_PROSTHESIS + + biological_state = (BIO_METAL|BIO_JOINTED) + +// teshari_ advanced + +/obj/item/bodypart/arm/left/robot/teshari_advanced + name = "advanced left raptoral forelimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 0.8 + burn_modifier = 1 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/arm/right/robot/teshari_advanced + name = "advanced right raptoral forelimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 0.8 + burn_modifier = 1 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/left/robot/teshari_advanced + name = "advanced left raptoral hindlimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 0.8 + burn_modifier = 1 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/right/robot/teshari_advanced + name = "advanced right raptoral hindlimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 0.8 + burn_modifier = 1 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/arm/left/robot/teshari_advanced + name = "advanced left raptoral forelimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 1 + burn_modifier = 0.9 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/arm/right/robot/teshari_advanced + name = "advanced right raptoral forelimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 1 + burn_modifier = 0.9 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/left/robot/teshari_advanced + name = "advanced left raptoral hindlimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 1 + burn_modifier = 0.9 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +/obj/item/bodypart/leg/right/robot/teshari_advanced + name = "advanced right raptoral hindlimb" + desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." + icon_static = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + icon = 'modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + + unarmed_damage_low = TESHARI_PUNCH_LOW * 2 + unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 + + brute_modifier = 1 + burn_modifier = 0.9 + + max_damage = LIMB_MAX_HP_ADVANCED + body_damage_coeff = LIMB_BODY_DAMAGE_COEFFICIENT_ADVANCED + + biological_state = (BIO_METAL|BIO_JOINTED) + +#undef ROBOTIC_LIGHT_BRUTE_MSG +#undef ROBOTIC_MEDIUM_BRUTE_MSG +#undef ROBOTIC_HEAVY_BRUTE_MSG + +#undef ROBOTIC_LIGHT_BURN_MSG +#undef ROBOTIC_MEDIUM_BURN_MSG +#undef ROBOTIC_HEAVY_BURN_MSG + +#undef TESHARI_PUNCH_LOW +#undef TESHARI_PUNCH_HIGH diff --git a/modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi b/modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi new file mode 100644 index 00000000000..4f0c65c2d33 Binary files /dev/null and b/modular_skyrat/modules/tesh_augments/icons/advanced_augments_teshari.dmi differ diff --git a/modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi b/modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi new file mode 100644 index 00000000000..310336182fc Binary files /dev/null and b/modular_skyrat/modules/tesh_augments/icons/augments_teshari.dmi differ diff --git a/modular_skyrat/modules/tesh_augments/icons/sbipc_raptor.dmi b/modular_skyrat/modules/tesh_augments/icons/sbipc_raptor.dmi new file mode 100644 index 00000000000..09c792e0b4c Binary files /dev/null and b/modular_skyrat/modules/tesh_augments/icons/sbipc_raptor.dmi differ diff --git a/modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi b/modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi new file mode 100644 index 00000000000..3863b2a12da Binary files /dev/null and b/modular_skyrat/modules/tesh_augments/icons/surplus_augments_teshari.dmi differ diff --git a/modular_skyrat/modules/tesh_augments/readme.md b/modular_skyrat/modules/tesh_augments/readme.md new file mode 100644 index 00000000000..b43ce34148a --- /dev/null +++ b/modular_skyrat/modules/tesh_augments/readme.md @@ -0,0 +1,5 @@ +/* +teshari_ cybernetics +all done by aKhromatopsia +that's all +*/ diff --git a/modular_skyrat/modules/teshari/code/_teshari.dm b/modular_skyrat/modules/teshari/code/_teshari.dm index 3a7b8e0ee79..606a810a204 100644 --- a/modular_skyrat/modules/teshari/code/_teshari.dm +++ b/modular_skyrat/modules/teshari/code/_teshari.dm @@ -5,6 +5,7 @@ /datum/species/teshari name = "Teshari" id = SPECIES_TESHARI + no_gender_shaping = TRUE // Female uniform shaping breaks Teshari worn sprites, so this is disabled. This will not affect anything else in regards to gender however. eyes_icon = 'modular_skyrat/modules/organs/icons/teshari_eyes.dmi' inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, @@ -38,6 +39,7 @@ bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT + TESHARI_TEMP_OFFSET) bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT + TESHARI_TEMP_OFFSET) species_language_holder = /datum/language_holder/teshari + mutantears = /obj/item/organ/internal/ears/teshari body_size_restricted = TRUE bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/teshari, @@ -58,7 +60,7 @@ /obj/item/organ/internal/tongue/teshari - liked_foodtypes = MEAT + liked_foodtypes = MEAT | GORE | RAW disliked_foodtypes = GROSS | GRAIN @@ -82,3 +84,11 @@ tesh.dna.mutant_bodyparts["tail"] = list(MUTANT_INDEX_NAME = "Teshari (Default)", MUTANT_INDEX_COLOR_LIST = list(base_color, base_color, ear_color)) regenerate_organs(tesh, src, visual_only = TRUE) tesh.update_body(TRUE) + +/datum/species/teshari/on_species_gain(mob/living/carbon/human/new_teshari, datum/species/old_species, pref_load) + . = ..() + passtable_on(new_teshari, SPECIES_TRAIT) + +/datum/species/teshari/on_species_loss(mob/living/carbon/C, datum/species/new_species, pref_load) + . = ..() + passtable_off(C, SPECIES_TRAIT) diff --git a/modular_skyrat/modules/teshari/code/schechi.dm b/modular_skyrat/modules/teshari/code/schechi.dm index 47c2c136cc0..5da75c731b2 100644 --- a/modular_skyrat/modules/teshari/code/schechi.dm +++ b/modular_skyrat/modules/teshari/code/schechi.dm @@ -1,12 +1,14 @@ /datum/language/schechi name = "Schechi" - desc = "The common language of the Teshari, and later adapted by many other avian species, consisting of miscellaneous chirps." + desc = "The very structurally loose creole tongue of the Teshari, host to hundreds of dialects almost different enough to resemble their own languages. \ + Originally developed on Sirisai, Schechi has made its way across the Teshari diaspora as a commonly agreed upon way for entirely different packs to communicate." key = "F" space_chance = 40 syllables = list( "i", "ii", "si", "aci", "hi", "ni", "li", "schi", "tari", "e", "she", "re", "me", "ne", "te", "se", "le", "ai", - "a", "ra", "ca", "scha", "tara", "sa", "la", "na", + "a", "ra", "ca", "scha", "tara", "sa", "la", "na", "ce", + "re", "se", "shi", "ti", "le", "la", "lu", "tu", "shu", ) icon = 'modular_skyrat/master_files/icons/misc/language.dmi' icon_state = "schechi" diff --git a/modular_skyrat/modules/time_clock/code/console_tgui.dm b/modular_skyrat/modules/time_clock/code/console_tgui.dm index 0060e134a46..64b576828d0 100644 --- a/modular_skyrat/modules/time_clock/code/console_tgui.dm +++ b/modular_skyrat/modules/time_clock/code/console_tgui.dm @@ -45,7 +45,7 @@ /obj/item/mod/control/pre_equipped/safeguard, \ /obj/item/gun/energy/cell_loaded/medigun/cmo, \ /obj/item/defibrillator/compact/loaded, \ - /obj/item/storage/hypospraykit/cmo, \ + /obj/item/storage/hypospraykit/cmo/preloaded, \ /obj/item/mod/control/pre_equipped/rescue, \ /obj/item/gun/ballistic/rifle/boltaction/sporterized, \ /obj/item/clothing/glasses/hud/gun_permit/sunglasses, \ diff --git a/modular_skyrat/modules/wrestlingring/code/wrestlingring.dm b/modular_skyrat/modules/wrestlingring/code/wrestlingring.dm index 8c0e09deccc..d865fc0653f 100644 --- a/modular_skyrat/modules/wrestlingring/code/wrestlingring.dm +++ b/modular_skyrat/modules/wrestlingring/code/wrestlingring.dm @@ -113,11 +113,10 @@ deconstruct() return TRUE -/obj/structure/wrestling_corner/deconstruct(disassembled) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/obj/item/stack/sheet/iron/iron_sheets = new /obj/item/stack/sheet/iron(drop_location(), 3) - transfer_fingerprints_to(iron_sheets) - return ..() +/obj/structure/wrestling_corner/atom_deconstruct(disassembled) + . = ..() + var/obj/item/stack/sheet/iron/iron_sheets = new /obj/item/stack/sheet/iron(drop_location(), 3) + transfer_fingerprints_to(iron_sheets) ///Implements behaviour that makes it possible to unanchor the railing. /obj/structure/wrestling_corner/wrench_act(mob/living/user, obj/item/tool) diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm index 337ea135950..eb35953e901 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm @@ -46,6 +46,7 @@ . += span_notice("[scanned ? "This item has been scanned. Max Depth: [max_depth] cm. Safe Depth: [safe_depth] cm." : "This item has not been scanned."]") if(adv_scanned) . += span_notice("The item depth is [item_depth] cm.") + . += span_notice("[measured ? "This item has been measured. Dug Depth: [dug_depth]." : "This item has not been measured."]") if(measured && dug_depth > item_depth) . += span_warning("The rock is crumbling, even just brushing it will destroy it!") @@ -56,9 +57,11 @@ if(1 to 60) hidden_item = pick_weight(GLOB.tier1_reward) choose_tier = REWARD_ONE + if(61 to 87) hidden_item = pick_weight(GLOB.tier2_reward) choose_tier = REWARD_TWO + if(88 to 100) hidden_item = pick_weight(GLOB.tier3_reward) choose_tier = REWARD_THREE @@ -73,6 +76,7 @@ /obj/item/xenoarch/strange_rock/proc/get_measured() if(measured) return FALSE + measured = TRUE return TRUE @@ -82,91 +86,113 @@ if(!adv_scanned && use_advanced) adv_scanned = TRUE return TRUE + return FALSE + scanned = TRUE if(use_advanced) adv_scanned = TRUE + return TRUE /obj/item/xenoarch/strange_rock/proc/try_dig(dig_amount) if(!dig_amount) return DIG_UNDEFINED + dug_depth += dig_amount if(dug_depth > item_depth) qdel(src) return DIG_DELETE + return DIG_ROCK /obj/item/xenoarch/strange_rock/proc/try_uncover() if(dug_depth > item_depth) qdel(src) return BRUSH_DELETE + if(dug_depth == item_depth) new hidden_item(get_turf(src)) qdel(src) return BRUSH_UNCOVER - try_dig(1) + return BRUSH_NONE -/obj/item/xenoarch/strange_rock/attackby(obj/item/I, mob/living/user, params) +/obj/item/xenoarch/strange_rock/attackby(obj/item/attacking_item, mob/living/user, params) . = ..() - if(istype(I, /obj/item/xenoarch/hammer)) - var/obj/item/xenoarch/hammer/xeno_hammer = I + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/research, SKILL_SPEED_MODIFIER) + if(istype(attacking_item, /obj/item/xenoarch/hammer)) + var/obj/item/xenoarch/hammer/xeno_hammer = attacking_item to_chat(user, span_notice("You begin carefully using your hammer.")) - if(!do_after(user, xeno_hammer.dig_speed, target = src)) + if(!do_after(user, xeno_hammer.dig_speed * skill_modifier, target = src)) to_chat(user, span_warning("You interrupt your careful planning, damaging the rock in the process!")) dug_depth += rand(1,5) return + switch(try_dig(xeno_hammer.dig_amount)) if(DIG_UNDEFINED) message_admins("Tell coders something broke with xenoarch hammers and dig amount.") return + if(DIG_DELETE) to_chat(user, span_warning("The rock crumbles, leaving nothing behind.")) return + if(DIG_ROCK) to_chat(user, span_notice("You successfully dig around the item.")) + user.mind.adjust_experience(/datum/skill/research, xeno_hammer.dig_amount) - if(istype(I, /obj/item/xenoarch/brush)) - var/obj/item/xenoarch/brush/xeno_brush = I + if(istype(attacking_item, /obj/item/xenoarch/brush)) + var/obj/item/xenoarch/brush/xeno_brush = attacking_item to_chat(user, span_notice("You begin carefully using your brush.")) - if(!do_after(user, xeno_brush.dig_speed, target = src)) + if(!do_after(user, xeno_brush.dig_speed * skill_modifier, target = src)) to_chat(user, span_warning("You interrupt your careful planning, damaging the rock in the process!")) dug_depth += rand(1,5) return + switch(try_uncover()) if(BRUSH_DELETE) to_chat(user, span_warning("The rock crumbles, leaving nothing behind.")) return + if(BRUSH_UNCOVER) to_chat(user, span_notice("You successfully brush around the item, fully revealing the item!")) + user.mind.adjust_experience(/datum/skill/research, 20) return + if(BRUSH_NONE) to_chat(user, span_notice("You brush around the item, but it wasn't revealed... hammer some more.")) - if(istype(I, /obj/item/xenoarch/tape_measure)) + if(istype(attacking_item, /obj/item/xenoarch/tape_measure)) to_chat(user, span_notice("You begin carefully using your measuring tape.")) - if(!do_after(user, 4 SECONDS, target = src)) + if(!do_after(user, 4 SECONDS * skill_modifier, target = src)) to_chat(user, span_warning("You interrupt your careful planning, damaging the rock in the process!")) dug_depth += rand(1,5) return + if(get_measured()) to_chat(user, span_notice("You successfully attach a holo measuring tape to the strange rock; the strange rock will now report its dug depth always!")) + user.mind.adjust_experience(/datum/skill/research, 5) return + to_chat(user, span_warning("The strange rock was already marked with a holo measuring tape.")) - if(istype(I, /obj/item/xenoarch/handheld_scanner)) - var/obj/item/xenoarch/handheld_scanner/item_scanner = I + if(istype(attacking_item, /obj/item/xenoarch/handheld_scanner)) + var/obj/item/xenoarch/handheld_scanner/item_scanner = attacking_item to_chat(user, span_notice("You begin to scan [src] using [item_scanner].")) - if(!do_after(user, item_scanner.scanning_speed, target = src)) + if(!do_after(user, item_scanner.scanning_speed * skill_modifier, target = src)) to_chat(user, span_warning("You interrupt your scanning, damaging the rock in the process!")) dug_depth += rand(1,5) return + if(get_scanned(item_scanner.scan_advanced)) to_chat(user, span_notice("You successfully attach a holo scanning module to the strange rock; the strange rock will now report its depth information always!")) + user.mind.adjust_experience(/datum/skill/research, 5) if(adv_scanned) to_chat(user, span_notice("The rock's item depth is being reported!")) + return + to_chat(user, span_warning("The strange rock was already marked with a holo scanning module.")) //turfs diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm index f70d56f4920..4a85d2f1957 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm @@ -15,16 +15,21 @@ if(istype(src, /obj/item/xenoarch/useless_relic/magnified)) balloon_alert(user, "already magnified!") return + if(!HAS_TRAIT(user, TRAIT_XENOARCH_QUALIFIED)) balloon_alert(user, "needs training!") // it was very tempting to replace this with "skill issue" return + balloon_alert(user, "starting analysis!") if(!do_after(user, 5 SECONDS, target = src)) balloon_alert(user, "stand still!") return + loc.balloon_alert(user, "magnified!") + user.mind.adjust_experience(/datum/skill/research, 5) spawn_magnified(magnified_number) return + return ..() #define ANCIENT_URN 1 @@ -45,41 +50,49 @@ new_item.desc = "This useless relic is an ancient urn that dates from around [rand(400,600)] years ago. \ It has made of a ceramic substance and is clearly crumbling at the edges. Perhaps it has ashes \ of someone from long ago." + if(ANCIENT_BOWL) new_item.name = "ancient bowl" new_item.desc = "This useless relic is an ancient bowl that dates from around [rand(400,600)] years ago. \ It is made of a bronze alloy and is dented, with some scratches along the inside. Perhaps it could \ have had DNA of someone from long ago." + if(ANCIENT_CROWN) new_item.name = "ancient crown" new_item.desc = "This useless relic is an ancient crown that dates from around [rand(900,1100)] years ago. \ It is made from some unknown alloy, with small inlets that would have been used for jewels. Perhaps if we \ look around, we could find some of those old jewels." + if(ANCIENT_COIL) new_item.name = "ancient coil" new_item.desc = "This useless relic is an ancient coil that dates from around [rand(400,600)] years ago. \ It is made of iron and copper. It has some burn marks around the iron rod. Perhaps later on, we could \ use it for some machines." + if(ANCIENT_LIGHT) new_item.name = "ancient light" new_item.desc = "This useless relic is an ancient light that dates from around [rand(400,600)] years ago. \ It is made of iron and has glass shards around it. It has dents on the iron and clear damage from misuse. \ Perhaps we could research this later on to see how the ancients made lights." + if(ANCIENT_CUP) new_item.name = "ancient cup" new_item.desc = "This useless relic is an ancient cup that dates from around [rand(900,1100)] years ago. \ It is made of hardened stone. There are small cracks all along the surface, as long as chisel marks. \ Perhaps it will give insight into the ancient's eating and drinking habits." + if(ANCIENT_UTENSILS) new_item.name = "ancient utensils" new_item.desc = "These useless relics are ancient utensils that dates from around [rand(900,1100)] years ago. \ It is made of hardened stone. There are small cracks all along the surface, as long as chisel marks. \ Perhaps it will give insight into the ancient's eating and drinking habits." + if(ANCIENT_R_BOWL) new_item.name = "ancient rock bowl" new_item.desc = "This useless relic is an ancient rock bowl that dates from around [rand(900,1100)] years ago. \ It is made of hardened stone. There are small cracks all along the surface, as long as chisel marks. \ Perhaps it will give insight into the ancient's eating and drinking habits." + new_item.desc += " Whatever use it possibly had in the past, its only use now is either as a museum piece, or being sold off to collectors via the Cargo shuttle." qdel(src) diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm index fdb1f2cb7b9..11ad224db55 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm @@ -106,6 +106,7 @@ var/choice = tgui_input_list(user, "Remove the rocks from [src]?", "Rock Removal", list("Yes", "No")) if(choice != "Yes") return + var/turf/src_turf = get_turf(src) for(var/obj/item/removed_item in storage_unit.contents) removed_item.forceMove(src_turf) diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm index 5d58fa29b84..ce0053da047 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm @@ -16,6 +16,7 @@ . = ..() if(advanced) . += span_notice("This is an advanced hammer. It can change its digging depth from 1 to 30. Click to change depth.") + . += span_notice("Current Digging Depth: [dig_amount]cm") /obj/item/xenoarch/hammer/attack_self(mob/user, modifiers) @@ -23,20 +24,24 @@ if(!advanced) to_chat(user, span_warning("This is not an advanced hammer, it cannot change its digging depth.")) return + var/user_choice = input(user, "Choose the digging depth. 1 to 30", "Digging Depth Selection") as null|num if(!user_choice) dig_amount = 1 dig_speed = 1 return + if(dig_amount <= 0) dig_amount = 1 dig_speed = 1 return + var/round_dig = round(user_choice) if(round_dig >= 30) dig_amount = 30 dig_speed = 30 return + dig_amount = round_dig dig_speed = round_dig * 0.5 to_chat(user, span_notice("You change the hammer's digging depth to [round_dig]cm.")) @@ -131,45 +136,61 @@ /obj/item/xenoarch/handheld_recoverer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(!proximity_flag) return + var/turf/target_turf = get_turf(target) if(istype(target, /obj/item/xenoarch/broken_item/tech)) var/spawn_item = pick_weight(GLOB.tech_reward) new spawn_item(target_turf) + user.mind.adjust_experience(/datum/skill/research, 5) qdel(target) return + if(istype(target, /obj/item/xenoarch/broken_item/weapon)) var/spawn_item = pick_weight(GLOB.weapon_reward) new spawn_item(target_turf) + user.mind.adjust_experience(/datum/skill/research, 5) qdel(target) return + if(istype(target, /obj/item/xenoarch/broken_item/illegal)) var/spawn_item = pick_weight(GLOB.illegal_reward) new spawn_item(target_turf) + user.mind.adjust_experience(/datum/skill/research, 5) qdel(target) return + if(istype(target, /obj/item/xenoarch/broken_item/alien)) var/spawn_item = pick_weight(GLOB.alien_reward) new spawn_item(target_turf) + user.mind.adjust_experience(/datum/skill/research, 5) qdel(target) return + if(istype(target, /obj/item/xenoarch/broken_item/plant)) var/spawn_item = pick_weight(GLOB.plant_reward) new spawn_item(target_turf) + user.mind.adjust_experience(/datum/skill/research, 5) qdel(target) return + if(istype(target, /obj/item/xenoarch/broken_item/clothing)) var/spawn_item = pick_weight(GLOB.clothing_reward) new spawn_item(target_turf) + user.mind.adjust_experience(/datum/skill/research, 5) qdel(target) return + if(istype(target, /obj/item/xenoarch/broken_item/animal)) var/spawn_item var/turf/src_turf = get_turf(src) for(var/looptime in 1 to rand(1,4)) spawn_item = pick_weight(GLOB.animal_reward) new spawn_item(src_turf) + + user.mind.adjust_experience(/datum/skill/research, 5) qdel(target) return + return ..() /obj/item/storage/belt/utility/xenoarch @@ -222,8 +243,10 @@ . = ..() if(listeningTo == user) return + if(listeningTo) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(pickup_rocks)) listeningTo = user @@ -231,6 +254,7 @@ . = ..() if(listeningTo) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null /obj/item/storage/bag/xenoarch/proc/pickup_rocks(mob/living/user) @@ -244,17 +268,21 @@ for(var/A in tile) if (!is_type_in_typecache(A, atom_storage.can_hold)) continue + else if(atom_storage.attempt_insert(A, user)) show_message = TRUE + else if(!spam_protection) to_chat(user, span_warning("Your [name] is full and can't hold any more!")) spam_protection = TRUE continue + if(show_message) playsound(user, SFX_RUSTLE, 50, TRUE) user.visible_message(span_notice("[user] scoops up the rocks beneath [user.p_them()]."), \ span_notice("You scoop up the rocks beneath you with your [name].")) + spam_protection = FALSE /obj/item/storage/bag/xenoarch/adv diff --git a/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm b/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm index c4297e8babd..a4b57732f68 100644 --- a/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm +++ b/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm @@ -7,6 +7,7 @@ base_pixel_x = -16 //All of the xeno sprites are 64x64, and we want them to be level with the tile they are on, much like oversized quirk users mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles + plane = ABOVE_GAME_PLANE maptext_height = 64 maptext_width = 64 pressure_resistance = 200 diff --git a/modular_zubbers/code/datums/brain_damage/magic.dm b/modular_zubbers/code/datums/brain_damage/magic.dm index 093c317b3e6..4325f36dd77 100644 --- a/modular_zubbers/code/datums/brain_damage/magic.dm +++ b/modular_zubbers/code/datums/brain_damage/magic.dm @@ -16,6 +16,7 @@ ///When the trauma is removed from a mob. /datum/brain_trauma/special/bluespace_prophet/phobetor/on_lose(silent) + . = ..() for(var/obj/effect/client_image_holder/phobetor/phobetor_tears as anything in created_firsts) qdel(phobetor_tears) diff --git a/modular_zubbers/code/game/machinery/camera/camera.dm b/modular_zubbers/code/game/machinery/camera/camera.dm index 12146e601b0..af3b8bf870a 100644 --- a/modular_zubbers/code/game/machinery/camera/camera.dm +++ b/modular_zubbers/code/game/machinery/camera/camera.dm @@ -22,7 +22,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/autoname/toxins, 0) /obj/machinery/camera/autoname/bombsite network = list("toxins","ordnance","rd") use_power = NO_POWER_USE //Test site is an unpowered area - invuln = TRUE + resistance_flags = INDESTRUCTIBLE light_range = 10 start_active = TRUE diff --git a/modular_zubbers/code/game/machinery/medipen_refiller.dm b/modular_zubbers/code/game/machinery/medipen_refiller.dm index f989321eb6f..2bb42d131f0 100644 --- a/modular_zubbers/code/game/machinery/medipen_refiller.dm +++ b/modular_zubbers/code/game/machinery/medipen_refiller.dm @@ -32,7 +32,6 @@ medipen.add_initial_reagents() reagents.remove_reagent(moreallowed_pens[medipen.type], 10) balloon_alert(user, "refilled") - use_power(active_power_usage) cut_overlays() return return ..() diff --git a/modular_zubbers/code/game/objects/structures/chalkboard.dm b/modular_zubbers/code/game/objects/structures/chalkboard.dm index b435aa5daf1..6466e9779e8 100644 --- a/modular_zubbers/code/game/objects/structures/chalkboard.dm +++ b/modular_zubbers/code/game/objects/structures/chalkboard.dm @@ -62,7 +62,8 @@ deconstruct() return ITEM_INTERACT_SUCCESS -/obj/structure/chalkboard/deconstruct(disassembled = TRUE) +/obj/structure/chalkboard/handle_deconstruct(disassembled = TRUE) + . = ..() if(!(obj_flags & NO_DECONSTRUCTION)) new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) qdel(src) diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/procs.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/procs.dm index 907e216e75a..bdcd7accda2 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/procs.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/procs.dm @@ -39,7 +39,7 @@ if(broke_masquerade) return owner.current.playsound_local(null, 'modular_zubbers/sound/bloodsucker/lunge_warn.ogg', 100, FALSE, pressure_affected = FALSE) - to_chat(owner.current, span_cultboldtalic("You have broken the Masquerade!")) + to_chat(owner.current, span_cult_bold_italic("You have broken the Masquerade!")) to_chat(owner.current, span_warning("Bloodsucker Tip: When you break the Masquerade, you become open for termination by fellow Bloodsuckers, and your Vassals are no longer completely loyal to you, as other Bloodsuckers can steal them for themselves!")) broke_masquerade = TRUE antag_hud_name = "masquerade_broken" @@ -50,7 +50,7 @@ /datum/antagonist/bloodsucker/proc/fix_masquerade(mob/admin) if(!broke_masquerade) return - to_chat(owner.current, span_cultboldtalic("You have re-entered the Masquerade.")) + to_chat(owner.current, span_cult_bold_italic("You have re-entered the Masquerade.")) broke_masquerade = FALSE antag_hud_name = "bloodsucker" add_team_hud(owner.current) @@ -62,7 +62,7 @@ if(masquerade_infractions >= 3) break_masquerade() else - to_chat(owner.current, span_cultbold("You violated the Masquerade! Break the Masquerade [3 - masquerade_infractions] more times and you will become a criminal to the Bloodsucker's Cause!")) + to_chat(owner.current, span_cult_bold("You violated the Masquerade! Break the Masquerade [3 - masquerade_infractions] more times and you will become a criminal to the Bloodsucker's Cause!")) /datum/antagonist/bloodsucker/proc/RankUp(force = FALSE) if(!owner || !owner.current) diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/clans/clan_malkavian.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/clans/clan_malkavian.dm index a63a31d14ea..026d09b5656 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/clans/clan_malkavian.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/clans/clan_malkavian.dm @@ -83,7 +83,7 @@ /datum/bloodsucker_clan/malkavian/on_final_death(datum/antagonist/bloodsucker/source) var/obj/item/soulstone/bloodsucker/stone = new /obj/item/soulstone/bloodsucker(get_turf(bloodsuckerdatum.owner.current)) - stone.capture_soul(bloodsuckerdatum.owner.current, forced = TRUE, bloodsuckerdatum = bloodsuckerdatum) + ASYNC stone.capture_soul(bloodsuckerdatum.owner.current, forced = TRUE, bloodsuckerdatum = bloodsuckerdatum) return DONT_DUST /datum/bloodsucker_clan/malkavian/proc/on_bloodsucker_broke_masquerade(datum/antagonist/bloodsucker/masquerade_breaker) diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/structures/coffin.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/structures/coffin.dm index acb5f4befe4..c25b602cdb0 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/structures/coffin.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/structures/coffin.dm @@ -181,9 +181,9 @@ if(bloodsucker_structure.owner == resident) bloodsucker_structure.unbolt() if(manual) - to_chat(resident, span_cultitalic("You have unclaimed your coffin! This also unclaims all your other Bloodsucker structures!")) + to_chat(resident, span_cult_italic("You have unclaimed your coffin! This also unclaims all your other Bloodsucker structures!")) else - to_chat(resident, span_cultitalic("You sense that the link with your coffin and your sacred lair has been broken! You will need to seek another.")) + to_chat(resident, span_cult_italic("You sense that the link with your coffin and your sacred lair has been broken! You will need to seek another.")) // Remove resident. Because this object isnt removed from the game immediately (GC?) we need to give them a way to see they don't have a home anymore. resident = null diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/structures/crypt.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/structures/crypt.dm index fa5fbc74bb6..5e47c85d1e4 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/structures/crypt.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/structures/crypt.dm @@ -138,7 +138,7 @@ . += span_cult("You can support a total of [convert_integer_to_words(bloodsuckerdatum.max_vassals())] [bloodsuckerdatum.max_vassals() == 1 ? "vassal" : "vassals"], \ with [convert_integer_to_words(bloodsuckerdatum.free_vassal_slots())] [bloodsuckerdatum.free_vassal_slots() == 1 ? "slot" : "slots"] remaining.") -/obj/structure/bloodsucker/vassalrack/deconstruct(disassembled = TRUE) +/obj/structure/bloodsucker/vassalrack/handle_deconstruct(disassembled = TRUE) . = ..() new /obj/item/stack/sheet/iron(src.loc, 4) new /obj/item/stack/rods(loc, 4) @@ -593,7 +593,7 @@ return var/message = speech_args[SPEECH_MESSAGE] var/mob/living/carbon/human/user = source - var/rendered = span_cultlarge("[user.real_name]: [capitalize(message)]") + var/rendered = span_cult_large("[user.real_name]: [capitalize(message)]") user.log_talk(message, LOG_SAY, tag = ROLE_BLOODSUCKER) var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(/datum/antagonist/bloodsucker) for(var/datum/antagonist/vassal/receiver as anything in bloodsuckerdatum.vassals) diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm index 380fc6d43c0..96c8de0937a 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm @@ -166,7 +166,7 @@ owner.current.playsound_local(null, 'sound/magic/mutate.ogg', 100, FALSE, pressure_affected = FALSE) /// Message told to your (former) Master. if(master && master.owner) - to_chat(master.owner, span_cultbold("You feel the bond with your vassal [owner.current] has somehow been broken!")) + to_chat(master.owner, span_cult_bold("You feel the bond with your vassal [owner.current] has somehow been broken!")) /datum/antagonist/vassal/admin_add(datum/mind/new_owner, mob/admin) var/list/datum/mind/possible_vampires = list() diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm index 7db0640fadc..9d9c74e8300 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm @@ -75,11 +75,11 @@ SIGNAL_HANDLER if(COOLDOWN_TIMELEFT(src, blood_timer) <= BLOOD_TIMER_HALWAY + 2 && COOLDOWN_TIMELEFT(src, blood_timer) >= BLOOD_TIMER_HALWAY - 2) //just about halfway - to_chat(owner.current, span_cultbold("You need new blood from your Master!")) + to_chat(owner.current, span_cult_bold("You need new blood from your Master!")) if(!COOLDOWN_FINISHED(src, blood_timer)) return - to_chat(owner.current, span_cultbold("You are out of blood!")) - to_chat(revenge_vassal.owner.current, span_cultbold("[owner.current] has ran out of blood and is no longer in the fold!")) + to_chat(owner.current, span_cult_bold("You are out of blood!")) + to_chat(revenge_vassal.owner.current, span_cult_bold("[owner.current] has ran out of blood and is no longer in the fold!")) owner.remove_antag_datum(/datum/antagonist/ex_vassal) diff --git a/modular_zubbers/code/modules/antagonists/malf/remove_malf.dm b/modular_zubbers/code/modules/antagonists/malf/remove_malf.dm index f82509a84ac..a2587ec072a 100644 --- a/modular_zubbers/code/modules/antagonists/malf/remove_malf.dm +++ b/modular_zubbers/code/modules/antagonists/malf/remove_malf.dm @@ -12,7 +12,6 @@ . = TRUE /obj/machinery/computer/aifixer/proc/run_antivirus() - use_power(1000) while(occupier && restoring) sleep(2 SECONDS) if(prob(25)) diff --git a/modular_zubbers/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/modular_zubbers/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 072a57d7588..2e5b7145491 100644 --- a/modular_zubbers/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/modular_zubbers/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -19,4 +19,3 @@ if(delta_temperature > 0) environment.temperature += delta_temperature air_update_turf(FALSE, FALSE) - use_power(required_energy / efficiency) diff --git a/modular_zubbers/code/modules/hydroponics/gene_modder.dm b/modular_zubbers/code/modules/hydroponics/gene_modder.dm index 298dd9704dc..27bec35eb8d 100644 --- a/modular_zubbers/code/modules/hydroponics/gene_modder.dm +++ b/modular_zubbers/code/modules/hydroponics/gene_modder.dm @@ -373,7 +373,7 @@ /obj/machinery/plantgenes/proc/eject_disk() if (disk && !operation) - if(Adjacent(usr) && !issiliconoradminghost(usr)) + if(Adjacent(usr)) if (!usr.put_in_hands(disk)) disk.forceMove(drop_location()) else @@ -383,7 +383,7 @@ /obj/machinery/plantgenes/proc/eject_seed() if (seed && !operation) - if(Adjacent(usr) && !issiliconoradminghost(usr)) + if(Adjacent(usr)) if (!usr.put_in_hands(seed)) seed.forceMove(drop_location()) else diff --git a/modular_zubbers/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm b/modular_zubbers/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm index 39575fd8468..0567ba5cdce 100644 --- a/modular_zubbers/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm +++ b/modular_zubbers/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm @@ -20,7 +20,11 @@ bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 35) meat = /obj/item/food/meat/slab/human/mutant/feline //you monster! skinned_type = /obj/item/stack/sheet/animalhide/cat - ass_image = 'modular_zubbers/icons/ass/asstajara.png' + +/obj/item/bodypart/chest/mutant/tajaran +/obj/item/bodypart/chest/mutant/tajaran/get_butt_sprite() + var/ass_image = 'modular_zubbers/icons/ass/asstajara.png' + return ass_image //Tajaran tongue /obj/item/organ/internal/tongue/cat/tajaran @@ -103,7 +107,8 @@ ) return to_add - +/obj/item/bodypart/chest/tajaran/get_butt_sprite() + return BUTT_SPRITE_FUZZY /datum/species/tajaran/get_species_description() //Something basic until I make lore later return "The Tajara are a race of humanoids that possess markedly felinoid traits that include \ a semi-prehensile tail, a body covered in fur of varying shades, and padded, digitigrade feet. \ diff --git a/modular_zubbers/modules/shelves/shelf.dm b/modular_zubbers/modules/shelves/shelf.dm index a86bdd64c0e..6325f5e07a8 100644 --- a/modular_zubbers/modules/shelves/shelf.dm +++ b/modular_zubbers/modules/shelves/shelf.dm @@ -113,7 +113,7 @@ return TRUE return FALSE // If the do_after() is interrupted, return FALSE! -/obj/structure/cargo_shelf/deconstruct(disassembled = TRUE) +/obj/structure/cargo_shelf/handle_deconstruct(disassembled = TRUE) var/turf/dump_turf = drop_location() for(var/obj/structure/closet/crate/crate in shelf_contents) crate.layer = initial(crate.layer) // Reset the crates back to default visual state @@ -176,7 +176,8 @@ qdel(src) building = FALSE -/obj/structure/cargo_shelf/deconstruct(disassembled = TRUE) +/obj/structure/cargo_shelf/handle_deconstruct(disassembled = TRUE) + . = ..() if(!(obj_flags & NO_DECONSTRUCTION)) set_density(FALSE) var/obj/item/rack_parts/cargo_shelf/newparts = new(loc) @@ -202,7 +203,8 @@ qdel(src) building = FALSE -/obj/structure/rack/gunrack/deconstruct(disassembled = TRUE) +/obj/structure/rack/gunrack/handle_deconstruct(disassembled = TRUE) + . = ..() if(!(obj_flags & NO_DECONSTRUCTION)) set_density(FALSE) var/obj/item/rack_parts/gun/newparts = new(loc) @@ -228,7 +230,8 @@ qdel(src) building = FALSE -/obj/structure/rack/shelf/deconstruct(disassembled = TRUE) +/obj/structure/rack/shelf/handle_deconstruct(disassembled = TRUE) + . = ..() if(!(obj_flags & NO_DECONSTRUCTION)) set_density(FALSE) var/obj/item/rack_parts/shelf/newparts = new(loc) diff --git a/modular_zubbers/modules/tesh-vali_augments/code/__DEFINES/research/research_categories.dm b/modular_zubbers/modules/tesh-vali_augments/code/__DEFINES/research/research_categories.dm deleted file mode 100644 index 671b72a8ddb..00000000000 --- a/modular_zubbers/modules/tesh-vali_augments/code/__DEFINES/research/research_categories.dm +++ /dev/null @@ -1 +0,0 @@ -#define RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL "/Raptoral" diff --git a/sound/ambience/antag/spy.ogg b/sound/ambience/antag/spy.ogg new file mode 100644 index 00000000000..1a5c64a3979 Binary files /dev/null and b/sound/ambience/antag/spy.ogg differ diff --git a/sound/ambience/license.txt b/sound/ambience/license.txt index 607dd6628e7..a0b6efb24c5 100644 --- a/sound/ambience/license.txt +++ b/sound/ambience/license.txt @@ -1,4 +1,4 @@ -ambidet1.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC-BY 3.0 license. +ambidet1.ogg and spy.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC-BY 3.0 license. It has been cropped for use ingame. ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed under CC-BY 3.0 license. It has been cropped for use ingame, and also fades in. diff --git a/sound/attributions.txt b/sound/attributions.txt index 82486a5735d..c81aa3e664b 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -117,6 +117,9 @@ https://freesound.org/people/humanoide9000/sounds/330293/ reel1.ogg, reel2.ogg, reel3.ogg, reel4.ogg and reel5.ogg adapted from pixabay. Free for use under the Pixabay Content License (https://pixabay.com/service/license-summary/): https://pixabay.com/sound-effects/reel-78063/ +rattle1.ogg, rattle2.ogg and rattle3.ogg adapted from pixabay. Free for use under the Pixabay Content License (https://pixabay.com/service/license-summary/): +https://pixabay.com/sound-effects/chain-6073/ + throw.ogg, throwhard.ogg and throwsoft.ogg (Royalty-Free and Copyright-Free) are adapted from Jam FX, SmartSound FX and Epic Stock Media in : https://uppbeat.io/sfx/whoosh-swift-cut/7727/23617 https://uppbeat.io/sfx/whoosh-air-punch/114/1168 diff --git a/sound/effects/footstep/moffstep01.ogg b/sound/effects/footstep/moffstep01.ogg new file mode 100644 index 00000000000..6350cb057bf Binary files /dev/null and b/sound/effects/footstep/moffstep01.ogg differ diff --git a/sound/effects/kaching.ogg b/sound/effects/kaching.ogg new file mode 100644 index 00000000000..ea642a56a9b Binary files /dev/null and b/sound/effects/kaching.ogg differ diff --git a/sound/items/rattle1.ogg b/sound/items/rattle1.ogg new file mode 100644 index 00000000000..71c4110fafe Binary files /dev/null and b/sound/items/rattle1.ogg differ diff --git a/sound/items/rattle2.ogg b/sound/items/rattle2.ogg new file mode 100644 index 00000000000..30f0e2d85ea Binary files /dev/null and b/sound/items/rattle2.ogg differ diff --git a/sound/items/rattle3.ogg b/sound/items/rattle3.ogg new file mode 100644 index 00000000000..ef1cfc6bf6b Binary files /dev/null and b/sound/items/rattle3.ogg differ diff --git a/sound/weapons/minebot_rocket.ogg b/sound/weapons/minebot_rocket.ogg new file mode 100644 index 00000000000..f8749a15e18 Binary files /dev/null and b/sound/weapons/minebot_rocket.ogg differ diff --git a/strings/antagonist_flavor/spy_objective.json b/strings/antagonist_flavor/spy_objective.json new file mode 100644 index 00000000000..aa696baad6f --- /dev/null +++ b/strings/antagonist_flavor/spy_objective.json @@ -0,0 +1,84 @@ +{ + "objective_body": [ + "Assassinate a high profile crewmember without being caught.", + "Cause a disaster to shake the station.", + "Cause a station evacuation.", + "Deprive the station of as many @pick(stealables) as you can.", + "Ensure @pick(department) is @pick(affected) by the end of the shift.", + "Ensure @pick(location) is @pick(affected) by the end of the shift.", + "Ensure no heads of staff @pick(escape) the station.", + "Ensure no members of @pick(department) @pick(escape) the station.", + "Ensure no rival @pick(rivals) @pick(escape) the station.", + "Frame a crewmember for a crime.", + "Free the station's AI from its laws.", + "Halt the station's @pick(happenings).", + "Invoke a mutiny against the heads of staff.", + "Make it difficult, but not impossible to @pick(escape) the station.", + "Sabotage the station's power grid or engine.", + "Steal as many @pick(stealables) as you can.", + "Take control of the station as the new Captain.", + "Take hostages of high value crewmembers and demand a ransom." + ], + "department": [ + "Security", + "Engineering", + "Medical", + "Science", + "Supply" + ], + "location": [ + "engineering", + "genetics", + "hydroponics", + "medbay", + "the bar", + "the bridge", + "the brig", + "the cargo bay", + "the chapel", + "the kitchen", + "the library", + "xenobiology" + ], + "happenings": [ + "research", + "cargo operations", + "communications", + "genetic research", + "mining operation" + ], + "affected": [ + "ablaze", + "burning", + "covered in blood", + "demolished", + "destroyed", + "engulfed in flames", + "obliterated", + "on fire", + "ruined", + "sabotaged", + "wrecked" + ], + "rivals": [ + "agents", + "moles", + "operatives", + "spies", + "traitors" + ], + "stealables": [ + "items", + "objects", + "things", + "tools", + "weapons" + ], + "escape": [ + "depart", + "escape", + "evacuate", + "flee", + "leave" + ] +} diff --git a/tgstation.dme b/tgstation.dme index 71a71424976..93b5d310b55 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -93,7 +93,6 @@ #include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\firealarm.dm" #include "code\__DEFINES\fish.dm" -#include "code\__DEFINES\flora.dm" #include "code\__DEFINES\font_awesome_icons.dm" #include "code\__DEFINES\fonts.dm" #include "code\__DEFINES\food.dm" @@ -154,6 +153,7 @@ #include "code\__DEFINES\mood.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" +#include "code\__DEFINES\movement_info.dm" #include "code\__DEFINES\movespeed_modification.dm" #include "code\__DEFINES\multiz.dm" #include "code\__DEFINES\nitrile.dm" @@ -203,6 +203,7 @@ #include "code\__DEFINES\screentips.dm" #include "code\__DEFINES\security.dm" #include "code\__DEFINES\shuttles.dm" +#include "code\__DEFINES\si.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\skills.dm" #include "code\__DEFINES\song.dm" @@ -266,6 +267,7 @@ #include "code\__DEFINES\ai\pet_commands.dm" #include "code\__DEFINES\ai\pets.dm" #include "code\__DEFINES\ai\simplemob.dm" +#include "code\__DEFINES\ai\slime.dm" #include "code\__DEFINES\ai\tourist.dm" #include "code\__DEFINES\ai\trader.dm" #include "code\__DEFINES\ai\vending.dm" @@ -293,6 +295,7 @@ #include "code\__DEFINES\dcs\signals\signals_backpack.dm" #include "code\__DEFINES\dcs\signals\signals_beam.dm" #include "code\__DEFINES\dcs\signals\signals_bitrunning.dm" +#include "code\__DEFINES\dcs\signals\signals_blackmarket.dm" #include "code\__DEFINES\dcs\signals\signals_blob.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" #include "code\__DEFINES\dcs\signals\signals_camera.dm" @@ -333,12 +336,12 @@ #include "code\__DEFINES\dcs\signals\signals_music.dm" #include "code\__DEFINES\dcs\signals\signals_object.dm" #include "code\__DEFINES\dcs\signals\signals_operating_computer.dm" +#include "code\__DEFINES\dcs\signals\signals_operatives.dm" #include "code\__DEFINES\dcs\signals\signals_painting.dm" #include "code\__DEFINES\dcs\signals\signals_proxmonitor.dm" #include "code\__DEFINES\dcs\signals\signals_radiation.dm" #include "code\__DEFINES\dcs\signals\signals_reagent.dm" #include "code\__DEFINES\dcs\signals\signals_restaurant.dm" -#include "code\__DEFINES\dcs\signals\signals_saboteur.dm" #include "code\__DEFINES\dcs\signals\signals_scangate.dm" #include "code\__DEFINES\dcs\signals\signals_screentips.dm" #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" @@ -417,6 +420,7 @@ #include "code\__DEFINES\~skyrat_defines\faction.dm" #include "code\__DEFINES\~skyrat_defines\factions.dm" #include "code\__DEFINES\~skyrat_defines\flavor_defines.dm" +#include "code\__DEFINES\~skyrat_defines\food.dm" #include "code\__DEFINES\~skyrat_defines\game_options.dm" #include "code\__DEFINES\~skyrat_defines\hud.dm" #include "code\__DEFINES\~skyrat_defines\id_cards.dm" @@ -467,6 +471,7 @@ #include "code\__DEFINES\~skyrat_defines\vv.dm" #include "code\__DEFINES\~skyrat_defines\wounds.dm" #include "code\__DEFINES\~skyrat_defines\_globalvars\bitfields.dm" +#include "code\__DEFINES\~skyrat_defines\_globalvars\food.dm" #include "code\__DEFINES\~skyrat_defines\_globalvars\logging.dm" #include "code\__DEFINES\~skyrat_defines\_globalvars\lists\mapping.dm" #include "code\__DEFINES\~skyrat_defines\_HELPERS\atmos_mapping_helpers.dm" @@ -725,6 +730,8 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\ban_cache.dm" +#include "code\controllers\subsystem\battle_royale.dm" +#include "code\controllers\subsystem\bitrunning.dm" #include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\blackmarket.dm" #include "code\controllers\subsystem\chat.dm" @@ -736,14 +743,12 @@ #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\early_assets.dm" #include "code\controllers\subsystem\economy.dm" -#include "code\controllers\subsystem\eigenstate.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\explosions.dm" #include "code\controllers\subsystem\fluids.dm" #include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\id_access.dm" -#include "code\controllers\subsystem\idlenpcpool.dm" #include "code\controllers\subsystem\init_profiler.dm" #include "code\controllers\subsystem\input.dm" #include "code\controllers\subsystem\ipintel.dm" @@ -832,6 +837,7 @@ #include "code\controllers\subsystem\persistence\custom_outfits.dm" #include "code\controllers\subsystem\persistence\engravings.dm" #include "code\controllers\subsystem\persistence\photo_albums.dm" +#include "code\controllers\subsystem\persistence\piggy_banks.dm" #include "code\controllers\subsystem\persistence\recipes.dm" #include "code\controllers\subsystem\persistence\scars.dm" #include "code\controllers\subsystem\persistence\tattoos.dm" @@ -840,7 +846,7 @@ #include "code\controllers\subsystem\processing\ai_basic_avoidance.dm" #include "code\controllers\subsystem\processing\ai_behaviors.dm" #include "code\controllers\subsystem\processing\antag_hud.dm" -#include "code\controllers\subsystem\processing\aura_healing.dm" +#include "code\controllers\subsystem\processing\aura.dm" #include "code\controllers\subsystem\processing\clock_component.dm" #include "code\controllers\subsystem\processing\conveyors.dm" #include "code\controllers\subsystem\processing\digital_clock.dm" @@ -867,12 +873,14 @@ #include "code\datums\candidate_poll.dm" #include "code\datums\chat_payload.dm" #include "code\datums\chatmessage.dm" +#include "code\datums\cogbar.dm" #include "code\datums\dash_weapon.dm" #include "code\datums\datum.dm" #include "code\datums\datumvars.dm" #include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" #include "code\datums\ductnet.dm" +#include "code\datums\eigenstate.dm" #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\hailer_phrase.dm" @@ -978,6 +986,7 @@ #include "code\datums\ai\basic_mobs\basic_ai_behaviors\find_parent.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\nearest_targeting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\pick_up_item.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\pull_target.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\run_away_from_target.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\set_travel_destination.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\step_towards_turf.dm" @@ -1113,7 +1122,6 @@ #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\attached_sticker.dm" #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" #include "code\datums\components\basic_inhands.dm" @@ -1210,7 +1218,6 @@ #include "code\datums\components\jukebox.dm" #include "code\datums\components\keep_me_secure.dm" #include "code\datums\components\knockoff.dm" -#include "code\datums\components\label.dm" #include "code\datums\components\leash.dm" #include "code\datums\components\life_link.dm" #include "code\datums\components\light_eater.dm" @@ -1234,7 +1241,6 @@ #include "code\datums\components\omen.dm" #include "code\datums\components\on_hit_effect.dm" #include "code\datums\components\onwear_mood.dm" -#include "code\datums\components\orbit_poll.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\overlay_lighting.dm" #include "code\datums\components\palette.dm" @@ -1257,6 +1263,7 @@ #include "code\datums\components\recharging_attacks.dm" #include "code\datums\components\redirect_attack_hand_from_turf.dm" #include "code\datums\components\reflection.dm" +#include "code\datums\components\regenerative_shield.dm" #include "code\datums\components\regenerator.dm" #include "code\datums\components\religious_tool.dm" #include "code\datums\components\rename.dm" @@ -1278,6 +1285,7 @@ #include "code\datums\components\shy_in_room.dm" #include "code\datums\components\sign_language.dm" #include "code\datums\components\simple_access.dm" +#include "code\datums\components\simple_bodycam.dm" #include "code\datums\components\singularity.dm" #include "code\datums\components\sitcomlaughter.dm" #include "code\datums\components\sizzle.dm" @@ -1296,6 +1304,7 @@ #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\stationstuck.dm" +#include "code\datums\components\sticker.dm" #include "code\datums\components\storm_hating.dm" #include "code\datums\components\strong_pull.dm" #include "code\datums\components\subtype_picker.dm" @@ -1463,18 +1472,20 @@ #include "code\datums\elements\attack_equip.dm" #include "code\datums\elements\backblast.dm" #include "code\datums\elements\bane.dm" -#include "code\datums\elements\basic_body_temp_sensitive.dm" #include "code\datums\elements\basic_eating.dm" +#include "code\datums\elements\basic_health_examine.dm" #include "code\datums\elements\beauty.dm" #include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\befriend_petting.dm" #include "code\datums\elements\blocks_explosives.dm" +#include "code\datums\elements\body_temp_sensitive.dm" #include "code\datums\elements\bombable_turf.dm" #include "code\datums\elements\bonus_damage.dm" #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\bugkiller_reagent.dm" #include "code\datums\elements\bump_click.dm" #include "code\datums\elements\can_barricade.dm" +#include "code\datums\elements\can_shatter.dm" #include "code\datums\elements\caseless.dm" #include "code\datums\elements\chemical_transfer.dm" #include "code\datums\elements\chewable.dm" @@ -1529,6 +1540,7 @@ #include "code\datums\elements\hostile_machine.dm" #include "code\datums\elements\human_biter.dm" #include "code\datums\elements\immerse.dm" +#include "code\datums\elements\inverted_movement.dm" #include "code\datums\elements\item_fov.dm" #include "code\datums\elements\item_scaling.dm" #include "code\datums\elements\kneecapping.dm" @@ -1541,6 +1553,7 @@ #include "code\datums\elements\light_eater.dm" #include "code\datums\elements\loomable.dm" #include "code\datums\elements\mirage_border.dm" +#include "code\datums\elements\mob_access.dm" #include "code\datums\elements\mob_grabber.dm" #include "code\datums\elements\mob_killed_tally.dm" #include "code\datums\elements\move_force_on_death.dm" @@ -1568,7 +1581,6 @@ #include "code\datums\elements\rust.dm" #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\series.dm" -#include "code\datums\elements\shatters_when_thrown.dm" #include "code\datums\elements\sideway_movement.dm" #include "code\datums\elements\simple_flying.dm" #include "code\datums\elements\skill_reward.dm" @@ -1578,7 +1590,6 @@ #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\squish_sound.dm" -#include "code\datums\elements\sticker.dm" #include "code\datums\elements\strippable.dm" #include "code\datums\elements\structure_repair.dm" #include "code\datums\elements\swabbable.dm" @@ -1586,6 +1597,7 @@ #include "code\datums\elements\tenacious.dm" #include "code\datums\elements\tiny_mob_hunter.dm" #include "code\datums\elements\tool_flash.dm" +#include "code\datums\elements\toy_talk.dm" #include "code\datums\elements\turf_transparency.dm" #include "code\datums\elements\undertile.dm" #include "code\datums\elements\unfriend_attacker.dm" @@ -1741,6 +1753,7 @@ #include "code\datums\proximity_monitor\fields\timestop.dm" #include "code\datums\quirks\_quirk.dm" #include "code\datums\quirks\_quirk_constant_data.dm" +#include "code\datums\quirks\negative_quirks\addict.dm" #include "code\datums\quirks\negative_quirks\all_nighter.dm" #include "code\datums\quirks\negative_quirks\allergic.dm" #include "code\datums\quirks\negative_quirks\bad_back.dm" @@ -1765,7 +1778,6 @@ #include "code\datums\quirks\negative_quirks\illiterate.dm" #include "code\datums\quirks\negative_quirks\indebted.dm" #include "code\datums\quirks\negative_quirks\insanity.dm" -#include "code\datums\quirks\negative_quirks\junkie.dm" #include "code\datums\quirks\negative_quirks\light_drinker.dm" #include "code\datums\quirks\negative_quirks\mute.dm" #include "code\datums\quirks\negative_quirks\nearsighted.dm" @@ -1786,6 +1798,7 @@ #include "code\datums\quirks\negative_quirks\unstable.dm" #include "code\datums\quirks\negative_quirks\unusual.dm" #include "code\datums\quirks\neutral_quirks\bald.dm" +#include "code\datums\quirks\neutral_quirks\borg_ready.dm" #include "code\datums\quirks\neutral_quirks\colorist.dm" #include "code\datums\quirks\neutral_quirks\deviant_tastes.dm" #include "code\datums\quirks\neutral_quirks\extrovert.dm" @@ -1880,10 +1893,16 @@ #include "code\datums\status_effects\song_effects.dm" #include "code\datums\status_effects\stacking_effect.dm" #include "code\datums\status_effects\wound_effects.dm" -#include "code\datums\status_effects\buffs\food_haste.dm" -#include "code\datums\status_effects\buffs\food_traits.dm" #include "code\datums\status_effects\buffs\stop_drop_roll.dm" #include "code\datums\status_effects\buffs\stun_absorption.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" +#include "code\datums\status_effects\buffs\bioware\ligaments.dm" +#include "code\datums\status_effects\buffs\bioware\nerves.dm" +#include "code\datums\status_effects\buffs\food\chilling.dm" +#include "code\datums\status_effects\buffs\food\food_traits.dm" +#include "code\datums\status_effects\buffs\food\haste.dm" #include "code\datums\status_effects\debuffs\blindness.dm" #include "code\datums\status_effects\debuffs\choke.dm" #include "code\datums\status_effects\debuffs\confusion.dm" @@ -1905,7 +1924,6 @@ #include "code\datums\status_effects\debuffs\screen_blur.dm" #include "code\datums\status_effects\debuffs\screwy_hud.dm" #include "code\datums\status_effects\debuffs\silenced.dm" -#include "code\datums\status_effects\debuffs\slimed.dm" #include "code\datums\status_effects\debuffs\spacer.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" #include "code\datums\status_effects\debuffs\staggered.dm" @@ -1913,6 +1931,9 @@ #include "code\datums\status_effects\debuffs\strandling.dm" #include "code\datums\status_effects\debuffs\terrified.dm" #include "code\datums\status_effects\debuffs\tower_of_babel.dm" +#include "code\datums\status_effects\debuffs\slime\slime_food.dm" +#include "code\datums\status_effects\debuffs\slime\slime_leech.dm" +#include "code\datums\status_effects\debuffs\slime\slimed.dm" #include "code\datums\storage\storage.dm" #include "code\datums\storage\subtypes\backpack.dm" #include "code\datums\storage\subtypes\bag_of_holding.dm" @@ -1942,6 +1963,7 @@ #include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\collar_bomb.dm" #include "code\datums\wires\conveyor.dm" #include "code\datums\wires\ecto_sniffer.dm" #include "code\datums\wires\emitter.dm" @@ -2072,6 +2094,7 @@ #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\nebula_shielding.dm" #include "code\game\machinery\PDApainter.dm" +#include "code\game\machinery\photobooth.dm" #include "code\game\machinery\prisongate.dm" #include "code\game\machinery\prisonlabor.dm" #include "code\game\machinery\quantum_pad.dm" @@ -2097,7 +2120,7 @@ #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\camera_construction.dm" #include "code\game\machinery\camera\motion.dm" #include "code\game\machinery\camera\presets.dm" #include "code\game\machinery\camera\trackable.dm" @@ -2219,6 +2242,7 @@ #include "code\game\objects\effects\info.dm" #include "code\game\objects\effects\landmarks.dm" #include "code\game\objects\effects\lighting.dm" +#include "code\game\objects\effects\material_insert.dm" #include "code\game\objects\effects\mines.dm" #include "code\game\objects\effects\misc.dm" #include "code\game\objects\effects\overlays.dm" @@ -2322,6 +2346,7 @@ #include "code\game\objects\items\botpad_remote.dm" #include "code\game\objects\items\boxcutter.dm" #include "code\game\objects\items\broom.dm" +#include "code\game\objects\items\busts_and_figurines.dm" #include "code\game\objects\items\cardboard_cutouts.dm" #include "code\game\objects\items\cards_ids.dm" #include "code\game\objects\items\chainsaw.dm" @@ -2368,6 +2393,7 @@ #include "code\game\objects\items\kitchen.dm" #include "code\game\objects\items\knives.dm" #include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\machine_wand.dm" #include "code\game\objects\items\mail.dm" #include "code\game\objects\items\maintenance_loot.dm" #include "code\game\objects\items\manuals.dm" @@ -2376,6 +2402,7 @@ #include "code\game\objects\items\paint.dm" #include "code\game\objects\items\paiwire.dm" #include "code\game\objects\items\pet_carrier.dm" +#include "code\game\objects\items\piggy_bank.dm" #include "code\game\objects\items\pillow.dm" #include "code\game\objects\items\pinpointer.dm" #include "code\game\objects\items\pitchfork.dm" @@ -2394,7 +2421,7 @@ #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\spear.dm" -#include "code\game\objects\items\sticker.dm" +#include "code\game\objects\items\stickers.dm" #include "code\game\objects\items\surgery_tray.dm" #include "code\game\objects\items\syndie_spraycan.dm" #include "code\game\objects\items\tail_pin.dm" @@ -2428,6 +2455,7 @@ #include "code\game\objects\items\devices\aicard_evil.dm" #include "code\game\objects\items\devices\anomaly_neutralizer.dm" #include "code\game\objects\items\devices\anomaly_releaser.dm" +#include "code\game\objects\items\devices\battle_royale.dm" #include "code\game\objects\items\devices\beacon.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\destabilizing_crystal.dm" @@ -2544,6 +2572,7 @@ #include "code\game\objects\items\grenades\syndieminibomb.dm" #include "code\game\objects\items\implants\implant.dm" #include "code\game\objects\items\implants\implant_abductor.dm" +#include "code\game\objects\items\implants\implant_battle_royale.dm" #include "code\game\objects\items\implants\implant_clown.dm" #include "code\game\objects\items\implants\implant_deathrattle.dm" #include "code\game\objects\items\implants\implant_explosive.dm" @@ -3224,11 +3253,17 @@ #include "code\modules\antagonists\ninja\ninja_stars.dm" #include "code\modules\antagonists\ninja\ninjaDrainAct.dm" #include "code\modules\antagonists\ninja\outfit.dm" -#include "code\modules\antagonists\nukeop\nukeop.dm" #include "code\modules\antagonists\nukeop\outfits.dm" +#include "code\modules\antagonists\nukeop\datums\operative.dm" +#include "code\modules\antagonists\nukeop\datums\operative_leader.dm" +#include "code\modules\antagonists\nukeop\datums\operative_lone.dm" +#include "code\modules\antagonists\nukeop\datums\operative_reinforcement.dm" +#include "code\modules\antagonists\nukeop\datums\operative_support.dm" +#include "code\modules\antagonists\nukeop\datums\operative_team.dm" #include "code\modules\antagonists\nukeop\equipment\borgchameleon.dm" #include "code\modules\antagonists\nukeop\equipment\nuclear_authentication_disk.dm" #include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm" +#include "code\modules\antagonists\nukeop\equipment\overwatch_tools.dm" #include "code\modules\antagonists\nukeop\equipment\pinpointer.dm" #include "code\modules\antagonists\nukeop\equipment\nuclear_bomb\_nuclear_bomb.dm" #include "code\modules\antagonists\nukeop\equipment\nuclear_bomb\beer_nuke.dm" @@ -3259,6 +3294,10 @@ #include "code\modules\antagonists\space_dragon\space_dragon.dm" #include "code\modules\antagonists\space_ninja\space_ninja.dm" #include "code\modules\antagonists\spiders\spiders.dm" +#include "code\modules\antagonists\spy\spy.dm" +#include "code\modules\antagonists\spy\spy_bounty.dm" +#include "code\modules\antagonists\spy\spy_bounty_handler.dm" +#include "code\modules\antagonists\spy\spy_uplink.dm" #include "code\modules\antagonists\survivalist\survivalist.dm" #include "code\modules\antagonists\syndicate_monkey\syndicate_monkey.dm" #include "code\modules\antagonists\traitor\balance_helper.dm" @@ -3288,12 +3327,12 @@ #include "code\modules\antagonists\traitor\objectives\sleeper_protocol.dm" #include "code\modules\antagonists\traitor\objectives\steal.dm" #include "code\modules\antagonists\traitor\objectives\abstract\target_player.dm" +#include "code\modules\antagonists\traitor\objectives\final_objective\battle_royale.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\battlecruiser.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\final_objective.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\infect_ai.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\objective_dark_matteor.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\romerol.dm" -#include "code\modules\antagonists\traitor\objectives\final_objective\space_dragon.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\supermatter_cascade.dm" #include "code\modules\antagonists\valentines\heartbreaker.dm" #include "code\modules\antagonists\valentines\valentine.dm" @@ -3411,6 +3450,7 @@ #include "code\modules\atmospherics\machinery\datum_pipeline.dm" #include "code\modules\atmospherics\machinery\air_alarm\_air_alarm.dm" #include "code\modules\atmospherics\machinery\air_alarm\air_alarm_circuit.dm" +#include "code\modules\atmospherics\machinery\air_alarm\air_alarm_contextual_tips.dm" #include "code\modules\atmospherics\machinery\air_alarm\air_alarm_interact.dm" #include "code\modules\atmospherics\machinery\air_alarm\air_alarm_modes.dm" #include "code\modules\atmospherics\machinery\air_alarm\air_alarm_thresholds.dm" @@ -3524,11 +3564,12 @@ #include "code\modules\bitrunning\objects\hololadder.dm" #include "code\modules\bitrunning\objects\host_monitor.dm" #include "code\modules\bitrunning\objects\landmarks.dm" +#include "code\modules\bitrunning\objects\loot_box.dm" #include "code\modules\bitrunning\objects\loot_crate.dm" #include "code\modules\bitrunning\objects\netpod.dm" #include "code\modules\bitrunning\objects\quantum_console.dm" #include "code\modules\bitrunning\objects\vendor.dm" -#include "code\modules\bitrunning\orders\disks.dm" +#include "code\modules\bitrunning\orders\bepis.dm" #include "code\modules\bitrunning\orders\flair.dm" #include "code\modules\bitrunning\orders\tech.dm" #include "code\modules\bitrunning\server\_parent.dm" @@ -3605,7 +3646,6 @@ #include "code\modules\cargo\bounty.dm" #include "code\modules\cargo\centcom_podlauncher.dm" #include "code\modules\cargo\coupon.dm" -#include "code\modules\cargo\department_order.dm" #include "code\modules\cargo\exports.dm" #include "code\modules\cargo\expressconsole.dm" #include "code\modules\cargo\gondolapod.dm" @@ -3653,7 +3693,9 @@ #include "code\modules\cargo\markets\market_uplink.dm" #include "code\modules\cargo\markets\market_items\clothing.dm" #include "code\modules\cargo\markets\market_items\consumables.dm" +#include "code\modules\cargo\markets\market_items\hostages.dm" #include "code\modules\cargo\markets\market_items\misc.dm" +#include "code\modules\cargo\markets\market_items\stolen_goods.dm" #include "code\modules\cargo\markets\market_items\tools.dm" #include "code\modules\cargo\markets\market_items\weapons.dm" #include "code\modules\cargo\packs\_packs.dm" @@ -3682,6 +3724,7 @@ #include "code\modules\client\preferences_menu.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences\_preference.dm" +#include "code\modules\client\preferences\addict.dm" #include "code\modules\client\preferences\admin.dm" #include "code\modules\client\preferences\age.dm" #include "code\modules\client\preferences\ai_core_display.dm" @@ -3700,6 +3743,7 @@ #include "code\modules\client\preferences\ghost.dm" #include "code\modules\client\preferences\ghost_lighting.dm" #include "code\modules\client\preferences\glasses.dm" +#include "code\modules\client\preferences\hemiplegic.dm" #include "code\modules\client\preferences\heterochromatic.dm" #include "code\modules\client\preferences\hotkeys.dm" #include "code\modules\client\preferences\item_outlines.dm" @@ -3721,7 +3765,8 @@ #include "code\modules\client\preferences\preferred_map.dm" #include "code\modules\client\preferences\pride_pin.dm" #include "code\modules\client\preferences\prisoner_crime.dm" -#include "code\modules\client\preferences\prosthetic.dm" +#include "code\modules\client\preferences\prosthetic_limb.dm" +#include "code\modules\client\preferences\prosthetic_organ.dm" #include "code\modules\client\preferences\random.dm" #include "code\modules\client\preferences\runechat.dm" #include "code\modules\client\preferences\scaling_method.dm" @@ -3733,6 +3778,7 @@ #include "code\modules\client\preferences\statpanel.dm" #include "code\modules\client\preferences\tgui.dm" #include "code\modules\client\preferences\tooltips.dm" +#include "code\modules\client\preferences\trans_prosthetic.dm" #include "code\modules\client\preferences\ui_style.dm" #include "code\modules\client\preferences\underwear_color.dm" #include "code\modules\client\preferences\uplink_location.dm" @@ -3741,6 +3787,7 @@ #include "code\modules\client\preferences\window_flashing.dm" #include "code\modules\client\preferences\middleware\_middleware.dm" #include "code\modules\client\preferences\middleware\antags.dm" +#include "code\modules\client\preferences\middleware\food.dm" #include "code\modules\client\preferences\middleware\jobs.dm" #include "code\modules\client\preferences\middleware\keybindings.dm" #include "code\modules\client\preferences\middleware\legacy_toggles.dm" @@ -3831,6 +3878,7 @@ #include "code\modules\clothing\masks\muzzle.dm" #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\outfits\ert.dm" #include "code\modules\clothing\outfits\event.dm" #include "code\modules\clothing\outfits\plasmaman.dm" @@ -3908,6 +3956,7 @@ #include "code\modules\clothing\under\jobs\medical.dm" #include "code\modules\clothing\under\jobs\rnd.dm" #include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\jobs\station_trait.dm" #include "code\modules\clothing\under\jobs\civilian\civilian.dm" #include "code\modules\clothing\under\jobs\civilian\clown_mime.dm" #include "code\modules\clothing\under\jobs\civilian\curator.dm" @@ -3922,6 +3971,7 @@ #include "code\modules\deathmatch\deathmatch_lobby.dm" #include "code\modules\deathmatch\deathmatch_mapping.dm" #include "code\modules\deathmatch\deathmatch_maps.dm" +#include "code\modules\deathmatch\deathmatch_modifier.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\scanner.dm" #include "code\modules\discord\accountlink.dm" @@ -4362,6 +4412,8 @@ #include "code\modules\jobs\job_types\spawner\zombie.dm" #include "code\modules\jobs\job_types\station_trait\bridge_assistant.dm" #include "code\modules\jobs\job_types\station_trait\cargo_gorilla.dm" +#include "code\modules\jobs\job_types\station_trait\human_ai.dm" +#include "code\modules\jobs\job_types\station_trait\veteran_advisor.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_client.dm" #include "code\modules\keybindings\focus.dm" @@ -4406,6 +4458,7 @@ #include "code\modules\library\skill_learning\job_skillchips\_job.dm" #include "code\modules\library\skill_learning\job_skillchips\chef.dm" #include "code\modules\library\skill_learning\job_skillchips\janitor.dm" +#include "code\modules\library\skill_learning\job_skillchips\miner.dm" #include "code\modules\library\skill_learning\job_skillchips\psychologist.dm" #include "code\modules\library\skill_learning\job_skillchips\research_director.dm" #include "code\modules\library\skill_learning\job_skillchips\roboticist.dm" @@ -4633,6 +4686,12 @@ #include "code\modules\mob\living\basic\festivus_pole.dm" #include "code\modules\mob\living\basic\health_adjustment.dm" #include "code\modules\mob\living\basic\tree.dm" +#include "code\modules\mob\living\basic\alien\_alien.dm" +#include "code\modules\mob\living\basic\alien\alien_ai.dm" +#include "code\modules\mob\living\basic\alien\drone.dm" +#include "code\modules\mob\living\basic\alien\maid.dm" +#include "code\modules\mob\living\basic\alien\queen.dm" +#include "code\modules\mob\living\basic\alien\sentinel.dm" #include "code\modules\mob\living\basic\blob_minions\blob_ai.dm" #include "code\modules\mob\living\basic\blob_minions\blob_mob.dm" #include "code\modules\mob\living\basic\blob_minions\blob_spore.dm" @@ -4781,6 +4840,7 @@ #include "code\modules\mob\living\basic\minebots\minebot.dm" #include "code\modules\mob\living\basic\minebots\minebot_abilities.dm" #include "code\modules\mob\living\basic\minebots\minebot_ai.dm" +#include "code\modules\mob\living\basic\minebots\minebot_remote_control.dm" #include "code\modules\mob\living\basic\minebots\minebot_upgrades.dm" #include "code\modules\mob\living\basic\pets\fox.dm" #include "code\modules\mob\living\basic\pets\penguin.dm" @@ -4809,6 +4869,9 @@ #include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_hoarding.dm" #include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_perching.dm" #include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parroting_action.dm" +#include "code\modules\mob\living\basic\pets\pet_cult\pet_cult.dm" +#include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_abilities.dm" +#include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_ai.dm" #include "code\modules\mob\living\basic\ruin_defender\flesh.dm" #include "code\modules\mob\living\basic\ruin_defender\living_floor.dm" #include "code\modules\mob\living\basic\ruin_defender\skeleton.dm" @@ -4816,6 +4879,18 @@ #include "code\modules\mob\living\basic\ruin_defender\wizard\wizard.dm" #include "code\modules\mob\living\basic\ruin_defender\wizard\wizard_ai.dm" #include "code\modules\mob\living\basic\ruin_defender\wizard\wizard_spells.dm" +#include "code\modules\mob\living\basic\slime\actions.dm" +#include "code\modules\mob\living\basic\slime\death.dm" +#include "code\modules\mob\living\basic\slime\defense.dm" +#include "code\modules\mob\living\basic\slime\emote.dm" +#include "code\modules\mob\living\basic\slime\feeding.dm" +#include "code\modules\mob\living\basic\slime\life.dm" +#include "code\modules\mob\living\basic\slime\slime.dm" +#include "code\modules\mob\living\basic\slime\slime_type.dm" +#include "code\modules\mob\living\basic\slime\ai\behaviours.dm" +#include "code\modules\mob\living\basic\slime\ai\controller.dm" +#include "code\modules\mob\living\basic\slime\ai\pet_command.dm" +#include "code\modules\mob\living\basic\slime\ai\subtrees.dm" #include "code\modules\mob\living\basic\space_fauna\ant.dm" #include "code\modules\mob\living\basic\space_fauna\cat_surgeon.dm" #include "code\modules\mob\living\basic\space_fauna\faithless.dm" @@ -5074,7 +5149,6 @@ #include "code\modules\mob\living\simple_animal\bot\vibebot.dm" #include "code\modules\mob\living\simple_animal\friendly\gondola.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" -#include "code\modules\mob\living\simple_animal\hostile\alien.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" @@ -5095,7 +5169,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\elite.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" @@ -5103,15 +5176,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\slime\ai.dm" -#include "code\modules\mob\living\simple_animal\slime\death.dm" -#include "code\modules\mob\living\simple_animal\slime\defense.dm" -#include "code\modules\mob\living\simple_animal\slime\emote.dm" -#include "code\modules\mob\living\simple_animal\slime\life.dm" -#include "code\modules\mob\living\simple_animal\slime\powers.dm" -#include "code\modules\mob\living\simple_animal\slime\slime.dm" -#include "code\modules\mob\living\simple_animal\slime\slime_say.dm" -#include "code\modules\mob\living\simple_animal\slime\slime_type.dm" #include "code\modules\mob_spawn\mob_spawn.dm" #include "code\modules\mob_spawn\corpses\job_corpses.dm" #include "code\modules\mob_spawn\corpses\mining_corpses.dm" @@ -5188,6 +5252,7 @@ #include "code\modules\modular_computers\file_system\programs\cargoship.dm" #include "code\modules\modular_computers\file_system\programs\coupon.dm" #include "code\modules\modular_computers\file_system\programs\crewmanifest.dm" +#include "code\modules\modular_computers\file_system\programs\dept_order.dm" #include "code\modules\modular_computers\file_system\programs\emojipedia.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" #include "code\modules\modular_computers\file_system\programs\frontier.dm" @@ -5201,6 +5266,7 @@ #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\records.dm" +#include "code\modules\modular_computers\file_system\programs\restock_tracker.dm" #include "code\modules\modular_computers\file_system\programs\robocontrol.dm" #include "code\modules\modular_computers\file_system\programs\robotact.dm" #include "code\modules\modular_computers\file_system\programs\secureye.dm" @@ -5475,12 +5541,12 @@ #include "code\modules\projectiles\projectile\special\floral.dm" #include "code\modules\projectiles\projectile\special\gravity.dm" #include "code\modules\projectiles\projectile\special\ion.dm" -#include "code\modules\projectiles\projectile\special\lightbreaker.dm" #include "code\modules\projectiles\projectile\special\meteor.dm" #include "code\modules\projectiles\projectile\special\mindflayer.dm" #include "code\modules\projectiles\projectile\special\neurotoxin.dm" #include "code\modules\projectiles\projectile\special\plasma.dm" #include "code\modules\projectiles\projectile\special\rocket.dm" +#include "code\modules\projectiles\projectile\special\saboteur.dm" #include "code\modules\projectiles\projectile\special\temperature.dm" #include "code\modules\projectiles\projectile\special\wormhole.dm" #include "code\modules\reagents\chem_splash.dm" @@ -5777,6 +5843,7 @@ #include "code\modules\spells\spell_types\shapeshift\_shape_status.dm" #include "code\modules\spells\spell_types\shapeshift\_shapeshift.dm" #include "code\modules\spells\spell_types\shapeshift\dragon.dm" +#include "code\modules\spells\spell_types\shapeshift\gorilla.dm" #include "code\modules\spells\spell_types\shapeshift\polar_bear.dm" #include "code\modules\spells\spell_types\shapeshift\shapechange.dm" #include "code\modules\spells\spell_types\teleport\_teleport.dm" @@ -5831,7 +5898,6 @@ #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.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" @@ -5973,6 +6039,7 @@ #include "code\modules\uplink\uplink_items\nukeops.dm" #include "code\modules\uplink\uplink_items\special.dm" #include "code\modules\uplink\uplink_items\species.dm" +#include "code\modules\uplink\uplink_items\spy_unique.dm" #include "code\modules\uplink\uplink_items\stealthy.dm" #include "code\modules\uplink\uplink_items\stealthy_tools.dm" #include "code\modules\uplink\uplink_items\suits.dm" @@ -6042,6 +6109,7 @@ #include "code\modules\vending\engineering.dm" #include "code\modules\vending\engivend.dm" #include "code\modules\vending\games.dm" +#include "code\modules\vending\hotdog.dm" #include "code\modules\vending\liberation.dm" #include "code\modules\vending\liberation_toy.dm" #include "code\modules\vending\magivend.dm" @@ -6256,6 +6324,7 @@ #include "modular_skyrat\master_files\code\datums\quirks\negative_quirks\narcolepsy.dm" #include "modular_skyrat\master_files\code\datums\quirks\negative_quirks\nerve_staple.dm" #include "modular_skyrat\master_files\code\datums\quirks\neutral_quirks\equipping.dm" +#include "modular_skyrat\master_files\code\datums\quirks\neutral_quirks\food.dm" #include "modular_skyrat\master_files\code\datums\quirks\neutral_quirks\lungs.dm" #include "modular_skyrat\master_files\code\datums\quirks\positive_quirks\life_savings.dm" #include "modular_skyrat\master_files\code\datums\records\record.dm" @@ -6345,7 +6414,6 @@ #include "modular_skyrat\master_files\code\modules\cargo\packs\general.dm" #include "modular_skyrat\master_files\code\modules\cargo\packs\security.dm" #include "modular_skyrat\master_files\code\modules\cargo\packs\service.dm" -#include "modular_skyrat\master_files\code\modules\client\playtime.dm" #include "modular_skyrat\master_files\code\modules\client\preferences.dm" #include "modular_skyrat\master_files\code\modules\client\preferences_savefile.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\_admin.dm" @@ -6361,6 +6429,7 @@ #include "modular_skyrat\master_files\code\modules\client\preferences\erp_preferences.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\face_cursor_combat_mode.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\flavor_text.dm" +#include "modular_skyrat\master_files\code\modules\client\preferences\gameplay.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\genitals.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\ghost.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\headshot.dm" @@ -6484,6 +6553,7 @@ #include "modular_skyrat\master_files\code\modules\mob\living\living.dm" #include "modular_skyrat\master_files\code\modules\mob\living\living_defines.dm" #include "modular_skyrat\master_files\code\modules\mob\living\living_movement.dm" +#include "modular_skyrat\master_files\code\modules\mob\living\basic\alien\alien.dm" #include "modular_skyrat\master_files\code\modules\mob\living\carbon\carbon_defense.dm" #include "modular_skyrat\master_files\code\modules\mob\living\carbon\death.dm" #include "modular_skyrat\master_files\code\modules\mob\living\carbon\human_helpers.dm" @@ -6495,13 +6565,15 @@ #include "modular_skyrat\master_files\code\modules\mob\living\carbon\human\species_type\snail.dm" #include "modular_skyrat\master_files\code\modules\mob\living\human\monkey.dm" #include "modular_skyrat\master_files\code\modules\mob\living\human\species.dm" +#include "modular_skyrat\master_files\code\modules\mob\living\human\species_types\ethereal.dm" +#include "modular_skyrat\master_files\code\modules\mob\living\human\species_types\flypeople.dm" +#include "modular_skyrat\master_files\code\modules\mob\living\human\species_types\plasmamen.dm" #include "modular_skyrat\master_files\code\modules\mob\living\sillicon\robot.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\simple_animal.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\bumbles.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\dogs.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\poppy.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\syndicatefox.dm" -#include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\alien.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\bubblegum.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\grabbagmob.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\zombie.dm" @@ -6523,6 +6595,7 @@ #include "modular_skyrat\master_files\code\modules\power\powernet.dm" #include "modular_skyrat\master_files\code\modules\power\lighting\light_mapping_helpers.dm" #include "modular_skyrat\master_files\code\modules\power\singularity\containment_field.dm" +#include "modular_skyrat\master_files\code\modules\power\tesla\coil.dm" #include "modular_skyrat\master_files\code\modules\projectiles\boxes_magazines\external\shotgun.dm" #include "modular_skyrat\master_files\code\modules\projectiles\boxes_magazines\external\smg.dm" #include "modular_skyrat\master_files\code\modules\projectiles\guns\ballistic.dm" @@ -6540,12 +6613,14 @@ #include "modular_skyrat\master_files\code\modules\reagents\medicine_reagents\medicine_reagents.dm" #include "modular_skyrat\master_files\code\modules\reagents\withdrawal\generic_addictions.dm" #include "modular_skyrat\master_files\code\modules\religion\religious_sects.dm" +#include "modular_skyrat\master_files\code\modules\research\designs\AI_module_designs.dm" #include "modular_skyrat\master_files\code\modules\research\designs\biogenerator_designs.dm" #include "modular_skyrat\master_files\code\modules\research\designs\limbgrower_designs.dm" #include "modular_skyrat\master_files\code\modules\research\designs\mechfabricator_designs.dm" #include "modular_skyrat\master_files\code\modules\research\designs\medical_designs.dm" #include "modular_skyrat\master_files\code\modules\research\designs\misc_designs.dm" #include "modular_skyrat\master_files\code\modules\research\designs\tool_designs.dm" +#include "modular_skyrat\master_files\code\modules\research\machinery\_production.dm" #include "modular_skyrat\master_files\code\modules\research\techweb\all_nodes.dm" #include "modular_skyrat\master_files\code\modules\research\techweb\protolathe.dm" #include "modular_skyrat\master_files\code\modules\shuttle\shuttle.dm" @@ -6639,7 +6714,7 @@ #include "modular_skyrat\modules\alternative_job_titles\code\job.dm" #include "modular_skyrat\modules\ammo_workbench\code\ammo_workbench.dm" #include "modular_skyrat\modules\ammo_workbench\code\design_disks.dm" -#include "modular_skyrat\modules\apc_arcing\apc.dm" +#include "modular_skyrat\modules\apc_arcing\code\apc.dm" #include "modular_skyrat\modules\armaments\code\armament_component.dm" #include "modular_skyrat\modules\armaments\code\armament_entries.dm" #include "modular_skyrat\modules\armaments\code\armament_station.dm" @@ -6785,6 +6860,7 @@ #include "modular_skyrat\modules\blueshield\code\closet.dm" #include "modular_skyrat\modules\blueshield\code\clothing.dm" #include "modular_skyrat\modules\blueshield\code\encryptionkey.dm" +#include "modular_skyrat\modules\blueshield\code\energy_resholver.dm" #include "modular_skyrat\modules\blueshield\code\landmarks.dm" #include "modular_skyrat\modules\blueshield\code\medkit.dm" #include "modular_skyrat\modules\blueshield\code\devices\crew.dm" @@ -6841,6 +6917,7 @@ #include "modular_skyrat\modules\carriers\code\carrier_tgui.dm" #include "modular_skyrat\modules\carriers\code\carrier_user_component.dm" #include "modular_skyrat\modules\carriers\code\carrier_verbs.dm" +#include "modular_skyrat\modules\carriers\code\overlay_system.dm" #include "modular_skyrat\modules\cell_component\code\cell_component.dm" #include "modular_skyrat\modules\cellguns\code\cellgun_cells.dm" #include "modular_skyrat\modules\cellguns\code\cellguns.dm" @@ -7759,6 +7836,7 @@ #include "modular_skyrat\modules\modular_weapons\code\conversion_kits.dm" #include "modular_skyrat\modules\modular_weapons\code\ds2_gunset.dm" #include "modular_skyrat\modules\modular_weapons\code\energy.dm" +#include "modular_skyrat\modules\modular_weapons\code\gun_launches_little_guys_element.dm" #include "modular_skyrat\modules\modular_weapons\code\gunsets.dm" #include "modular_skyrat\modules\modular_weapons\code\melee.dm" #include "modular_skyrat\modules\modular_weapons\code\modular_projectiles.dm" @@ -7904,6 +7982,7 @@ #include "modular_skyrat\modules\opposing_force\code\equipment\modsuit.dm" #include "modular_skyrat\modules\opposing_force\code\equipment\spells.dm" #include "modular_skyrat\modules\opposing_force\code\equipment\uplink.dm" +#include "modular_skyrat\modules\organs\code\ears.dm" #include "modular_skyrat\modules\organs\code\heart.dm" #include "modular_skyrat\modules\organs\code\liver.dm" #include "modular_skyrat\modules\organs\code\lungs.dm" @@ -7966,6 +8045,7 @@ #include "modular_skyrat\modules\primitive_cooking_additions\code\cookware.dm" #include "modular_skyrat\modules\primitive_cooking_additions\code\cutting_board.dm" #include "modular_skyrat\modules\primitive_cooking_additions\code\millstone.dm" +#include "modular_skyrat\modules\primitive_cooking_additions\code\plant_bag.dm" #include "modular_skyrat\modules\primitive_cooking_additions\code\stone_griddle.dm" #include "modular_skyrat\modules\primitive_cooking_additions\code\stone_oven.dm" #include "modular_skyrat\modules\primitive_cooking_additions\code\stone_stove.dm" @@ -8051,6 +8131,9 @@ #include "modular_skyrat\modules\SiliconQoL\code\_onclick.dm" #include "modular_skyrat\modules\SiliconQoL\code\countdown.dm" #include "modular_skyrat\modules\SiliconQoL\code\robotic_factory.dm" +#include "modular_skyrat\modules\simple_research\research_document.dm" +#include "modular_skyrat\modules\simple_research\research_skill.dm" +#include "modular_skyrat\modules\simple_research\simple_research.dm" #include "modular_skyrat\modules\skyrat-uplinks\code\categories\bundles.dm" #include "modular_skyrat\modules\skyrat-uplinks\code\categories\dangerous.dm" #include "modular_skyrat\modules\skyrat-uplinks\code\categories\device_tools.dm" @@ -8127,6 +8210,10 @@ #include "modular_skyrat\modules\tarkon\code\misc-fluff\research.dm" #include "modular_skyrat\modules\tarkon\code\misc-fluff\spawner.dm" #include "modular_skyrat\modules\tarkon\code\misc-fluff\tools.dm" +#include "modular_skyrat\modules\tesh_augments\code\all_nodes.dm" +#include "modular_skyrat\modules\tesh_augments\code\limbs.dm" +#include "modular_skyrat\modules\tesh_augments\code\mechfabricator_designs.dm" +#include "modular_skyrat\modules\tesh_augments\code\robot_bodyparts.dm" #include "modular_skyrat\modules\teshari\code\_clothing_defines.dm" #include "modular_skyrat\modules\teshari\code\_teshari.dm" #include "modular_skyrat\modules\teshari\code\birdman_food.dm" @@ -8702,7 +8789,6 @@ #include "modular_zubbers\modules\synths\death_sound.dm" #include "modular_zubbers\modules\synths\code\synth_prefab.dm" #include "modular_zubbers\modules\synths\code\designs\exofab_designs.dm" -#include "modular_zubbers\modules\tesh-vali_augments\code\__DEFINES\research\research_categories.dm" #include "modular_zubbers\modules\tesh-vali_augments\code\modules\research\designs\mechfabricator_designs.dm" #include "modular_zubbers\modules\tesh-vali_augments\code\modules\research\techweb\all_nodes.dm" #include "modular_zubbers\modules\tesh-vali_augments\code\surgery\bodyparts\robot_bodyparts.dm" diff --git a/tgui/.prettierignore b/tgui/.prettierignore index 79e703c9544..a91324ebe6e 100644 --- a/tgui/.prettierignore +++ b/tgui/.prettierignore @@ -6,6 +6,7 @@ /yarn.lock /.pnp.* +.swcrc /docs /public /packages/tgui-polyfill diff --git a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs b/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs deleted file mode 100644 index 527659ff97f..00000000000 --- a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +++ /dev/null @@ -1,363 +0,0 @@ -/* eslint-disable */ -//prettier-ignore -module.exports = { -name: "@yarnpkg/plugin-interactive-tools", -factory: function (require) { -var plugin=(()=>{var PR=Object.create,J1=Object.defineProperty,MR=Object.defineProperties,FR=Object.getOwnPropertyDescriptor,LR=Object.getOwnPropertyDescriptors,RR=Object.getOwnPropertyNames,hh=Object.getOwnPropertySymbols,NR=Object.getPrototypeOf,Z4=Object.prototype.hasOwnProperty,aD=Object.prototype.propertyIsEnumerable;var dD=(i,u,f)=>u in i?J1(i,u,{enumerable:!0,configurable:!0,writable:!0,value:f}):i[u]=f,dt=(i,u)=>{for(var f in u||(u={}))Z4.call(u,f)&&dD(i,f,u[f]);if(hh)for(var f of hh(u))aD.call(u,f)&&dD(i,f,u[f]);return i},zn=(i,u)=>MR(i,LR(u)),BR=i=>J1(i,"__esModule",{value:!0});var Si=(i,u)=>{var f={};for(var c in i)Z4.call(i,c)&&u.indexOf(c)<0&&(f[c]=i[c]);if(i!=null&&hh)for(var c of hh(i))u.indexOf(c)<0&&aD.call(i,c)&&(f[c]=i[c]);return f};var Me=(i,u)=>()=>(u||i((u={exports:{}}).exports,u),u.exports),jR=(i,u)=>{for(var f in u)J1(i,f,{get:u[f],enumerable:!0})},UR=(i,u,f)=>{if(u&&typeof u=="object"||typeof u=="function")for(let c of RR(u))!Z4.call(i,c)&&c!=="default"&&J1(i,c,{get:()=>u[c],enumerable:!(f=FR(u,c))||f.enumerable});return i},Er=i=>UR(BR(J1(i!=null?PR(NR(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var ey=Me((YH,pD)=>{"use strict";var hD=Object.getOwnPropertySymbols,qR=Object.prototype.hasOwnProperty,zR=Object.prototype.propertyIsEnumerable;function WR(i){if(i==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}function HR(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de",Object.getOwnPropertyNames(i)[0]==="5")return!1;for(var u={},f=0;f<10;f++)u["_"+String.fromCharCode(f)]=f;var c=Object.getOwnPropertyNames(u).map(function(t){return u[t]});if(c.join("")!=="0123456789")return!1;var g={};return"abcdefghijklmnopqrst".split("").forEach(function(t){g[t]=t}),Object.keys(Object.assign({},g)).join("")==="abcdefghijklmnopqrst"}catch(t){return!1}}pD.exports=HR()?Object.assign:function(i,u){for(var f,c=WR(i),g,t=1;t{"use strict";var ty=ey(),as=typeof Symbol=="function"&&Symbol.for,Q1=as?Symbol.for("react.element"):60103,bR=as?Symbol.for("react.portal"):60106,GR=as?Symbol.for("react.fragment"):60107,VR=as?Symbol.for("react.strict_mode"):60108,YR=as?Symbol.for("react.profiler"):60114,$R=as?Symbol.for("react.provider"):60109,KR=as?Symbol.for("react.context"):60110,XR=as?Symbol.for("react.forward_ref"):60112,JR=as?Symbol.for("react.suspense"):60113,QR=as?Symbol.for("react.memo"):60115,ZR=as?Symbol.for("react.lazy"):60116,mD=typeof Symbol=="function"&&Symbol.iterator;function Z1(i){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+i,f=1;fmh.length&&mh.push(i)}function uy(i,u,f,c){var g=typeof i;(g==="undefined"||g==="boolean")&&(i=null);var t=!1;if(i===null)t=!0;else switch(g){case"string":case"number":t=!0;break;case"object":switch(i.$$typeof){case Q1:case bR:t=!0}}if(t)return f(c,i,u===""?"."+sy(i,0):u),1;if(t=0,u=u===""?".":u+":",Array.isArray(i))for(var C=0;C{"use strict";kD.exports=xD()});var AD=Me((ga,e2)=>{(function(){var i,u="4.17.21",f=200,c="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",g="Expected a function",t="Invalid `variable` option passed into `_.template`",C="__lodash_hash_undefined__",A=500,x="__lodash_placeholder__",D=1,L=2,N=4,j=1,$=2,h=1,re=2,ce=4,Q=8,oe=16,Se=32,me=64,De=128,J=256,Te=512,Oe=30,Le="...",ot=800,ct=16,Ue=1,be=2,At=3,Ot=1/0,Nt=9007199254740991,Je=17976931348623157e292,V=0/0,ne=4294967295,ge=ne-1,Z=ne>>>1,Ae=[["ary",De],["bind",h],["bindKey",re],["curry",Q],["curryRight",oe],["flip",Te],["partial",Se],["partialRight",me],["rearg",J]],at="[object Arguments]",it="[object Array]",Ft="[object AsyncFunction]",jt="[object Boolean]",hn="[object Date]",Un="[object DOMException]",Jt="[object Error]",Yt="[object Function]",cr="[object GeneratorFunction]",w="[object Map]",pt="[object Number]",Mn="[object Null]",Bn="[object Object]",Xn="[object Promise]",vr="[object Proxy]",gr="[object RegExp]",r0="[object Set]",Ci="[object String]",yo="[object Symbol]",Ds="[object Undefined]",Mu="[object WeakMap]",Gf="[object WeakSet]",iu="[object ArrayBuffer]",ou="[object DataView]",ol="[object Float32Array]",ul="[object Float64Array]",Es="[object Int8Array]",Uo="[object Int16Array]",sl="[object Int32Array]",Ss="[object Uint8Array]",Cs="[object Uint8ClampedArray]",Ti="[object Uint16Array]",Fu="[object Uint32Array]",ll=/\b__p \+= '';/g,fl=/\b(__p \+=) '' \+/g,cl=/(__e\(.*?\)|\b__t\)) \+\n'';/g,al=/&(?:amp|lt|gt|quot|#39);/g,Ui=/[&<>"']/g,Mr=RegExp(al.source),Ac=RegExp(Ui.source),of=/<%-([\s\S]+?)%>/g,Ts=/<%([\s\S]+?)%>/g,xs=/<%=([\s\S]+?)%>/g,dl=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,qi=/^\w*$/,qo=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,kr=/[\\^$.*+?()[\]{}|]/g,Fr=RegExp(kr.source),si=/^\s+/,H0=/\s/,b0=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bt=/\{\n\/\* \[wrapped with (.+)\] \*/,Lu=/,? & /,c0=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ru=/[()=,{}\[\]\/\s]/,ks=/\\(\\)?/g,As=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,uu=/\w*$/,wo=/^[-+]0x[0-9a-f]+$/i,zo=/^0b[01]+$/i,Os=/^\[object .+?Constructor\]$/,Is=/^0o[0-7]+$/i,uf=/^(?:0|[1-9]\d*)$/,_n=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Nu=/($^)/,Wo=/['\n\r\u2028\u2029\\]/g,su="\\ud800-\\udfff",Ps="\\u0300-\\u036f",pl="\\ufe20-\\ufe2f",Vf="\\u20d0-\\u20ff",hl=Ps+pl+Vf,Bu="\\u2700-\\u27bf",ju="a-z\\xdf-\\xf6\\xf8-\\xff",sf="\\xac\\xb1\\xd7\\xf7",ro="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Ms="\\u2000-\\u206f",ml=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Uu="A-Z\\xc0-\\xd6\\xd8-\\xde",G0="\\ufe0e\\ufe0f",Fs=sf+ro+Ms+ml,tt="['\u2019]",zi="["+su+"]",lu="["+Fs+"]",Ho="["+hl+"]",O0="\\d+",vl="["+Bu+"]",gl="["+ju+"]",fu="[^"+su+Fs+O0+Bu+ju+Uu+"]",_l="\\ud83c[\\udffb-\\udfff]",Sn="(?:"+Ho+"|"+_l+")",gt="[^"+su+"]",en="(?:\\ud83c[\\udde6-\\uddff]){2}",I0="[\\ud800-\\udbff][\\udc00-\\udfff]",li="["+Uu+"]",qu="\\u200d",Wi="(?:"+gl+"|"+fu+")",zu="(?:"+li+"|"+fu+")",Wu="(?:"+tt+"(?:d|ll|m|re|s|t|ve))?",Ls="(?:"+tt+"(?:D|LL|M|RE|S|T|VE))?",fi=Sn+"?",e0="["+G0+"]?",io="(?:"+qu+"(?:"+[gt,en,I0].join("|")+")"+e0+fi+")*",D0="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Do="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",i0=e0+fi+io,Rs="(?:"+[vl,en,I0].join("|")+")"+i0,a0="(?:"+[gt+Ho+"?",Ho,en,I0,zi].join("|")+")",Hu=RegExp(tt,"g"),V0=RegExp(Ho,"g"),bu=RegExp(_l+"(?="+_l+")|"+a0+i0,"g"),Ns=RegExp([li+"?"+gl+"+"+Wu+"(?="+[lu,li,"$"].join("|")+")",zu+"+"+Ls+"(?="+[lu,li+Wi,"$"].join("|")+")",li+"?"+Wi+"+"+Wu,li+"+"+Ls,Do,D0,O0,Rs].join("|"),"g"),bo=RegExp("["+qu+su+hl+G0+"]"),P0=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ln=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],lf=-1,nr={};nr[ol]=nr[ul]=nr[Es]=nr[Uo]=nr[sl]=nr[Ss]=nr[Cs]=nr[Ti]=nr[Fu]=!0,nr[at]=nr[it]=nr[iu]=nr[jt]=nr[ou]=nr[hn]=nr[Jt]=nr[Yt]=nr[w]=nr[pt]=nr[Bn]=nr[gr]=nr[r0]=nr[Ci]=nr[Mu]=!1;var rr={};rr[at]=rr[it]=rr[iu]=rr[ou]=rr[jt]=rr[hn]=rr[ol]=rr[ul]=rr[Es]=rr[Uo]=rr[sl]=rr[w]=rr[pt]=rr[Bn]=rr[gr]=rr[r0]=rr[Ci]=rr[yo]=rr[Ss]=rr[Cs]=rr[Ti]=rr[Fu]=!0,rr[Jt]=rr[Yt]=rr[Mu]=!1;var Go={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},Gu={"&":"&","<":"<",">":">",'"':""","'":"'"},yl={"&":"&","<":"<",">":">",""":'"',"'":"'"},cu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Bs=parseFloat,Vu=parseInt,M0=typeof global=="object"&&global&&global.Object===Object&&global,au=typeof self=="object"&&self&&self.Object===Object&&self,Lr=M0||au||Function("return this")(),F=typeof ga=="object"&&ga&&!ga.nodeType&&ga,R=F&&typeof e2=="object"&&e2&&!e2.nodeType&&e2,U=R&&R.exports===F,H=U&&M0.process,fe=function(){try{var ae=R&&R.require&&R.require("util").types;return ae||H&&H.binding&&H.binding("util")}catch(Be){}}(),ue=fe&&fe.isArrayBuffer,de=fe&&fe.isDate,W=fe&&fe.isMap,ve=fe&&fe.isRegExp,Fe=fe&&fe.isSet,Ge=fe&&fe.isTypedArray;function K(ae,Be,Ie){switch(Ie.length){case 0:return ae.call(Be);case 1:return ae.call(Be,Ie[0]);case 2:return ae.call(Be,Ie[0],Ie[1]);case 3:return ae.call(Be,Ie[0],Ie[1],Ie[2])}return ae.apply(Be,Ie)}function xe(ae,Be,Ie,ht){for(var mt=-1,wn=ae==null?0:ae.length;++mt-1}function wt(ae,Be,Ie){for(var ht=-1,mt=ae==null?0:ae.length;++ht-1;);return Ie}function js(ae,Be){for(var Ie=ae.length;Ie--&&Qe(Be,ae[Ie],0)>-1;);return Ie}function Dl(ae,Be){for(var Ie=ae.length,ht=0;Ie--;)ae[Ie]===Be&&++ht;return ht}var du=Cn(Go),Yu=Cn(Gu);function Us(ae){return"\\"+cu[ae]}function oo(ae,Be){return ae==null?i:ae[Be]}function Hi(ae){return bo.test(ae)}function qs(ae){return P0.test(ae)}function F0(ae){for(var Be,Ie=[];!(Be=ae.next()).done;)Ie.push(Be.value);return Ie}function Gr(ae){var Be=-1,Ie=Array(ae.size);return ae.forEach(function(ht,mt){Ie[++Be]=[mt,ht]}),Ie}function ir(ae,Be){return function(Ie){return ae(Be(Ie))}}function L0(ae,Be){for(var Ie=-1,ht=ae.length,mt=0,wn=[];++Ie-1}function Ju(a,p){var E=this.__data__,I=hf(E,a);return I<0?(++this.size,E.push([a,p])):E[I][1]=p,this}Z0.prototype.clear=df,Z0.prototype.delete=Ba,Z0.prototype.get=Oc,Z0.prototype.has=mu,Z0.prototype.set=Ju;function ei(a){var p=-1,E=a==null?0:a.length;for(this.clear();++p=p?a:p)),a}function vi(a,p,E,I,B,G){var te,se=p&D,Ee=p&L,$e=p&N;if(E&&(te=B?E(a,I,B,G):E(a)),te!==i)return te;if(!Jr(a))return a;var Ke=On(a);if(Ke){if(te=f1(a),!se)return Xr(a,te)}else{var nt=U0(a),Ct=nt==Yt||nt==cr;if(Eu(a))return Od(a,se);if(nt==Bn||nt==at||Ct&&!B){if(te=Ee||Ct?{}:zd(a),!se)return Ee?Zu(a,Wa(te,a)):j0(a,mf(te,a))}else{if(!rr[nt])return B?a:{};te=Wd(a,nt,se)}}G||(G=new co);var Gt=G.get(a);if(Gt)return Gt;G.set(a,te),kp(a)?a.forEach(function(dn){te.add(vi(dn,p,E,dn,a,G))}):Tp(a)&&a.forEach(function(dn,Yn){te.set(Yn,vi(dn,p,E,Yn,a,G))});var an=$e?Ee?Dn:r1:Ee?Yi:q0,qn=Ke?i:an(a);return je(qn||a,function(dn,Yn){qn&&(Yn=dn,dn=a[Yn]),xl(te,Yn,vi(dn,p,E,Yn,a,G))}),te}function Xf(a){var p=q0(a);return function(E){return Rc(E,a,p)}}function Rc(a,p,E){var I=E.length;if(a==null)return!I;for(a=$t(a);I--;){var B=E[I],G=p[B],te=a[B];if(te===i&&!(B in a)||!G(te))return!1}return!0}function Jf(a,p,E){if(typeof a!="function")throw new Yr(g);return wf(function(){a.apply(i,E)},p)}function ao(a,p,E,I){var B=-1,G=xt,te=!0,se=a.length,Ee=[],$e=p.length;if(!se)return Ee;E&&(p=lt(p,qr(E))),I?(G=wt,te=!1):p.length>=f&&(G=So,te=!1,p=new vu(p));e:for(;++BB?0:B+E),I=I===i||I>B?B:jn(I),I<0&&(I+=B),I=E>I?0:Ip(I);E0&&E(se)?p>1?k0(se,p-1,E,I,B):Rt(B,se):I||(B[B.length]=se)}return B}var v=ec(),m=ec(!0);function S(a,p){return a&&v(a,p,q0)}function O(a,p){return a&&m(a,p,q0)}function M(a,p){return st(p,function(E){return rs(a[E])})}function b(a,p){p=Gs(p,a);for(var E=0,I=p.length;a!=null&&Ep}function ut(a,p){return a!=null&&or.call(a,p)}function In(a,p){return a!=null&&p in $t(a)}function A0(a,p,E){return a>=kn(p,E)&&a=120&&Ke.length>=120)?new vu(te&&Ke):i}Ke=a[0];var nt=-1,Ct=se[0];e:for(;++nt-1;)se!==a&&C0.call(se,Ee,1),C0.call(a,Ee,1);return a}function jc(a,p){for(var E=a?p.length:0,I=E-1;E--;){var B=p[E];if(E==I||B!==G){var G=B;es(B)?C0.call(a,B,1):$a(a,B)}}return a}function Ga(a,p){return a+hu(Ai()*(p-a+1))}function Lm(a,p,E,I){for(var B=-1,G=wr(B0((p-a)/(E||1)),0),te=Ie(G);G--;)te[I?G:++B]=a,a+=E;return te}function Va(a,p){var E="";if(!a||p<1||p>Nt)return E;do p%2&&(E+=a),p=hu(p/2),p&&(a+=a);while(p);return E}function Wn(a,p){return m1(Gd(a,p,$i),a+"")}function wd(a){return Fc(Ef(a))}function Dd(a,p){var E=Ef(a);return Yc(E,mi(p,0,E.length))}function Ol(a,p,E,I){if(!Jr(a))return a;p=Gs(p,a);for(var B=-1,G=p.length,te=G-1,se=a;se!=null&&++BB?0:B+p),E=E>B?B:E,E<0&&(E+=B),B=p>E?0:E-p>>>0,p>>>=0;for(var G=Ie(B);++I>>1,te=a[G];te!==null&&!mo(te)&&(E?te<=p:te=f){var $e=p?null:bm(a);if($e)return Y0($e);te=!1,B=So,Ee=new vu}else Ee=p?[]:se;e:for(;++I=I?a:Oo(a,p,E)}var Ad=pu||function(a){return Lr.clearTimeout(a)};function Od(a,p){if(p)return a.slice();var E=a.length,I=Nr?Nr(E):new a.constructor(E);return a.copy(I),I}function Qa(a){var p=new a.constructor(a.byteLength);return new R0(p).set(new R0(a)),p}function jm(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.byteLength)}function Um(a){var p=new a.constructor(a.source,uu.exec(a));return p.lastIndex=a.lastIndex,p}function qm(a){return Wr?$t(Wr.call(a)):{}}function Id(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.length)}function Pd(a,p){if(a!==p){var E=a!==i,I=a===null,B=a===a,G=mo(a),te=p!==i,se=p===null,Ee=p===p,$e=mo(p);if(!se&&!$e&&!G&&a>p||G&&te&&Ee&&!se&&!$e||I&&te&&Ee||!E&&Ee||!B)return 1;if(!I&&!G&&!$e&&a=se)return Ee;var $e=E[I];return Ee*($e=="desc"?-1:1)}}return a.index-p.index}function gf(a,p,E,I){for(var B=-1,G=a.length,te=E.length,se=-1,Ee=p.length,$e=wr(G-te,0),Ke=Ie(Ee+$e),nt=!I;++se1?E[B-1]:i,te=B>2?E[2]:i;for(G=a.length>3&&typeof G=="function"?(B--,G):i,te&&Ii(E[0],E[1],te)&&(G=B<3?i:G,B=1),p=$t(p);++I-1?B[G?p[te]:te]:i}}function Rd(a){return yu(function(p){var E=p.length,I=E,B=Qn.prototype.thru;for(a&&p.reverse();I--;){var G=p[I];if(typeof G!="function")throw new Yr(g);if(B&&!te&&Gc(G)=="wrapper")var te=new Qn([],!0)}for(I=te?I:E;++I1&&er.reverse(),Ke&&Eese))return!1;var $e=G.get(a),Ke=G.get(p);if($e&&Ke)return $e==p&&Ke==a;var nt=-1,Ct=!0,Gt=E&$?new vu:i;for(G.set(a,p),G.set(p,a);++nt1?"& ":"")+p[I],p=p.join(E>2?", ":" "),a.replace(b0,`{ -/* [wrapped with `+p+`] */ -`)}function Xm(a){return On(a)||Ll(a)||!!(di&&a&&a[di])}function es(a,p){var E=typeof a;return p=p==null?Nt:p,!!p&&(E=="number"||E!="symbol"&&uf.test(a))&&a>-1&&a%1==0&&a0){if(++p>=ot)return arguments[0]}else p=0;return a.apply(i,arguments)}}function Yc(a,p){var E=-1,I=a.length,B=I-1;for(p=p===i?I:p;++E1?a[p-1]:i;return E=typeof E=="function"?(a.pop(),E):i,sp(a,E)});function fp(a){var p=z(a);return p.__chain__=!0,p}function cp(a,p){return p(a),a}function Kc(a,p){return p(a)}var Wv=yu(function(a){var p=a.length,E=p?a[0]:0,I=this.__wrapped__,B=function(G){return Hs(G,a)};return p>1||this.__actions__.length||!(I instanceof nn)||!es(E)?this.thru(B):(I=I.slice(E,+E+(p?1:0)),I.__actions__.push({func:Kc,args:[B],thisArg:i}),new Qn(I,this.__chain__).thru(function(G){return p&&!G.length&&G.push(i),G}))});function Hv(){return fp(this)}function bv(){return new Qn(this.value(),this.__chain__)}function Gv(){this.__values__===i&&(this.__values__=Op(this.value()));var a=this.__index__>=this.__values__.length,p=a?i:this.__values__[this.__index__++];return{done:a,value:p}}function Vv(){return this}function Yv(a){for(var p,E=this;E instanceof Or;){var I=Jd(E);I.__index__=0,I.__values__=i,p?B.__wrapped__=I:p=I;var B=I;E=E.__wrapped__}return B.__wrapped__=a,p}function Ml(){var a=this.__wrapped__;if(a instanceof nn){var p=a;return this.__actions__.length&&(p=new nn(this)),p=p.reverse(),p.__actions__.push({func:Kc,args:[g1],thisArg:i}),new Qn(p,this.__chain__)}return this.thru(g1)}function Fl(){return xd(this.__wrapped__,this.__actions__)}var Xc=_f(function(a,p,E){or.call(a,E)?++a[E]:ti(a,E,1)});function $v(a,p,E){var I=On(a)?rt:Nc;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}function Kv(a,p){var E=On(a)?st:Qf;return E(a,cn(p,3))}var Xv=Ld(Qd),D1=Ld($c);function Jv(a,p){return k0(Jc(a,p),1)}function Qv(a,p){return k0(Jc(a,p),Ot)}function ap(a,p,E){return E=E===i?1:jn(E),k0(Jc(a,p),E)}function dp(a,p){var E=On(a)?je:$o;return E(a,cn(p,3))}function pp(a,p){var E=On(a)?Xe:kl;return E(a,cn(p,3))}var Zv=_f(function(a,p,E){or.call(a,E)?a[E].push(p):ti(a,E,[p])});function eg(a,p,E,I){a=Vi(a)?a:Ef(a),E=E&&!I?jn(E):0;var B=a.length;return E<0&&(E=wr(B+E,0)),ia(a)?E<=B&&a.indexOf(p,E)>-1:!!B&&Qe(a,p,E)>-1}var tg=Wn(function(a,p,E){var I=-1,B=typeof p=="function",G=Vi(a)?Ie(a.length):[];return $o(a,function(te){G[++I]=B?K(p,te,E):po(te,p,E)}),G}),hp=_f(function(a,p,E){ti(a,E,p)});function Jc(a,p){var E=On(a)?lt:vd;return E(a,cn(p,3))}function ng(a,p,E,I){return a==null?[]:(On(p)||(p=p==null?[]:[p]),E=I?i:E,On(E)||(E=E==null?[]:[E]),Oi(a,p,E))}var rg=_f(function(a,p,E){a[E?0:1].push(p)},function(){return[[],[]]});function mp(a,p,E){var I=On(a)?yn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,$o)}function ig(a,p,E){var I=On(a)?sn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,kl)}function og(a,p){var E=On(a)?st:Qf;return E(a,Zc(cn(p,3)))}function ug(a){var p=On(a)?Fc:wd;return p(a)}function sg(a,p,E){(E?Ii(a,p,E):p===i)?p=1:p=jn(p);var I=On(a)?Lc:Dd;return I(a,p)}function lg(a){var p=On(a)?Kf:Ao;return p(a)}function E1(a){if(a==null)return 0;if(Vi(a))return ia(a)?Rr(a):a.length;var p=U0(a);return p==w||p==r0?a.size:Zf(a).length}function fg(a,p,E){var I=On(a)?ar:Nm;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}var cg=Wn(function(a,p){if(a==null)return[];var E=p.length;return E>1&&Ii(a,p[0],p[1])?p=[]:E>2&&Ii(p[0],p[1],p[2])&&(p=[p[0]]),Oi(a,k0(p,1),[])}),rc=Sl||function(){return Lr.Date.now()};function ag(a,p){if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){if(--a<1)return p.apply(this,arguments)}}function vp(a,p,E){return p=E?i:p,p=a&&p==null?a.length:p,Lt(a,De,i,i,i,i,p)}function gp(a,p){var E;if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){return--a>0&&(E=p.apply(this,arguments)),a<=1&&(p=i),E}}var S1=Wn(function(a,p,E){var I=h;if(E.length){var B=L0(E,An(S1));I|=Se}return Lt(a,I,p,E,B)}),_p=Wn(function(a,p,E){var I=h|re;if(E.length){var B=L0(E,An(_p));I|=Se}return Lt(p,I,a,E,B)});function C1(a,p,E){p=E?i:p;var I=Lt(a,Q,i,i,i,i,i,p);return I.placeholder=C1.placeholder,I}function yp(a,p,E){p=E?i:p;var I=Lt(a,oe,i,i,i,i,i,p);return I.placeholder=yp.placeholder,I}function wp(a,p,E){var I,B,G,te,se,Ee,$e=0,Ke=!1,nt=!1,Ct=!0;if(typeof a!="function")throw new Yr(g);p=Fo(p)||0,Jr(E)&&(Ke=!!E.leading,nt="maxWait"in E,G=nt?wr(Fo(E.maxWait)||0,p):G,Ct="trailing"in E?!!E.trailing:Ct);function Gt(f0){var Jo=I,Su=B;return I=B=i,$e=f0,te=a.apply(Su,Jo),te}function an(f0){return $e=f0,se=wf(Yn,p),Ke?Gt(f0):te}function qn(f0){var Jo=f0-Ee,Su=f0-$e,Zp=p-Jo;return nt?kn(Zp,G-Su):Zp}function dn(f0){var Jo=f0-Ee,Su=f0-$e;return Ee===i||Jo>=p||Jo<0||nt&&Su>=G}function Yn(){var f0=rc();if(dn(f0))return er(f0);se=wf(Yn,qn(f0))}function er(f0){return se=i,Ct&&I?Gt(f0):(I=B=i,te)}function vo(){se!==i&&Ad(se),$e=0,I=Ee=B=se=i}function Pi(){return se===i?te:er(rc())}function Mi(){var f0=rc(),Jo=dn(f0);if(I=arguments,B=this,Ee=f0,Jo){if(se===i)return an(Ee);if(nt)return Ad(se),se=wf(Yn,p),Gt(Ee)}return se===i&&(se=wf(Yn,p)),te}return Mi.cancel=vo,Mi.flush=Pi,Mi}var dg=Wn(function(a,p){return Jf(a,1,p)}),Dp=Wn(function(a,p,E){return Jf(a,Fo(p)||0,E)});function pg(a){return Lt(a,Te)}function Qc(a,p){if(typeof a!="function"||p!=null&&typeof p!="function")throw new Yr(g);var E=function(){var I=arguments,B=p?p.apply(this,I):I[0],G=E.cache;if(G.has(B))return G.get(B);var te=a.apply(this,I);return E.cache=G.set(B,te)||G,te};return E.cache=new(Qc.Cache||ei),E}Qc.Cache=ei;function Zc(a){if(typeof a!="function")throw new Yr(g);return function(){var p=arguments;switch(p.length){case 0:return!a.call(this);case 1:return!a.call(this,p[0]);case 2:return!a.call(this,p[0],p[1]);case 3:return!a.call(this,p[0],p[1],p[2])}return!a.apply(this,p)}}function ea(a){return gp(2,a)}var hg=Bm(function(a,p){p=p.length==1&&On(p[0])?lt(p[0],qr(cn())):lt(k0(p,1),qr(cn()));var E=p.length;return Wn(function(I){for(var B=-1,G=kn(I.length,E);++B=p}),Ll=_i(function(){return arguments}())?_i:function(a){return n0(a)&&or.call(a,"callee")&&!N0.call(a,"callee")},On=Ie.isArray,x1=ue?qr(ue):Re;function Vi(a){return a!=null&&na(a.length)&&!rs(a)}function l0(a){return n0(a)&&Vi(a)}function kg(a){return a===!0||a===!1||n0(a)&&Ye(a)==jt}var Eu=pi||W1,Ag=de?qr(de):Ce;function Og(a){return n0(a)&&a.nodeType===1&&!ic(a)}function Cp(a){if(a==null)return!0;if(Vi(a)&&(On(a)||typeof a=="string"||typeof a.splice=="function"||Eu(a)||Df(a)||Ll(a)))return!a.length;var p=U0(a);if(p==w||p==r0)return!a.size;if(nc(a))return!Zf(a).length;for(var E in a)if(or.call(a,E))return!1;return!0}function Ig(a,p){return ze(a,p)}function Pg(a,p,E){E=typeof E=="function"?E:i;var I=E?E(a,p):i;return I===i?ze(a,p,i,E):!!I}function k1(a){if(!n0(a))return!1;var p=Ye(a);return p==Jt||p==Un||typeof a.message=="string"&&typeof a.name=="string"&&!ic(a)}function Mg(a){return typeof a=="number"&&Br(a)}function rs(a){if(!Jr(a))return!1;var p=Ye(a);return p==Yt||p==cr||p==Ft||p==vr}function A1(a){return typeof a=="number"&&a==jn(a)}function na(a){return typeof a=="number"&&a>-1&&a%1==0&&a<=Nt}function Jr(a){var p=typeof a;return a!=null&&(p=="object"||p=="function")}function n0(a){return a!=null&&typeof a=="object"}var Tp=W?qr(W):on;function Fg(a,p){return a===p||sr(a,p,Nn(p))}function Lg(a,p,E){return E=typeof E=="function"?E:i,sr(a,p,Nn(p),E)}function Rg(a){return xp(a)&&a!=+a}function Ng(a){if(Zm(a))throw new mt(c);return mn(a)}function Bg(a){return a===null}function O1(a){return a==null}function xp(a){return typeof a=="number"||n0(a)&&Ye(a)==pt}function ic(a){if(!n0(a)||Ye(a)!=Bn)return!1;var p=uo(a);if(p===null)return!0;var E=or.call(p,"constructor")&&p.constructor;return typeof E=="function"&&E instanceof E&&bi.call(E)==af}var ra=ve?qr(ve):pr;function jg(a){return A1(a)&&a>=-Nt&&a<=Nt}var kp=Fe?qr(Fe):Hr;function ia(a){return typeof a=="string"||!On(a)&&n0(a)&&Ye(a)==Ci}function mo(a){return typeof a=="symbol"||n0(a)&&Ye(a)==yo}var Df=Ge?qr(Ge):Vn;function Ap(a){return a===i}function Ug(a){return n0(a)&&U0(a)==Mu}function qg(a){return n0(a)&&Ye(a)==Gf}var zg=bc(Ha),Wg=bc(function(a,p){return a<=p});function Op(a){if(!a)return[];if(Vi(a))return ia(a)?Jn(a):Xr(a);if(u0&&a[u0])return F0(a[u0]());var p=U0(a),E=p==w?Gr:p==r0?Y0:Ef;return E(a)}function is(a){if(!a)return a===0?a:0;if(a=Fo(a),a===Ot||a===-Ot){var p=a<0?-1:1;return p*Je}return a===a?a:0}function jn(a){var p=is(a),E=p%1;return p===p?E?p-E:p:0}function Ip(a){return a?mi(jn(a),0,ne):0}function Fo(a){if(typeof a=="number")return a;if(mo(a))return V;if(Jr(a)){var p=typeof a.valueOf=="function"?a.valueOf():a;a=Jr(p)?p+"":p}if(typeof a!="string")return a===0?a:+a;a=E0(a);var E=zo.test(a);return E||Is.test(a)?Vu(a.slice(2),E?2:8):wo.test(a)?V:+a}function oa(a){return yi(a,Yi(a))}function Hg(a){return a?mi(jn(a),-Nt,Nt):a===0?a:0}function yr(a){return a==null?"":ho(a)}var Pp=Io(function(a,p){if(nc(p)||Vi(p)){yi(p,q0(p),a);return}for(var E in p)or.call(p,E)&&xl(a,E,p[E])}),Mp=Io(function(a,p){yi(p,Yi(p),a)}),ua=Io(function(a,p,E,I){yi(p,Yi(p),a,I)}),bg=Io(function(a,p,E,I){yi(p,q0(p),a,I)}),Gg=yu(Hs);function Vg(a,p){var E=dr(a);return p==null?E:mf(E,p)}var Fp=Wn(function(a,p){a=$t(a);var E=-1,I=p.length,B=I>2?p[2]:i;for(B&&Ii(p[0],p[1],B)&&(I=1);++E1),G}),yi(a,Dn(a),E),I&&(E=vi(E,D|L|N,Gm));for(var B=p.length;B--;)$a(E,p[B]);return E});function l_(a,p){return Bp(a,Zc(cn(p)))}var f_=yu(function(a,p){return a==null?{}:Fm(a,p)});function Bp(a,p){if(a==null)return{};var E=lt(Dn(a),function(I){return[I]});return p=cn(p),yd(a,E,function(I,B){return p(I,B[0])})}function c_(a,p,E){p=Gs(p,a);var I=-1,B=p.length;for(B||(B=1,a=i);++Ip){var I=a;a=p,p=I}if(E||a%1||p%1){var B=Ai();return kn(a+B*(p-a+Bs("1e-"+((B+"").length-1))),p)}return Ga(a,p)}var __=yf(function(a,p,E){return p=p.toLowerCase(),a+(E?Wp(p):p)});function Wp(a){return L1(yr(a).toLowerCase())}function Hp(a){return a=yr(a),a&&a.replace(_n,du).replace(V0,"")}function y_(a,p,E){a=yr(a),p=ho(p);var I=a.length;E=E===i?I:mi(jn(E),0,I);var B=E;return E-=p.length,E>=0&&a.slice(E,B)==p}function M1(a){return a=yr(a),a&&Ac.test(a)?a.replace(Ui,Yu):a}function w_(a){return a=yr(a),a&&Fr.test(a)?a.replace(kr,"\\$&"):a}var D_=yf(function(a,p,E){return a+(E?"-":"")+p.toLowerCase()}),bp=yf(function(a,p,E){return a+(E?" ":"")+p.toLowerCase()}),E_=Fd("toLowerCase");function S_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;if(!p||I>=p)return a;var B=(p-I)/2;return Hc(hu(B),E)+a+Hc(B0(B),E)}function C_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;return p&&I>>0,E?(a=yr(a),a&&(typeof p=="string"||p!=null&&!ra(p))&&(p=ho(p),!p&&Hi(a))?Vs(Jn(a),0,E):a.split(p,E)):[]}var I_=yf(function(a,p,E){return a+(E?" ":"")+L1(p)});function P_(a,p,E){return a=yr(a),E=E==null?0:mi(jn(E),0,a.length),p=ho(p),a.slice(E,E+p.length)==p}function M_(a,p,E){var I=z.templateSettings;E&&Ii(a,p,E)&&(p=i),a=yr(a),p=ua({},p,I,n1);var B=ua({},p.imports,I.imports,n1),G=q0(B),te=Eo(B,G),se,Ee,$e=0,Ke=p.interpolate||Nu,nt="__p += '",Ct=X0((p.escape||Nu).source+"|"+Ke.source+"|"+(Ke===xs?As:Nu).source+"|"+(p.evaluate||Nu).source+"|$","g"),Gt="//# sourceURL="+(or.call(p,"sourceURL")?(p.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++lf+"]")+` -`;a.replace(Ct,function(dn,Yn,er,vo,Pi,Mi){return er||(er=vo),nt+=a.slice($e,Mi).replace(Wo,Us),Yn&&(se=!0,nt+=`' + -__e(`+Yn+`) + -'`),Pi&&(Ee=!0,nt+=`'; -`+Pi+`; -__p += '`),er&&(nt+=`' + -((__t = (`+er+`)) == null ? '' : __t) + -'`),$e=Mi+dn.length,dn}),nt+=`'; -`;var an=or.call(p,"variable")&&p.variable;if(!an)nt=`with (obj) { -`+nt+` -} -`;else if(Ru.test(an))throw new mt(t);nt=(Ee?nt.replace(ll,""):nt).replace(fl,"$1").replace(cl,"$1;"),nt="function("+(an||"obj")+`) { -`+(an?"":`obj || (obj = {}); -`)+"var __t, __p = ''"+(se?", __e = _.escape":"")+(Ee?`, __j = Array.prototype.join; -function print() { __p += __j.call(arguments, '') } -`:`; -`)+nt+`return __p -}`;var qn=$p(function(){return wn(G,Gt+"return "+nt).apply(i,te)});if(qn.source=nt,k1(qn))throw qn;return qn}function F_(a){return yr(a).toLowerCase()}function L_(a){return yr(a).toUpperCase()}function R_(a,p,E){if(a=yr(a),a&&(E||p===i))return E0(a);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=Jn(p),G=wl(I,B),te=js(I,B)+1;return Vs(I,G,te).join("")}function F1(a,p,E){if(a=yr(a),a&&(E||p===i))return a.slice(0,ai(a)+1);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=js(I,Jn(p))+1;return Vs(I,0,B).join("")}function N_(a,p,E){if(a=yr(a),a&&(E||p===i))return a.replace(si,"");if(!a||!(p=ho(p)))return a;var I=Jn(a),B=wl(I,Jn(p));return Vs(I,B).join("")}function B_(a,p){var E=Oe,I=Le;if(Jr(p)){var B="separator"in p?p.separator:B;E="length"in p?jn(p.length):E,I="omission"in p?ho(p.omission):I}a=yr(a);var G=a.length;if(Hi(a)){var te=Jn(a);G=te.length}if(E>=G)return a;var se=E-Rr(I);if(se<1)return I;var Ee=te?Vs(te,0,se).join(""):a.slice(0,se);if(B===i)return Ee+I;if(te&&(se+=Ee.length-se),ra(B)){if(a.slice(se).search(B)){var $e,Ke=Ee;for(B.global||(B=X0(B.source,yr(uu.exec(B))+"g")),B.lastIndex=0;$e=B.exec(Ke);)var nt=$e.index;Ee=Ee.slice(0,nt===i?se:nt)}}else if(a.indexOf(ho(B),se)!=se){var Ct=Ee.lastIndexOf(B);Ct>-1&&(Ee=Ee.slice(0,Ct))}return Ee+I}function Vp(a){return a=yr(a),a&&Mr.test(a)?a.replace(al,o0):a}var j_=yf(function(a,p,E){return a+(E?" ":"")+p.toUpperCase()}),L1=Fd("toUpperCase");function Yp(a,p,E){return a=yr(a),p=E?i:p,p===i?qs(a)?cf(a):d0(a):a.match(p)||[]}var $p=Wn(function(a,p){try{return K(a,i,p)}catch(E){return k1(E)?E:new mt(E)}}),U_=yu(function(a,p){return je(p,function(E){E=Xo(E),ti(a,E,S1(a[E],a))}),a});function Kp(a){var p=a==null?0:a.length,E=cn();return a=p?lt(a,function(I){if(typeof I[1]!="function")throw new Yr(g);return[E(I[0]),I[1]]}):[],Wn(function(I){for(var B=-1;++BNt)return[];var E=ne,I=kn(a,ne);p=cn(p),a-=ne;for(var B=ci(I,p);++E0||p<0)?new nn(E):(a<0?E=E.takeRight(-a):a&&(E=E.drop(a)),p!==i&&(p=jn(p),E=p<0?E.dropRight(-p):E.take(p-a)),E)},nn.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},nn.prototype.toArray=function(){return this.take(ne)},S(nn.prototype,function(a,p){var E=/^(?:filter|find|map|reject)|While$/.test(p),I=/^(?:head|last)$/.test(p),B=z[I?"take"+(p=="last"?"Right":""):p],G=I||/^find/.test(p);!B||(z.prototype[p]=function(){var te=this.__wrapped__,se=I?[1]:arguments,Ee=te instanceof nn,$e=se[0],Ke=Ee||On(te),nt=function(Yn){var er=B.apply(z,Rt([Yn],se));return I&&Ct?er[0]:er};Ke&&E&&typeof $e=="function"&&$e.length!=1&&(Ee=Ke=!1);var Ct=this.__chain__,Gt=!!this.__actions__.length,an=G&&!Ct,qn=Ee&&!Gt;if(!G&&Ke){te=qn?te:new nn(this);var dn=a.apply(te,se);return dn.__actions__.push({func:Kc,args:[nt],thisArg:i}),new Qn(dn,Ct)}return an&&qn?a.apply(this,se):(dn=this.thru(nt),an?I?dn.value()[0]:dn.value():dn)})}),je(["pop","push","shift","sort","splice","unshift"],function(a){var p=$r[a],E=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",I=/^(?:pop|shift)$/.test(a);z.prototype[a]=function(){var B=arguments;if(I&&!this.__chain__){var G=this.value();return p.apply(On(G)?G:[],B)}return this[E](function(te){return p.apply(On(te)?te:[],B)})}}),S(nn.prototype,function(a,p){var E=z[p];if(E){var I=E.name+"";or.call(bt,I)||(bt[I]=[]),bt[I].push({name:p,func:E})}}),bt[zc(i,re).name]=[{name:"wrapper",func:i}],nn.prototype.clone=s0,nn.prototype.reverse=t0,nn.prototype.value=g0,z.prototype.at=Wv,z.prototype.chain=Hv,z.prototype.commit=bv,z.prototype.next=Gv,z.prototype.plant=Yv,z.prototype.reverse=Ml,z.prototype.toJSON=z.prototype.valueOf=z.prototype.value=Fl,z.prototype.first=z.prototype.head,u0&&(z.prototype[u0]=Vv),z},K0=$0();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Lr._=K0,define(function(){return K0})):R?((R.exports=K0)._=K0,F._=K0):Lr._=K0}).call(ga)});var ay=Me((XH,cy)=>{"use strict";var fr=cy.exports;cy.exports.default=fr;var Pr="[",t2="]",ya="\x07",vh=";",OD=process.env.TERM_PROGRAM==="Apple_Terminal";fr.cursorTo=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");return typeof u!="number"?Pr+(i+1)+"G":Pr+(u+1)+";"+(i+1)+"H"};fr.cursorMove=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");let f="";return i<0?f+=Pr+-i+"D":i>0&&(f+=Pr+i+"C"),u<0?f+=Pr+-u+"A":u>0&&(f+=Pr+u+"B"),f};fr.cursorUp=(i=1)=>Pr+i+"A";fr.cursorDown=(i=1)=>Pr+i+"B";fr.cursorForward=(i=1)=>Pr+i+"C";fr.cursorBackward=(i=1)=>Pr+i+"D";fr.cursorLeft=Pr+"G";fr.cursorSavePosition=OD?"7":Pr+"s";fr.cursorRestorePosition=OD?"8":Pr+"u";fr.cursorGetPosition=Pr+"6n";fr.cursorNextLine=Pr+"E";fr.cursorPrevLine=Pr+"F";fr.cursorHide=Pr+"?25l";fr.cursorShow=Pr+"?25h";fr.eraseLines=i=>{let u="";for(let f=0;f[t2,"8",vh,vh,u,ya,i,t2,"8",vh,vh,ya].join("");fr.image=(i,u={})=>{let f=`${t2}1337;File=inline=1`;return u.width&&(f+=`;width=${u.width}`),u.height&&(f+=`;height=${u.height}`),u.preserveAspectRatio===!1&&(f+=";preserveAspectRatio=0"),f+":"+i.toString("base64")+ya};fr.iTerm={setCwd:(i=process.cwd())=>`${t2}50;CurrentDir=${i}${ya}`,annotation:(i,u={})=>{let f=`${t2}1337;`,c=typeof u.x!="undefined",g=typeof u.y!="undefined";if((c||g)&&!(c&&g&&typeof u.length!="undefined"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return i=i.replace(/\|/g,""),f+=u.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",u.length>0?f+=(c?[i,u.length,u.x,u.y]:[u.length,i]).join("|"):f+=i,f+ya}}});var PD=Me((JH,dy)=>{"use strict";var ID=(i,u)=>{for(let f of Reflect.ownKeys(u))Object.defineProperty(i,f,Object.getOwnPropertyDescriptor(u,f));return i};dy.exports=ID;dy.exports.default=ID});var FD=Me((QH,gh)=>{"use strict";var oN=PD(),_h=new WeakMap,MD=(i,u={})=>{if(typeof i!="function")throw new TypeError("Expected a function");let f,c=!1,g=0,t=i.displayName||i.name||"",C=function(...A){if(_h.set(C,++g),c){if(u.throw===!0)throw new Error(`Function \`${t}\` can only be called once`);return f}return c=!0,f=i.apply(this,A),i=null,f};return oN(C,i),_h.set(C,g),C};gh.exports=MD;gh.exports.default=MD;gh.exports.callCount=i=>{if(!_h.has(i))throw new Error(`The given function \`${i.name}\` is not wrapped by the \`onetime\` package`);return _h.get(i)}});var LD=Me((ZH,yh)=>{yh.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&yh.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&yh.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var vy=Me((eb,n2)=>{var uN=require("assert"),r2=LD(),sN=/^win/i.test(process.platform),wh=require("events");typeof wh!="function"&&(wh=wh.EventEmitter);var Bi;process.__signal_exit_emitter__?Bi=process.__signal_exit_emitter__:(Bi=process.__signal_exit_emitter__=new wh,Bi.count=0,Bi.emitted={});Bi.infinite||(Bi.setMaxListeners(Infinity),Bi.infinite=!0);n2.exports=function(i,u){uN.equal(typeof i,"function","a callback must be provided for exit handler"),i2===!1&&RD();var f="exit";u&&u.alwaysLast&&(f="afterexit");var c=function(){Bi.removeListener(f,i),Bi.listeners("exit").length===0&&Bi.listeners("afterexit").length===0&&py()};return Bi.on(f,i),c};n2.exports.unload=py;function py(){!i2||(i2=!1,r2.forEach(function(i){try{process.removeListener(i,hy[i])}catch(u){}}),process.emit=my,process.reallyExit=ND,Bi.count-=1)}function wa(i,u,f){Bi.emitted[i]||(Bi.emitted[i]=!0,Bi.emit(i,u,f))}var hy={};r2.forEach(function(i){hy[i]=function(){var f=process.listeners(i);f.length===Bi.count&&(py(),wa("exit",null,i),wa("afterexit",null,i),sN&&i==="SIGHUP"&&(i="SIGINT"),process.kill(process.pid,i))}});n2.exports.signals=function(){return r2};n2.exports.load=RD;var i2=!1;function RD(){i2||(i2=!0,Bi.count+=1,r2=r2.filter(function(i){try{return process.on(i,hy[i]),!0}catch(u){return!1}}),process.emit=fN,process.reallyExit=lN)}var ND=process.reallyExit;function lN(i){process.exitCode=i||0,wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),ND.call(process,process.exitCode)}var my=process.emit;function fN(i,u){if(i==="exit"){u!==void 0&&(process.exitCode=u);var f=my.apply(this,arguments);return wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),f}else return my.apply(this,arguments)}});var jD=Me((tb,BD)=>{"use strict";var cN=FD(),aN=vy();BD.exports=cN(()=>{aN(()=>{process.stderr.write("[?25h")},{alwaysLast:!0})})});var gy=Me(Da=>{"use strict";var dN=jD(),Dh=!1;Da.show=(i=process.stderr)=>{!i.isTTY||(Dh=!1,i.write("[?25h"))};Da.hide=(i=process.stderr)=>{!i.isTTY||(dN(),Dh=!0,i.write("[?25l"))};Da.toggle=(i,u)=>{i!==void 0&&(Dh=i),Dh?Da.show(u):Da.hide(u)}});var WD=Me(o2=>{"use strict";var UD=o2&&o2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(o2,"__esModule",{value:!0});var qD=UD(ay()),zD=UD(gy()),pN=(i,{showCursor:u=!1}={})=>{let f=0,c="",g=!1,t=C=>{!u&&!g&&(zD.default.hide(),g=!0);let A=C+` -`;A!==c&&(c=A,i.write(qD.default.eraseLines(f)+A),f=A.split(` -`).length)};return t.clear=()=>{i.write(qD.default.eraseLines(f)),c="",f=0},t.done=()=>{c="",f=0,u||(zD.default.show(),g=!1)},t};o2.default={create:pN}});var bD=Me((ib,HD)=>{HD.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var YD=Me(ru=>{"use strict";var GD=bD(),nl=process.env;Object.defineProperty(ru,"_vendors",{value:GD.map(function(i){return i.constant})});ru.name=null;ru.isPR=null;GD.forEach(function(i){var u=Array.isArray(i.env)?i.env:[i.env],f=u.every(function(c){return VD(c)});if(ru[i.constant]=f,f)switch(ru.name=i.name,typeof i.pr){case"string":ru.isPR=!!nl[i.pr];break;case"object":"env"in i.pr?ru.isPR=i.pr.env in nl&&nl[i.pr.env]!==i.pr.ne:"any"in i.pr?ru.isPR=i.pr.any.some(function(c){return!!nl[c]}):ru.isPR=VD(i.pr);break;default:ru.isPR=null}});ru.isCI=!!(nl.CI||nl.CONTINUOUS_INTEGRATION||nl.BUILD_NUMBER||nl.RUN_ID||ru.name);function VD(i){return typeof i=="string"?!!nl[i]:Object.keys(i).every(function(u){return nl[u]===i[u]})}});var KD=Me((ub,$D)=>{"use strict";$D.exports=YD().isCI});var JD=Me((sb,XD)=>{"use strict";var hN=i=>{let u=new Set;do for(let f of Reflect.ownKeys(i))u.add([i,f]);while((i=Reflect.getPrototypeOf(i))&&i!==Object.prototype);return u};XD.exports=(i,{include:u,exclude:f}={})=>{let c=g=>{let t=C=>typeof C=="string"?g===C:C.test(g);return u?u.some(t):f?!f.some(t):!0};for(let[g,t]of hN(i.constructor.prototype)){if(t==="constructor"||!c(t))continue;let C=Reflect.getOwnPropertyDescriptor(g,t);C&&typeof C.value=="function"&&(i[t]=i[t].bind(i))}return i}});var iE=Me(Sr=>{"use strict";Object.defineProperty(Sr,"__esModule",{value:!0});var Ea,u2,Eh,Sh,_y;typeof window=="undefined"||typeof MessageChannel!="function"?(Sa=null,yy=null,wy=function(){if(Sa!==null)try{var i=Sr.unstable_now();Sa(!0,i),Sa=null}catch(u){throw setTimeout(wy,0),u}},QD=Date.now(),Sr.unstable_now=function(){return Date.now()-QD},Ea=function(i){Sa!==null?setTimeout(Ea,0,i):(Sa=i,setTimeout(wy,0))},u2=function(i,u){yy=setTimeout(i,u)},Eh=function(){clearTimeout(yy)},Sh=function(){return!1},_y=Sr.unstable_forceFrameRate=function(){}):(Ch=window.performance,Dy=window.Date,ZD=window.setTimeout,eE=window.clearTimeout,typeof console!="undefined"&&(tE=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof tE!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof Ch=="object"&&typeof Ch.now=="function"?Sr.unstable_now=function(){return Ch.now()}:(nE=Dy.now(),Sr.unstable_now=function(){return Dy.now()-nE}),s2=!1,l2=null,Th=-1,Ey=5,Sy=0,Sh=function(){return Sr.unstable_now()>=Sy},_y=function(){},Sr.unstable_forceFrameRate=function(i){0>i||125kh(C,f))x!==void 0&&0>kh(x,C)?(i[c]=x,i[A]=f,c=A):(i[c]=C,i[t]=f,c=t);else if(x!==void 0&&0>kh(x,f))i[c]=x,i[A]=f,c=A;else break e}}return u}return null}function kh(i,u){var f=i.sortIndex-u.sortIndex;return f!==0?f:i.id-u.id}var ds=[],Nf=[],mN=1,_o=null,to=3,Oh=!1,pc=!1,f2=!1;function Ih(i){for(var u=Iu(Nf);u!==null;){if(u.callback===null)Ah(Nf);else if(u.startTime<=i)Ah(Nf),u.sortIndex=u.expirationTime,Ty(ds,u);else break;u=Iu(Nf)}}function xy(i){if(f2=!1,Ih(i),!pc)if(Iu(ds)!==null)pc=!0,Ea(ky);else{var u=Iu(Nf);u!==null&&u2(xy,u.startTime-i)}}function ky(i,u){pc=!1,f2&&(f2=!1,Eh()),Oh=!0;var f=to;try{for(Ih(u),_o=Iu(ds);_o!==null&&(!(_o.expirationTime>u)||i&&!Sh());){var c=_o.callback;if(c!==null){_o.callback=null,to=_o.priorityLevel;var g=c(_o.expirationTime<=u);u=Sr.unstable_now(),typeof g=="function"?_o.callback=g:_o===Iu(ds)&&Ah(ds),Ih(u)}else Ah(ds);_o=Iu(ds)}if(_o!==null)var t=!0;else{var C=Iu(Nf);C!==null&&u2(xy,C.startTime-u),t=!1}return t}finally{_o=null,to=f,Oh=!1}}function rE(i){switch(i){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var vN=_y;Sr.unstable_ImmediatePriority=1;Sr.unstable_UserBlockingPriority=2;Sr.unstable_NormalPriority=3;Sr.unstable_IdlePriority=5;Sr.unstable_LowPriority=4;Sr.unstable_runWithPriority=function(i,u){switch(i){case 1:case 2:case 3:case 4:case 5:break;default:i=3}var f=to;to=i;try{return u()}finally{to=f}};Sr.unstable_next=function(i){switch(to){case 1:case 2:case 3:var u=3;break;default:u=to}var f=to;to=u;try{return i()}finally{to=f}};Sr.unstable_scheduleCallback=function(i,u,f){var c=Sr.unstable_now();if(typeof f=="object"&&f!==null){var g=f.delay;g=typeof g=="number"&&0c?(i.sortIndex=g,Ty(Nf,i),Iu(ds)===null&&i===Iu(Nf)&&(f2?Eh():f2=!0,u2(xy,g-c))):(i.sortIndex=f,Ty(ds,i),pc||Oh||(pc=!0,Ea(ky))),i};Sr.unstable_cancelCallback=function(i){i.callback=null};Sr.unstable_wrapCallback=function(i){var u=to;return function(){var f=to;to=u;try{return i.apply(this,arguments)}finally{to=f}}};Sr.unstable_getCurrentPriorityLevel=function(){return to};Sr.unstable_shouldYield=function(){var i=Sr.unstable_now();Ih(i);var u=Iu(ds);return u!==_o&&_o!==null&&u!==null&&u.callback!==null&&u.startTime<=i&&u.expirationTime<_o.expirationTime||Sh()};Sr.unstable_requestPaint=vN;Sr.unstable_continueExecution=function(){pc||Oh||(pc=!0,Ea(ky))};Sr.unstable_pauseExecution=function(){};Sr.unstable_getFirstCallbackNode=function(){return Iu(ds)};Sr.unstable_Profiling=null});var Ay=Me((fb,oE)=>{"use strict";oE.exports=iE()});var uE=Me((cb,c2)=>{c2.exports=function i(u){"use strict";var f=ey(),c=lr(),g=Ay();function t(v){for(var m="https://reactjs.org/docs/error-decoder.html?invariant="+v,S=1;Sqo||(v.current=qi[qo],qi[qo]=null,qo--)}function Fr(v,m){qo++,qi[qo]=v.current,v.current=m}var si={},H0={current:si},b0={current:!1},Bt=si;function Lu(v,m){var S=v.type.contextTypes;if(!S)return si;var O=v.stateNode;if(O&&O.__reactInternalMemoizedUnmaskedChildContext===m)return O.__reactInternalMemoizedMaskedChildContext;var M={},b;for(b in S)M[b]=m[b];return O&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=m,v.__reactInternalMemoizedMaskedChildContext=M),M}function c0(v){return v=v.childContextTypes,v!=null}function Ru(v){kr(b0,v),kr(H0,v)}function ks(v){kr(b0,v),kr(H0,v)}function As(v,m,S){if(H0.current!==si)throw Error(t(168));Fr(H0,m,v),Fr(b0,S,v)}function uu(v,m,S){var O=v.stateNode;if(v=m.childContextTypes,typeof O.getChildContext!="function")return S;O=O.getChildContext();for(var M in O)if(!(M in v))throw Error(t(108,Oe(m)||"Unknown",M));return f({},S,{},O)}function wo(v){var m=v.stateNode;return m=m&&m.__reactInternalMemoizedMergedChildContext||si,Bt=H0.current,Fr(H0,m,v),Fr(b0,b0.current,v),!0}function zo(v,m,S){var O=v.stateNode;if(!O)throw Error(t(169));S?(m=uu(v,m,Bt),O.__reactInternalMemoizedMergedChildContext=m,kr(b0,v),kr(H0,v),Fr(H0,m,v)):kr(b0,v),Fr(b0,S,v)}var Os=g.unstable_runWithPriority,Is=g.unstable_scheduleCallback,uf=g.unstable_cancelCallback,_n=g.unstable_shouldYield,Nu=g.unstable_requestPaint,Wo=g.unstable_now,su=g.unstable_getCurrentPriorityLevel,Ps=g.unstable_ImmediatePriority,pl=g.unstable_UserBlockingPriority,Vf=g.unstable_NormalPriority,hl=g.unstable_LowPriority,Bu=g.unstable_IdlePriority,ju={},sf=Nu!==void 0?Nu:function(){},ro=null,Ms=null,ml=!1,Uu=Wo(),G0=1e4>Uu?Wo:function(){return Wo()-Uu};function Fs(){switch(su()){case Ps:return 99;case pl:return 98;case Vf:return 97;case hl:return 96;case Bu:return 95;default:throw Error(t(332))}}function tt(v){switch(v){case 99:return Ps;case 98:return pl;case 97:return Vf;case 96:return hl;case 95:return Bu;default:throw Error(t(332))}}function zi(v,m){return v=tt(v),Os(v,m)}function lu(v,m,S){return v=tt(v),Is(v,m,S)}function Ho(v){return ro===null?(ro=[v],Ms=Is(Ps,vl)):ro.push(v),ju}function O0(){if(Ms!==null){var v=Ms;Ms=null,uf(v)}vl()}function vl(){if(!ml&&ro!==null){ml=!0;var v=0;try{var m=ro;zi(99,function(){for(;v=m&&(ai=!0),v.firstContext=null)}function D0(v,m){if(zu!==v&&m!==!1&&m!==0)if((typeof m!="number"||m===1073741823)&&(zu=v,m=1073741823),m={context:v,observedBits:m,next:null},Wi===null){if(qu===null)throw Error(t(308));Wi=m,qu.dependencies={expirationTime:0,firstContext:m,responders:null}}else Wi=Wi.next=m;return Jt?v._currentValue:v._currentValue2}var Do=!1;function i0(v){return{baseState:v,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Rs(v){return{baseState:v.baseState,firstUpdate:v.firstUpdate,lastUpdate:v.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function a0(v,m){return{expirationTime:v,suspenseConfig:m,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Hu(v,m){v.lastUpdate===null?v.firstUpdate=v.lastUpdate=m:(v.lastUpdate.next=m,v.lastUpdate=m)}function V0(v,m){var S=v.alternate;if(S===null){var O=v.updateQueue,M=null;O===null&&(O=v.updateQueue=i0(v.memoizedState))}else O=v.updateQueue,M=S.updateQueue,O===null?M===null?(O=v.updateQueue=i0(v.memoizedState),M=S.updateQueue=i0(S.memoizedState)):O=v.updateQueue=Rs(M):M===null&&(M=S.updateQueue=Rs(O));M===null||O===M?Hu(O,m):O.lastUpdate===null||M.lastUpdate===null?(Hu(O,m),Hu(M,m)):(Hu(O,m),M.lastUpdate=m)}function bu(v,m){var S=v.updateQueue;S=S===null?v.updateQueue=i0(v.memoizedState):Ns(v,S),S.lastCapturedUpdate===null?S.firstCapturedUpdate=S.lastCapturedUpdate=m:(S.lastCapturedUpdate.next=m,S.lastCapturedUpdate=m)}function Ns(v,m){var S=v.alternate;return S!==null&&m===S.updateQueue&&(m=v.updateQueue=Rs(m)),m}function bo(v,m,S,O,M,b){switch(S.tag){case 1:return v=S.payload,typeof v=="function"?v.call(b,O,M):v;case 3:v.effectTag=v.effectTag&-4097|64;case 0:if(v=S.payload,M=typeof v=="function"?v.call(b,O,M):v,M==null)break;return f({},O,M);case 2:Do=!0}return O}function P0(v,m,S,O,M){Do=!1,m=Ns(v,m);for(var b=m.baseState,ee=null,Ye=0,Ze=m.firstUpdate,ut=b;Ze!==null;){var In=Ze.expirationTime;Inpr?(Hr=mn,mn=null):Hr=mn.sibling;var Vn=jr(Re,mn,ze[pr],Et);if(Vn===null){mn===null&&(mn=Hr);break}v&&mn&&Vn.alternate===null&&m(Re,mn),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn,mn=Hr}if(pr===ze.length)return S(Re,mn),on;if(mn===null){for(;prpr?(Hr=mn,mn=null):Hr=mn.sibling;var ni=jr(Re,mn,Vn.value,Et);if(ni===null){mn===null&&(mn=Hr);break}v&&mn&&ni.alternate===null&&m(Re,mn),Ce=b(ni,Ce,pr),sr===null?on=ni:sr.sibling=ni,sr=ni,mn=Hr}if(Vn.done)return S(Re,mn),on;if(mn===null){for(;!Vn.done;pr++,Vn=ze.next())Vn=A0(Re,Vn.value,Et),Vn!==null&&(Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return on}for(mn=O(Re,mn);!Vn.done;pr++,Vn=ze.next())Vn=gi(mn,Re,pr,Vn.value,Et),Vn!==null&&(v&&Vn.alternate!==null&&mn.delete(Vn.key===null?pr:Vn.key),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return v&&mn.forEach(function(Zf){return m(Re,Zf)}),on}return function(Re,Ce,ze,Et){var on=typeof ze=="object"&&ze!==null&&ze.type===L&&ze.key===null;on&&(ze=ze.props.children);var sr=typeof ze=="object"&&ze!==null;if(sr)switch(ze.$$typeof){case x:e:{for(sr=ze.key,on=Ce;on!==null;){if(on.key===sr)if(on.tag===7?ze.type===L:on.elementType===ze.type){S(Re,on.sibling),Ce=M(on,ze.type===L?ze.props.children:ze.props,Et),Ce.ref=au(Re,on,ze),Ce.return=Re,Re=Ce;break e}else{S(Re,on);break}else m(Re,on);on=on.sibling}ze.type===L?(Ce=mi(ze.props.children,Re.mode,Et,ze.key),Ce.return=Re,Re=Ce):(Et=Hs(ze.type,ze.key,ze.props,null,Re.mode,Et),Et.ref=au(Re,Ce,ze),Et.return=Re,Re=Et)}return ee(Re);case D:e:{for(on=ze.key;Ce!==null;){if(Ce.key===on)if(Ce.tag===4&&Ce.stateNode.containerInfo===ze.containerInfo&&Ce.stateNode.implementation===ze.implementation){S(Re,Ce.sibling),Ce=M(Ce,ze.children||[],Et),Ce.return=Re,Re=Ce;break e}else{S(Re,Ce);break}else m(Re,Ce);Ce=Ce.sibling}Ce=Xf(ze,Re.mode,Et),Ce.return=Re,Re=Ce}return ee(Re)}if(typeof ze=="string"||typeof ze=="number")return ze=""+ze,Ce!==null&&Ce.tag===6?(S(Re,Ce.sibling),Ce=M(Ce,ze,Et),Ce.return=Re,Re=Ce):(S(Re,Ce),Ce=vi(ze,Re.mode,Et),Ce.return=Re,Re=Ce),ee(Re);if(M0(ze))return po(Re,Ce,ze,Et);if(J(ze))return _i(Re,Ce,ze,Et);if(sr&&Lr(Re,ze),typeof ze=="undefined"&&!on)switch(Re.tag){case 1:case 0:throw Re=Re.type,Error(t(152,Re.displayName||Re.name||"Component"))}return S(Re,Ce)}}var R=F(!0),U=F(!1),H={},fe={current:H},ue={current:H},de={current:H};function W(v){if(v===H)throw Error(t(174));return v}function ve(v,m){Fr(de,m,v),Fr(ue,v,v),Fr(fe,H,v),m=Ot(m),kr(fe,v),Fr(fe,m,v)}function Fe(v){kr(fe,v),kr(ue,v),kr(de,v)}function Ge(v){var m=W(de.current),S=W(fe.current);m=Nt(S,v.type,m),S!==m&&(Fr(ue,v,v),Fr(fe,m,v))}function K(v){ue.current===v&&(kr(fe,v),kr(ue,v))}var xe={current:0};function je(v){for(var m=v;m!==null;){if(m.tag===13){var S=m.memoizedState;if(S!==null&&(S=S.dehydrated,S===null||ll(S)||fl(S)))return m}else if(m.tag===19&&m.memoizedProps.revealOrder!==void 0){if((m.effectTag&64)!=0)return m}else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===v)break;for(;m.sibling===null;){if(m.return===null||m.return===v)return null;m=m.return}m.sibling.return=m.return,m=m.sibling}return null}function Xe(v,m){return{responder:v,props:m}}var rt=C.ReactCurrentDispatcher,st=C.ReactCurrentBatchConfig,xt=0,wt=null,lt=null,Rt=null,yn=null,sn=null,ar=null,rn=0,Hn=null,d0=0,Cr=!1,He=null,Qe=0;function Ne(){throw Error(t(321))}function ft(v,m){if(m===null)return!1;for(var S=0;Srn&&(rn=In,pf(rn))):(Yf(In,Ze.suspenseConfig),b=Ze.eagerReducer===v?Ze.eagerState:v(b,Ze.action)),ee=Ze,Ze=Ze.next}while(Ze!==null&&Ze!==O);ut||(Ye=ee,M=b),Sn(b,m.memoizedState)||(ai=!0),m.memoizedState=b,m.baseUpdate=Ye,m.baseState=M,S.lastRenderedState=b}return[m.memoizedState,S.dispatch]}function ci(v){var m=Cn();return typeof v=="function"&&(v=v()),m.memoizedState=m.baseState=v,v=m.queue={last:null,dispatch:null,lastRenderedReducer:p0,lastRenderedState:v},v=v.dispatch=Us.bind(null,wt,v),[m.memoizedState,v]}function xi(v){return h0(p0,v)}function E0(v,m,S,O){return v={tag:v,create:m,destroy:S,deps:O,next:null},Hn===null?(Hn={lastEffect:null},Hn.lastEffect=v.next=v):(m=Hn.lastEffect,m===null?Hn.lastEffect=v.next=v:(S=m.next,m.next=v,v.next=S,Hn.lastEffect=v)),v}function qr(v,m,S,O){var M=Cn();d0|=v,M.memoizedState=E0(m,S,void 0,O===void 0?null:O)}function Eo(v,m,S,O){var M=bn();O=O===void 0?null:O;var b=void 0;if(lt!==null){var ee=lt.memoizedState;if(b=ee.destroy,O!==null&&ft(O,ee.deps)){E0(0,S,b,O);return}}d0|=v,M.memoizedState=E0(m,S,b,O)}function So(v,m){return qr(516,192,v,m)}function wl(v,m){return Eo(516,192,v,m)}function js(v,m){if(typeof m=="function")return v=v(),m(v),function(){m(null)};if(m!=null)return v=v(),m.current=v,function(){m.current=null}}function Dl(){}function du(v,m){return Cn().memoizedState=[v,m===void 0?null:m],v}function Yu(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(S.memoizedState=[v,m],v)}function Us(v,m,S){if(!(25>Qe))throw Error(t(301));var O=v.alternate;if(v===wt||O!==null&&O===wt)if(Cr=!0,v={expirationTime:xt,suspenseConfig:null,action:S,eagerReducer:null,eagerState:null,next:null},He===null&&(He=new Map),S=He.get(m),S===void 0)He.set(m,v);else{for(m=S;m.next!==null;)m=m.next;m.next=v}else{var M=g0(),b=nr.suspense;M=Kr(M,v,b),b={expirationTime:M,suspenseConfig:b,action:S,eagerReducer:null,eagerState:null,next:null};var ee=m.last;if(ee===null)b.next=b;else{var Ye=ee.next;Ye!==null&&(b.next=Ye),ee.next=b}if(m.last=b,v.expirationTime===0&&(O===null||O.expirationTime===0)&&(O=m.lastRenderedReducer,O!==null))try{var Ze=m.lastRenderedState,ut=O(Ze,S);if(b.eagerReducer=O,b.eagerState=ut,Sn(ut,Ze))return}catch(In){}finally{}_0(v,M)}}var oo={readContext:D0,useCallback:Ne,useContext:Ne,useEffect:Ne,useImperativeHandle:Ne,useLayoutEffect:Ne,useMemo:Ne,useReducer:Ne,useRef:Ne,useState:Ne,useDebugValue:Ne,useResponder:Ne,useDeferredValue:Ne,useTransition:Ne},Hi={readContext:D0,useCallback:du,useContext:D0,useEffect:So,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,qr(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return qr(4,36,v,m)},useMemo:function(v,m){var S=Cn();return m=m===void 0?null:m,v=v(),S.memoizedState=[v,m],v},useReducer:function(v,m,S){var O=Cn();return m=S!==void 0?S(m):m,O.memoizedState=O.baseState=m,v=O.queue={last:null,dispatch:null,lastRenderedReducer:v,lastRenderedState:m},v=v.dispatch=Us.bind(null,wt,v),[O.memoizedState,v]},useRef:function(v){var m=Cn();return v={current:v},m.memoizedState=v},useState:ci,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=ci(v),O=S[0],M=S[1];return So(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=ci(!1),S=m[0],O=m[1];return[du(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},qs={readContext:D0,useCallback:Yu,useContext:D0,useEffect:wl,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,Eo(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return Eo(4,36,v,m)},useMemo:function(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(v=v(),S.memoizedState=[v,m],v)},useReducer:h0,useRef:function(){return bn().memoizedState},useState:xi,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=xi(v),O=S[0],M=S[1];return wl(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=xi(!1),S=m[0],O=m[1];return[Yu(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},F0=null,Gr=null,ir=!1;function L0(v,m){var S=xo(5,null,null,0);S.elementType="DELETED",S.type="DELETED",S.stateNode=m,S.return=v,S.effectTag=8,v.lastEffect!==null?(v.lastEffect.nextEffect=S,v.lastEffect=S):v.firstEffect=v.lastEffect=S}function Y0(v,m){switch(v.tag){case 5:return m=Ti(m,v.type,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 6:return m=Fu(m,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 13:return!1;default:return!1}}function Co(v){if(ir){var m=Gr;if(m){var S=m;if(!Y0(v,m)){if(m=cl(S),!m||!Y0(v,m)){v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v;return}L0(F0,S)}F0=v,Gr=al(m)}else v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v}}function $u(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;F0=v}function Vo(v){if(!w||v!==F0)return!1;if(!ir)return $u(v),ir=!0,!1;var m=v.type;if(v.tag!==5||m!=="head"&&m!=="body"&&!at(m,v.memoizedProps))for(m=Gr;m;)L0(v,m),m=cl(m);if($u(v),v.tag===13){if(!w)throw Error(t(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(t(317));Gr=Ac(v)}else Gr=F0?cl(v.stateNode):null;return!0}function Rr(){w&&(Gr=F0=null,ir=!1)}var Jn=C.ReactCurrentOwner,ai=!1;function o0(v,m,S,O){m.child=v===null?U(m,null,S,O):R(m,v.child,S,O)}function Vr(v,m,S,O,M){S=S.render;var b=m.ref;return io(m,M),O=St(v,m,S,O,b,M),v!==null&&!ai?(m.updateQueue=v.updateQueue,m.effectTag&=-517,v.expirationTime<=M&&(v.expirationTime=0),X0(v,m,M)):(m.effectTag|=1,o0(v,m,O,M),m.child)}function ff(v,m,S,O,M,b){if(v===null){var ee=S.type;return typeof ee=="function"&&!mf(ee)&&ee.defaultProps===void 0&&S.compare===null&&S.defaultProps===void 0?(m.tag=15,m.type=ee,cf(v,m,ee,O,M,b)):(v=Hs(S.type,null,O,null,m.mode,b),v.ref=m.ref,v.return=m,m.child=v)}return ee=v.child,Mm)&&Qn.set(v,m)))}}function Gi(v,m){v.expirationTimev?m:v)}function x0(v){if(v.lastExpiredTime!==0)v.callbackExpirationTime=1073741823,v.callbackPriority=99,v.callbackNode=Ho(Z0.bind(null,v));else{var m=fo(v),S=v.callbackNode;if(m===0)S!==null&&(v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90);else{var O=g0();if(m===1073741823?O=99:m===1||m===2?O=95:(O=10*(1073741821-m)-10*(1073741821-O),O=0>=O?99:250>=O?98:5250>=O?97:95),S!==null){var M=v.callbackPriority;if(v.callbackExpirationTime===m&&M>=O)return;S!==ju&&uf(S)}v.callbackExpirationTime=m,v.callbackPriority=O,m=m===1073741823?Ho(Z0.bind(null,v)):lu(O,Xu.bind(null,v),{timeout:10*(1073741821-m)-G0()}),v.callbackNode=m}}}function Xu(v,m){if(t0=0,m)return m=g0(),kl(v,m),x0(v),null;var S=fo(v);if(S!==0){if(m=v.callbackNode,(Kt&(Br|zr))!==Fn)throw Error(t(327));if(Ws(),v===X&&S===ye||mu(v,S),Y!==null){var O=Kt;Kt|=Br;var M=ei(v);do try{Ua();break}catch(Ye){Ju(v,Ye)}while(1);if(Wu(),Kt=O,B0.current=M,he===wr)throw m=We,mu(v,S),ao(v,S),x0(v),m;if(Y===null)switch(M=v.finishedWork=v.current.alternate,v.finishedExpirationTime=S,O=he,X=null,O){case lo:case wr:throw Error(t(345));case kn:kl(v,2=S){v.lastPingedTime=S,mu(v,S);break}}if(b=fo(v),b!==0&&b!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}v.timeoutHandle=jt(gu.bind(null,v),M);break}gu(v);break;case hi:if(ao(v,S),O=v.lastSuspendedTime,S===O&&(v.nextKnownPendingLevel=$f(M)),qt&&(M=v.lastPingedTime,M===0||M>=S)){v.lastPingedTime=S,mu(v,S);break}if(M=fo(v),M!==0&&M!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}if(Dt!==1073741823?O=10*(1073741821-Dt)-G0():et===1073741823?O=0:(O=10*(1073741821-et)-5e3,M=G0(),S=10*(1073741821-S)-M,O=M-O,0>O&&(O=0),O=(120>O?120:480>O?480:1080>O?1080:1920>O?1920:3e3>O?3e3:4320>O?4320:1960*Cl(O/1960))-O,S=O?O=0:(M=ee.busyDelayMs|0,b=G0()-(10*(1073741821-b)-(ee.timeoutMs|0||5e3)),O=b<=M?0:M+O-b),10 component higher in the tree to provide a loading indicator or placeholder to display.`+dl(M))}he!==Ai&&(he=kn),b=zs(b,M),Ze=O;do{switch(Ze.tag){case 3:ee=b,Ze.effectTag|=4096,Ze.expirationTime=m;var Ce=pu(Ze,ee,m);bu(Ze,Ce);break e;case 1:ee=b;var ze=Ze.type,Et=Ze.stateNode;if((Ze.effectTag&64)==0&&(typeof ze.getDerivedStateFromError=="function"||Et!==null&&typeof Et.componentDidCatch=="function"&&(Ar===null||!Ar.has(Et)))){Ze.effectTag|=4096,Ze.expirationTime=m;var on=Sl(Ze,ee,m);bu(Ze,on);break e}}Ze=Ze.return}while(Ze!==null)}Y=vu(Y)}catch(sr){m=sr;continue}break}while(1)}function ei(){var v=B0.current;return B0.current=oo,v===null?oo:v}function Yf(v,m){vZt&&(Zt=v)}function ja(){for(;Y!==null;)Y=Ic(Y)}function Ua(){for(;Y!==null&&!_n();)Y=Ic(Y)}function Ic(v){var m=Lc(v.alternate,v,ye);return v.memoizedProps=v.pendingProps,m===null&&(m=vu(v)),hu.current=null,m}function vu(v){Y=v;do{var m=Y.alternate;if(v=Y.return,(Y.effectTag&2048)==0){e:{var S=m;m=Y;var O=ye,M=m.pendingProps;switch(m.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:c0(m.type)&&Ru(m);break;case 3:Fe(m),ks(m),M=m.stateNode,M.pendingContext&&(M.context=M.pendingContext,M.pendingContext=null),(S===null||S.child===null)&&Vo(m)&&ki(m),$r(m);break;case 5:K(m);var b=W(de.current);if(O=m.type,S!==null&&m.stateNode!=null)m0(S,m,O,M,b),S.ref!==m.ref&&(m.effectTag|=128);else if(M){if(S=W(fe.current),Vo(m)){if(M=m,!w)throw Error(t(175));S=Ui(M.stateNode,M.type,M.memoizedProps,b,S,M),M.updateQueue=S,S=S!==null,S&&ki(m)}else{var ee=ne(O,M,b,S,m);Yr(ee,m,!1,!1),m.stateNode=ee,Z(ee,O,M,b,S)&&ki(m)}m.ref!==null&&(m.effectTag|=128)}else if(m.stateNode===null)throw Error(t(166));break;case 6:if(S&&m.stateNode!=null)Tn(S,m,S.memoizedProps,M);else{if(typeof M!="string"&&m.stateNode===null)throw Error(t(166));if(S=W(de.current),b=W(fe.current),Vo(m)){if(S=m,!w)throw Error(t(176));(S=Mr(S.stateNode,S.memoizedProps,S))&&ki(m)}else m.stateNode=Ft(M,S,b,m)}break;case 11:break;case 13:if(kr(xe,m),M=m.memoizedState,(m.effectTag&64)!=0){m.expirationTime=O;break e}M=M!==null,b=!1,S===null?m.memoizedProps.fallback!==void 0&&Vo(m):(O=S.memoizedState,b=O!==null,M||O===null||(O=S.child.sibling,O!==null&&(ee=m.firstEffect,ee!==null?(m.firstEffect=O,O.nextEffect=ee):(m.firstEffect=m.lastEffect=O,O.nextEffect=null),O.effectTag=8))),M&&!b&&(m.mode&2)!=0&&(S===null&&m.memoizedProps.unstable_avoidThisFallback!==!0||(xe.current&1)!=0?he===lo&&(he=T0):((he===lo||he===T0)&&(he=hi),Zt!==0&&X!==null&&(ao(X,ye),$o(X,Zt)))),cr&&M&&(m.effectTag|=4),Yt&&(M||b)&&(m.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Fe(m),$r(m);break;case 10:fi(m);break;case 9:break;case 14:break;case 17:c0(m.type)&&Ru(m);break;case 19:if(kr(xe,m),M=m.memoizedState,M===null)break;if(b=(m.effectTag&64)!=0,ee=M.rendering,ee===null){if(b)bi(M,!1);else if(he!==lo||S!==null&&(S.effectTag&64)!=0)for(S=m.child;S!==null;){if(ee=je(S),ee!==null){for(m.effectTag|=64,bi(M,!1),S=ee.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),M.lastEffect===null&&(m.firstEffect=null),m.lastEffect=M.lastEffect,S=O,M=m.child;M!==null;)b=M,O=S,b.effectTag&=2,b.nextEffect=null,b.firstEffect=null,b.lastEffect=null,ee=b.alternate,ee===null?(b.childExpirationTime=0,b.expirationTime=O,b.child=null,b.memoizedProps=null,b.memoizedState=null,b.updateQueue=null,b.dependencies=null):(b.childExpirationTime=ee.childExpirationTime,b.expirationTime=ee.expirationTime,b.child=ee.child,b.memoizedProps=ee.memoizedProps,b.memoizedState=ee.memoizedState,b.updateQueue=ee.updateQueue,O=ee.dependencies,b.dependencies=O===null?null:{expirationTime:O.expirationTime,firstContext:O.firstContext,responders:O.responders}),M=M.sibling;Fr(xe,xe.current&1|2,m),m=m.child;break e}S=S.sibling}}else{if(!b)if(S=je(ee),S!==null){if(m.effectTag|=64,b=!0,S=S.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),bi(M,!0),M.tail===null&&M.tailMode==="hidden"&&!ee.alternate){m=m.lastEffect=M.lastEffect,m!==null&&(m.nextEffect=null);break}}else G0()>M.tailExpiration&&1M&&(M=O),ee>M&&(M=ee),b=b.sibling;S.childExpirationTime=M}if(m!==null)return m;v!==null&&(v.effectTag&2048)==0&&(v.firstEffect===null&&(v.firstEffect=Y.firstEffect),Y.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=Y.firstEffect),v.lastEffect=Y.lastEffect),1v?m:v}function gu(v){var m=Fs();return zi(99,co.bind(null,v,m)),null}function co(v,m){do Ws();while(dr!==null);if((Kt&(Br|zr))!==Fn)throw Error(t(327));var S=v.finishedWork,O=v.finishedExpirationTime;if(S===null)return null;if(v.finishedWork=null,v.finishedExpirationTime=0,S===v.current)throw Error(t(177));v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90,v.nextKnownPendingLevel=0;var M=$f(S);if(v.firstPendingTime=M,O<=v.lastSuspendedTime?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:O<=v.firstSuspendedTime&&(v.firstSuspendedTime=O-1),O<=v.lastPingedTime&&(v.lastPingedTime=0),O<=v.lastExpiredTime&&(v.lastExpiredTime=0),v===X&&(Y=X=null,ye=0),1=S?mt(v,m,S):(Fr(xe,xe.current&1,m),m=X0(v,m,S),m!==null?m.sibling:null);Fr(xe,xe.current&1,m);break;case 19:if(O=m.childExpirationTime>=S,(v.effectTag&64)!=0){if(O)return $t(v,m,S);m.effectTag|=64}if(M=m.memoizedState,M!==null&&(M.rendering=null,M.tail=null),Fr(xe,xe.current,m),!O)return null}return X0(v,m,S)}ai=!1}}else ai=!1;switch(m.expirationTime=0,m.tag){case 2:if(O=m.type,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,M=Lu(m,H0.current),io(m,S),M=St(null,m,O,v,M,S),m.effectTag|=1,typeof M=="object"&&M!==null&&typeof M.render=="function"&&M.$$typeof===void 0){if(m.tag=1,Qt(),c0(O)){var b=!0;wo(m)}else b=!1;m.memoizedState=M.state!==null&&M.state!==void 0?M.state:null;var ee=O.getDerivedStateFromProps;typeof ee=="function"&&Go(m,O,ee,v),M.updater=Gu,m.stateNode=M,M._reactInternalFiber=m,Vu(m,O,v,S),m=Be(null,m,O,!0,b,S)}else m.tag=0,o0(null,m,M,S),m=m.child;return m;case 16:if(M=m.elementType,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,Te(M),M._status!==1)throw M._result;switch(M=M._result,m.type=M,b=m.tag=Wa(M),v=I0(M,v),b){case 0:m=K0(null,m,M,v,S);break;case 1:m=ae(null,m,M,v,S);break;case 11:m=Vr(null,m,M,v,S);break;case 14:m=ff(null,m,M,I0(M.type,v),O,S);break;default:throw Error(t(306,M,""))}return m;case 0:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),K0(v,m,O,M,S);case 1:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),ae(v,m,O,M,S);case 3:if(Ie(m),O=m.updateQueue,O===null)throw Error(t(282));if(M=m.memoizedState,M=M!==null?M.element:null,P0(m,O,m.pendingProps,null,S),O=m.memoizedState.element,O===M)Rr(),m=X0(v,m,S);else{if((M=m.stateNode.hydrate)&&(w?(Gr=al(m.stateNode.containerInfo),F0=m,M=ir=!0):M=!1),M)for(S=U(m,null,O,S),m.child=S;S;)S.effectTag=S.effectTag&-3|1024,S=S.sibling;else o0(v,m,O,S),Rr();m=m.child}return m;case 5:return Ge(m),v===null&&Co(m),O=m.type,M=m.pendingProps,b=v!==null?v.memoizedProps:null,ee=M.children,at(O,M)?ee=null:b!==null&&at(O,b)&&(m.effectTag|=16),$0(v,m),m.mode&4&&S!==1&&it(O,M)?(m.expirationTime=m.childExpirationTime=1,m=null):(o0(v,m,ee,S),m=m.child),m;case 6:return v===null&&Co(m),null;case 13:return mt(v,m,S);case 4:return ve(m,m.stateNode.containerInfo),O=m.pendingProps,v===null?m.child=R(m,null,O,S):o0(v,m,O,S),m.child;case 11:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),Vr(v,m,O,M,S);case 7:return o0(v,m,m.pendingProps,S),m.child;case 8:return o0(v,m,m.pendingProps.children,S),m.child;case 12:return o0(v,m,m.pendingProps.children,S),m.child;case 10:e:{if(O=m.type._context,M=m.pendingProps,ee=m.memoizedProps,b=M.value,Ls(m,b),ee!==null){var Ye=ee.value;if(b=Sn(Ye,b)?0:(typeof O._calculateChangedBits=="function"?O._calculateChangedBits(Ye,b):1073741823)|0,b===0){if(ee.children===M.children&&!b0.current){m=X0(v,m,S);break e}}else for(Ye=m.child,Ye!==null&&(Ye.return=m);Ye!==null;){var Ze=Ye.dependencies;if(Ze!==null){ee=Ye.child;for(var ut=Ze.firstContext;ut!==null;){if(ut.context===O&&(ut.observedBits&b)!=0){Ye.tag===1&&(ut=a0(S,null),ut.tag=2,V0(Ye,ut)),Ye.expirationTime=m&&v<=m}function ao(v,m){var S=v.firstSuspendedTime,O=v.lastSuspendedTime;Sm||S===0)&&(v.lastSuspendedTime=m),m<=v.lastPingedTime&&(v.lastPingedTime=0),m<=v.lastExpiredTime&&(v.lastExpiredTime=0)}function $o(v,m){m>v.firstPendingTime&&(v.firstPendingTime=m);var S=v.firstSuspendedTime;S!==0&&(m>=S?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:m>=v.lastSuspendedTime&&(v.lastSuspendedTime=m+1),m>v.nextKnownPendingLevel&&(v.nextKnownPendingLevel=m))}function kl(v,m){var S=v.lastExpiredTime;(S===0||S>m)&&(v.lastExpiredTime=m)}function Nc(v){var m=v._reactInternalFiber;if(m===void 0)throw typeof v.render=="function"?Error(t(188)):Error(t(268,Object.keys(v)));return v=Ue(m),v===null?null:v.stateNode}function Al(v,m){v=v.memoizedState,v!==null&&v.dehydrated!==null&&v.retryTime{"use strict";sE.exports=uE()});var cE=Me((db,fE)=>{"use strict";var gN={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};fE.exports=gN});var hE=Me((pb,aE)=>{"use strict";var _N=Object.assign||function(i){for(var u=1;u"}}]),i}(),dE=function(){Ph(i,null,[{key:"fromJS",value:function(f){var c=f.width,g=f.height;return new i(c,g)}}]);function i(u,f){Iy(this,i),this.width=u,this.height=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.width,this.height)}},{key:"toString",value:function(){return""}}]),i}(),pE=function(){function i(u,f){Iy(this,i),this.unit=u,this.value=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case ps.UNIT_POINT:return String(this.value);case ps.UNIT_PERCENT:return this.value+"%";case ps.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),i}();aE.exports=function(i,u){function f(C,A,x){var D=C[A];C[A]=function(){for(var L=arguments.length,N=Array(L),j=0;j1?N-1:0),$=1;$1&&arguments[1]!==void 0?arguments[1]:NaN,x=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,D=arguments.length>3&&arguments[3]!==void 0?arguments[3]:ps.DIRECTION_LTR;return C.call(this,A,x,D)}),_N({Config:u.Config,Node:u.Node,Layout:i("Layout",yN),Size:i("Size",dE),Value:i("Value",pE),getInstanceCount:function(){return u.getInstanceCount.apply(u,arguments)}},ps)}});var mE=Me((exports,module)=>{(function(i,u){typeof define=="function"&&define.amd?define([],function(){return u}):typeof module=="object"&&module.exports?module.exports=u:(i.nbind=i.nbind||{}).init=u})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(i,u){return function(){i&&i.apply(this,arguments);try{Module.ccall("nbind_init")}catch(f){u(f);return}u(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module!="undefined"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof require=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(u,f){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),u=nodePath.normalize(u);var c=nodeFS.readFileSync(u);return f?c:c.toString()},Module.readBinary=function(u){var f=Module.read(u,!0);return f.buffer||(f=new Uint8Array(f)),assert(f.buffer),f},Module.load=function(u){globalEval(read(u))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module!="undefined"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr!="undefined"&&(Module.printErr=printErr),typeof read!="undefined"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(u){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(u));var f=read(u,"binary");return assert(typeof f=="object"),f},typeof scriptArgs!="undefined"?Module.arguments=scriptArgs:typeof arguments!="undefined"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(i,u){quit(i)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.send(null),f.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.responseType="arraybuffer",f.send(null),new Uint8Array(f.response)}),Module.readAsync=function(u,f,c){var g=new XMLHttpRequest;g.open("GET",u,!0),g.responseType="arraybuffer",g.onload=function(){g.status==200||g.status==0&&g.response?f(g.response):c()},g.onerror=c,g.send(null)},typeof arguments!="undefined"&&(Module.arguments=arguments),typeof console!="undefined")Module.print||(Module.print=function(u){console.log(u)}),Module.printErr||(Module.printErr=function(u){console.warn(u)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump!="undefined"?function(i){dump(i)}:function(i){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle=="undefined"&&(Module.setWindowTitle=function(i){document.title=i})}else throw"Unknown runtime environment. Where are we?";function globalEval(i){eval.call(null,i)}!Module.load&&Module.read&&(Module.load=function(u){globalEval(Module.read(u))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(i,u){throw u}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(i){return tempRet0=i,i},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(i){STACKTOP=i},getNativeTypeSize:function(i){switch(i){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(i[i.length-1]==="*")return Runtime.QUANTUM_SIZE;if(i[0]==="i"){var u=parseInt(i.substr(1));return assert(u%8==0),u/8}else return 0}}},getNativeFieldSize:function(i){return Math.max(Runtime.getNativeTypeSize(i),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(i,u){return u==="double"||u==="i64"?i&7&&(assert((i&7)==4),i+=4):assert((i&3)==0),i},getAlignSize:function(i,u,f){return!f&&(i=="i64"||i=="double")?8:i?Math.min(u||(i?Runtime.getNativeFieldSize(i):0),Runtime.QUANTUM_SIZE):Math.min(u,8)},dynCall:function(i,u,f){return f&&f.length?Module["dynCall_"+i].apply(null,[u].concat(f)):Module["dynCall_"+i].call(null,u)},functionPointers:[],addFunction:function(i){for(var u=0;u>2],f=(u+i+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=f,f>=TOTAL_MEMORY){var c=enlargeMemory();if(!c)return HEAP32[DYNAMICTOP_PTR>>2]=u,0}return u},alignMemory:function(i,u){var f=i=Math.ceil(i/(u||16))*(u||16);return f},makeBigInt:function(i,u,f){var c=f?+(i>>>0)+ +(u>>>0)*4294967296:+(i>>>0)+ +(u|0)*4294967296;return c},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(i,u){i||abort("Assertion failed: "+u)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(i){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(i){var u=Runtime.stackAlloc(i.length);return writeArrayToMemory(i,u),u},stringToC:function(i){var u=0;if(i!=null&&i!==0){var f=(i.length<<2)+1;u=Runtime.stackAlloc(f),stringToUTF8(i,u,f)}return u}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(u,f,c,g,t){var C=getCFunc(u),A=[],x=0;if(g)for(var D=0;D>0]=u;break;case"i8":HEAP8[i>>0]=u;break;case"i16":HEAP16[i>>1]=u;break;case"i32":HEAP32[i>>2]=u;break;case"i64":tempI64=[u>>>0,(tempDouble=u,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[i>>2]=tempI64[0],HEAP32[i+4>>2]=tempI64[1];break;case"float":HEAPF32[i>>2]=u;break;case"double":HEAPF64[i>>3]=u;break;default:abort("invalid type for setValue: "+f)}}Module.setValue=setValue;function getValue(i,u,f){switch(u=u||"i8",u.charAt(u.length-1)==="*"&&(u="i32"),u){case"i1":return HEAP8[i>>0];case"i8":return HEAP8[i>>0];case"i16":return HEAP16[i>>1];case"i32":return HEAP32[i>>2];case"i64":return HEAP32[i>>2];case"float":return HEAPF32[i>>2];case"double":return HEAPF64[i>>3];default:abort("invalid type for setValue: "+u)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(i,u,f,c){var g,t;typeof i=="number"?(g=!0,t=i):(g=!1,t=i.length);var C=typeof u=="string"?u:null,A;if(f==ALLOC_NONE?A=c:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][f===void 0?ALLOC_STATIC:f](Math.max(t,C?1:u.length)),g){var c=A,x;for(assert((A&3)==0),x=A+(t&~3);c>2]=0;for(x=A+t;c>0]=0;return A}if(C==="i8")return i.subarray||i.slice?HEAPU8.set(i,A):HEAPU8.set(new Uint8Array(i),A),A;for(var D=0,L,N,j;D>0],f|=c,!(c==0&&!u||(g++,u&&g==u)););u||(u=g);var t="";if(f<128){for(var C=1024,A;u>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(i,i+Math.min(u,C))),t=t?t+A:A,i+=C,u-=C;return t}return Module.UTF8ToString(i)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(i){for(var u="";;){var f=HEAP8[i++>>0];if(!f)return u;u+=String.fromCharCode(f)}}Module.AsciiToString=AsciiToString;function stringToAscii(i,u){return writeAsciiToMemory(i,u,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(i,u){for(var f=u;i[f];)++f;if(f-u>16&&i.subarray&&UTF8Decoder)return UTF8Decoder.decode(i.subarray(u,f));for(var c,g,t,C,A,x,D="";;){if(c=i[u++],!c)return D;if(!(c&128)){D+=String.fromCharCode(c);continue}if(g=i[u++]&63,(c&224)==192){D+=String.fromCharCode((c&31)<<6|g);continue}if(t=i[u++]&63,(c&240)==224?c=(c&15)<<12|g<<6|t:(C=i[u++]&63,(c&248)==240?c=(c&7)<<18|g<<12|t<<6|C:(A=i[u++]&63,(c&252)==248?c=(c&3)<<24|g<<18|t<<12|C<<6|A:(x=i[u++]&63,c=(c&1)<<30|g<<24|t<<18|C<<12|A<<6|x))),c<65536)D+=String.fromCharCode(c);else{var L=c-65536;D+=String.fromCharCode(55296|L>>10,56320|L&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(i){return UTF8ArrayToString(HEAPU8,i)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(i,u,f,c){if(!(c>0))return 0;for(var g=f,t=f+c-1,C=0;C=55296&&A<=57343&&(A=65536+((A&1023)<<10)|i.charCodeAt(++C)&1023),A<=127){if(f>=t)break;u[f++]=A}else if(A<=2047){if(f+1>=t)break;u[f++]=192|A>>6,u[f++]=128|A&63}else if(A<=65535){if(f+2>=t)break;u[f++]=224|A>>12,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=2097151){if(f+3>=t)break;u[f++]=240|A>>18,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=67108863){if(f+4>=t)break;u[f++]=248|A>>24,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else{if(f+5>=t)break;u[f++]=252|A>>30,u[f++]=128|A>>24&63,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}}return u[f]=0,f-g}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(i,u,f){return stringToUTF8Array(i,HEAPU8,u,f)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(i){for(var u=0,f=0;f=55296&&c<=57343&&(c=65536+((c&1023)<<10)|i.charCodeAt(++f)&1023),c<=127?++u:c<=2047?u+=2:c<=65535?u+=3:c<=2097151?u+=4:c<=67108863?u+=5:u+=6}return u}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):void 0;function demangle(i){var u=Module.___cxa_demangle||Module.__cxa_demangle;if(u){try{var f=i.substr(1),c=lengthBytesUTF8(f)+1,g=_malloc(c);stringToUTF8(f,g,c);var t=_malloc(4),C=u(g,0,0,t);if(getValue(t,"i32")===0&&C)return Pointer_stringify(C)}catch(A){}finally{g&&_free(g),t&&_free(t),C&&_free(C)}return i}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),i}function demangleAll(i){var u=/__Z[\w\d_]+/g;return i.replace(u,function(f){var c=demangle(f);return f===c?f:f+" ["+c+"]"})}function jsStackTrace(){var i=new Error;if(!i.stack){try{throw new Error(0)}catch(u){i=u}if(!i.stack)return"(no stack trace available)"}return i.stack.toString()}function stackTrace(){var i=jsStackTrace();return Module.extraStackTrace&&(i+=` -`+Module.extraStackTrace()),demangleAll(i)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var u=i.shift();if(typeof u=="function"){u();continue}var f=u.func;typeof f=="number"?u.arg===void 0?Module.dynCall_v(f):Module.dynCall_vi(f,u.arg):f(u.arg===void 0?null:u.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(i){__ATPRERUN__.unshift(i)}Module.addOnPreRun=addOnPreRun;function addOnInit(i){__ATINIT__.unshift(i)}Module.addOnInit=addOnInit;function addOnPreMain(i){__ATMAIN__.unshift(i)}Module.addOnPreMain=addOnPreMain;function addOnExit(i){__ATEXIT__.unshift(i)}Module.addOnExit=addOnExit;function addOnPostRun(i){__ATPOSTRUN__.unshift(i)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(i,u,f){var c=f>0?f:lengthBytesUTF8(i)+1,g=new Array(c),t=stringToUTF8Array(i,g,0,g.length);return u&&(g.length=t),g}Module.intArrayFromString=intArrayFromString;function intArrayToString(i){for(var u=[],f=0;f255&&(c&=255),u.push(String.fromCharCode(c))}return u.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(i,u,f){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var c,g;f&&(g=u+lengthBytesUTF8(i),c=HEAP8[g]),stringToUTF8(i,u,Infinity),f&&(HEAP8[g]=c)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(i,u){HEAP8.set(i,u)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(i,u,f){for(var c=0;c>0]=i.charCodeAt(c);f||(HEAP8[u>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function(u,f){var c=u>>>16,g=u&65535,t=f>>>16,C=f&65535;return g*C+(c*C+g*t<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(i){return froundBuffer[0]=i,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(i){i=i>>>0;for(var u=0;u<32;u++)if(i&1<<31-u)return u;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(i){return i<0?Math.ceil(i):Math.floor(i)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(i){return i}function addRunDependency(i){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(i){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var u=dependenciesFulfilled;dependenciesFulfilled=null,u()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(i,u,f,c,g,t,C,A){return _nbind.callbackSignatureList[i].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(i,u,f,c,g,t,C,A){return ASM_CONSTS[i](u,f,c,g,t,C,A)}function _emscripten_asm_const_iiiii(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiidddddd(i,u,f,c,g,t,C,A,x){return ASM_CONSTS[i](u,f,c,g,t,C,A,x)}function _emscripten_asm_const_iiididi(i,u,f,c,g,t,C){return ASM_CONSTS[i](u,f,c,g,t,C)}function _emscripten_asm_const_iiii(i,u,f,c){return ASM_CONSTS[i](u,f,c)}function _emscripten_asm_const_iiiid(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiiiii(i,u,f,c,g,t){return ASM_CONSTS[i](u,f,c,g,t)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(i,u){__ATEXIT__.unshift({func:i,arg:u})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(i,u,f,c){var g=arguments.length,t=g<3?u:c===null?c=Object.getOwnPropertyDescriptor(u,f):c,C;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(i,u,f,c);else for(var A=i.length-1;A>=0;A--)(C=i[A])&&(t=(g<3?C(t):g>3?C(u,f,t):C(u,f))||t);return g>3&&t&&Object.defineProperty(u,f,t),t}function _defineHidden(i){return function(u,f){Object.defineProperty(u,f,{configurable:!1,enumerable:!1,value:i,writable:!0})}}var _nbind={};function __nbind_free_external(i){_nbind.externalList[i].dereference(i)}function __nbind_reference_external(i){_nbind.externalList[i].reference()}function _llvm_stackrestore(i){var u=_llvm_stacksave,f=u.LLVM_SAVEDSTACKS[i];u.LLVM_SAVEDSTACKS.splice(i,1),Runtime.stackRestore(f)}function __nbind_register_pool(i,u,f,c){_nbind.Pool.pageSize=i,_nbind.Pool.usedPtr=u/4,_nbind.Pool.rootPtr=f,_nbind.Pool.pagePtr=c/4,HEAP32[u/4]=16909060,HEAP8[u]==1&&(_nbind.bigEndian=!0),HEAP32[u/4]=0,_nbind.makeTypeKindTbl=(t={},t[1024]=_nbind.PrimitiveType,t[64]=_nbind.Int64Type,t[2048]=_nbind.BindClass,t[3072]=_nbind.BindClassPtr,t[4096]=_nbind.SharedClassPtr,t[5120]=_nbind.ArrayType,t[6144]=_nbind.ArrayType,t[7168]=_nbind.CStringType,t[9216]=_nbind.CallbackType,t[10240]=_nbind.BindType,t),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var g=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});g.proto=Module,_nbind.BindClass.list.push(g);var t}function _emscripten_set_main_loop_timing(i,u){if(Browser.mainLoop.timingMode=i,Browser.mainLoop.timingValue=u,!Browser.mainLoop.func)return 1;if(i==0)Browser.mainLoop.scheduler=function(){var C=Math.max(0,Browser.mainLoop.tickStartTime+u-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,C)},Browser.mainLoop.method="timeout";else if(i==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(i==2){if(!window.setImmediate){let t=function(C){C.source===window&&C.data===c&&(C.stopPropagation(),f.shift()())};var g=t,f=[],c="setimmediate";window.addEventListener("message",t,!0),window.setImmediate=function(A){f.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:c})):window.postMessage(c,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(i,u,f,c,g){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=i,Browser.mainLoop.arg=c;var t;typeof c!="undefined"?t=function(){Module.dynCall_vi(i,c)}:t=function(){Module.dynCall_v(i)};var C=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var x=Date.now(),D=Browser.mainLoop.queue.shift();if(D.func(D.arg),Browser.mainLoop.remainingBlockers){var L=Browser.mainLoop.remainingBlockers,N=L%1==0?L-1:Math.floor(L);D.counted?Browser.mainLoop.remainingBlockers=N:(N=N+.5,Browser.mainLoop.remainingBlockers=(8*L+N)/9)}if(console.log('main loop blocker "'+D.name+'" took '+(Date.now()-x)+" ms"),Browser.mainLoop.updateStatus(),C1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(t),!(C0?_emscripten_set_main_loop_timing(0,1e3/u):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),f)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var i=Browser.mainLoop.timingMode,u=Browser.mainLoop.timingValue,f=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(f,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(i,u),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var i=Module.statusMessage||"Please wait...",u=Browser.mainLoop.remainingBlockers,f=Browser.mainLoop.expectedBlockers;u?u=6;){var Le=J>>Te-6&63;Te-=6,De+=Se[Le]}return Te==2?(De+=Se[(J&3)<<4],De+=me+me):Te==4&&(De+=Se[(J&15)<<2],De+=me),De}h.src="data:audio/x-"+C.substr(-3)+";base64,"+Q(t),L(h)},h.src=$,Browser.safeSetTimeout(function(){L(h)},1e4)}else return N()},Module.preloadPlugins.push(u);function f(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var c=Module.canvas;c&&(c.requestPointerLock=c.requestPointerLock||c.mozRequestPointerLock||c.webkitRequestPointerLock||c.msRequestPointerLock||function(){},c.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},c.exitPointerLock=c.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",f,!1),document.addEventListener("mozpointerlockchange",f,!1),document.addEventListener("webkitpointerlockchange",f,!1),document.addEventListener("mspointerlockchange",f,!1),Module.elementPointerLock&&c.addEventListener("click",function(g){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),g.preventDefault())},!1))},createContext:function(i,u,f,c){if(u&&Module.ctx&&i==Module.canvas)return Module.ctx;var g,t;if(u){var C={antialias:!1,alpha:!1};if(c)for(var A in c)C[A]=c[A];t=GL.createContext(i,C),t&&(g=GL.getContext(t).GLctx)}else g=i.getContext("2d");return g?(f&&(u||assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=g,u&&GL.makeContextCurrent(t),Module.useWebGL=u,Browser.moduleContextCreatedCallbacks.forEach(function(x){x()}),Browser.init()),g):null},destroyContext:function(i,u,f){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(i,u,f){Browser.lockPointer=i,Browser.resizeCanvas=u,Browser.vrDevice=f,typeof Browser.lockPointer=="undefined"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas=="undefined"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice=="undefined"&&(Browser.vrDevice=null);var c=Module.canvas;function g(){Browser.isFullscreen=!1;var C=c.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===C?(c.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},c.exitFullscreen=c.exitFullscreen.bind(document),Browser.lockPointer&&c.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(C.parentNode.insertBefore(c,C),C.parentNode.removeChild(C),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(c)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",g,!1),document.addEventListener("mozfullscreenchange",g,!1),document.addEventListener("webkitfullscreenchange",g,!1),document.addEventListener("MSFullscreenChange",g,!1));var t=document.createElement("div");c.parentNode.insertBefore(t,c),t.appendChild(c),t.requestFullscreen=t.requestFullscreen||t.mozRequestFullScreen||t.msRequestFullscreen||(t.webkitRequestFullscreen?function(){t.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(t.webkitRequestFullScreen?function(){t.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),f?t.requestFullscreen({vrDisplay:f}):t.requestFullscreen()},requestFullScreen:function(i,u,f){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(c,g,t){return Browser.requestFullscreen(c,g,t)},Browser.requestFullscreen(i,u,f)},nextRAF:0,fakeRequestAnimationFrame:function(i){var u=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=u+1e3/60;else for(;u+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var f=Math.max(Browser.nextRAF-u,0);setTimeout(i,f)},requestAnimationFrame:function(u){typeof window=="undefined"?Browser.fakeRequestAnimationFrame(u):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(u))},safeCallback:function(i){return function(){if(!ABORT)return i.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var i=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],i.forEach(function(u){u()})}},safeRequestAnimationFrame:function(i){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))})},safeSetTimeout:function(i,u){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))},u)},safeSetInterval:function(i,u){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&i()},u)},getMimetype:function(i){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[i.substr(i.lastIndexOf(".")+1)]},getUserMedia:function(i){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(i)},getMovementX:function(i){return i.movementX||i.mozMovementX||i.webkitMovementX||0},getMovementY:function(i){return i.movementY||i.mozMovementY||i.webkitMovementY||0},getMouseWheelDelta:function(i){var u=0;switch(i.type){case"DOMMouseScroll":u=i.detail;break;case"mousewheel":u=i.wheelDelta;break;case"wheel":u=i.deltaY;break;default:throw"unrecognized mouse wheel event: "+i.type}return u},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(i){if(Browser.pointerLock)i.type!="mousemove"&&"mozMovementX"in i?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(i),Browser.mouseMovementY=Browser.getMovementY(i)),typeof SDL!="undefined"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var u=Module.canvas.getBoundingClientRect(),f=Module.canvas.width,c=Module.canvas.height,g=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset,t=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(i.type==="touchstart"||i.type==="touchend"||i.type==="touchmove"){var C=i.touch;if(C===void 0)return;var A=C.pageX-(g+u.left),x=C.pageY-(t+u.top);A=A*(f/u.width),x=x*(c/u.height);var D={x:A,y:x};if(i.type==="touchstart")Browser.lastTouches[C.identifier]=D,Browser.touches[C.identifier]=D;else if(i.type==="touchend"||i.type==="touchmove"){var L=Browser.touches[C.identifier];L||(L=D),Browser.lastTouches[C.identifier]=L,Browser.touches[C.identifier]=D}return}var N=i.pageX-(g+u.left),j=i.pageY-(t+u.top);N=N*(f/u.width),j=j*(c/u.height),Browser.mouseMovementX=N-Browser.mouseX,Browser.mouseMovementY=j-Browser.mouseY,Browser.mouseX=N,Browser.mouseY=j}},asyncLoad:function(i,u,f,c){var g=c?"":getUniqueRunDependency("al "+i);Module.readAsync(i,function(t){assert(t,'Loading data file "'+i+'" failed (no arrayBuffer).'),u(new Uint8Array(t)),g&&removeRunDependency(g)},function(t){if(f)f();else throw'Loading data file "'+i+'" failed.'}),g&&addRunDependency(g)},resizeListeners:[],updateResizeListeners:function(){var i=Module.canvas;Browser.resizeListeners.forEach(function(u){u(i.width,i.height)})},setCanvasSize:function(i,u,f){var c=Module.canvas;Browser.updateCanvasDimensions(c,i,u),f||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i&~8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},updateCanvasDimensions:function(i,u,f){u&&f?(i.widthNative=u,i.heightNative=f):(u=i.widthNative,f=i.heightNative);var c=u,g=f;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(c/g>2];return u},getStr:function(){var i=Pointer_stringify(SYSCALLS.get());return i},get64:function(){var i=SYSCALLS.get(),u=SYSCALLS.get();return i>=0?assert(u===0):assert(u===-1),i},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD();return FS.close(f),0}catch(c){return(typeof FS=="undefined"||!(c instanceof FS.ErrnoError))&&abort(c),-c.errno}}function ___syscall54(i,u){SYSCALLS.varargs=u;try{return 0}catch(f){return(typeof FS=="undefined"||!(f instanceof FS.ErrnoError))&&abort(f),-f.errno}}function _typeModule(i){var u=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function f(x,D,L,N,j,$){if(D==1){var h=N&896;(h==128||h==256||h==384)&&(x="X const")}var re;return $?re=L.replace("X",x).replace("Y",j):re=x.replace("X",L).replace("Y",j),re.replace(/([*&]) (?=[*&])/g,"$1")}function c(x,D,L,N,j){throw new Error(x+" type "+L.replace("X",D+"?")+(N?" with flag "+N:"")+" in "+j)}function g(x,D,L,N,j,$,h,re){$===void 0&&($="X"),re===void 0&&(re=1);var ce=L(x);if(ce)return ce;var Q=N(x),oe=Q.placeholderFlag,Se=u[oe];h&&Se&&($=f(h[2],h[0],$,Se[0],"?",!0));var me;oe==0&&(me="Unbound"),oe>=10&&(me="Corrupt"),re>20&&(me="Deeply nested"),me&&c(me,x,$,oe,j||"?");var De=Q.paramList[0],J=g(De,D,L,N,j,$,Se,re+1),Te,Oe={flags:Se[0],id:x,name:"",paramList:[J]},Le=[],ot="?";switch(Q.placeholderFlag){case 1:Te=J.spec;break;case 2:if((J.flags&15360)==1024&&J.spec.ptrSize==1){Oe.flags=7168;break}case 3:case 6:case 5:Te=J.spec,(J.flags&15360)!=2048;break;case 8:ot=""+Q.paramList[1],Oe.paramList.push(Q.paramList[1]);break;case 9:for(var ct=0,Ue=Q.paramList[1];ct>2]=i),i}function _llvm_stacksave(){var i=_llvm_stacksave;return i.LLVM_SAVEDSTACKS||(i.LLVM_SAVEDSTACKS=[]),i.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),i.LLVM_SAVEDSTACKS.length-1}function ___syscall140(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=SYSCALLS.get(),C=SYSCALLS.get(),A=g;return FS.llseek(f,A,C),HEAP32[t>>2]=f.position,f.getdents&&A===0&&C===0&&(f.getdents=null),0}catch(x){return(typeof FS=="undefined"||!(x instanceof FS.ErrnoError))&&abort(x),-x.errno}}function ___syscall146(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.get(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(L,N){var j=___syscall146.buffers[L];assert(j),N===0||N===10?((L===1?Module.print:Module.printErr)(UTF8ArrayToString(j,0)),j.length=0):j.push(N)});for(var C=0;C>2],x=HEAP32[c+(C*8+4)>>2],D=0;Di.pageSize/2||u>i.pageSize-f){var c=_nbind.typeNameTbl.NBind.proto;return c.lalloc(u)}else return HEAPU32[i.usedPtr]=f+u,i.rootPtr+f},i.lreset=function(u,f){var c=HEAPU32[i.pagePtr];if(c){var g=_nbind.typeNameTbl.NBind.proto;g.lreset(u,f)}else HEAPU32[i.usedPtr]=u},i}();_nbind.Pool=Pool;function constructType(i,u){var f=i==10240?_nbind.makeTypeNameTbl[u.name]||_nbind.BindType:_nbind.makeTypeKindTbl[i],c=new f(u);return typeIdTbl[u.id]=c,_nbind.typeNameTbl[u.name]=c,c}_nbind.constructType=constructType;function getType(i){return typeIdTbl[i]}_nbind.getType=getType;function queryType(i){var u=HEAPU8[i],f=_nbind.structureList[u][1];i/=4,f<0&&(++i,f=HEAPU32[i]+1);var c=Array.prototype.slice.call(HEAPU32.subarray(i+1,i+1+f));return u==9&&(c=[c[0],c.slice(1)]),{paramList:c,placeholderFlag:u}}_nbind.queryType=queryType;function getTypes(i,u){return i.map(function(f){return typeof f=="number"?_nbind.getComplexType(f,constructType,getType,queryType,u):_nbind.typeNameTbl[f]})}_nbind.getTypes=getTypes;function readTypeIdList(i,u){return Array.prototype.slice.call(HEAPU32,i/4,i/4+u)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(i){for(var u=i;HEAPU8[u++];);return String.fromCharCode.apply("",HEAPU8.subarray(i,u-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(i){var u={};if(i)for(;;){var f=HEAPU32[i/4];if(!f)break;u[readAsciiString(f)]=!0,i+=4}return u}_nbind.readPolicyList=readPolicyList;function getDynCall(i,u){var f={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},c=i.map(function(t){return f[t.name]||"i"}).join(""),g=Module["dynCall_"+c];if(!g)throw new Error("dynCall_"+c+" not found for "+u+"("+i.map(function(t){return t.name}).join(", ")+")");return g}_nbind.getDynCall=getDynCall;function addMethod(i,u,f,c){var g=i[u];i.hasOwnProperty(u)&&g?((g.arity||g.arity===0)&&(g=_nbind.makeOverloader(g,g.arity),i[u]=g),g.addMethod(f,c)):(f.arity=c,i[u]=f)}_nbind.addMethod=addMethod;function throwError(i){throw new Error(i)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.heap=HEAPU32,f.ptrSize=4,f}return u.prototype.needsWireRead=function(f){return!!this.wireRead||!!this.makeWireRead},u.prototype.needsWireWrite=function(f){return!!this.wireWrite||!!this.makeWireWrite},u}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(i){__extends(u,i);function u(f){var c=i.call(this,f)||this,g=f.flags&32?{32:HEAPF32,64:HEAPF64}:f.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return c.heap=g[f.ptrSize*8],c.ptrSize=f.ptrSize,c}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="number")return g;throw new Error("Type mismatch")}},u}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(i,u){if(i==null){if(u&&u.Nullable)return 0;throw new Error("Type mismatch")}if(u&&u.Strict){if(typeof i!="string")throw new Error("Type mismatch")}else i=i.toString();var f=Module.lengthBytesUTF8(i)+1,c=_nbind.Pool.lalloc(f);return Module.stringToUTF8Array(i,HEAPU8,c,f),c}_nbind.pushCString=pushCString;function popCString(i){return i===0?null:Module.Pointer_stringify(i)}_nbind.popCString=popCString;var CStringType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=popCString,f.wireWrite=pushCString,f.readResources=[_nbind.resources.pool],f.writeResources=[_nbind.resources.pool],f}return u.prototype.makeWireWrite=function(f,c){return function(g){return pushCString(g,c)}},u}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=function(c){return!!c},f}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireRead=function(f){return"!!("+f+")"},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="boolean")return g;throw new Error("Type mismatch")}||f},u}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function i(){}return i.prototype.persist=function(){this.__nbindState|=1},i}();_nbind.Wrapper=Wrapper;function makeBound(i,u){var f=function(c){__extends(g,c);function g(t,C,A,x){var D=c.call(this)||this;if(!(D instanceof g))return new(Function.prototype.bind.apply(g,Array.prototype.concat.apply([null],arguments)));var L=C,N=A,j=x;if(t!==_nbind.ptrMarker){var $=D.__nbindConstructor.apply(D,arguments);L=4096|512,j=HEAPU32[$/4],N=HEAPU32[$/4+1]}var h={configurable:!0,enumerable:!1,value:null,writable:!1},re={__nbindFlags:L,__nbindPtr:N};j&&(re.__nbindShared=j,_nbind.mark(D));for(var ce=0,Q=Object.keys(re);ce>=1;var f=_nbind.valueList[i];return _nbind.valueList[i]=firstFreeValue,firstFreeValue=i,f}else{if(u)return _nbind.popShared(i,u);throw new Error("Invalid value slot "+i)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(i){return typeof i=="number"?i:pushValue(i)*4096+valueBase}function pop64(i){return i=3?C=Buffer.from(t):C=new Buffer(t),C.copy(c)}else getBuffer(c).set(t)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var i=0,u=dirtyList;i>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(i,u,f,c,g,t){try{Module.dynCall_viiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_vif(i,u,f){try{Module.dynCall_vif(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_vid(i,u,f){try{Module.dynCall_vid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_fiff(i,u,f,c){try{return Module.dynCall_fiff(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_vi(i,u){try{Module.dynCall_vi(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_vii(i,u,f){try{Module.dynCall_vii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_ii(i,u){try{return Module.dynCall_ii(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_viddi(i,u,f,c,g){try{Module.dynCall_viddi(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_vidd(i,u,f,c){try{Module.dynCall_vidd(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_iiii(i,u,f,c){try{return Module.dynCall_iiii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_diii(i,u,f,c){try{return Module.dynCall_diii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_di(i,u){try{return Module.dynCall_di(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_iid(i,u,f){try{return Module.dynCall_iid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_iii(i,u,f){try{return Module.dynCall_iii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiddi(i,u,f,c,g,t){try{Module.dynCall_viiddi(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiiiii(i,u,f,c,g,t,C){try{Module.dynCall_viiiiii(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(i,u,f){try{return Module.dynCall_dii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_i(i){try{return Module.dynCall_i(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_iiiiii(i,u,f,c,g,t){try{return Module.dynCall_iiiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiid(i,u,f,c,g){try{Module.dynCall_viiid(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_viififi(i,u,f,c,g,t,C){try{Module.dynCall_viififi(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(i,u,f,c){try{Module.dynCall_viii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_v(i){try{Module.dynCall_v(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viid(i,u,f,c){try{Module.dynCall_viid(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_idd(i,u,f){try{return Module.dynCall_idd(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiii(i,u,f,c,g){try{Module.dynCall_viiii(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:Infinity},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(i,u,f){var c=new i.Int8Array(f),g=new i.Int16Array(f),t=new i.Int32Array(f),C=new i.Uint8Array(f),A=new i.Uint16Array(f),x=new i.Uint32Array(f),D=new i.Float32Array(f),L=new i.Float64Array(f),N=u.DYNAMICTOP_PTR|0,j=u.tempDoublePtr|0,$=u.ABORT|0,h=u.STACKTOP|0,re=u.STACK_MAX|0,ce=u.cttz_i8|0,Q=u.___dso_handle|0,oe=0,Se=0,me=0,De=0,J=i.NaN,Te=i.Infinity,Oe=0,Le=0,ot=0,ct=0,Ue=0,be=0,At=i.Math.floor,Ot=i.Math.abs,Nt=i.Math.sqrt,Je=i.Math.pow,V=i.Math.cos,ne=i.Math.sin,ge=i.Math.tan,Z=i.Math.acos,Ae=i.Math.asin,at=i.Math.atan,it=i.Math.atan2,Ft=i.Math.exp,jt=i.Math.log,hn=i.Math.ceil,Un=i.Math.imul,Jt=i.Math.min,Yt=i.Math.max,cr=i.Math.clz32,w=i.Math.fround,pt=u.abort,Mn=u.assert,Bn=u.enlargeMemory,Xn=u.getTotalMemory,vr=u.abortOnCannotGrowMemory,gr=u.invoke_viiiii,r0=u.invoke_vif,Ci=u.invoke_vid,yo=u.invoke_fiff,Ds=u.invoke_vi,Mu=u.invoke_vii,Gf=u.invoke_ii,iu=u.invoke_viddi,ou=u.invoke_vidd,ol=u.invoke_iiii,ul=u.invoke_diii,Es=u.invoke_di,Uo=u.invoke_iid,sl=u.invoke_iii,Ss=u.invoke_viiddi,Cs=u.invoke_viiiiii,Ti=u.invoke_dii,Fu=u.invoke_i,ll=u.invoke_iiiiii,fl=u.invoke_viiid,cl=u.invoke_viififi,al=u.invoke_viii,Ui=u.invoke_v,Mr=u.invoke_viid,Ac=u.invoke_idd,of=u.invoke_viiii,Ts=u._emscripten_asm_const_iiiii,xs=u._emscripten_asm_const_iiidddddd,dl=u._emscripten_asm_const_iiiid,qi=u.__nbind_reference_external,qo=u._emscripten_asm_const_iiiiiiii,kr=u._removeAccessorPrefix,Fr=u._typeModule,si=u.__nbind_register_pool,H0=u.__decorate,b0=u._llvm_stackrestore,Bt=u.___cxa_atexit,Lu=u.__extends,c0=u.__nbind_get_value_object,Ru=u.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,ks=u._emscripten_set_main_loop_timing,As=u.__nbind_register_primitive,uu=u.__nbind_register_type,wo=u._emscripten_memcpy_big,zo=u.__nbind_register_function,Os=u.___setErrNo,Is=u.__nbind_register_class,uf=u.__nbind_finish,_n=u._abort,Nu=u._nbind_value,Wo=u._llvm_stacksave,su=u.___syscall54,Ps=u._defineHidden,pl=u._emscripten_set_main_loop,Vf=u._emscripten_get_now,hl=u.__nbind_register_callback_signature,Bu=u._emscripten_asm_const_iiiiii,ju=u.__nbind_free_external,sf=u._emscripten_asm_const_iiii,ro=u._emscripten_asm_const_iiididi,Ms=u.___syscall6,ml=u._atexit,Uu=u.___syscall140,G0=u.___syscall146,Fs=w(0);let tt=w(0);function zi(e){e=e|0;var n=0;return n=h,h=h+e|0,h=h+15&-16,n|0}function lu(){return h|0}function Ho(e){e=e|0,h=e}function O0(e,n){e=e|0,n=n|0,h=e,re=n}function vl(e,n){e=e|0,n=n|0,oe||(oe=e,Se=n)}function gl(e){e=e|0,be=e}function fu(){return be|0}function _l(){var e=0,n=0;vn(8104,8,400)|0,vn(8504,408,540)|0,e=9044,n=e+44|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));c[9088]=0,c[9089]=1,t[2273]=0,t[2274]=948,t[2275]=948,Bt(17,8104,Q|0)|0}function Sn(e){e=e|0,lf(e+948|0)}function gt(e){return e=w(e),((Ar(e)|0)&2147483647)>>>0>2139095040|0}function en(e,n,r){e=e|0,n=n|0,r=r|0;e:do if(t[e+(n<<3)+4>>2]|0)e=e+(n<<3)|0;else{if((n|2|0)==3?t[e+60>>2]|0:0){e=e+56|0;break}switch(n|0){case 0:case 2:case 4:case 5:{if(t[e+52>>2]|0){e=e+48|0;break e}break}default:}if(t[e+68>>2]|0){e=e+64|0;break}else{e=(n|1|0)==5?948:r;break}}while(0);return e|0}function I0(e){e=e|0;var n=0;return n=uh(1e3)|0,li(e,(n|0)!=0,2456),t[2276]=(t[2276]|0)+1,vn(n|0,8104,1e3)|0,c[e+2>>0]|0&&(t[n+4>>2]=2,t[n+12>>2]=4),t[n+976>>2]=e,n|0}function li(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,zs(e,5,3197,o)),h=s}function qu(){return I0(956)|0}function Wi(e){e=e|0;var n=0;return n=Tt(1e3)|0,zu(n,e),li(t[e+976>>2]|0,1,2456),t[2276]=(t[2276]|0)+1,t[n+944>>2]=0,n|0}function zu(e,n){e=e|0,n=n|0;var r=0;vn(e|0,n|0,948)|0,af(e+948|0,n+948|0),r=e+960|0,e=n+960|0,n=r+40|0;do t[r>>2]=t[e>>2],r=r+4|0,e=e+4|0;while((r|0)<(n|0))}function Wu(e){e=e|0;var n=0,r=0,o=0,s=0;if(n=e+944|0,r=t[n>>2]|0,r|0&&(Ls(r+948|0,e)|0,t[n>>2]=0),r=fi(e)|0,r|0){n=0;do t[(e0(e,n)|0)+944>>2]=0,n=n+1|0;while((n|0)!=(r|0))}r=e+948|0,o=t[r>>2]|0,s=e+952|0,n=t[s>>2]|0,(n|0)!=(o|0)&&(t[s>>2]=n+(~((n+-4-o|0)>>>2)<<2)),io(r),sh(e),t[2276]=(t[2276]|0)+-1}function Ls(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0;o=t[e>>2]|0,_=e+4|0,r=t[_>>2]|0,l=r;e:do if((o|0)==(r|0))s=o,d=4;else for(e=o;;){if((t[e>>2]|0)==(n|0)){s=e,d=4;break e}if(e=e+4|0,(e|0)==(r|0)){e=0;break}}while(0);return(d|0)==4&&((s|0)!=(r|0)?(o=s+4|0,e=l-o|0,n=e>>2,n&&(Y1(s|0,o|0,e|0)|0,r=t[_>>2]|0),e=s+(n<<2)|0,(r|0)==(e|0)||(t[_>>2]=r+(~((r+-4-e|0)>>>2)<<2)),e=1):e=0),e|0}function fi(e){return e=e|0,(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2|0}function e0(e,n){e=e|0,n=n|0;var r=0;return r=t[e+948>>2]|0,(t[e+952>>2]|0)-r>>2>>>0>n>>>0?e=t[r+(n<<2)>>2]|0:e=0,e|0}function io(e){e=e|0;var n=0,r=0,o=0,s=0;o=h,h=h+32|0,n=o,s=t[e>>2]|0,r=(t[e+4>>2]|0)-s|0,((t[e+8>>2]|0)-s|0)>>>0>r>>>0&&(s=r>>2,z(n,s,s,e+8|0),dr(e,n),Or(n)),h=o}function D0(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;k=fi(e)|0;do if(k|0){if((t[(e0(e,0)|0)+944>>2]|0)==(e|0)){if(!(Ls(e+948|0,n)|0))break;vn(n+400|0,8504,540)|0,t[n+944>>2]=0,ln(e);break}d=t[(t[e+976>>2]|0)+12>>2]|0,_=e+948|0,y=(d|0)==0,r=0,l=0;do o=t[(t[_>>2]|0)+(l<<2)>>2]|0,(o|0)==(n|0)?ln(e):(s=Wi(o)|0,t[(t[_>>2]|0)+(r<<2)>>2]=s,t[s+944>>2]=e,y||Q4[d&15](o,s,e,r),r=r+1|0),l=l+1|0;while((l|0)!=(k|0));if(r>>>0>>0){y=e+948|0,_=e+952|0,d=r,r=t[_>>2]|0;do l=(t[y>>2]|0)+(d<<2)|0,o=l+4|0,s=r-o|0,n=s>>2,n&&(Y1(l|0,o|0,s|0)|0,r=t[_>>2]|0),s=r,o=l+(n<<2)|0,(s|0)!=(o|0)&&(r=s+(~((s+-4-o|0)>>>2)<<2)|0,t[_>>2]=r),d=d+1|0;while((d|0)!=(k|0))}}while(0)}function Do(e){e=e|0;var n=0,r=0,o=0,s=0;i0(e,(fi(e)|0)==0,2491),i0(e,(t[e+944>>2]|0)==0,2545),n=e+948|0,r=t[n>>2]|0,o=e+952|0,s=t[o>>2]|0,(s|0)!=(r|0)&&(t[o>>2]=s+(~((s+-4-r|0)>>>2)<<2)),io(n),n=e+976|0,r=t[n>>2]|0,vn(e|0,8104,1e3)|0,c[r+2>>0]|0&&(t[e+4>>2]=2,t[e+12>>2]=4),t[n>>2]=r}function i0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,wn(e,5,3197,o)),h=s}function Rs(){return t[2276]|0}function a0(){var e=0;return e=uh(20)|0,Hu((e|0)!=0,2592),t[2277]=(t[2277]|0)+1,t[e>>2]=t[239],t[e+4>>2]=t[240],t[e+8>>2]=t[241],t[e+12>>2]=t[242],t[e+16>>2]=t[243],e|0}function Hu(e,n){e=e|0,n=n|0;var r=0,o=0;o=h,h=h+16|0,r=o,e||(t[r>>2]=n,wn(0,5,3197,r)),h=o}function V0(e){e=e|0,sh(e),t[2277]=(t[2277]|0)+-1}function bu(e,n){e=e|0,n=n|0;var r=0;n?(i0(e,(fi(e)|0)==0,2629),r=1):(r=0,n=0),t[e+964>>2]=n,t[e+988>>2]=r}function Ns(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+8|0,s=o+4|0,d=o,t[s>>2]=n,i0(e,(t[n+944>>2]|0)==0,2709),i0(e,(t[e+964>>2]|0)==0,2763),bo(e),n=e+948|0,t[d>>2]=(t[n>>2]|0)+(r<<2),t[l>>2]=t[d>>2],P0(n,l,s)|0,t[(t[s>>2]|0)+944>>2]=e,ln(e),h=o}function bo(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;if(r=fi(e)|0,r|0?(t[(e0(e,0)|0)+944>>2]|0)!=(e|0):0){o=t[(t[e+976>>2]|0)+12>>2]|0,s=e+948|0,l=(o|0)==0,n=0;do d=t[(t[s>>2]|0)+(n<<2)>>2]|0,_=Wi(d)|0,t[(t[s>>2]|0)+(n<<2)>>2]=_,t[_+944>>2]=e,l||Q4[o&15](d,_,e,n),n=n+1|0;while((n|0)!=(r|0))}}function P0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0;Pe=h,h=h+64|0,P=Pe+52|0,_=Pe+48|0,q=Pe+28|0,we=Pe+24|0,le=Pe+20|0,ie=Pe,o=t[e>>2]|0,l=o,n=o+((t[n>>2]|0)-l>>2<<2)|0,o=e+4|0,s=t[o>>2]|0,d=e+8|0;do if(s>>>0<(t[d>>2]|0)>>>0){if((n|0)==(s|0)){t[n>>2]=t[r>>2],t[o>>2]=(t[o>>2]|0)+4;break}Qn(e,n,s,n+4|0),n>>>0<=r>>>0&&(r=(t[o>>2]|0)>>>0>r>>>0?r+4|0:r),t[n>>2]=t[r>>2]}else{o=(s-l>>2)+1|0,s=Q0(e)|0,s>>>0>>0&&$n(e),T=t[e>>2]|0,k=(t[d>>2]|0)-T|0,l=k>>1,z(ie,k>>2>>>0>>1>>>0?l>>>0>>0?o:l:s,n-T>>2,e+8|0),T=ie+8|0,o=t[T>>2]|0,l=ie+12|0,k=t[l>>2]|0,d=k,y=o;do if((o|0)==(k|0)){if(k=ie+4|0,o=t[k>>2]|0,ke=t[ie>>2]|0,s=ke,o>>>0<=ke>>>0){o=d-s>>1,o=(o|0)==0?1:o,z(q,o,o>>>2,t[ie+16>>2]|0),t[we>>2]=t[k>>2],t[le>>2]=t[T>>2],t[_>>2]=t[we>>2],t[P>>2]=t[le>>2],s0(q,_,P),o=t[ie>>2]|0,t[ie>>2]=t[q>>2],t[q>>2]=o,o=q+4|0,ke=t[k>>2]|0,t[k>>2]=t[o>>2],t[o>>2]=ke,o=q+8|0,ke=t[T>>2]|0,t[T>>2]=t[o>>2],t[o>>2]=ke,o=q+12|0,ke=t[l>>2]|0,t[l>>2]=t[o>>2],t[o>>2]=ke,Or(q),o=t[T>>2]|0;break}l=o,d=((l-s>>2)+1|0)/-2|0,_=o+(d<<2)|0,s=y-l|0,l=s>>2,l&&(Y1(_|0,o|0,s|0)|0,o=t[k>>2]|0),ke=_+(l<<2)|0,t[T>>2]=ke,t[k>>2]=o+(d<<2),o=ke}while(0);t[o>>2]=t[r>>2],t[T>>2]=(t[T>>2]|0)+4,n=nn(e,ie,n)|0,Or(ie)}while(0);return h=Pe,n|0}function ln(e){e=e|0;var n=0;do{if(n=e+984|0,c[n>>0]|0)break;c[n>>0]=1,D[e+504>>2]=w(J),e=t[e+944>>2]|0}while((e|0)!=0)}function lf(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function nr(e){return e=e|0,t[e+944>>2]|0}function rr(e){e=e|0,i0(e,(t[e+964>>2]|0)!=0,2832),ln(e)}function Go(e){return e=e|0,(c[e+984>>0]|0)!=0|0}function Gu(e,n){e=e|0,n=n|0,fL(e,n,400)|0&&(vn(e|0,n|0,400)|0,ln(e))}function yl(e){e=e|0;var n=tt;return n=w(D[e+44>>2]),e=gt(n)|0,w(e?w(0):n)}function cu(e){e=e|0;var n=tt;return n=w(D[e+48>>2]),gt(n)|0&&(n=c[(t[e+976>>2]|0)+2>>0]|0?w(1):w(0)),w(n)}function Bs(e,n){e=e|0,n=n|0,t[e+980>>2]=n}function Vu(e){return e=e|0,t[e+980>>2]|0}function M0(e,n){e=e|0,n=n|0;var r=0;r=e+4|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function au(e){return e=e|0,t[e+4>>2]|0}function Lr(e,n){e=e|0,n=n|0;var r=0;r=e+8|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function F(e){return e=e|0,t[e+8>>2]|0}function R(e,n){e=e|0,n=n|0;var r=0;r=e+12|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function U(e){return e=e|0,t[e+12>>2]|0}function H(e,n){e=e|0,n=n|0;var r=0;r=e+16|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function fe(e){return e=e|0,t[e+16>>2]|0}function ue(e,n){e=e|0,n=n|0;var r=0;r=e+20|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function de(e){return e=e|0,t[e+20>>2]|0}function W(e,n){e=e|0,n=n|0;var r=0;r=e+24|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function ve(e){return e=e|0,t[e+24>>2]|0}function Fe(e,n){e=e|0,n=n|0;var r=0;r=e+28|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Ge(e){return e=e|0,t[e+28>>2]|0}function K(e,n){e=e|0,n=n|0;var r=0;r=e+32|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function xe(e){return e=e|0,t[e+32>>2]|0}function je(e,n){e=e|0,n=n|0;var r=0;r=e+36|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Xe(e){return e=e|0,t[e+36>>2]|0}function rt(e,n){e=e|0,n=w(n);var r=0;r=e+40|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function st(e,n){e=e|0,n=w(n);var r=0;r=e+44|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function xt(e,n){e=e|0,n=w(n);var r=0;r=e+48|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function wt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+52|0,s=e+56|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function lt(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+52|0,r=e+56|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function Rt(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+52|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function yn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function sn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function ar(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+132+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function rn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Hn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function d0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+60+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function Cr(e,n){e=e|0,n=n|0;var r=0;r=e+60+(n<<3)+4|0,(t[r>>2]|0)!=3&&(D[e+60+(n<<3)>>2]=w(J),t[r>>2]=3,ln(e))}function He(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Qe(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Ne(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+204+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function ft(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+276+(n<<3)|0,n=e+276+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function St(e,n){return e=e|0,n=n|0,w(D[e+276+(n<<3)>>2])}function Qt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+348|0,s=e+352|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Cn(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+348|0,r=e+352|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function bn(e){e=e|0;var n=0;n=e+352|0,(t[n>>2]|0)!=3&&(D[e+348>>2]=w(J),t[n>>2]=3,ln(e))}function p0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+348|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function h0(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+356|0,s=e+360|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function ci(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+356|0,r=e+360|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function xi(e){e=e|0;var n=0;n=e+360|0,(t[n>>2]|0)!=3&&(D[e+356>>2]=w(J),t[n>>2]=3,ln(e))}function E0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+356|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function qr(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Eo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function So(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+364|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function wl(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function js(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Dl(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+372|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function du(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Yu(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Us(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+380|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function oo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Hi(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function qs(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+388|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function F0(e,n){e=e|0,n=w(n);var r=0;r=e+396|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function Gr(e){return e=e|0,w(D[e+396>>2])}function ir(e){return e=e|0,w(D[e+400>>2])}function L0(e){return e=e|0,w(D[e+404>>2])}function Y0(e){return e=e|0,w(D[e+408>>2])}function Co(e){return e=e|0,w(D[e+412>>2])}function $u(e){return e=e|0,w(D[e+416>>2])}function Vo(e){return e=e|0,w(D[e+420>>2])}function Rr(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+424+(n<<2)>>2])}function Jn(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+448+(n<<2)>>2])}function ai(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+472+(n<<2)>>2])}function o0(e,n){e=e|0,n=n|0;var r=0,o=tt;return r=t[e+4>>2]|0,(r|0)==(t[n+4>>2]|0)?r?(o=w(D[e>>2]),e=w(Ot(w(o-w(D[n>>2]))))>2]=0,t[o+4>>2]=0,t[o+8>>2]=0,Ru(o|0,e|0,n|0,0),wn(e,3,(c[o+11>>0]|0)<0?t[o>>2]|0:o,r),ML(o),h=r}function $0(e,n,r,o){e=w(e),n=w(n),r=r|0,o=o|0;var s=tt;e=w(e*n),s=w(V4(e,w(1)));do if(Vr(s,w(0))|0)e=w(e-s);else{if(e=w(e-s),Vr(s,w(1))|0){e=w(e+w(1));break}if(r){e=w(e+w(1));break}o||(s>w(.5)?s=w(1):(o=Vr(s,w(.5))|0,s=w(o?1:0)),e=w(e+s))}while(0);return w(e/n)}function K0(e,n,r,o,s,l,d,_,y,k,T,P,q){e=e|0,n=w(n),r=r|0,o=w(o),s=s|0,l=w(l),d=d|0,_=w(_),y=w(y),k=w(k),T=w(T),P=w(P),q=q|0;var we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt;return y>2]),le!=w(0)):0)?(Pe=w($0(n,le,0,0)),ke=w($0(o,le,0,0)),ie=w($0(l,le,0,0)),le=w($0(_,le,0,0))):(ie=l,Pe=n,le=_,ke=o),(s|0)==(e|0)?we=Vr(ie,Pe)|0:we=0,(d|0)==(r|0)?q=Vr(le,ke)|0:q=0,((we?0:(qe=w(n-T),!(ae(e,qe,y)|0)))?!(Be(e,qe,s,y)|0):0)?we=Ie(e,qe,s,l,y)|0:we=1,((q?0:(pe=w(o-P),!(ae(r,pe,k)|0)))?!(Be(r,pe,d,k)|0):0)?q=Ie(r,pe,d,_,k)|0:q=1,q=we&q),q|0}function ae(e,n,r){return e=e|0,n=w(n),r=w(r),(e|0)==1?e=Vr(n,r)|0:e=0,e|0}function Be(e,n,r,o){return e=e|0,n=w(n),r=r|0,o=w(o),(e|0)==2&(r|0)==0?n>=o?e=1:e=Vr(n,o)|0:e=0,e|0}function Ie(e,n,r,o,s){return e=e|0,n=w(n),r=r|0,o=w(o),s=w(s),(e|0)==2&(r|0)==2&o>n?s<=n?e=1:e=Vr(n,s)|0:e=0,e|0}function ht(e,n,r,o,s,l,d,_,y,k,T){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0,T=T|0;var P=0,q=0,we=0,le=0,ie=tt,Pe=tt,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=tt,Ki=tt,Xi=tt,Ji=0,Ro=0;zt=h,h=h+160|0,It=zt+152|0,Ht=zt+120|0,Ln=zt+104|0,pe=zt+72|0,le=zt+56|0,vt=zt+8|0,qe=zt,_e=(t[2279]|0)+1|0,t[2279]=_e,gn=e+984|0,((c[gn>>0]|0)!=0?(t[e+512>>2]|0)!=(t[2278]|0):0)?ke=4:(t[e+516>>2]|0)==(o|0)?Pn=0:ke=4,(ke|0)==4&&(t[e+520>>2]=0,t[e+924>>2]=-1,t[e+928>>2]=-1,D[e+932>>2]=w(-1),D[e+936>>2]=w(-1),Pn=1);e:do if(t[e+964>>2]|0)if(ie=w(mt(e,2,d)),Pe=w(mt(e,0,d)),P=e+916|0,Xi=w(D[P>>2]),Ki=w(D[e+920>>2]),Dr=w(D[e+932>>2]),K0(s,n,l,r,t[e+924>>2]|0,Xi,t[e+928>>2]|0,Ki,Dr,w(D[e+936>>2]),ie,Pe,T)|0)ke=22;else if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,Dr=w(D[P>>2]),Ki=w(D[e+524+(q*24|0)+4>>2]),Xi=w(D[e+524+(q*24|0)+16>>2]),K0(s,n,l,r,t[e+524+(q*24|0)+8>>2]|0,Dr,t[e+524+(q*24|0)+12>>2]|0,Ki,Xi,w(D[e+524+(q*24|0)+20>>2]),ie,Pe,T)|0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}else{if(y){if(P=e+916|0,!(Vr(w(D[P>>2]),n)|0)){ke=21;break}if(!(Vr(w(D[e+920>>2]),r)|0)){ke=21;break}if((t[e+924>>2]|0)!=(s|0)){ke=21;break}P=(t[e+928>>2]|0)==(l|0)?P:0,ke=22;break}if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,((Vr(w(D[P>>2]),n)|0?Vr(w(D[e+524+(q*24|0)+4>>2]),r)|0:0)?(t[e+524+(q*24|0)+8>>2]|0)==(s|0):0)?(t[e+524+(q*24|0)+12>>2]|0)==(l|0):0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}}while(0);do if((ke|0)==21)c[11697]|0?(P=0,ke=28):(P=0,ke=31);else if((ke|0)==22){if(q=(c[11697]|0)!=0,!((P|0)!=0&(Pn^1)))if(q){ke=28;break}else{ke=31;break}le=P+16|0,t[e+908>>2]=t[le>>2],we=P+20|0,t[e+912>>2]=t[we>>2],(c[11698]|0)==0|q^1||(t[qe>>2]=Gn(_e)|0,t[qe+4>>2]=_e,wn(e,4,2972,qe),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),s=$t(s,y)|0,l=$t(l,y)|0,Ro=+w(D[le>>2]),Ji=+w(D[we>>2]),t[vt>>2]=s,t[vt+4>>2]=l,L[vt+8>>3]=+n,L[vt+16>>3]=+r,L[vt+24>>3]=Ro,L[vt+32>>3]=Ji,t[vt+40>>2]=k,wn(e,4,2989,vt))}while(0);return(ke|0)==28&&(q=Gn(_e)|0,t[le>>2]=q,t[le+4>>2]=_e,t[le+8>>2]=Pn?3047:11699,wn(e,4,3038,le),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,ke=$t(l,y)|0,t[pe>>2]=vt,t[pe+4>>2]=ke,L[pe+8>>3]=+n,L[pe+16>>3]=+r,t[pe+24>>2]=k,wn(e,4,3049,pe),ke=31),(ke|0)==31&&(X0(e,n,r,o,s,l,d,_,y,T),c[11697]|0&&(q=t[2279]|0,vt=Gn(q)|0,t[Ln>>2]=vt,t[Ln+4>>2]=q,t[Ln+8>>2]=Pn?3047:11699,wn(e,4,3083,Ln),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,Ln=$t(l,y)|0,Ji=+w(D[e+908>>2]),Ro=+w(D[e+912>>2]),t[Ht>>2]=vt,t[Ht+4>>2]=Ln,L[Ht+8>>3]=Ji,L[Ht+16>>3]=Ro,t[Ht+24>>2]=k,wn(e,4,3092,Ht)),t[e+516>>2]=o,P||(q=e+520|0,P=t[q>>2]|0,(P|0)==16&&(c[11697]|0&&wn(e,4,3124,It),t[q>>2]=0,P=0),y?P=e+916|0:(t[q>>2]=P+1,P=e+524+(P*24|0)|0),D[P>>2]=n,D[P+4>>2]=r,t[P+8>>2]=s,t[P+12>>2]=l,t[P+16>>2]=t[e+908>>2],t[P+20>>2]=t[e+912>>2],P=0)),y&&(t[e+416>>2]=t[e+908>>2],t[e+420>>2]=t[e+912>>2],c[e+985>>0]=1,c[gn>>0]=0),t[2279]=(t[2279]|0)+-1,t[e+512>>2]=t[2278],h=zt,Pn|(P|0)==0|0}function mt(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(Tr(e,n,r)),w(o+w(R0(e,n,r)))}function wn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=h,h=h+16|0,s=l,t[s>>2]=o,e?o=t[e+976>>2]|0:o=0,Ku(o,e,n,r,s),h=l}function Gn(e){return e=e|0,(e>>>0>60?3201:3201+(60-e)|0)|0}function $t(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+32|0,r=s+12|0,o=s,t[r>>2]=t[254],t[r+4>>2]=t[255],t[r+8>>2]=t[256],t[o>>2]=t[257],t[o+4>>2]=t[258],t[o+8>>2]=t[259],(e|0)>2?e=11699:e=t[(n?o:r)+(e<<2)>>2]|0,h=s,e|0}function X0(e,n,r,o,s,l,d,_,y,k){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0;var T=0,P=0,q=0,we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt,_e=tt,vt=0,Ln=0,Ht=0,It=tt,gn=tt,Pn=0,zt=tt,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=tt,Rf=tt,Zs=tt,el=tt,ss=tt,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=tt,tl=tt,ql=tt,zl=tt,Li=tt,Di=tt,ku=0,xr=tt,Wl=tt,Qi=tt,ls=tt,Zi=tt,fs=tt,Hl=0,bl=0,cs=tt,Ri=tt,Au=0,Gl=0,Vl=0,Yl=0,En=tt,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0,kt=tt,$l=0,Qr=0;Ou=h,h=h+16|0,Fi=Ou+12|0,nu=Ou+8|0,go=Ou+4|0,xu=Ou,i0(e,(s|0)==0|(gt(n)|0)^1,3326),i0(e,(l|0)==0|(gt(r)|0)^1,3406),Ei=so(e,o)|0,t[e+496>>2]=Ei,xn=N0(2,Ei)|0,Vt=N0(0,Ei)|0,D[e+440>>2]=w(Tr(e,xn,d)),D[e+444>>2]=w(R0(e,xn,d)),D[e+428>>2]=w(Tr(e,Vt,d)),D[e+436>>2]=w(R0(e,Vt,d)),D[e+464>>2]=w(C0(e,xn)),D[e+468>>2]=w(di(e,xn)),D[e+452>>2]=w(C0(e,Vt)),D[e+460>>2]=w(di(e,Vt)),D[e+488>>2]=w(u0(e,xn,d)),D[e+492>>2]=w(v0(e,xn,d)),D[e+476>>2]=w(u0(e,Vt,d)),D[e+484>>2]=w(v0(e,Vt,d));do if(t[e+964>>2]|0)To(e,n,r,s,l,d,_);else{if(eo=e+948|0,Ni=(t[e+952>>2]|0)-(t[eo>>2]|0)>>2,!Ni){pu(e,n,r,s,l,d,_);break}if(y?0:Sl(e,n,r,s,l,d,_)|0)break;bo(e),Tu=e+508|0,c[Tu>>0]=0,xn=N0(t[e+4>>2]|0,Ei)|0,Vt=Cl(xn,Ei)|0,br=Nr(xn)|0,Ff=t[e+8>>2]|0,Gl=e+28|0,us=(t[Gl>>2]|0)!=0,Zi=br?d:_,cs=br?_:d,Lf=w(B0(e,xn,d)),Rf=w(hu(e,xn,d)),le=w(B0(e,Vt,d)),fs=w(Fn(e,xn,d)),Ri=w(Fn(e,Vt,d)),Ht=br?s:l,Au=br?l:s,En=br?fs:Ri,qe=br?Ri:fs,ls=w(mt(e,2,d)),ke=w(mt(e,0,d)),ie=w(w(Tn(e+364|0,d))-En),Pe=w(w(Tn(e+380|0,d))-En),pe=w(w(Tn(e+372|0,_))-qe),_e=w(w(Tn(e+388|0,_))-qe),Zs=br?ie:pe,el=br?Pe:_e,ls=w(n-ls),n=w(ls-En),gt(n)|0?En=n:En=w(Ur(w(cc(n,Pe)),ie)),Wl=w(r-ke),n=w(Wl-qe),gt(n)|0?Qi=n:Qi=w(Ur(w(cc(n,_e)),pe)),ie=br?En:Qi,xr=br?Qi:En;e:do if((Ht|0)==1)for(o=0,P=0;;){if(T=e0(e,P)|0,!o)(w(Br(T))>w(0)?w(zr(T))>w(0):0)?o=T:o=0;else if(pi(T)|0){we=0;break e}if(P=P+1|0,P>>>0>=Ni>>>0){we=o;break}}else we=0;while(0);vt=we+500|0,Ln=we+504|0,o=0,T=0,n=w(0),q=0;do{if(P=t[(t[eo>>2]|0)+(q<<2)>>2]|0,(t[P+36>>2]|0)==1)lo(P),c[P+985>>0]=1,c[P+984>>0]=0;else{$r(P),y&&Yo(P,so(P,Ei)|0,ie,xr,En);do if((t[P+24>>2]|0)!=1)if((P|0)==(we|0)){t[vt>>2]=t[2278],D[Ln>>2]=w(0);break}else{wr(e,P,En,s,Qi,En,Qi,l,Ei,k);break}else T|0&&(t[T+960>>2]=P),t[P+960>>2]=0,T=P,o=(o|0)==0?P:o;while(0);Di=w(D[P+504>>2]),n=w(n+w(Di+w(mt(P,xn,En))))}q=q+1|0}while((q|0)!=(Ni|0));for(Xi=n>ie,ku=us&((Ht|0)==2&Xi)?1:Ht,Dr=(Au|0)==1,Ro=Dr&(y^1),kf=(ku|0)==1,Af=(ku|0)==2,Cu=976+(xn<<2)|0,Of=(Au|2|0)==2,Mf=Dr&(us^1),Js=1040+(Vt<<2)|0,Qs=1040+(xn<<2)|0,If=976+(Vt<<2)|0,Pf=(Au|0)!=1,Xi=us&((Ht|0)!=0&Xi),Ki=e+976|0,Dr=Dr^1,n=ie,Pn=0,Ji=0,Di=w(0),ss=w(0);;){e:do if(Pn>>>0>>0)for(Ln=t[eo>>2]|0,q=0,_e=w(0),pe=w(0),Pe=w(0),ie=w(0),P=0,T=0,we=Pn;;){if(vt=t[Ln+(we<<2)>>2]|0,(t[vt+36>>2]|0)!=1?(t[vt+940>>2]=Ji,(t[vt+24>>2]|0)!=1):0){if(ke=w(mt(vt,xn,En)),Kn=t[Cu>>2]|0,r=w(Tn(vt+380+(Kn<<3)|0,Zi)),qe=w(D[vt+504>>2]),r=w(cc(r,qe)),r=w(Ur(w(Tn(vt+364+(Kn<<3)|0,Zi)),r)),us&(q|0)!=0&w(ke+w(pe+r))>n){l=q,ke=_e,Ht=we;break e}ke=w(ke+r),r=w(pe+ke),ke=w(_e+ke),pi(vt)|0&&(Pe=w(Pe+w(Br(vt))),ie=w(ie-w(qe*w(zr(vt))))),T|0&&(t[T+960>>2]=vt),t[vt+960>>2]=0,q=q+1|0,T=vt,P=(P|0)==0?vt:P}else ke=_e,r=pe;if(we=we+1|0,we>>>0>>0)_e=ke,pe=r;else{l=q,Ht=we;break}}else l=0,ke=w(0),Pe=w(0),ie=w(0),P=0,Ht=Pn;while(0);Kn=Pe>w(0)&Pew(0)&ieel&((gt(el)|0)^1))n=el,Kn=51;else if(c[(t[Ki>>2]|0)+3>>0]|0)Kn=51;else{if(It!=w(0)?w(Br(e))!=w(0):0){Kn=53;break}n=ke,Kn=53}while(0);if((Kn|0)==51&&(Kn=0,gt(n)|0?Kn=53:(gn=w(n-ke),zt=n)),(Kn|0)==53&&(Kn=0,ke>2]|0,we=gnw(0),pe=w(gn/It),Pe=w(0),ke=w(0),n=w(0),T=P;do r=w(Tn(T+380+(q<<3)|0,Zi)),ie=w(Tn(T+364+(q<<3)|0,Zi)),ie=w(cc(r,w(Ur(ie,w(D[T+504>>2]))))),we?(r=w(ie*w(zr(T))),(r!=w(-0)?(kt=w(ie-w(qe*r)),Ul=w(kn(T,xn,kt,zt,En)),kt!=Ul):0)&&(Pe=w(Pe-w(Ul-ie)),n=w(n+r))):((vt?(tl=w(Br(T)),tl!=w(0)):0)?(kt=w(ie+w(pe*tl)),ql=w(kn(T,xn,kt,zt,En)),kt!=ql):0)&&(Pe=w(Pe-w(ql-ie)),ke=w(ke-tl)),T=t[T+960>>2]|0;while((T|0)!=0);if(n=w(_e+n),ie=w(gn+Pe),jl)n=w(0);else{qe=w(It+ke),we=t[Cu>>2]|0,vt=iew(0),qe=w(ie/qe),n=w(0);do{kt=w(Tn(P+380+(we<<3)|0,Zi)),Pe=w(Tn(P+364+(we<<3)|0,Zi)),Pe=w(cc(kt,w(Ur(Pe,w(D[P+504>>2]))))),vt?(kt=w(Pe*w(zr(P))),ie=w(-kt),kt!=w(-0)?(kt=w(pe*ie),ie=w(kn(P,xn,w(Pe+(Ln?ie:kt)),zt,En))):ie=Pe):(q?(zl=w(Br(P)),zl!=w(0)):0)?ie=w(kn(P,xn,w(Pe+w(qe*zl)),zt,En)):ie=Pe,n=w(n-w(ie-Pe)),ke=w(mt(P,xn,En)),r=w(mt(P,Vt,En)),ie=w(ie+ke),D[nu>>2]=ie,t[xu>>2]=1,Pe=w(D[P+396>>2]);e:do if(gt(Pe)|0){T=gt(xr)|0;do if(!T){if(Xi|(m0(P,Vt,xr)|0|Dr)||(T0(e,P)|0)!=4||(t[(hi(P,Vt)|0)+4>>2]|0)==3||(t[(Ai(P,Vt)|0)+4>>2]|0)==3)break;D[Fi>>2]=xr,t[go>>2]=1;break e}while(0);if(m0(P,Vt,xr)|0){T=t[P+992+(t[If>>2]<<2)>>2]|0,kt=w(r+w(Tn(T,xr))),D[Fi>>2]=kt,T=Pf&(t[T+4>>2]|0)==2,t[go>>2]=((gt(kt)|0|T)^1)&1;break}else{D[Fi>>2]=xr,t[go>>2]=T?0:2;break}}else kt=w(ie-ke),It=w(kt/Pe),kt=w(Pe*kt),t[go>>2]=1,D[Fi>>2]=w(r+(br?It:kt));while(0);Kt(P,xn,zt,En,xu,nu),Kt(P,Vt,xr,En,go,Fi);do if(m0(P,Vt,xr)|0?0:(T0(e,P)|0)==4){if((t[(hi(P,Vt)|0)+4>>2]|0)==3){T=0;break}T=(t[(Ai(P,Vt)|0)+4>>2]|0)!=3}else T=0;while(0);kt=w(D[nu>>2]),It=w(D[Fi>>2]),$l=t[xu>>2]|0,Qr=t[go>>2]|0,ht(P,br?kt:It,br?It:kt,Ei,br?$l:Qr,br?Qr:$l,En,Qi,y&(T^1),3488,k)|0,c[Tu>>0]=c[Tu>>0]|c[P+508>>0],P=t[P+960>>2]|0}while((P|0)!=0)}}else n=w(0);if(n=w(gn+n),Qr=n>0]=Qr|C[Tu>>0],Af&n>w(0)?(T=t[Cu>>2]|0,((t[e+364+(T<<3)+4>>2]|0)!=0?(Li=w(Tn(e+364+(T<<3)|0,Zi)),Li>=w(0)):0)?ie=w(Ur(w(0),w(Li-w(zt-n)))):ie=w(0)):ie=n,vt=Pn>>>0>>0,vt){we=t[eo>>2]|0,q=Pn,T=0;do P=t[we+(q<<2)>>2]|0,t[P+24>>2]|0||(T=((t[(hi(P,xn)|0)+4>>2]|0)==3&1)+T|0,T=T+((t[(Ai(P,xn)|0)+4>>2]|0)==3&1)|0),q=q+1|0;while((q|0)!=(Ht|0));T?(ke=w(0),r=w(0)):Kn=101}else Kn=101;e:do if((Kn|0)==101)switch(Kn=0,Ff|0){case 1:{T=0,ke=w(ie*w(.5)),r=w(0);break e}case 2:{T=0,ke=ie,r=w(0);break e}case 3:{if(l>>>0<=1){T=0,ke=w(0),r=w(0);break e}r=w((l+-1|0)>>>0),T=0,ke=w(0),r=w(w(Ur(ie,w(0)))/r);break e}case 5:{r=w(ie/w((l+1|0)>>>0)),T=0,ke=r;break e}case 4:{r=w(ie/w(l>>>0)),T=0,ke=w(r*w(.5));break e}default:{T=0,ke=w(0),r=w(0);break e}}while(0);if(n=w(Lf+ke),vt){Pe=w(ie/w(T|0)),q=t[eo>>2]|0,P=Pn,ie=w(0);do{T=t[q+(P<<2)>>2]|0;e:do if((t[T+36>>2]|0)!=1){switch(t[T+24>>2]|0){case 1:{if(X(T,xn)|0){if(!y)break e;kt=w(Y(T,xn,zt)),kt=w(kt+w(C0(e,xn))),kt=w(kt+w(Tr(T,xn,En))),D[T+400+(t[Qs>>2]<<2)>>2]=kt;break e}break}case 0:if(Qr=(t[(hi(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,y&&(Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(n+w(D[Qr>>2]))),Qr=(t[(Ai(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,Ro){kt=w(r+w(mt(T,xn,En))),ie=xr,n=w(n+w(kt+w(D[T+504>>2])));break e}else{n=w(n+w(r+w(ye(T,xn,En)))),ie=w(Ur(ie,w(ye(T,Vt,En))));break e}default:}y&&(kt=w(ke+w(C0(e,xn))),Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2])))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}else ie=w(0);if(r=w(Rf+n),Of?ke=w(w(kn(e,Vt,w(Ri+ie),cs,d))-Ri):ke=xr,Pe=w(w(kn(e,Vt,w(Ri+(Mf?xr:ie)),cs,d))-Ri),vt&y){P=Pn;do{q=t[(t[eo>>2]|0)+(P<<2)>>2]|0;do if((t[q+36>>2]|0)!=1){if((t[q+24>>2]|0)==1){if(X(q,Vt)|0){if(kt=w(Y(q,Vt,xr)),kt=w(kt+w(C0(e,Vt))),kt=w(kt+w(Tr(q,Vt,En))),T=t[Js>>2]|0,D[q+400+(T<<2)>>2]=kt,!(gt(kt)|0))break}else T=t[Js>>2]|0;kt=w(C0(e,Vt)),D[q+400+(T<<2)>>2]=w(kt+w(Tr(q,Vt,En)));break}T=T0(e,q)|0;do if((T|0)==4){if((t[(hi(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if(m0(q,Vt,xr)|0){n=le;break}$l=t[q+908+(t[Cu>>2]<<2)>>2]|0,t[Fi>>2]=$l,n=w(D[q+396>>2]),Qr=gt(n)|0,ie=(t[j>>2]=$l,w(D[j>>2])),Qr?n=Pe:(gn=w(mt(q,Vt,En)),kt=w(ie/n),n=w(n*ie),n=w(gn+(br?kt:n))),D[nu>>2]=n,D[Fi>>2]=w(w(mt(q,xn,En))+ie),t[go>>2]=1,t[xu>>2]=1,Kt(q,xn,zt,En,go,Fi),Kt(q,Vt,xr,En,xu,nu),n=w(D[Fi>>2]),gn=w(D[nu>>2]),kt=br?n:gn,n=br?gn:n,Qr=((gt(kt)|0)^1)&1,ht(q,kt,n,Ei,Qr,((gt(n)|0)^1)&1,En,Qi,1,3493,k)|0,n=le}else Kn=139;while(0);e:do if((Kn|0)==139){Kn=0,n=w(ke-w(ye(q,Vt,En)));do if((t[(hi(q,Vt)|0)+4>>2]|0)==3){if((t[(Ai(q,Vt)|0)+4>>2]|0)!=3)break;n=w(le+w(Ur(w(0),w(n*w(.5)))));break e}while(0);if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){n=le;break}if((t[(hi(q,Vt)|0)+4>>2]|0)==3){n=w(le+w(Ur(w(0),n)));break}switch(T|0){case 1:{n=le;break e}case 2:{n=w(le+w(n*w(.5)));break e}default:{n=w(le+n);break e}}}while(0);kt=w(Di+n),Qr=q+400+(t[Js>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2]))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}if(Di=w(Di+Pe),ss=w(Ur(ss,r)),l=Ji+1|0,Ht>>>0>=Ni>>>0)break;n=zt,Pn=Ht,Ji=l}do if(y){if(T=l>>>0>1,T?0:!(he(e)|0))break;if(!(gt(xr)|0)){n=w(xr-Di);e:do switch(t[e+12>>2]|0){case 3:{le=w(le+n),pe=w(0);break}case 2:{le=w(le+w(n*w(.5))),pe=w(0);break}case 4:{xr>Di?pe=w(n/w(l>>>0)):pe=w(0);break}case 7:if(xr>Di){le=w(le+w(n/w(l<<1>>>0))),pe=w(n/w(l>>>0)),pe=T?pe:w(0);break e}else{le=w(le+w(n*w(.5))),pe=w(0);break e}case 6:{pe=w(n/w(Ji>>>0)),pe=xr>Di&T?pe:w(0);break}default:pe=w(0)}while(0);if(l|0)for(vt=1040+(Vt<<2)|0,Ln=976+(Vt<<2)|0,we=0,P=0;;){e:do if(P>>>0>>0)for(ie=w(0),Pe=w(0),n=w(0),q=P;;){T=t[(t[eo>>2]|0)+(q<<2)>>2]|0;do if((t[T+36>>2]|0)!=1?(t[T+24>>2]|0)==0:0){if((t[T+940>>2]|0)!=(we|0))break e;if(We(T,Vt)|0&&(kt=w(D[T+908+(t[Ln>>2]<<2)>>2]),n=w(Ur(n,w(kt+w(mt(T,Vt,En)))))),(T0(e,T)|0)!=5)break;Li=w(et(T)),Li=w(Li+w(Tr(T,0,En))),kt=w(D[T+912>>2]),kt=w(w(kt+w(mt(T,0,En)))-Li),Li=w(Ur(Pe,Li)),kt=w(Ur(ie,kt)),ie=kt,Pe=Li,n=w(Ur(n,w(Li+kt)))}while(0);if(T=q+1|0,T>>>0>>0)q=T;else{q=T;break}}else Pe=w(0),n=w(0),q=P;while(0);if(qe=w(pe+n),r=le,le=w(le+qe),P>>>0>>0){ke=w(r+Pe),T=P;do{P=t[(t[eo>>2]|0)+(T<<2)>>2]|0;e:do if((t[P+36>>2]|0)!=1?(t[P+24>>2]|0)==0:0)switch(T0(e,P)|0){case 1:{kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 3:{kt=w(w(le-w(R0(P,Vt,En)))-w(D[P+908+(t[Ln>>2]<<2)>>2])),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 2:{kt=w(r+w(w(qe-w(D[P+908+(t[Ln>>2]<<2)>>2]))*w(.5))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 4:{if(kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt,m0(P,Vt,xr)|0||(br?(ie=w(D[P+908>>2]),n=w(ie+w(mt(P,xn,En))),Pe=qe):(Pe=w(D[P+912>>2]),Pe=w(Pe+w(mt(P,Vt,En))),n=qe,ie=w(D[P+908>>2])),Vr(n,ie)|0?Vr(Pe,w(D[P+912>>2]))|0:0))break e;ht(P,n,Pe,Ei,1,1,En,Qi,1,3501,k)|0;break e}case 5:{D[P+404>>2]=w(w(ke-w(et(P)))+w(Y(P,0,xr)));break e}default:break e}while(0);T=T+1|0}while((T|0)!=(q|0))}if(we=we+1|0,(we|0)==(l|0))break;P=q}}}while(0);if(D[e+908>>2]=w(kn(e,2,ls,d,d)),D[e+912>>2]=w(kn(e,0,Wl,_,d)),((ku|0)!=0?(Hl=t[e+32>>2]|0,bl=(ku|0)==2,!(bl&(Hl|0)!=2)):0)?bl&(Hl|0)==2&&(n=w(fs+zt),n=w(Ur(w(cc(n,w(Dt(e,xn,ss,Zi)))),fs)),Kn=198):(n=w(kn(e,xn,ss,Zi,d)),Kn=198),(Kn|0)==198&&(D[e+908+(t[976+(xn<<2)>>2]<<2)>>2]=n),((Au|0)!=0?(Vl=t[e+32>>2]|0,Yl=(Au|0)==2,!(Yl&(Vl|0)!=2)):0)?Yl&(Vl|0)==2&&(n=w(Ri+xr),n=w(Ur(w(cc(n,w(Dt(e,Vt,w(Ri+Di),cs)))),Ri)),Kn=204):(n=w(kn(e,Vt,w(Ri+Di),cs,d)),Kn=204),(Kn|0)==204&&(D[e+908+(t[976+(Vt<<2)>>2]<<2)>>2]=n),y){if((t[Gl>>2]|0)==2){P=976+(Vt<<2)|0,q=1040+(Vt<<2)|0,T=0;do we=e0(e,T)|0,t[we+24>>2]|0||($l=t[P>>2]|0,kt=w(D[e+908+($l<<2)>>2]),Qr=we+400+(t[q>>2]<<2)|0,kt=w(kt-w(D[Qr>>2])),D[Qr>>2]=w(kt-w(D[we+908+($l<<2)>>2]))),T=T+1|0;while((T|0)!=(Ni|0))}if(o|0){T=br?ku:s;do bt(e,o,En,T,Qi,Ei,k),o=t[o+960>>2]|0;while((o|0)!=0)}if(T=(xn|2|0)==3,P=(Vt|2|0)==3,T|P){o=0;do q=t[(t[eo>>2]|0)+(o<<2)>>2]|0,(t[q+36>>2]|0)!=1&&(T&&Zt(e,q,xn),P&&Zt(e,q,Vt)),o=o+1|0;while((o|0)!=(Ni|0))}}}while(0);h=Ou}function ki(e,n){e=e|0,n=w(n);var r=0;li(e,n>=w(0),3147),r=n==w(0),D[e+4>>2]=r?w(0):n}function Yr(e,n,r,o){e=e|0,n=w(n),r=w(r),o=o|0;var s=tt,l=tt,d=0,_=0,y=0;t[2278]=(t[2278]|0)+1,$r(e),m0(e,2,n)|0?(s=w(Tn(t[e+992>>2]|0,n)),y=1,s=w(s+w(mt(e,2,n)))):(s=w(Tn(e+380|0,n)),s>=w(0)?y=2:(y=((gt(n)|0)^1)&1,s=n)),m0(e,0,r)|0?(l=w(Tn(t[e+996>>2]|0,r)),_=1,l=w(l+w(mt(e,0,n)))):(l=w(Tn(e+388|0,r)),l>=w(0)?_=2:(_=((gt(r)|0)^1)&1,l=r)),d=e+976|0,(ht(e,s,l,o,y,_,n,r,1,3189,t[d>>2]|0)|0?(Yo(e,t[e+496>>2]|0,n,r,n),bi(e,w(D[(t[d>>2]|0)+4>>2]),w(0),w(0)),c[11696]|0):0)&&ff(e,7)}function $r(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;_=h,h=h+32|0,d=_+24|0,l=_+16|0,o=_+8|0,s=_,r=0;do n=e+380+(r<<3)|0,((t[e+380+(r<<3)+4>>2]|0)!=0?(y=n,k=t[y+4>>2]|0,T=o,t[T>>2]=t[y>>2],t[T+4>>2]=k,T=e+364+(r<<3)|0,k=t[T+4>>2]|0,y=s,t[y>>2]=t[T>>2],t[y+4>>2]=k,t[l>>2]=t[o>>2],t[l+4>>2]=t[o+4>>2],t[d>>2]=t[s>>2],t[d+4>>2]=t[s+4>>2],o0(l,d)|0):0)||(n=e+348+(r<<3)|0),t[e+992+(r<<2)>>2]=n,r=r+1|0;while((r|0)!=2);h=_}function m0(e,n,r){e=e|0,n=n|0,r=w(r);var o=0;switch(e=t[e+992+(t[976+(n<<2)>>2]<<2)>>2]|0,t[e+4>>2]|0){case 0:case 3:{e=0;break}case 1:{w(D[e>>2])>2])>2]|0){case 2:{n=w(w(w(D[e>>2])*n)/w(100));break}case 1:{n=w(D[e>>2]);break}default:n=w(J)}return w(n)}function Yo(e,n,r,o,s){e=e|0,n=n|0,r=w(r),o=w(o),s=w(s);var l=0,d=tt;n=t[e+944>>2]|0?n:1,l=N0(t[e+4>>2]|0,n)|0,n=Cl(l,n)|0,r=w(Wr(e,l,r)),o=w(Wr(e,n,o)),d=w(r+w(Tr(e,l,s))),D[e+400+(t[1040+(l<<2)>>2]<<2)>>2]=d,r=w(r+w(R0(e,l,s))),D[e+400+(t[1e3+(l<<2)>>2]<<2)>>2]=r,r=w(o+w(Tr(e,n,s))),D[e+400+(t[1040+(n<<2)>>2]<<2)>>2]=r,s=w(o+w(R0(e,n,s))),D[e+400+(t[1e3+(n<<2)>>2]<<2)>>2]=s}function bi(e,n,r,o){e=e|0,n=w(n),r=w(r),o=w(o);var s=0,l=0,d=tt,_=tt,y=0,k=0,T=tt,P=0,q=tt,we=tt,le=tt,ie=tt;if(n!=w(0)&&(s=e+400|0,ie=w(D[s>>2]),l=e+404|0,le=w(D[l>>2]),P=e+416|0,we=w(D[P>>2]),k=e+420|0,d=w(D[k>>2]),q=w(ie+r),T=w(le+o),o=w(q+we),_=w(T+d),y=(t[e+988>>2]|0)==1,D[s>>2]=w($0(ie,n,0,y)),D[l>>2]=w($0(le,n,0,y)),r=w(V4(w(we*n),w(1))),Vr(r,w(0))|0?l=0:l=(Vr(r,w(1))|0)^1,r=w(V4(w(d*n),w(1))),Vr(r,w(0))|0?s=0:s=(Vr(r,w(1))|0)^1,ie=w($0(o,n,y&l,y&(l^1))),D[P>>2]=w(ie-w($0(q,n,0,y))),ie=w($0(_,n,y&s,y&(s^1))),D[k>>2]=w(ie-w($0(T,n,0,y))),l=(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2,l|0)){s=0;do bi(e0(e,s)|0,n,q,T),s=s+1|0;while((s|0)!=(l|0))}}function or(e,n,r,o,s){switch(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,r|0){case 5:case 0:{e=q8(t[489]|0,o,s)|0;break}default:e=AL(o,s)|0}return e|0}function zs(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;s=h,h=h+16|0,l=s,t[l>>2]=o,Ku(e,0,n,r,l),h=s}function Ku(e,n,r,o,s){if(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,e=e|0?e:956,sD[t[e+8>>2]&1](e,n,r,o,s)|0,(r|0)==5)_n();else return}function J0(e,n,r){e=e|0,n=n|0,r=r|0,c[e+n>>0]=r&1}function af(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(S0(e,o),El(e,t[n>>2]|0,t[r>>2]|0,o))}function S0(e,n){e=e|0,n=n|0;var r=0;if((Q0(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function El(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function Q0(e){return e=e|0,1073741823}function Tr(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?e=e+92|0:e=en(e+60|0,t[1040+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function R0(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?e=e+100|0:e=en(e+60|0,t[1e3+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function Nr(e){return e=e|0,(e|1|0)==3|0}function uo(e,n){return e=e|0,n=w(n),(t[e+4>>2]|0)==3?n=w(0):n=w(Tn(e,n)),w(n)}function so(e,n){return e=e|0,n=n|0,e=t[e>>2]|0,((e|0)==0?(n|0)>1?n:1:e)|0}function N0(e,n){e=e|0,n=n|0;var r=0;e:do if((n|0)==2){switch(e|0){case 2:{e=3;break e}case 3:break;default:{r=4;break e}}e=2}else r=4;while(0);return e|0}function C0(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+312>>2]|0)!=0:0)?(r=w(D[e+308>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1040+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function di(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+320>>2]|0)!=0:0)?(r=w(D[e+316>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1e3+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function u0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+240>>2]|0)!=0:0)?(o=w(Tn(e+236|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1040+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function v0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+248>>2]|0)!=0:0)?(o=w(Tn(e+244|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1e3+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function To(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt,P=tt,q=tt,we=0,le=0,ie=0;ie=h,h=h+16|0,we=ie,le=e+964|0,i0(e,(t[le>>2]|0)!=0,3519),_=w(Fn(e,2,n)),y=w(Fn(e,0,n)),k=w(mt(e,2,n)),T=w(mt(e,0,n)),gt(n)|0?P=n:P=w(Ur(w(0),w(w(n-k)-_))),gt(r)|0?q=r:q=w(Ur(w(0),w(w(r-T)-y))),(o|0)==1&(s|0)==1?(D[e+908>>2]=w(kn(e,2,w(n-k),l,l)),n=w(kn(e,0,w(r-T),d,l))):(lD[t[le>>2]&1](we,e,P,o,q,s),P=w(_+w(D[we>>2])),q=w(n-k),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?P:q,l,l)),q=w(y+w(D[we+4>>2])),n=w(r-T),n=w(kn(e,0,(s|2|0)==2?q:n,d,l))),D[e+912>>2]=n,h=ie}function pu(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt;k=w(Fn(e,2,l)),_=w(Fn(e,0,l)),T=w(mt(e,2,l)),y=w(mt(e,0,l)),n=w(n-T),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?k:n,l,l)),r=w(r-y),D[e+912>>2]=w(kn(e,0,(s|2|0)==2?_:r,d,l))}function Sl(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=0,y=tt,k=tt;return _=(o|0)==2,((n<=w(0)&_?0:!(r<=w(0)&(s|0)==2))?!((o|0)==1&(s|0)==1):0)?e=0:(y=w(mt(e,0,l)),k=w(mt(e,2,l)),_=n>2]=w(kn(e,2,_?w(0):n,l,l)),n=w(r-y),_=r>2]=w(kn(e,0,_?w(0):n,d,l)),e=1),e|0}function Cl(e,n){return e=e|0,n=n|0,qt(e)|0?e=N0(2,n)|0:e=0,e|0}function B0(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(u0(e,n,r)),w(r+w(C0(e,n)))}function hu(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(v0(e,n,r)),w(r+w(di(e,n)))}function Fn(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(B0(e,n,r)),w(o+w(hu(e,n,r)))}function pi(e){return e=e|0,t[e+24>>2]|0?e=0:w(Br(e))!=w(0)?e=1:e=w(zr(e))!=w(0),e|0}function Br(e){e=e|0;var n=tt;if(t[e+944>>2]|0){if(n=w(D[e+44>>2]),gt(n)|0)return n=w(D[e+40>>2]),e=n>w(0)&((gt(n)|0)^1),w(e?n:w(0))}else n=w(0);return w(n)}function zr(e){e=e|0;var n=tt,r=0,o=tt;do if(t[e+944>>2]|0){if(n=w(D[e+48>>2]),gt(n)|0){if(r=c[(t[e+976>>2]|0)+2>>0]|0,r<<24>>24==0?(o=w(D[e+40>>2]),o>24?w(1):w(0)}}else n=w(0);while(0);return w(n)}function lo(e){e=e|0;var n=0,r=0;if(pa(e+400|0,0,540)|0,c[e+985>>0]=1,bo(e),r=fi(e)|0,r|0){n=e+948|0,e=0;do lo(t[(t[n>>2]|0)+(e<<2)>>2]|0),e=e+1|0;while((e|0)!=(r|0))}}function wr(e,n,r,o,s,l,d,_,y,k){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=w(l),d=w(d),_=_|0,y=y|0,k=k|0;var T=0,P=tt,q=0,we=0,le=tt,ie=tt,Pe=0,ke=tt,qe=0,pe=tt,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0;Dr=h,h=h+16|0,Ln=Dr+12|0,Ht=Dr+8|0,It=Dr+4|0,gn=Dr,zt=N0(t[e+4>>2]|0,y)|0,_e=Nr(zt)|0,P=w(Tn(Ut(n)|0,_e?l:d)),vt=m0(n,2,l)|0,Pn=m0(n,0,d)|0;do if(gt(P)|0?0:!(gt(_e?r:s)|0)){if(T=n+504|0,!(gt(w(D[T>>2]))|0)&&(!(fn(t[n+976>>2]|0,0)|0)||(t[n+500>>2]|0)==(t[2278]|0)))break;D[T>>2]=w(Ur(P,w(Fn(n,zt,l))))}else q=7;while(0);do if((q|0)==7){if(qe=_e^1,!(qe|vt^1)){d=w(Tn(t[n+992>>2]|0,l)),D[n+504>>2]=w(Ur(d,w(Fn(n,2,l))));break}if(!(_e|Pn^1)){d=w(Tn(t[n+996>>2]|0,d)),D[n+504>>2]=w(Ur(d,w(Fn(n,0,l))));break}D[Ln>>2]=w(J),D[Ht>>2]=w(J),t[It>>2]=0,t[gn>>2]=0,ke=w(mt(n,2,l)),pe=w(mt(n,0,l)),vt?(le=w(ke+w(Tn(t[n+992>>2]|0,l))),D[Ln>>2]=le,t[It>>2]=1,we=1):(we=0,le=w(J)),Pn?(P=w(pe+w(Tn(t[n+996>>2]|0,d))),D[Ht>>2]=P,t[gn>>2]=1,T=1):(T=0,P=w(J)),q=t[e+32>>2]|0,_e&(q|0)==2?q=2:(gt(le)|0?!(gt(r)|0):0)&&(D[Ln>>2]=r,t[It>>2]=2,we=2,le=r),(((q|0)==2&qe?0:gt(P)|0)?!(gt(s)|0):0)&&(D[Ht>>2]=s,t[gn>>2]=2,T=2,P=s),ie=w(D[n+396>>2]),Pe=gt(ie)|0;do if(Pe)q=we;else{if((we|0)==1&qe){D[Ht>>2]=w(w(le-ke)/ie),t[gn>>2]=1,T=1,q=1;break}_e&(T|0)==1?(D[Ln>>2]=w(ie*w(P-pe)),t[It>>2]=1,T=1,q=1):q=we}while(0);Ki=gt(r)|0,we=(T0(e,n)|0)!=4,(_e|vt|((o|0)!=1|Ki)|(we|(q|0)==1)?0:(D[Ln>>2]=r,t[It>>2]=1,!Pe))&&(D[Ht>>2]=w(w(r-ke)/ie),t[gn>>2]=1,T=1),(Pn|qe|((_|0)!=1|(gt(s)|0))|(we|(T|0)==1)?0:(D[Ht>>2]=s,t[gn>>2]=1,!Pe))&&(D[Ln>>2]=w(ie*w(s-pe)),t[It>>2]=1),Kt(n,2,l,l,It,Ln),Kt(n,0,d,l,gn,Ht),r=w(D[Ln>>2]),s=w(D[Ht>>2]),ht(n,r,s,y,t[It>>2]|0,t[gn>>2]|0,l,d,0,3565,k)|0,d=w(D[n+908+(t[976+(zt<<2)>>2]<<2)>>2]),D[n+504>>2]=w(Ur(d,w(Fn(n,zt,l))))}while(0);t[n+500>>2]=t[2278],h=Dr}function kn(e,n,r,o,s){return e=e|0,n=n|0,r=w(r),o=w(o),s=w(s),o=w(Dt(e,n,r,o)),w(Ur(o,w(Fn(e,n,s))))}function T0(e,n){return e=e|0,n=n|0,n=n+20|0,n=t[((t[n>>2]|0)==0?e+16|0:n)>>2]|0,((n|0)==5?qt(t[e+4>>2]|0)|0:0)&&(n=1),n|0}function hi(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?n=4:n=t[1040+(n<<2)>>2]|0,e+60+(n<<3)|0}function Ai(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?n=5:n=t[1e3+(n<<2)>>2]|0,e+60+(n<<3)|0}function Kt(e,n,r,o,s,l){switch(e=e|0,n=n|0,r=w(r),o=w(o),s=s|0,l=l|0,r=w(Tn(e+380+(t[976+(n<<2)>>2]<<3)|0,r)),r=w(r+w(mt(e,n,o))),t[s>>2]|0){case 2:case 1:{s=gt(r)|0,o=w(D[l>>2]),D[l>>2]=s|o>2]=2,D[l>>2]=r);break}default:}}function X(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,4,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1040+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function Y(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,4,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1040+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function ye(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),o=w(o+w(Tr(e,n,r))),w(o+w(R0(e,n,r)))}function he(e){e=e|0;var n=0,r=0,o=0;e:do if(qt(t[e+4>>2]|0)|0)n=0;else if((t[e+16>>2]|0)!=5)if(r=fi(e)|0,!r)n=0;else for(n=0;;){if(o=e0(e,n)|0,(t[o+24>>2]|0)==0?(t[o+20>>2]|0)==5:0){n=1;break e}if(n=n+1|0,n>>>0>=r>>>0){n=0;break}}else n=1;while(0);return n|0}function We(e,n){e=e|0,n=n|0;var r=tt;return r=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),r>=w(0)&((gt(r)|0)^1)|0}function et(e){e=e|0;var n=tt,r=0,o=0,s=0,l=0,d=0,_=0,y=tt;if(r=t[e+968>>2]|0,r)y=w(D[e+908>>2]),n=w(D[e+912>>2]),n=w(rD[r&0](e,y,n)),i0(e,(gt(n)|0)^1,3573);else{l=fi(e)|0;do if(l|0){for(r=0,s=0;;){if(o=e0(e,s)|0,t[o+940>>2]|0){d=8;break}if((t[o+24>>2]|0)!=1)if(_=(T0(e,o)|0)==5,_){r=o;break}else r=(r|0)==0?o:r;if(s=s+1|0,s>>>0>=l>>>0){d=8;break}}if((d|0)==8&&!r)break;return n=w(et(r)),w(n+w(D[r+404>>2]))}while(0);n=w(D[e+912>>2])}return w(n)}function Dt(e,n,r,o){e=e|0,n=n|0,r=w(r),o=w(o);var s=tt,l=0;return qt(n)|0?(n=1,l=3):Nr(n)|0?(n=0,l=3):(o=w(J),s=w(J)),(l|0)==3&&(s=w(Tn(e+364+(n<<3)|0,o)),o=w(Tn(e+380+(n<<3)|0,o))),l=o=w(0)&((gt(o)|0)^1)),r=l?o:r,l=s>=w(0)&((gt(s)|0)^1)&r>2]|0,l)|0,le=Cl(Pe,l)|0,ie=Nr(Pe)|0,P=w(mt(n,2,r)),q=w(mt(n,0,r)),m0(n,2,r)|0?_=w(P+w(Tn(t[n+992>>2]|0,r))):(X(n,2)|0?_t(n,2)|0:0)?(_=w(D[e+908>>2]),y=w(C0(e,2)),y=w(_-w(y+w(di(e,2)))),_=w(Y(n,2,r)),_=w(kn(n,2,w(y-w(_+w(_r(n,2,r)))),r,r))):_=w(J),m0(n,0,s)|0?y=w(q+w(Tn(t[n+996>>2]|0,s))):(X(n,0)|0?_t(n,0)|0:0)?(y=w(D[e+912>>2]),qe=w(C0(e,0)),qe=w(y-w(qe+w(di(e,0)))),y=w(Y(n,0,s)),y=w(kn(n,0,w(qe-w(y+w(_r(n,0,s)))),s,r))):y=w(J),k=gt(_)|0,T=gt(y)|0;do if(k^T?(we=w(D[n+396>>2]),!(gt(we)|0)):0)if(k){_=w(P+w(w(y-q)*we));break}else{qe=w(q+w(w(_-P)/we)),y=T?qe:y;break}while(0);T=gt(_)|0,k=gt(y)|0,T|k&&(pe=(T^1)&1,o=r>w(0)&((o|0)!=0&T),_=ie?_:o?r:_,ht(n,_,y,l,ie?pe:o?2:pe,T&(k^1)&1,_,y,0,3623,d)|0,_=w(D[n+908>>2]),_=w(_+w(mt(n,2,r))),y=w(D[n+912>>2]),y=w(y+w(mt(n,0,r)))),ht(n,_,y,l,1,1,_,y,1,3635,d)|0,(_t(n,Pe)|0?!(X(n,Pe)|0):0)?(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,Pe))),qe=w(qe-w(R0(n,Pe,r))),qe=w(qe-w(_r(n,Pe,ie?r:s))),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe):ke=21;do if((ke|0)==21){if(X(n,Pe)|0?0:(t[e+8>>2]|0)==1){pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe;break}(X(n,Pe)|0?0:(t[e+8>>2]|0)==2)&&(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe)}while(0);(_t(n,le)|0?!(X(n,le)|0):0)?(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,le))),qe=w(qe-w(R0(n,le,r))),qe=w(qe-w(_r(n,le,ie?s:r))),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe):ke=30;do if((ke|0)==30?!(X(n,le)|0):0){if((T0(e,n)|0)==2){pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe;break}pe=(T0(e,n)|0)==3,pe^(t[e+28>>2]|0)==2&&(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe)}while(0)}function Zt(e,n,r){e=e|0,n=n|0,r=r|0;var o=tt,s=0;s=t[976+(r<<2)>>2]|0,o=w(D[n+908+(s<<2)>>2]),o=w(w(D[e+908+(s<<2)>>2])-o),o=w(o-w(D[n+400+(t[1040+(r<<2)>>2]<<2)>>2])),D[n+400+(t[1e3+(r<<2)>>2]<<2)>>2]=o}function qt(e){return e=e|0,(e|1|0)==1|0}function Ut(e){e=e|0;var n=tt;switch(t[e+56>>2]|0){case 0:case 3:{n=w(D[e+40>>2]),n>w(0)&((gt(n)|0)^1)?e=c[(t[e+976>>2]|0)+2>>0]|0?1056:992:e=1056;break}default:e=e+52|0}return e|0}function fn(e,n){return e=e|0,n=n|0,(c[e+n>>0]|0)!=0|0}function _t(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,5,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1e3+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function _r(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,5,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1e3+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function Wr(e,n,r){return e=e|0,n=n|0,r=w(r),X(e,n)|0?r=w(Y(e,n,r)):r=w(-w(_r(e,n,r))),w(r)}function Ar(e){return e=w(e),D[j>>2]=e,t[j>>2]|0|0}function z(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function dr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Or(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function Qn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;if(d=e+4|0,_=t[d>>2]|0,s=_-o|0,l=s>>2,e=n+(l<<2)|0,e>>>0>>0){o=_;do t[o>>2]=t[e>>2],e=e+4|0,o=(t[d>>2]|0)+4|0,t[d>>2]=o;while(e>>>0>>0)}l|0&&Y1(_+(0-l<<2)|0,n|0,s|0)|0}function nn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return _=n+4|0,y=t[_>>2]|0,s=t[e>>2]|0,d=r,l=d-s|0,o=y+(0-(l>>2)<<2)|0,t[_>>2]=o,(l|0)>0&&vn(o|0,s|0,l|0)|0,s=e+4|0,l=n+8|0,o=(t[s>>2]|0)-d|0,(o|0)>0&&(vn(t[l>>2]|0,r|0,o|0)|0,t[l>>2]=(t[l>>2]|0)+(o>>>2<<2)),d=t[e>>2]|0,t[e>>2]=t[_>>2],t[_>>2]=d,d=t[s>>2]|0,t[s>>2]=t[l>>2],t[l>>2]=d,d=e+8|0,r=n+12|0,e=t[d>>2]|0,t[d>>2]=t[r>>2],t[r>>2]=e,t[n>>2]=t[_>>2],y|0}function s0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;if(d=t[n>>2]|0,l=t[r>>2]|0,(d|0)!=(l|0)){s=e+8|0,r=((l+-4-d|0)>>>2)+1|0,e=d,o=t[s>>2]|0;do t[o>>2]=t[e>>2],o=(t[s>>2]|0)+4|0,t[s>>2]=o,e=e+4|0;while((e|0)!=(l|0));t[n>>2]=d+(r<<2)}}function t0(){_l()}function g0(){var e=0;return e=Tt(4)|0,Kr(e),e|0}function Kr(e){e=e|0,t[e>>2]=a0()|0}function _0(e){e=e|0,e|0&&(Gi(e),Ve(e))}function Gi(e){e=e|0,V0(t[e>>2]|0)}function fo(e,n,r){e=e|0,n=n|0,r=r|0,J0(t[e>>2]|0,n,r)}function x0(e,n){e=e|0,n=w(n),ki(t[e>>2]|0,n)}function Xu(e,n){return e=e|0,n=n|0,fn(t[e>>2]|0,n)|0}function Z0(){var e=0;return e=Tt(8)|0,df(e,0),e|0}function df(e,n){e=e|0,n=n|0,n?n=I0(t[n>>2]|0)|0:n=qu()|0,t[e>>2]=n,t[e+4>>2]=0,Bs(n,e)}function Ba(e){e=e|0;var n=0;return n=Tt(8)|0,df(n,e),n|0}function Oc(e){e=e|0,e|0&&(mu(e),Ve(e))}function mu(e){e=e|0;var n=0;Wu(t[e>>2]|0),n=e+4|0,e=t[n>>2]|0,t[n>>2]=0,e|0&&(Ju(e),Ve(e))}function Ju(e){e=e|0,ei(e)}function ei(e){e=e|0,e=t[e>>2]|0,e|0&&ju(e|0)}function Yf(e){return e=e|0,Vu(e)|0}function pf(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),Do(t[e>>2]|0)}function ja(e,n){e=e|0,n=n|0,Gu(t[e>>2]|0,t[n>>2]|0)}function Ua(e,n){e=e|0,n=n|0,W(t[e>>2]|0,n)}function Ic(e,n,r){e=e|0,n=n|0,r=+r,yn(t[e>>2]|0,n,w(r))}function vu(e,n,r){e=e|0,n=n|0,r=+r,sn(t[e>>2]|0,n,w(r))}function $f(e,n){e=e|0,n=n|0,R(t[e>>2]|0,n)}function gu(e,n){e=e|0,n=n|0,H(t[e>>2]|0,n)}function co(e,n){e=e|0,n=n|0,ue(t[e>>2]|0,n)}function qa(e,n){e=e|0,n=n|0,M0(t[e>>2]|0,n)}function Ws(e,n){e=e|0,n=n|0,Fe(t[e>>2]|0,n)}function za(e,n){e=e|0,n=n|0,Lr(t[e>>2]|0,n)}function Pc(e,n,r){e=e|0,n=n|0,r=+r,rn(t[e>>2]|0,n,w(r))}function Qu(e,n,r){e=e|0,n=n|0,r=+r,Hn(t[e>>2]|0,n,w(r))}function Mc(e,n){e=e|0,n=n|0,Cr(t[e>>2]|0,n)}function Fc(e,n){e=e|0,n=n|0,K(t[e>>2]|0,n)}function Lc(e,n){e=e|0,n=n|0,je(t[e>>2]|0,n)}function Kf(e,n){e=e|0,n=+n,rt(t[e>>2]|0,w(n))}function Tl(e,n){e=e|0,n=+n,wt(t[e>>2]|0,w(n))}function xl(e,n){e=e|0,n=+n,lt(t[e>>2]|0,w(n))}function hf(e,n){e=e|0,n=+n,st(t[e>>2]|0,w(n))}function xo(e,n){e=e|0,n=+n,xt(t[e>>2]|0,w(n))}function mf(e,n){e=e|0,n=+n,Qt(t[e>>2]|0,w(n))}function Wa(e,n){e=e|0,n=+n,Cn(t[e>>2]|0,w(n))}function ti(e){e=e|0,bn(t[e>>2]|0)}function Hs(e,n){e=e|0,n=+n,h0(t[e>>2]|0,w(n))}function mi(e,n){e=e|0,n=+n,ci(t[e>>2]|0,w(n))}function vi(e){e=e|0,xi(t[e>>2]|0)}function Xf(e,n){e=e|0,n=+n,qr(t[e>>2]|0,w(n))}function Rc(e,n){e=e|0,n=+n,Eo(t[e>>2]|0,w(n))}function Jf(e,n){e=e|0,n=+n,wl(t[e>>2]|0,w(n))}function ao(e,n){e=e|0,n=+n,js(t[e>>2]|0,w(n))}function $o(e,n){e=e|0,n=+n,du(t[e>>2]|0,w(n))}function kl(e,n){e=e|0,n=+n,Yu(t[e>>2]|0,w(n))}function Nc(e,n){e=e|0,n=+n,oo(t[e>>2]|0,w(n))}function Al(e,n){e=e|0,n=+n,Hi(t[e>>2]|0,w(n))}function vf(e,n){e=e|0,n=+n,F0(t[e>>2]|0,w(n))}function Qf(e,n,r){e=e|0,n=n|0,r=+r,ft(t[e>>2]|0,n,w(r))}function k0(e,n,r){e=e|0,n=n|0,r=+r,He(t[e>>2]|0,n,w(r))}function v(e,n,r){e=e|0,n=n|0,r=+r,Qe(t[e>>2]|0,n,w(r))}function m(e){return e=e|0,ve(t[e>>2]|0)|0}function S(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,ar(s,t[n>>2]|0,r),O(e,s),h=o}function O(e,n){e=e|0,n=n|0,M(e,t[n+4>>2]|0,+w(D[n>>2]))}function M(e,n,r){e=e|0,n=n|0,r=+r,t[e>>2]=n,L[e+8>>3]=r}function b(e){return e=e|0,U(t[e>>2]|0)|0}function ee(e){return e=e|0,fe(t[e>>2]|0)|0}function Ye(e){return e=e|0,de(t[e>>2]|0)|0}function Ze(e){return e=e|0,au(t[e>>2]|0)|0}function ut(e){return e=e|0,Ge(t[e>>2]|0)|0}function In(e){return e=e|0,F(t[e>>2]|0)|0}function A0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,d0(s,t[n>>2]|0,r),O(e,s),h=o}function jr(e){return e=e|0,xe(t[e>>2]|0)|0}function gi(e){return e=e|0,Xe(t[e>>2]|0)|0}function po(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Rt(o,t[n>>2]|0),O(e,o),h=r}function _i(e){return e=e|0,+ +w(yl(t[e>>2]|0))}function Re(e){return e=e|0,+ +w(cu(t[e>>2]|0))}function Ce(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,p0(o,t[n>>2]|0),O(e,o),h=r}function ze(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,E0(o,t[n>>2]|0),O(e,o),h=r}function Et(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,So(o,t[n>>2]|0),O(e,o),h=r}function on(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Dl(o,t[n>>2]|0),O(e,o),h=r}function sr(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Us(o,t[n>>2]|0),O(e,o),h=r}function mn(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,qs(o,t[n>>2]|0),O(e,o),h=r}function pr(e){return e=e|0,+ +w(Gr(t[e>>2]|0))}function Hr(e,n){return e=e|0,n=n|0,+ +w(St(t[e>>2]|0,n))}function Vn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Ne(s,t[n>>2]|0,r),O(e,s),h=o}function ni(e,n,r){e=e|0,n=n|0,r=r|0,Ns(t[e>>2]|0,t[n>>2]|0,r)}function Zf(e,n){e=e|0,n=n|0,D0(t[e>>2]|0,t[n>>2]|0)}function Pm(e){return e=e|0,fi(t[e>>2]|0)|0}function Ha(e){return e=e|0,e=nr(t[e>>2]|0)|0,e?e=Yf(e)|0:e=0,e|0}function vd(e,n){return e=e|0,n=n|0,e=e0(t[e>>2]|0,n)|0,e?e=Yf(e)|0:e=0,e|0}function gd(e,n){e=e|0,n=n|0;var r=0,o=0;o=Tt(4)|0,ba(o,n),r=e+4|0,n=t[r>>2]|0,t[r>>2]=o,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,1)}function ba(e,n){e=e|0,n=n|0,Oo(e,n)}function Bc(e,n,r,o,s,l){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Mm(_,Vu(n)|0,+r,o,+s,l),D[e>>2]=w(+L[_>>3]),D[e+4>>2]=w(+L[_+8>>3]),h=d}function Mm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0,_=0,y=0,k=0,T=0;d=h,h=h+32|0,T=d+8|0,k=d+20|0,y=d,_=d+16|0,L[T>>3]=r,t[k>>2]=o,L[y>>3]=s,t[_>>2]=l,_d(e,t[n+4>>2]|0,T,k,y,_),h=d}function _d(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Zo(_),n=Oi(n)|0,Fm(e,n,+L[r>>3],t[o>>2]|0,+L[s>>3],t[l>>2]|0),eu(_),h=d}function Oi(e){return e=e|0,t[e>>2]|0}function Fm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0;d=ko(yd()|0)|0,r=+Ko(r),o=jc(o)|0,s=+Ko(s),Ga(e,ro(0,d|0,n|0,+r,o|0,+s,jc(l)|0)|0)}function yd(){var e=0;return c[7608]|0||(Ed(9120),e=7608,t[e>>2]=1,t[e+4>>2]=0),9120}function ko(e){return e=e|0,t[e+8>>2]|0}function Ko(e){return e=+e,+ +Ol(e)}function jc(e){return e=e|0,Dd(e)|0}function Ga(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=n,o&1?(Lm(r,0),c0(o|0,r|0)|0,Va(e,r),Wn(r)):(t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]),h=s}function Lm(e,n){e=e|0,n=n|0,wd(e,n),t[e+8>>2]=0,c[e+24>>0]=0}function Va(e,n){e=e|0,n=n|0,n=n+8|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]}function Wn(e){e=e|0,c[e+24>>0]=0}function wd(e,n){e=e|0,n=n|0,t[e>>2]=n}function Dd(e){return e=e|0,e|0}function Ol(e){return e=+e,+e}function Ed(e){e=e|0,Ao(e,Rm()|0,4)}function Rm(){return 1064}function Ao(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=hl(n|0,r+1|0)|0}function Oo(e,n){e=e|0,n=n|0,n=t[n>>2]|0,t[e>>2]=n,qi(n|0)}function Nm(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,0)}function Uc(e){e=e|0,rr(t[e>>2]|0)}function Ya(e){return e=e|0,Go(t[e>>2]|0)|0}function Sd(e,n,r,o){e=e|0,n=+n,r=+r,o=o|0,Yr(t[e>>2]|0,w(n),w(r),o)}function Cd(e){return e=e|0,+ +w(ir(t[e>>2]|0))}function ho(e){return e=e|0,+ +w(Y0(t[e>>2]|0))}function bs(e){return e=e|0,+ +w(L0(t[e>>2]|0))}function $a(e){return e=e|0,+ +w(Co(t[e>>2]|0))}function Td(e){return e=e|0,+ +w($u(t[e>>2]|0))}function qc(e){return e=e|0,+ +w(Vo(t[e>>2]|0))}function xd(e,n){e=e|0,n=n|0,L[e>>3]=+w(ir(t[n>>2]|0)),L[e+8>>3]=+w(Y0(t[n>>2]|0)),L[e+16>>3]=+w(L0(t[n>>2]|0)),L[e+24>>3]=+w(Co(t[n>>2]|0)),L[e+32>>3]=+w($u(t[n>>2]|0)),L[e+40>>3]=+w(Vo(t[n>>2]|0))}function Ka(e,n){return e=e|0,n=n|0,+ +w(Rr(t[e>>2]|0,n))}function kd(e,n){return e=e|0,n=n|0,+ +w(Jn(t[e>>2]|0,n))}function Xa(e,n){return e=e|0,n=n|0,+ +w(ai(t[e>>2]|0,n))}function Ja(){return Rs()|0}function Gs(){Bm(),Vs(),Ad(),Od(),Qa(),jm()}function Bm(){hO(11713,4938,1)}function Vs(){FA(10448)}function Ad(){hA(10408)}function Od(){Bk(10324)}function Qa(){Gx(10096)}function jm(){Um(9132)}function Um(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=0,Rf=0,Zs=0,el=0,ss=0,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=0,tl=0,ql=0,zl=0,Li=0,Di=0,ku=0,xr=0,Wl=0,Qi=0,ls=0,Zi=0,fs=0,Hl=0,bl=0,cs=0,Ri=0,Au=0,Gl=0,Vl=0,Yl=0,En=0,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0;n=h,h=h+672|0,r=n+656|0,Ou=n+648|0,Vt=n+640|0,xn=n+632|0,Ni=n+624|0,eo=n+616|0,Ei=n+608|0,br=n+600|0,En=n+592|0,Yl=n+584|0,Vl=n+576|0,Gl=n+568|0,Au=n+560|0,Ri=n+552|0,cs=n+544|0,bl=n+536|0,Hl=n+528|0,fs=n+520|0,Zi=n+512|0,ls=n+504|0,Qi=n+496|0,Wl=n+488|0,xr=n+480|0,ku=n+472|0,Di=n+464|0,Li=n+456|0,zl=n+448|0,ql=n+440|0,tl=n+432|0,Ul=n+424|0,jl=n+416|0,xu=n+408|0,go=n+400|0,nu=n+392|0,Fi=n+384|0,ss=n+376|0,el=n+368|0,Zs=n+360|0,Rf=n+352|0,Lf=n+344|0,us=n+336|0,Ff=n+328|0,Tu=n+320|0,Kn=n+312|0,Mf=n+304|0,Pf=n+296|0,If=n+288|0,Qs=n+280|0,Js=n+272|0,Of=n+264|0,Cu=n+256|0,Af=n+248|0,kf=n+240|0,Ro=n+232|0,Ji=n+224|0,Xi=n+216|0,Ki=n+208|0,Dr=n+200|0,zt=n+192|0,Pn=n+184|0,gn=n+176|0,It=n+168|0,Ht=n+160|0,Ln=n+152|0,vt=n+144|0,_e=n+136|0,pe=n+128|0,qe=n+120|0,ke=n+112|0,Pe=n+104|0,ie=n+96|0,le=n+88|0,we=n+80|0,q=n+72|0,P=n+64|0,T=n+56|0,k=n+48|0,y=n+40|0,_=n+32|0,d=n+24|0,l=n+16|0,s=n+8|0,o=n,qm(e,3646),Id(e,3651,2)|0,Pd(e,3665,2)|0,zm(e,3682,18)|0,t[Ou>>2]=19,t[Ou+4>>2]=0,t[r>>2]=t[Ou>>2],t[r+4>>2]=t[Ou+4>>2],gf(e,3690,r)|0,t[Vt>>2]=1,t[Vt+4>>2]=0,t[r>>2]=t[Vt>>2],t[r+4>>2]=t[Vt+4>>2],Md(e,3696,r)|0,t[xn>>2]=2,t[xn+4>>2]=0,t[r>>2]=t[xn>>2],t[r+4>>2]=t[xn+4>>2],Xr(e,3706,r)|0,t[Ni>>2]=1,t[Ni+4>>2]=0,t[r>>2]=t[Ni>>2],t[r+4>>2]=t[Ni+4>>2],yi(e,3722,r)|0,t[eo>>2]=2,t[eo+4>>2]=0,t[r>>2]=t[eo>>2],t[r+4>>2]=t[eo+4>>2],yi(e,3734,r)|0,t[Ei>>2]=3,t[Ei+4>>2]=0,t[r>>2]=t[Ei>>2],t[r+4>>2]=t[Ei+4>>2],Xr(e,3753,r)|0,t[br>>2]=4,t[br+4>>2]=0,t[r>>2]=t[br>>2],t[r+4>>2]=t[br+4>>2],Xr(e,3769,r)|0,t[En>>2]=5,t[En+4>>2]=0,t[r>>2]=t[En>>2],t[r+4>>2]=t[En+4>>2],Xr(e,3783,r)|0,t[Yl>>2]=6,t[Yl+4>>2]=0,t[r>>2]=t[Yl>>2],t[r+4>>2]=t[Yl+4>>2],Xr(e,3796,r)|0,t[Vl>>2]=7,t[Vl+4>>2]=0,t[r>>2]=t[Vl>>2],t[r+4>>2]=t[Vl+4>>2],Xr(e,3813,r)|0,t[Gl>>2]=8,t[Gl+4>>2]=0,t[r>>2]=t[Gl>>2],t[r+4>>2]=t[Gl+4>>2],Xr(e,3825,r)|0,t[Au>>2]=3,t[Au+4>>2]=0,t[r>>2]=t[Au>>2],t[r+4>>2]=t[Au+4>>2],yi(e,3843,r)|0,t[Ri>>2]=4,t[Ri+4>>2]=0,t[r>>2]=t[Ri>>2],t[r+4>>2]=t[Ri+4>>2],yi(e,3853,r)|0,t[cs>>2]=9,t[cs+4>>2]=0,t[r>>2]=t[cs>>2],t[r+4>>2]=t[cs+4>>2],Xr(e,3870,r)|0,t[bl>>2]=10,t[bl+4>>2]=0,t[r>>2]=t[bl>>2],t[r+4>>2]=t[bl+4>>2],Xr(e,3884,r)|0,t[Hl>>2]=11,t[Hl+4>>2]=0,t[r>>2]=t[Hl>>2],t[r+4>>2]=t[Hl+4>>2],Xr(e,3896,r)|0,t[fs>>2]=1,t[fs+4>>2]=0,t[r>>2]=t[fs>>2],t[r+4>>2]=t[fs+4>>2],j0(e,3907,r)|0,t[Zi>>2]=2,t[Zi+4>>2]=0,t[r>>2]=t[Zi>>2],t[r+4>>2]=t[Zi+4>>2],j0(e,3915,r)|0,t[ls>>2]=3,t[ls+4>>2]=0,t[r>>2]=t[ls>>2],t[r+4>>2]=t[ls+4>>2],j0(e,3928,r)|0,t[Qi>>2]=4,t[Qi+4>>2]=0,t[r>>2]=t[Qi>>2],t[r+4>>2]=t[Qi+4>>2],j0(e,3948,r)|0,t[Wl>>2]=5,t[Wl+4>>2]=0,t[r>>2]=t[Wl>>2],t[r+4>>2]=t[Wl+4>>2],j0(e,3960,r)|0,t[xr>>2]=6,t[xr+4>>2]=0,t[r>>2]=t[xr>>2],t[r+4>>2]=t[xr+4>>2],j0(e,3974,r)|0,t[ku>>2]=7,t[ku+4>>2]=0,t[r>>2]=t[ku>>2],t[r+4>>2]=t[ku+4>>2],j0(e,3983,r)|0,t[Di>>2]=20,t[Di+4>>2]=0,t[r>>2]=t[Di>>2],t[r+4>>2]=t[Di+4>>2],gf(e,3999,r)|0,t[Li>>2]=8,t[Li+4>>2]=0,t[r>>2]=t[Li>>2],t[r+4>>2]=t[Li+4>>2],j0(e,4012,r)|0,t[zl>>2]=9,t[zl+4>>2]=0,t[r>>2]=t[zl>>2],t[r+4>>2]=t[zl+4>>2],j0(e,4022,r)|0,t[ql>>2]=21,t[ql+4>>2]=0,t[r>>2]=t[ql>>2],t[r+4>>2]=t[ql+4>>2],gf(e,4039,r)|0,t[tl>>2]=10,t[tl+4>>2]=0,t[r>>2]=t[tl>>2],t[r+4>>2]=t[tl+4>>2],j0(e,4053,r)|0,t[Ul>>2]=11,t[Ul+4>>2]=0,t[r>>2]=t[Ul>>2],t[r+4>>2]=t[Ul+4>>2],j0(e,4065,r)|0,t[jl>>2]=12,t[jl+4>>2]=0,t[r>>2]=t[jl>>2],t[r+4>>2]=t[jl+4>>2],j0(e,4084,r)|0,t[xu>>2]=13,t[xu+4>>2]=0,t[r>>2]=t[xu>>2],t[r+4>>2]=t[xu+4>>2],j0(e,4097,r)|0,t[go>>2]=14,t[go+4>>2]=0,t[r>>2]=t[go>>2],t[r+4>>2]=t[go+4>>2],j0(e,4117,r)|0,t[nu>>2]=15,t[nu+4>>2]=0,t[r>>2]=t[nu>>2],t[r+4>>2]=t[nu+4>>2],j0(e,4129,r)|0,t[Fi>>2]=16,t[Fi+4>>2]=0,t[r>>2]=t[Fi>>2],t[r+4>>2]=t[Fi+4>>2],j0(e,4148,r)|0,t[ss>>2]=17,t[ss+4>>2]=0,t[r>>2]=t[ss>>2],t[r+4>>2]=t[ss+4>>2],j0(e,4161,r)|0,t[el>>2]=18,t[el+4>>2]=0,t[r>>2]=t[el>>2],t[r+4>>2]=t[el+4>>2],j0(e,4181,r)|0,t[Zs>>2]=5,t[Zs+4>>2]=0,t[r>>2]=t[Zs>>2],t[r+4>>2]=t[Zs+4>>2],yi(e,4196,r)|0,t[Rf>>2]=6,t[Rf+4>>2]=0,t[r>>2]=t[Rf>>2],t[r+4>>2]=t[Rf+4>>2],yi(e,4206,r)|0,t[Lf>>2]=7,t[Lf+4>>2]=0,t[r>>2]=t[Lf>>2],t[r+4>>2]=t[Lf+4>>2],yi(e,4217,r)|0,t[us>>2]=3,t[us+4>>2]=0,t[r>>2]=t[us>>2],t[r+4>>2]=t[us+4>>2],Zu(e,4235,r)|0,t[Ff>>2]=1,t[Ff+4>>2]=0,t[r>>2]=t[Ff>>2],t[r+4>>2]=t[Ff+4>>2],_f(e,4251,r)|0,t[Tu>>2]=4,t[Tu+4>>2]=0,t[r>>2]=t[Tu>>2],t[r+4>>2]=t[Tu+4>>2],Zu(e,4263,r)|0,t[Kn>>2]=5,t[Kn+4>>2]=0,t[r>>2]=t[Kn>>2],t[r+4>>2]=t[Kn+4>>2],Zu(e,4279,r)|0,t[Mf>>2]=6,t[Mf+4>>2]=0,t[r>>2]=t[Mf>>2],t[r+4>>2]=t[Mf+4>>2],Zu(e,4293,r)|0,t[Pf>>2]=7,t[Pf+4>>2]=0,t[r>>2]=t[Pf>>2],t[r+4>>2]=t[Pf+4>>2],Zu(e,4306,r)|0,t[If>>2]=8,t[If+4>>2]=0,t[r>>2]=t[If>>2],t[r+4>>2]=t[If+4>>2],Zu(e,4323,r)|0,t[Qs>>2]=9,t[Qs+4>>2]=0,t[r>>2]=t[Qs>>2],t[r+4>>2]=t[Qs+4>>2],Zu(e,4335,r)|0,t[Js>>2]=2,t[Js+4>>2]=0,t[r>>2]=t[Js>>2],t[r+4>>2]=t[Js+4>>2],_f(e,4353,r)|0,t[Of>>2]=12,t[Of+4>>2]=0,t[r>>2]=t[Of>>2],t[r+4>>2]=t[Of+4>>2],Io(e,4363,r)|0,t[Cu>>2]=1,t[Cu+4>>2]=0,t[r>>2]=t[Cu>>2],t[r+4>>2]=t[Cu+4>>2],_u(e,4376,r)|0,t[Af>>2]=2,t[Af+4>>2]=0,t[r>>2]=t[Af>>2],t[r+4>>2]=t[Af+4>>2],_u(e,4388,r)|0,t[kf>>2]=13,t[kf+4>>2]=0,t[r>>2]=t[kf>>2],t[r+4>>2]=t[kf+4>>2],Io(e,4402,r)|0,t[Ro>>2]=14,t[Ro+4>>2]=0,t[r>>2]=t[Ro>>2],t[r+4>>2]=t[Ro+4>>2],Io(e,4411,r)|0,t[Ji>>2]=15,t[Ji+4>>2]=0,t[r>>2]=t[Ji>>2],t[r+4>>2]=t[Ji+4>>2],Io(e,4421,r)|0,t[Xi>>2]=16,t[Xi+4>>2]=0,t[r>>2]=t[Xi>>2],t[r+4>>2]=t[Xi+4>>2],Io(e,4433,r)|0,t[Ki>>2]=17,t[Ki+4>>2]=0,t[r>>2]=t[Ki>>2],t[r+4>>2]=t[Ki+4>>2],Io(e,4446,r)|0,t[Dr>>2]=18,t[Dr+4>>2]=0,t[r>>2]=t[Dr>>2],t[r+4>>2]=t[Dr+4>>2],Io(e,4458,r)|0,t[zt>>2]=3,t[zt+4>>2]=0,t[r>>2]=t[zt>>2],t[r+4>>2]=t[zt+4>>2],_u(e,4471,r)|0,t[Pn>>2]=1,t[Pn+4>>2]=0,t[r>>2]=t[Pn>>2],t[r+4>>2]=t[Pn+4>>2],ec(e,4486,r)|0,t[gn>>2]=10,t[gn+4>>2]=0,t[r>>2]=t[gn>>2],t[r+4>>2]=t[gn+4>>2],Zu(e,4496,r)|0,t[It>>2]=11,t[It+4>>2]=0,t[r>>2]=t[It>>2],t[r+4>>2]=t[It+4>>2],Zu(e,4508,r)|0,t[Ht>>2]=3,t[Ht+4>>2]=0,t[r>>2]=t[Ht>>2],t[r+4>>2]=t[Ht+4>>2],_f(e,4519,r)|0,t[Ln>>2]=4,t[Ln+4>>2]=0,t[r>>2]=t[Ln>>2],t[r+4>>2]=t[Ln+4>>2],Wm(e,4530,r)|0,t[vt>>2]=19,t[vt+4>>2]=0,t[r>>2]=t[vt>>2],t[r+4>>2]=t[vt+4>>2],Fd(e,4542,r)|0,t[_e>>2]=12,t[_e+4>>2]=0,t[r>>2]=t[_e>>2],t[r+4>>2]=t[_e+4>>2],yf(e,4554,r)|0,t[pe>>2]=13,t[pe+4>>2]=0,t[r>>2]=t[pe>>2],t[r+4>>2]=t[pe+4>>2],tc(e,4568,r)|0,t[qe>>2]=2,t[qe+4>>2]=0,t[r>>2]=t[qe>>2],t[r+4>>2]=t[qe+4>>2],Hm(e,4578,r)|0,t[ke>>2]=20,t[ke+4>>2]=0,t[r>>2]=t[ke>>2],t[r+4>>2]=t[ke+4>>2],Ld(e,4587,r)|0,t[Pe>>2]=22,t[Pe+4>>2]=0,t[r>>2]=t[Pe>>2],t[r+4>>2]=t[Pe+4>>2],gf(e,4602,r)|0,t[ie>>2]=23,t[ie+4>>2]=0,t[r>>2]=t[ie>>2],t[r+4>>2]=t[ie+4>>2],gf(e,4619,r)|0,t[le>>2]=14,t[le+4>>2]=0,t[r>>2]=t[le>>2],t[r+4>>2]=t[le+4>>2],Rd(e,4629,r)|0,t[we>>2]=1,t[we+4>>2]=0,t[r>>2]=t[we>>2],t[r+4>>2]=t[we+4>>2],zc(e,4637,r)|0,t[q>>2]=4,t[q+4>>2]=0,t[r>>2]=t[q>>2],t[r+4>>2]=t[q+4>>2],_u(e,4653,r)|0,t[P>>2]=5,t[P+4>>2]=0,t[r>>2]=t[P>>2],t[r+4>>2]=t[P+4>>2],_u(e,4669,r)|0,t[T>>2]=6,t[T+4>>2]=0,t[r>>2]=t[T>>2],t[r+4>>2]=t[T+4>>2],_u(e,4686,r)|0,t[k>>2]=7,t[k+4>>2]=0,t[r>>2]=t[k>>2],t[r+4>>2]=t[k+4>>2],_u(e,4701,r)|0,t[y>>2]=8,t[y+4>>2]=0,t[r>>2]=t[y>>2],t[r+4>>2]=t[y+4>>2],_u(e,4719,r)|0,t[_>>2]=9,t[_+4>>2]=0,t[r>>2]=t[_>>2],t[r+4>>2]=t[_+4>>2],_u(e,4736,r)|0,t[d>>2]=21,t[d+4>>2]=0,t[r>>2]=t[d>>2],t[r+4>>2]=t[d+4>>2],Nd(e,4754,r)|0,t[l>>2]=2,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],ec(e,4772,r)|0,t[s>>2]=3,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],ec(e,4790,r)|0,t[o>>2]=4,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],ec(e,4808,r)|0,h=n}function qm(e,n){e=e|0,n=n|0;var r=0;r=Nx()|0,t[e>>2]=r,Bx(r,n),Cf(t[e>>2]|0)}function Id(e,n,r){return e=e|0,n=n|0,r=r|0,Ex(e,Zn(n)|0,r,0),e|0}function Pd(e,n,r){return e=e|0,n=n|0,r=r|0,ux(e,Zn(n)|0,r,0),e|0}function zm(e,n,r){return e=e|0,n=n|0,r=r|0,V9(e,Zn(n)|0,r,0),e|0}function gf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],I9(e,n,s),h=o,e|0}function Md(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],vo(e,n,s),h=o,e|0}function Xr(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],a(e,n,s),h=o,e|0}function yi(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],n4(e,n,s),h=o,e|0}function j0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],b_(e,n,s),h=o,e|0}function Zu(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L_(e,n,s),h=o,e|0}function _f(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hp(e,n,s),h=o,e|0}function Io(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],e_(e,n,s),h=o,e|0}function _u(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ip(e,n,s),h=o,e|0}function ec(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ng(e,n,s),h=o,e|0}function Wm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],l0(e,n,s),h=o,e|0}function Fd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],hg(e,n,s),h=o,e|0}function yf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sg(e,n,s),h=o,e|0}function tc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Kv(e,n,s),h=o,e|0}function Hm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y1(e,n,s),h=o,e|0}function Ld(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],wv(e,n,s),h=o,e|0}function Rd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],fv(e,n,s),h=o,e|0}function zc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Gd(e,n,s),h=o,e|0}function Nd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Wc(e,n,s),h=o,e|0}function Wc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hc(e,r,s,1),h=o}function Zn(e){return e=e|0,e|0}function Hc(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Za()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Bd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,bc(l,o)|0,o),h=s}function Za(){var e=0,n=0;if(c[7616]|0||(yu(9136),Bt(24,9136,Q|0)|0,n=7616,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9136)|0)){e=9136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));yu(9136)}return 9136}function Bd(e){return e=e|0,0}function bc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Za()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],n1(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jd(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ur(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0;d=h,h=h+32|0,q=d+24|0,P=d+20|0,y=d+16|0,T=d+12|0,k=d+8|0,_=d+4|0,we=d,t[P>>2]=n,t[y>>2]=r,t[T>>2]=o,t[k>>2]=s,t[_>>2]=l,l=e+28|0,t[we>>2]=t[l>>2],t[q>>2]=t[we>>2],e1(e+24|0,q,P,T,k,y,_)|0,t[l>>2]=t[t[l>>2]>>2],h=d}function e1(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,e=bm(n)|0,n=Tt(24)|0,t1(n+4|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0,t[d>>2]|0),t[n>>2]=t[e>>2],t[e>>2]=n,n|0}function bm(e){return e=e|0,t[e>>2]|0}function t1(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Lt(e,n){return e=e|0,n=n|0,n|e|0}function n1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Gm(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ud(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],n1(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Vm(e,_),Ym(_),h=k;return}}function Gm(e){return e=e|0,357913941}function Ud(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Vm(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ym(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function yu(e){e=e|0,Gc(e)}function r1(e){e=e|0,i1(e+24|0)}function Dn(e){return e=e|0,t[e>>2]|0}function i1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Gc(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,cn()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function An(){return 9228}function cn(){return 1140}function Vc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Il(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=$m(n,o)|0,h=r,n|0}function Nn(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Il(e){return e=e|0,(t[(Za()|0)+24>>2]|0)+(e*12|0)|0}function $m(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+48|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=o1(o)|0,h=s,o|0}function o1(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(u1()|0)|0,o?(s1(n,o),l1(r,n),qd(e,r),e=f1(n)|0):e=zd(e)|0,h=s,e|0}function u1(){var e=0;return c[7632]|0||(nc(9184),Bt(25,9184,Q|0)|0,e=7632,t[e>>2]=1,t[e+4>>2]=0),9184}function U0(e){return e=e|0,t[e+36>>2]|0}function s1(e,n){e=e|0,n=n|0,t[e>>2]=n,t[e+4>>2]=e,t[e+8>>2]=0}function l1(e,n){e=e|0,n=n|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=0}function qd(e,n){e=e|0,n=n|0,Ii(n,e,e+8|0,e+16|0,e+24|0,e+32|0,e+40|0)|0}function f1(e){return e=e|0,t[(t[e+4>>2]|0)+8>>2]|0}function zd(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;y=h,h=h+16|0,r=y+4|0,o=y,s=Qo(8)|0,l=s,d=Tt(48)|0,_=d,n=_+48|0;do t[_>>2]=t[e>>2],_=_+4|0,e=e+4|0;while((_|0)<(n|0));return n=l+4|0,t[n>>2]=d,_=Tt(8)|0,d=t[n>>2]|0,t[o>>2]=0,t[r>>2]=t[o>>2],Wd(_,d,r),t[s>>2]=_,h=y,l|0}function Wd(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1092,t[r+12>>2]=n,t[e+4>>2]=r}function Km(e){e=e|0,da(e),Ve(e)}function Xm(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function es(e){e=e|0,Ve(e)}function Ii(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,l=c1(t[e>>2]|0,n,r,o,s,l,d)|0,d=e+4|0,t[(t[d>>2]|0)+8>>2]=l,t[(t[d>>2]|0)+8>>2]|0}function c1(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0;var _=0,y=0;return _=h,h=h+16|0,y=_,Zo(y),e=Oi(e)|0,d=Jm(e,+L[n>>3],+L[r>>3],+L[o>>3],+L[s>>3],+L[l>>3],+L[d>>3])|0,eu(y),h=_,d|0}function Jm(e,n,r,o,s,l,d){e=e|0,n=+n,r=+r,o=+o,s=+s,l=+l,d=+d;var _=0;return _=ko(a1()|0)|0,n=+Ko(n),r=+Ko(r),o=+Ko(o),s=+Ko(s),l=+Ko(l),xs(0,_|0,e|0,+n,+r,+o,+s,+l,+ +Ko(d))|0}function a1(){var e=0;return c[7624]|0||(Qm(9172),e=7624,t[e>>2]=1,t[e+4>>2]=0),9172}function Qm(e){e=e|0,Ao(e,Zm()|0,6)}function Zm(){return 1112}function nc(e){e=e|0,Ys(e)}function Hd(e){e=e|0,d1(e+24|0),bd(e+16|0)}function d1(e){e=e|0,tv(e)}function bd(e){e=e|0,ev(e)}function ev(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function tv(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function Ys(e){e=e|0;var n=0;t[e+16>>2]=0,t[e+20>>2]=0,n=e+24|0,t[n>>2]=0,t[e+28>>2]=n,t[e+36>>2]=0,c[e+40>>0]=0,c[e+41>>0]=0}function Gd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Vd(e,r,s,0),h=o}function Vd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=p1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=h1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Yd(l,o)|0,o),h=s}function p1(){var e=0,n=0;if(c[7640]|0||(Xo(9232),Bt(26,9232,Q|0)|0,n=7640,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9232)|0)){e=9232,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Xo(9232)}return 9232}function h1(e){return e=e|0,0}function Yd(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=p1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],wf(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(m1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function wf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function m1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=$d(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Kd(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],wf(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yc(e,_),Xd(_),h=k;return}}function $d(e){return e=e|0,357913941}function Kd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Xd(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Xo(e){e=e|0,Jd(e)}function Pl(e){e=e|0,nv(e+24|0)}function nv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Jd(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,rv()|0,3),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rv(){return 1144}function iv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,d=l+8|0,_=l,y=ov(e)|0,e=t[y+4>>2]|0,t[_>>2]=t[y>>2],t[_+4>>2]=e,t[d>>2]=t[_>>2],t[d+4>>2]=t[_+4>>2],uv(n,d,r,o,s),h=l}function ov(e){return e=e|0,(t[(p1()|0)+24>>2]|0)+(e*12|0)|0}function uv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0,k=0;k=h,h=h+16|0,d=k+2|0,_=k+1|0,y=k,l=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(l=t[(t[e>>2]|0)+l>>2]|0),wu(d,r),r=+Du(d,r),wu(_,o),o=+Du(_,o),ts(y,s),y=ns(y,s)|0,iD[l&1](e,r,o,y),h=k}function wu(e,n){e=e|0,n=+n}function Du(e,n){return e=e|0,n=+n,+ +lv(n)}function ts(e,n){e=e|0,n=n|0}function ns(e,n){return e=e|0,n=n|0,sv(n)|0}function sv(e){return e=e|0,e|0}function lv(e){return e=+e,+e}function fv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qd(e,r,s,1),h=o}function Qd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=$c()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Zd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cv(l,o)|0,o),h=s}function $c(){var e=0,n=0;if(c[7648]|0||(np(9268),Bt(27,9268,Q|0)|0,n=7648,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9268)|0)){e=9268,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));np(9268)}return 9268}function Zd(e){return e=e|0,0}function cv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=$c()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(av(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function av(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=tp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,dv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,pv(e,_),hv(_),h=k;return}}function tp(e){return e=e|0,357913941}function dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function pv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function hv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function np(e){e=e|0,Po(e)}function mv(e){e=e|0,vv(e+24|0)}function vv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Po(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,gv()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gv(){return 1160}function _v(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=yv(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=rp(n,o)|0,h=r,n|0}function yv(e){return e=e|0,(t[($c()|0)+24>>2]|0)+(e*12|0)|0}function rp(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ip(dc[r&31](e)|0)|0}function ip(e){return e=e|0,e&1|0}function wv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Dv(e,r,s,0),h=o}function Dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=v1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=g1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Ev(l,o)|0,o),h=s}function v1(){var e=0,n=0;if(c[7656]|0||(up(9304),Bt(28,9304,Q|0)|0,n=7656,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9304)|0)){e=9304,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));up(9304)}return 9304}function g1(e){return e=e|0,0}function Ev(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=v1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],op(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Sv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Sv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Cv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Tv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],op(l,o,r),t[y>>2]=(t[y>>2]|0)+12,xv(e,_),kv(_),h=k;return}}function Cv(e){return e=e|0,357913941}function Tv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function xv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function up(e){e=e|0,Iv(e)}function Av(e){e=e|0,Ov(e+24|0)}function Ov(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Iv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Pv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Pv(){return 1164}function Mv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Fv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Lv(n,s,r),h=o}function Fv(e){return e=e|0,(t[(v1()|0)+24>>2]|0)+(e*12|0)|0}function Lv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),$s(s,r),r=Ks(s,r)|0,Bl[o&31](e,r),Xs(s),h=l}function $s(e,n){e=e|0,n=n|0,Rv(e,n)}function Ks(e,n){return e=e|0,n=n|0,e|0}function Xs(e){e=e|0,Ju(e)}function Rv(e,n){e=e|0,n=n|0,_1(e,n)}function _1(e,n){e=e|0,n=n|0,t[e>>2]=n}function y1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sp(e,r,s,0),h=o}function sp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=w1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Nv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Bv(l,o)|0,o),h=s}function w1(){var e=0,n=0;if(c[7664]|0||(cp(9340),Bt(29,9340,Q|0)|0,n=7664,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9340)|0)){e=9340,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));cp(9340)}return 9340}function Nv(e){return e=e|0,0}function Bv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=w1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Uv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,qv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,zv(e,_),fp(_),h=k;return}}function Uv(e){return e=e|0,357913941}function qv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function zv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function fp(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function cp(e){e=e|0,Hv(e)}function Kc(e){e=e|0,Wv(e+24|0)}function Wv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Hv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,bv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function bv(){return 1180}function Gv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Vv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=Yv(n,s,r)|0,h=o,r|0}function Vv(e){return e=e|0,(t[(w1()|0)+24>>2]|0)+(e*12|0)|0}function Yv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),Ml(s,r),s=Fl(s,r)|0,s=Xc(J4[o&15](e,s)|0)|0,h=l,s|0}function Ml(e,n){e=e|0,n=n|0}function Fl(e,n){return e=e|0,n=n|0,$v(n)|0}function Xc(e){return e=e|0,e|0}function $v(e){return e=e|0,e|0}function Kv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Xv(e,r,s,0),h=o}function Xv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=D1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Jv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Qv(l,o)|0,o),h=s}function D1(){var e=0,n=0;if(c[7672]|0||(hp(9376),Bt(30,9376,Q|0)|0,n=7672,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9376)|0)){e=9376,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));hp(9376)}return 9376}function Jv(e){return e=e|0,0}function Qv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=D1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ap(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(dp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ap(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function dp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=pp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Zv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ap(l,o,r),t[y>>2]=(t[y>>2]|0)+12,eg(e,_),tg(_),h=k;return}}function pp(e){return e=e|0,357913941}function Zv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function eg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function tg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function hp(e){e=e|0,rg(e)}function Jc(e){e=e|0,ng(e+24|0)}function ng(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function rg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function mp(){return 1196}function ig(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=og(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=ug(n,o)|0,h=r,n|0}function og(e){return e=e|0,(t[(D1()|0)+24>>2]|0)+(e*12|0)|0}function ug(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Xc(dc[r&31](e)|0)|0}function sg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],lg(e,r,s,1),h=o}function lg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=fg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cg(l,o)|0,o),h=s}function E1(){var e=0,n=0;if(c[7680]|0||(C1(9412),Bt(31,9412,Q|0)|0,n=7680,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9412)|0)){e=9412,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));C1(9412)}return 9412}function fg(e){return e=e|0,0}function cg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],rc(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(ag(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function rc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function ag(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=vp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,gp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],rc(l,o,r),t[y>>2]=(t[y>>2]|0)+12,S1(e,_),_p(_),h=k;return}}function vp(e){return e=e|0,357913941}function gp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function S1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function _p(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function C1(e){e=e|0,dg(e)}function yp(e){e=e|0,wp(e+24|0)}function wp(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function dg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Dp(){return 1200}function pg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Qc(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=Zc(n,o)|0,h=r,n|0}function Qc(e){return e=e|0,(t[(E1()|0)+24>>2]|0)+(e*12|0)|0}function Zc(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ea(dc[r&31](e)|0)|0}function ea(e){return e=e|0,e|0}function hg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],T1(e,r,s,0),h=o}function T1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=ta()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=mg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,vg(l,o)|0,o),h=s}function ta(){var e=0,n=0;if(c[7688]|0||(Sp(9448),Bt(32,9448,Q|0)|0,n=7688,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9448)|0)){e=9448,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Sp(9448)}return 9448}function mg(e){return e=e|0,0}function vg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=ta()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(gg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function gg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=_g(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,yg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,wg(e,_),Dg(_),h=k;return}}function _g(e){return e=e|0,357913941}function yg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function wg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Dg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Sp(e){e=e|0,Cg(e)}function Eg(e){e=e|0,Sg(e+24|0)}function Sg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Cg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Mo(){return 1204}function Tg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=xg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ll(n,s,r),h=o}function xg(e){return e=e|0,(t[(ta()|0)+24>>2]|0)+(e*12|0)|0}function Ll(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),On(s,r),s=x1(s,r)|0,Bl[o&31](e,s),h=l}function On(e,n){e=e|0,n=n|0}function x1(e,n){return e=e|0,n=n|0,Vi(n)|0}function Vi(e){return e=e|0,e|0}function l0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],kg(e,r,s,0),h=o}function kg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Eu()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Ag(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Og(l,o)|0,o),h=s}function Eu(){var e=0,n=0;if(c[7696]|0||(A1(9484),Bt(33,9484,Q|0)|0,n=7696,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9484)|0)){e=9484,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A1(9484)}return 9484}function Ag(e){return e=e|0,0}function Og(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Eu()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Cp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Ig(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Cp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Ig(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Pg(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,k1(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Cp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Mg(e,_),rs(_),h=k;return}}function Pg(e){return e=e|0,357913941}function k1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Mg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function rs(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function A1(e){e=e|0,n0(e)}function na(e){e=e|0,Jr(e+24|0)}function Jr(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function n0(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Tp()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Tp(){return 1212}function Fg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Lg(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],Rg(n,l,r,o),h=s}function Lg(e){return e=e|0,(t[(Eu()|0)+24>>2]|0)+(e*12|0)|0}function Rg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),On(l,r),l=x1(l,r)|0,Ml(d,o),d=Fl(d,o)|0,X1[s&15](e,l,d),h=_}function Ng(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Bg(e,r,s,1),h=o}function Bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=O1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=xp(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,ic(l,o)|0,o),h=s}function O1(){var e=0,n=0;if(c[7704]|0||(Ap(9520),Bt(34,9520,Q|0)|0,n=7704,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9520)|0)){e=9520,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ap(9520)}return 9520}function xp(e){return e=e|0,0}function ic(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=O1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ra(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ra(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=kp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,ia(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ra(l,o,r),t[y>>2]=(t[y>>2]|0)+12,mo(e,_),Df(_),h=k;return}}function kp(e){return e=e|0,357913941}function ia(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function mo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Df(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ap(e){e=e|0,zg(e)}function Ug(e){e=e|0,qg(e+24|0)}function qg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function zg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Wg()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Wg(){return 1224}function Op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;return s=h,h=h+16|0,l=s+8|0,d=s,_=is(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],o=+jn(n,l,r),h=s,+o}function is(e){return e=e|0,(t[(O1()|0)+24>>2]|0)+(e*12|0)|0}function jn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,d=+Ol(+uD[o&7](e,s)),h=l,+d}function Ip(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Fo(e,r,s,1),h=o}function Fo(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oa()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Hg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,yr(l,o)|0,o),h=s}function oa(){var e=0,n=0;if(c[7712]|0||(Fp(9556),Bt(35,9556,Q|0)|0,n=7712,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9556)|0)){e=9556,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fp(9556)}return 9556}function Hg(e){return e=e|0,0}function yr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oa()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Pp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Mp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Pp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Mp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=ua(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,bg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Pp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Gg(e,_),Vg(_),h=k;return}}function ua(e){return e=e|0,357913941}function bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Gg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Vg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Fp(e){e=e|0,Kg(e)}function Yg(e){e=e|0,$g(e+24|0)}function $g(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Kg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Xg()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Xg(){return 1232}function Jg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Qg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=+Zg(n,s),h=o,+r}function Qg(e){return e=e|0,(t[(oa()|0)+24>>2]|0)+(e*12|0)|0}function Zg(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),+ +Ol(+oD[r&15](e))}function e_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t_(e,r,s,1),h=o}function t_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oc()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=n_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,I1(l,o)|0,o),h=s}function oc(){var e=0,n=0;if(c[7720]|0||(Rp(9592),Bt(36,9592,Q|0)|0,n=7720,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9592)|0)){e=9592,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Rp(9592)}return 9592}function n_(e){return e=e|0,0}function I1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oc()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(r_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function r_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=i_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,q0(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yi(e,_),o_(_),h=k;return}}function i_(e){return e=e|0,357913941}function q0(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yi(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function o_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Rp(e){e=e|0,s_(e)}function u_(e){e=e|0,Np(e+24|0)}function Np(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function s_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,l_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function l_(){return 1276}function f_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Bp(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=c_(n,o)|0,h=r,n|0}function Bp(e){return e=e|0,(t[(oc()|0)+24>>2]|0)+(e*12|0)|0}function c_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+16|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=jp(o)|0,h=s,o|0}function jp(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(Up()|0)|0,o?(s1(n,o),l1(r,n),qp(e,r),e=f1(n)|0):e=zp(e)|0,h=s,e|0}function Up(){var e=0;return c[7736]|0||(Wp(9640),Bt(25,9640,Q|0)|0,e=7736,t[e>>2]=1,t[e+4>>2]=0),9640}function qp(e,n){e=e|0,n=n|0,Ef(n,e,e+8|0)|0}function zp(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(16)|0,t[_>>2]=t[e>>2],t[_+4>>2]=t[e+4>>2],t[_+8>>2]=t[e+8>>2],t[_+12>>2]=t[e+12>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(e,l,s),t[o>>2]=e,h=r,n|0}function P1(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1244,t[r+12>>2]=n,t[e+4>>2]=r}function a_(e){e=e|0,da(e),Ve(e)}function d_(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function p_(e){e=e|0,Ve(e)}function Ef(e,n,r){return e=e|0,n=n|0,r=r|0,n=h_(t[e>>2]|0,n,r)|0,r=e+4|0,t[(t[r>>2]|0)+8>>2]=n,t[(t[r>>2]|0)+8>>2]|0}function h_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;return o=h,h=h+16|0,s=o,Zo(s),e=Oi(e)|0,r=m_(e,t[n>>2]|0,+L[r>>3])|0,eu(s),h=o,r|0}function m_(e,n,r){e=e|0,n=n|0,r=+r;var o=0;return o=ko(v_()|0)|0,n=jc(n)|0,dl(0,o|0,e|0,n|0,+ +Ko(r))|0}function v_(){var e=0;return c[7728]|0||(g_(9628),e=7728,t[e>>2]=1,t[e+4>>2]=0),9628}function g_(e){e=e|0,Ao(e,__()|0,2)}function __(){return 1264}function Wp(e){e=e|0,Ys(e)}function Hp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y_(e,r,s,1),h=o}function y_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=M1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=w_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,D_(l,o)|0,o),h=s}function M1(){var e=0,n=0;if(c[7744]|0||(Gp(9684),Bt(37,9684,Q|0)|0,n=7744,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9684)|0)){e=9684,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gp(9684)}return 9684}function w_(e){return e=e|0,0}function D_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=M1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],bp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(E_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function bp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function E_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=S_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,C_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],bp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,T_(e,_),x_(_),h=k;return}}function S_(e){return e=e|0,357913941}function C_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function T_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function x_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Gp(e){e=e|0,O_(e)}function k_(e){e=e|0,A_(e+24|0)}function A_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function O_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,I_()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function I_(){return 1280}function P_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=M_(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=F_(n,s,r)|0,h=o,r|0}function M_(e){return e=e|0,(t[(M1()|0)+24>>2]|0)+(e*12|0)|0}function F_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return d=h,h=h+32|0,s=d,l=d+16|0,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(l,r),l=ns(l,r)|0,X1[o&15](s,e,l),l=jp(s)|0,h=d,l|0}function L_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],R_(e,r,s,1),h=o}function R_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=F1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=N_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B_(l,o)|0,o),h=s}function F1(){var e=0,n=0;if(c[7752]|0||(Kp(9720),Bt(38,9720,Q|0)|0,n=7752,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9720)|0)){e=9720,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Kp(9720)}return 9720}function N_(e){return e=e|0,0}function B_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=F1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Vp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(j_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Vp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function j_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=L1(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Yp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Vp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$p(e,_),U_(_),h=k;return}}function L1(e){return e=e|0,357913941}function Yp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $p(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function U_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Kp(e){e=e|0,z_(e)}function q_(e){e=e|0,R1(e+24|0)}function R1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,W_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W_(){return 1288}function H_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=$i(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=N1(n,o)|0,h=r,n|0}function $i(e){return e=e|0,(t[(F1()|0)+24>>2]|0)+(e*12|0)|0}function N1(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Dd(dc[r&31](e)|0)|0}function b_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],G_(e,r,s,0),h=o}function G_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=B1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=V_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,j1(l,o)|0,o),h=s}function B1(){var e=0,n=0;if(c[7760]|0||(q1(9756),Bt(39,9756,Q|0)|0,n=7760,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9756)|0)){e=9756,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));q1(9756)}return 9756}function V_(e){return e=e|0,0}function j1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=B1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Xp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(U1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Xp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function U1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Y_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,$_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Xp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,K_(e,_),X_(_),h=k;return}}function Y_(e){return e=e|0,357913941}function $_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function K_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function X_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function q1(e){e=e|0,Z_(e)}function J_(e){e=e|0,Q_(e+24|0)}function Q_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,z1()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function z1(){return 1292}function W1(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=e4(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t4(n,s,r),h=o}function e4(e){return e=e|0,(t[(B1()|0)+24>>2]|0)+(e*12|0)|0}function t4(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),wu(s,r),r=+Du(s,r),nD[o&31](e,r),h=l}function n4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r4(e,r,s,0),h=o}function r4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=H1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=i4(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,o4(l,o)|0,o),h=s}function H1(){var e=0,n=0;if(c[7768]|0||(Qp(9792),Bt(40,9792,Q|0)|0,n=7768,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9792)|0)){e=9792,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Qp(9792)}return 9792}function i4(e){return e=e|0,0}function o4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=H1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Jp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(u4(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Jp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function u4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=s4(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,l4(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Jp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,f4(e,_),c4(_),h=k;return}}function s4(e){return e=e|0,357913941}function l4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function f4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function c4(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Qp(e){e=e|0,p4(e)}function a4(e){e=e|0,d4(e+24|0)}function d4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function p4(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,h4()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function h4(){return 1300}function m4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=v4(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],g4(n,l,r,o),h=s}function v4(e){return e=e|0,(t[(H1()|0)+24>>2]|0)+(e*12|0)|0}function g4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,wu(d,o),o=+Du(d,o),cD[s&15](e,l,o),h=_}function a(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],p(e,r,s,0),h=o}function p(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=I(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B(l,o)|0,o),h=s}function E(){var e=0,n=0;if(c[7776]|0||(nt(9828),Bt(41,9828,Q|0)|0,n=7776,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9828)|0)){e=9828,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));nt(9828)}return 9828}function I(e){return e=e|0,0}function B(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],G(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(te(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function G(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function te(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=se(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ee(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],G(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$e(e,_),Ke(_),h=k;return}}function se(e){return e=e|0,357913941}function Ee(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $e(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ke(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function nt(e){e=e|0,an(e)}function Ct(e){e=e|0,Gt(e+24|0)}function Gt(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function an(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,qn()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function qn(){return 1312}function dn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Yn(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],er(n,s,r),h=o}function Yn(e){return e=e|0,(t[(E()|0)+24>>2]|0)+(e*12|0)|0}function er(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,Bl[o&31](e,s),h=l}function vo(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Pi(e,r,s,0),h=o}function Pi(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Mi()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=f0(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Jo(l,o)|0,o),h=s}function Mi(){var e=0,n=0;if(c[7784]|0||(kw(9864),Bt(42,9864,Q|0)|0,n=7784,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9864)|0)){e=9864,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));kw(9864)}return 9864}function f0(e){return e=e|0,0}function Jo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Mi()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Su(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Zp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Su(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Zp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=v9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,g9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Su(l,o,r),t[y>>2]=(t[y>>2]|0)+12,_9(e,_),y9(_),h=k;return}}function v9(e){return e=e|0,357913941}function g9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function _9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function y9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function kw(e){e=e|0,E9(e)}function w9(e){e=e|0,D9(e+24|0)}function D9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function E9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,S9()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function S9(){return 1320}function C9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=T9(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],x9(n,s,r),h=o}function T9(e){return e=e|0,(t[(Mi()|0)+24>>2]|0)+(e*12|0)|0}function x9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),k9(s,r),s=A9(s,r)|0,Bl[o&31](e,s),h=l}function k9(e,n){e=e|0,n=n|0}function A9(e,n){return e=e|0,n=n|0,O9(n)|0}function O9(e){return e=e|0,e|0}function I9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],P9(e,r,s,0),h=o}function P9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=_4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=M9(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,F9(l,o)|0,o),h=s}function _4(){var e=0,n=0;if(c[7792]|0||(Ow(9900),Bt(43,9900,Q|0)|0,n=7792,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9900)|0)){e=9900,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ow(9900)}return 9900}function M9(e){return e=e|0,0}function F9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=_4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Aw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(L9(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Aw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function L9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=R9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,N9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Aw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,B9(e,_),j9(_),h=k;return}}function R9(e){return e=e|0,357913941}function N9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function B9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function j9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ow(e){e=e|0,z9(e)}function U9(e){e=e|0,q9(e+24|0)}function q9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,22,n,W9()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W9(){return 1344}function H9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;r=h,h=h+16|0,o=r+8|0,s=r,l=b9(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],G9(n,o),h=r}function b9(e){return e=e|0,(t[(_4()|0)+24>>2]|0)+(e*12|0)|0}function G9(e,n){e=e|0,n=n|0;var r=0;r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Nl[r&127](e)}function V9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=y4()|0,e=Y9(r)|0,ur(l,n,s,e,$9(r,o)|0,o)}function y4(){var e=0,n=0;if(c[7800]|0||(Pw(9936),Bt(44,9936,Q|0)|0,n=7800,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9936)|0)){e=9936,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Pw(9936)}return 9936}function Y9(e){return e=e|0,e|0}function $9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=y4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Iw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(K9(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Iw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function K9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=X9(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,J9(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Iw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Q9(e,s),Z9(s),h=_;return}}function X9(e){return e=e|0,536870911}function J9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Q9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Z9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Pw(e){e=e|0,nx(e)}function ex(e){e=e|0,tx(e+24|0)}function tx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function nx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,23,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rx(e,n){e=e|0,n=n|0,ox(t[(ix(e)|0)>>2]|0,n)}function ix(e){return e=e|0,(t[(y4()|0)+24>>2]|0)+(e<<3)|0}function ox(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,On(o,n),n=x1(o,n)|0,Nl[e&127](n),h=r}function ux(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=w4()|0,e=sx(r)|0,ur(l,n,s,e,lx(r,o)|0,o)}function w4(){var e=0,n=0;if(c[7808]|0||(Fw(9972),Bt(45,9972,Q|0)|0,n=7808,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9972)|0)){e=9972,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fw(9972)}return 9972}function sx(e){return e=e|0,e|0}function lx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=w4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Mw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(fx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Mw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function fx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=cx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,ax(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Mw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,dx(e,s),px(s),h=_;return}}function cx(e){return e=e|0,536870911}function ax(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function dx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function px(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Fw(e){e=e|0,vx(e)}function hx(e){e=e|0,mx(e+24|0)}function mx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function vx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,9,n,gx()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gx(){return 1348}function _x(e,n){return e=e|0,n=n|0,wx(t[(yx(e)|0)>>2]|0,n)|0}function yx(e){return e=e|0,(t[(w4()|0)+24>>2]|0)+(e<<3)|0}function wx(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,n=Xc(dc[e&31](n)|0)|0,h=r,n|0}function Lw(e,n){e=e|0,n=n|0}function Rw(e,n){return e=e|0,n=n|0,Dx(n)|0}function Dx(e){return e=e|0,e|0}function Ex(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=D4()|0,e=Sx(r)|0,ur(l,n,s,e,Cx(r,o)|0,o)}function D4(){var e=0,n=0;if(c[7816]|0||(Bw(10008),Bt(46,10008,Q|0)|0,n=7816,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10008)|0)){e=10008,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Bw(10008)}return 10008}function Sx(e){return e=e|0,e|0}function Cx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=D4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Nw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(Tx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Nw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function Tx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=xx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,kx(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Nw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Ax(e,s),Ox(s),h=_;return}}function xx(e){return e=e|0,536870911}function kx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Ax(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ox(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Bw(e){e=e|0,Mx(e)}function Ix(e){e=e|0,Px(e+24|0)}function Px(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Mx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,15,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Fx(e){return e=e|0,Rx(t[(Lx(e)|0)>>2]|0)|0}function Lx(e){return e=e|0,(t[(D4()|0)+24>>2]|0)+(e<<3)|0}function Rx(e){return e=e|0,Xc(ph[e&7]()|0)|0}function Nx(){var e=0;return c[7832]|0||(bx(10052),Bt(25,10052,Q|0)|0,e=7832,t[e>>2]=1,t[e+4>>2]=0),10052}function Bx(e,n){e=e|0,n=n|0,t[e>>2]=jx()|0,t[e+4>>2]=Ux()|0,t[e+12>>2]=n,t[e+8>>2]=qx()|0,t[e+32>>2]=2}function jx(){return 11709}function Ux(){return 1188}function qx(){return eh()|0}function zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Wx(r),Ve(r)):n|0&&(mu(n),Ve(n))}function Sf(e,n){return e=e|0,n=n|0,n&e|0}function Wx(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function eh(){var e=0;return c[7824]|0||(t[2511]=Hx()|0,t[2512]=0,e=7824,t[e>>2]=1,t[e+4>>2]=0),10044}function Hx(){return 0}function bx(e){e=e|0,Ys(e)}function Gx(e){e=e|0;var n=0,r=0,o=0,s=0,l=0;n=h,h=h+32|0,r=n+24|0,l=n+16|0,s=n+8|0,o=n,Vx(e,4827),Yx(e,4834,3)|0,$x(e,3682,47)|0,t[l>>2]=9,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],Kx(e,4841,r)|0,t[s>>2]=1,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],Xx(e,4871,r)|0,t[o>>2]=10,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],Jx(e,4891,r)|0,h=n}function Vx(e,n){e=e|0,n=n|0;var r=0;r=Ok()|0,t[e>>2]=r,Ik(r,n),Cf(t[e>>2]|0)}function Yx(e,n,r){return e=e|0,n=n|0,r=r|0,pk(e,Zn(n)|0,r,0),e|0}function $x(e,n,r){return e=e|0,n=n|0,r=r|0,Q7(e,Zn(n)|0,r,0),e|0}function Kx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],F7(e,n,s),h=o,e|0}function Xx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],h7(e,n,s),h=o,e|0}function Jx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qx(e,n,s),h=o,e|0}function Qx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Zx(e,r,s,1),h=o}function Zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=e7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,t7(l,o)|0,o),h=s}function E4(){var e=0,n=0;if(c[7840]|0||(Uw(10100),Bt(48,10100,Q|0)|0,n=7840,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10100)|0)){e=10100,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Uw(10100)}return 10100}function e7(e){return e=e|0,0}function t7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],jw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(n7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function jw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function n7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=r7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,i7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],jw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,o7(e,_),u7(_),h=k;return}}function r7(e){return e=e|0,357913941}function i7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function o7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function u7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Uw(e){e=e|0,f7(e)}function s7(e){e=e|0,l7(e+24|0)}function l7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function f7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,c7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function c7(){return 1364}function a7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=d7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=p7(n,s,r)|0,h=o,r|0}function d7(e){return e=e|0,(t[(E4()|0)+24>>2]|0)+(e*12|0)|0}function p7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,s=ip(J4[o&15](e,s)|0)|0,h=l,s|0}function h7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],m7(e,r,s,0),h=o}function m7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=S4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=v7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,g7(l,o)|0,o),h=s}function S4(){var e=0,n=0;if(c[7848]|0||(zw(10136),Bt(49,10136,Q|0)|0,n=7848,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10136)|0)){e=10136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));zw(10136)}return 10136}function v7(e){return e=e|0,0}function g7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=S4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],qw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(_7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function qw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function _7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=y7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,w7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],qw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,D7(e,_),E7(_),h=k;return}}function y7(e){return e=e|0,357913941}function w7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function D7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function E7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function zw(e){e=e|0,T7(e)}function S7(e){e=e|0,C7(e+24|0)}function C7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function T7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,9,n,x7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function x7(){return 1372}function k7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=A7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],O7(n,s,r),h=o}function A7(e){return e=e|0,(t[(S4()|0)+24>>2]|0)+(e*12|0)|0}function O7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=tt;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),I7(s,r),d=w(P7(s,r)),tD[o&1](e,d),h=l}function I7(e,n){e=e|0,n=+n}function P7(e,n){return e=e|0,n=+n,w(M7(n))}function M7(e){return e=+e,w(e)}function F7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L7(e,r,s,0),h=o}function L7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=C4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=R7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,N7(l,o)|0,o),h=s}function C4(){var e=0,n=0;if(c[7856]|0||(Hw(10172),Bt(50,10172,Q|0)|0,n=7856,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10172)|0)){e=10172,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Hw(10172)}return 10172}function R7(e){return e=e|0,0}function N7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=C4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ww(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(B7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ww(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function B7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=j7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,U7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ww(l,o,r),t[y>>2]=(t[y>>2]|0)+12,q7(e,_),z7(_),h=k;return}}function j7(e){return e=e|0,357913941}function U7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function q7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function z7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Hw(e){e=e|0,b7(e)}function W7(e){e=e|0,H7(e+24|0)}function H7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function b7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,G7()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function G7(){return 1380}function V7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Y7(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],$7(n,l,r,o),h=s}function Y7(e){return e=e|0,(t[(C4()|0)+24>>2]|0)+(e*12|0)|0}function $7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,K7(d,o),d=X7(d,o)|0,X1[s&15](e,l,d),h=_}function K7(e,n){e=e|0,n=n|0}function X7(e,n){return e=e|0,n=n|0,J7(n)|0}function J7(e){return e=e|0,(e|0)!=0|0}function Q7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=T4()|0,e=Z7(r)|0,ur(l,n,s,e,ek(r,o)|0,o)}function T4(){var e=0,n=0;if(c[7864]|0||(Gw(10208),Bt(51,10208,Q|0)|0,n=7864,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10208)|0)){e=10208,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gw(10208)}return 10208}function Z7(e){return e=e|0,e|0}function ek(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=T4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(bw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function bw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rk(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,bw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,ik(e,s),ok(s),h=_;return}}function nk(e){return e=e|0,536870911}function rk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function ik(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function ok(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Gw(e){e=e|0,lk(e)}function uk(e){e=e|0,sk(e+24|0)}function sk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,24,n,fk()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fk(){return 1392}function ck(e,n){e=e|0,n=n|0,dk(t[(ak(e)|0)>>2]|0,n)}function ak(e){return e=e|0,(t[(T4()|0)+24>>2]|0)+(e<<3)|0}function dk(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,Nl[e&127](n),h=r}function pk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=x4()|0,e=hk(r)|0,ur(l,n,s,e,mk(r,o)|0,o)}function x4(){var e=0,n=0;if(c[7872]|0||(Yw(10244),Bt(52,10244,Q|0)|0,n=7872,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10244)|0)){e=10244,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Yw(10244)}return 10244}function hk(e){return e=e|0,e|0}function mk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=x4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Vw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(vk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Vw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function vk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=gk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,_k(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Vw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,yk(e,s),wk(s),h=_;return}}function gk(e){return e=e|0,536870911}function _k(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function yk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function wk(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Yw(e){e=e|0,Sk(e)}function Dk(e){e=e|0,Ek(e+24|0)}function Ek(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Sk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,16,n,Ck()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Ck(){return 1400}function Tk(e){return e=e|0,kk(t[(xk(e)|0)>>2]|0)|0}function xk(e){return e=e|0,(t[(x4()|0)+24>>2]|0)+(e<<3)|0}function kk(e){return e=e|0,Ak(ph[e&7]()|0)|0}function Ak(e){return e=e|0,e|0}function Ok(){var e=0;return c[7880]|0||(Nk(10280),Bt(25,10280,Q|0)|0,e=7880,t[e>>2]=1,t[e+4>>2]=0),10280}function Ik(e,n){e=e|0,n=n|0,t[e>>2]=Pk()|0,t[e+4>>2]=Mk()|0,t[e+12>>2]=n,t[e+8>>2]=Fk()|0,t[e+32>>2]=4}function Pk(){return 11711}function Mk(){return 1356}function Fk(){return eh()|0}function Lk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Rk(r),Ve(r)):n|0&&(Gi(n),Ve(n))}function Rk(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function Nk(e){e=e|0,Ys(e)}function Bk(e){e=e|0,jk(e,4920),Uk(e)|0,qk(e)|0}function jk(e,n){e=e|0,n=n|0;var r=0;r=Up()|0,t[e>>2]=r,sA(r,n),Cf(t[e>>2]|0)}function Uk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,Jk()|0),e|0}function qk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,zk()|0),e|0}function zk(){var e=0;return c[7888]|0||($w(10328),Bt(53,10328,Q|0)|0,e=7888,t[e>>2]=1,t[e+4>>2]=0),Dn(10328)|0||$w(10328),10328}function uc(e,n){e=e|0,n=n|0,ur(e,0,n,0,0,0)}function $w(e){e=e|0,bk(e),sc(e,10)}function Wk(e){e=e|0,Hk(e+24|0)}function Hk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function bk(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,$k()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Gk(e,n,r){e=e|0,n=n|0,r=+r,Vk(e,n,r)}function sc(e,n){e=e|0,n=n|0,t[e+20>>2]=n}function Vk(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,l=o+8|0,_=o+13|0,s=o,d=o+12|0,ts(_,n),t[l>>2]=ns(_,n)|0,wu(d,r),L[s>>3]=+Du(d,r),Yk(e,l,s),h=o}function Yk(e,n,r){e=e|0,n=n|0,r=r|0,M(e+8|0,t[n>>2]|0,+L[r>>3]),c[e+24>>0]=1}function $k(){return 1404}function Kk(e,n){return e=e|0,n=+n,Xk(e,n)|0}function Xk(e,n){e=e|0,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,l=o+4|0,d=o+8|0,_=o,s=Qo(8)|0,r=s,y=Tt(16)|0,ts(l,e),e=ns(l,e)|0,wu(d,n),M(y,e,+Du(d,n)),d=r+4|0,t[d>>2]=y,e=Tt(8)|0,d=t[d>>2]|0,t[_>>2]=0,t[l>>2]=t[_>>2],P1(e,d,l),t[s>>2]=e,h=o,r|0}function Jk(){var e=0;return c[7896]|0||(Kw(10364),Bt(54,10364,Q|0)|0,e=7896,t[e>>2]=1,t[e+4>>2]=0),Dn(10364)|0||Kw(10364),10364}function Kw(e){e=e|0,eA(e),sc(e,55)}function Qk(e){e=e|0,Zk(e+24|0)}function Zk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function eA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,4,n,iA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function tA(e){e=e|0,nA(e)}function nA(e){e=e|0,rA(e)}function rA(e){e=e|0,Xw(e+8|0),c[e+24>>0]=1}function Xw(e){e=e|0,t[e>>2]=0,L[e+8>>3]=0}function iA(){return 1424}function oA(){return uA()|0}function uA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,Xw(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(o,l,s),t[r>>2]=o,h=n,e|0}function sA(e,n){e=e|0,n=n|0,t[e>>2]=lA()|0,t[e+4>>2]=fA()|0,t[e+12>>2]=n,t[e+8>>2]=cA()|0,t[e+32>>2]=5}function lA(){return 11710}function fA(){return 1416}function cA(){return th()|0}function aA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dA(r),Ve(r)):n|0&&Ve(n)}function dA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function th(){var e=0;return c[7904]|0||(t[2600]=pA()|0,t[2601]=0,e=7904,t[e>>2]=1,t[e+4>>2]=0),10400}function pA(){return t[357]|0}function hA(e){e=e|0,mA(e,4926),vA(e)|0}function mA(e,n){e=e|0,n=n|0;var r=0;r=u1()|0,t[e>>2]=r,kA(r,n),Cf(t[e>>2]|0)}function vA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,gA()|0),e|0}function gA(){var e=0;return c[7912]|0||(Jw(10412),Bt(56,10412,Q|0)|0,e=7912,t[e>>2]=1,t[e+4>>2]=0),Dn(10412)|0||Jw(10412),10412}function Jw(e){e=e|0,wA(e),sc(e,57)}function _A(e){e=e|0,yA(e+24|0)}function yA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function wA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,5,n,CA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function DA(e){e=e|0,EA(e)}function EA(e){e=e|0,SA(e)}function SA(e){e=e|0;var n=0,r=0;n=e+8|0,r=n+48|0;do t[n>>2]=0,n=n+4|0;while((n|0)<(r|0));c[e+56>>0]=1}function CA(){return 1432}function TA(){return xA()|0}function xA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0;d=h,h=h+16|0,e=d+4|0,n=d,r=Qo(8)|0,o=r,s=Tt(48)|0,l=s,_=l+48|0;do t[l>>2]=0,l=l+4|0;while((l|0)<(_|0));return l=o+4|0,t[l>>2]=s,_=Tt(8)|0,l=t[l>>2]|0,t[n>>2]=0,t[e>>2]=t[n>>2],Wd(_,l,e),t[r>>2]=_,h=d,o|0}function kA(e,n){e=e|0,n=n|0,t[e>>2]=AA()|0,t[e+4>>2]=OA()|0,t[e+12>>2]=n,t[e+8>>2]=IA()|0,t[e+32>>2]=6}function AA(){return 11704}function OA(){return 1436}function IA(){return th()|0}function PA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(MA(r),Ve(r)):n|0&&Ve(n)}function MA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function FA(e){e=e|0,LA(e,4933),RA(e)|0,NA(e)|0}function LA(e,n){e=e|0,n=n|0;var r=0;r=uO()|0,t[e>>2]=r,sO(r,n),Cf(t[e>>2]|0)}function RA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,XA()|0),e|0}function NA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,BA()|0),e|0}function BA(){var e=0;return c[7920]|0||(Qw(10452),Bt(58,10452,Q|0)|0,e=7920,t[e>>2]=1,t[e+4>>2]=0),Dn(10452)|0||Qw(10452),10452}function Qw(e){e=e|0,qA(e),sc(e,1)}function jA(e){e=e|0,UA(e+24|0)}function UA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function qA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,bA()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function zA(e,n,r){e=e|0,n=+n,r=+r,WA(e,n,r)}function WA(e,n,r){e=e|0,n=+n,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,l=o+8|0,_=o+17|0,s=o,d=o+16|0,wu(_,n),L[l>>3]=+Du(_,n),wu(d,r),L[s>>3]=+Du(d,r),HA(e,l,s),h=o}function HA(e,n,r){e=e|0,n=n|0,r=r|0,Zw(e+8|0,+L[n>>3],+L[r>>3]),c[e+24>>0]=1}function Zw(e,n,r){e=e|0,n=+n,r=+r,L[e>>3]=n,L[e+8>>3]=r}function bA(){return 1472}function GA(e,n){return e=+e,n=+n,VA(e,n)|0}function VA(e,n){e=+e,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,d=o+4|0,_=o+8|0,y=o,s=Qo(8)|0,r=s,l=Tt(16)|0,wu(d,e),e=+Du(d,e),wu(_,n),Zw(l,e,+Du(_,n)),_=r+4|0,t[_>>2]=l,l=Tt(8)|0,_=t[_>>2]|0,t[y>>2]=0,t[d>>2]=t[y>>2],e8(l,_,d),t[s>>2]=l,h=o,r|0}function e8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1452,t[r+12>>2]=n,t[e+4>>2]=r}function YA(e){e=e|0,da(e),Ve(e)}function $A(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function KA(e){e=e|0,Ve(e)}function XA(){var e=0;return c[7928]|0||(t8(10488),Bt(59,10488,Q|0)|0,e=7928,t[e>>2]=1,t[e+4>>2]=0),Dn(10488)|0||t8(10488),10488}function t8(e){e=e|0,ZA(e),sc(e,60)}function JA(e){e=e|0,QA(e+24|0)}function QA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function ZA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,6,n,rO()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function eO(e){e=e|0,tO(e)}function tO(e){e=e|0,nO(e)}function nO(e){e=e|0,n8(e+8|0),c[e+24>>0]=1}function n8(e){e=e|0,t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,t[e+12>>2]=0}function rO(){return 1492}function iO(){return oO()|0}function oO(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,n8(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],e8(o,l,s),t[r>>2]=o,h=n,e|0}function uO(){var e=0;return c[7936]|0||(pO(10524),Bt(25,10524,Q|0)|0,e=7936,t[e>>2]=1,t[e+4>>2]=0),10524}function sO(e,n){e=e|0,n=n|0,t[e>>2]=lO()|0,t[e+4>>2]=fO()|0,t[e+12>>2]=n,t[e+8>>2]=cO()|0,t[e+32>>2]=7}function lO(){return 11700}function fO(){return 1484}function cO(){return th()|0}function aO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dO(r),Ve(r)):n|0&&Ve(n)}function dO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function pO(e){e=e|0,Ys(e)}function hO(e,n,r){e=e|0,n=n|0,r=r|0,e=Zn(n)|0,n=mO(r)|0,r=vO(r,0)|0,VO(e,n,r,k4()|0,0)}function mO(e){return e=e|0,e|0}function vO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=k4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(i8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(SO(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k4(){var e=0,n=0;if(c[7944]|0||(r8(10568),Bt(61,10568,Q|0)|0,n=7944,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10568)|0)){e=10568,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));r8(10568)}return 10568}function r8(e){e=e|0,yO(e)}function gO(e){e=e|0,_O(e+24|0)}function _O(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yO(e){e=e|0;var n=0;n=An()|0,Nn(e,1,17,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wO(e){return e=e|0,EO(t[(DO(e)|0)>>2]|0)|0}function DO(e){return e=e|0,(t[(k4()|0)+24>>2]|0)+(e<<3)|0}function EO(e){return e=e|0,ea(ph[e&7]()|0)|0}function i8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function SO(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=CO(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,TO(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,i8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,xO(e,s),kO(s),h=_;return}}function CO(e){return e=e|0,536870911}function TO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function xO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kO(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function AO(){OO()}function OO(){IO(10604)}function IO(e){e=e|0,PO(e,4955)}function PO(e,n){e=e|0,n=n|0;var r=0;r=MO()|0,t[e>>2]=r,FO(r,n),Cf(t[e>>2]|0)}function MO(){var e=0;return c[7952]|0||(WO(10612),Bt(25,10612,Q|0)|0,e=7952,t[e>>2]=1,t[e+4>>2]=0),10612}function FO(e,n){e=e|0,n=n|0,t[e>>2]=BO()|0,t[e+4>>2]=jO()|0,t[e+12>>2]=n,t[e+8>>2]=UO()|0,t[e+32>>2]=8}function Cf(e){e=e|0;var n=0,r=0;n=h,h=h+16|0,r=n,sa()|0,t[r>>2]=e,LO(10608,r),h=n}function sa(){return c[11714]|0||(t[2652]=0,Bt(62,10608,Q|0)|0,c[11714]=1),10608}function LO(e,n){e=e|0,n=n|0;var r=0;r=Tt(8)|0,t[r+4>>2]=t[n>>2],t[r>>2]=t[e>>2],t[e>>2]=r}function RO(e){e=e|0,NO(e)}function NO(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function BO(){return 11715}function jO(){return 1496}function UO(){return eh()|0}function qO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(zO(r),Ve(r)):n|0&&Ve(n)}function zO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function WO(e){e=e|0,Ys(e)}function HO(e,n){e=e|0,n=n|0;var r=0,o=0;sa()|0,r=t[2652]|0;e:do if(r|0){for(;o=t[r+4>>2]|0,!(o|0?(U8(A4(o)|0,e)|0)==0:0);)if(r=t[r>>2]|0,!r)break e;bO(o,n)}while(0)}function A4(e){return e=e|0,t[e+12>>2]|0}function bO(e,n){e=e|0,n=n|0;var r=0;e=e+36|0,r=t[e>>2]|0,r|0&&(Ju(r),Ve(r)),r=Tt(4)|0,ba(r,n),t[e>>2]=r}function O4(){return c[11716]|0||(t[2664]=0,Bt(63,10656,Q|0)|0,c[11716]=1),10656}function o8(){var e=0;return c[11717]|0?e=t[2665]|0:(GO(),t[2665]=1504,c[11717]=1,e=1504),e|0}function GO(){c[11740]|0||(c[11718]=Lt(Lt(8,0)|0,0)|0,c[11719]=Lt(Lt(0,0)|0,0)|0,c[11720]=Lt(Lt(0,16)|0,0)|0,c[11721]=Lt(Lt(8,0)|0,0)|0,c[11722]=Lt(Lt(0,0)|0,0)|0,c[11723]=Lt(Lt(8,0)|0,0)|0,c[11724]=Lt(Lt(0,0)|0,0)|0,c[11725]=Lt(Lt(8,0)|0,0)|0,c[11726]=Lt(Lt(0,0)|0,0)|0,c[11727]=Lt(Lt(8,0)|0,0)|0,c[11728]=Lt(Lt(0,0)|0,0)|0,c[11729]=Lt(Lt(0,0)|0,32)|0,c[11730]=Lt(Lt(0,0)|0,32)|0,c[11740]=1)}function u8(){return 1572}function VO(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0;l=h,h=h+32|0,T=l+16|0,k=l+12|0,y=l+8|0,_=l+4|0,d=l,t[T>>2]=e,t[k>>2]=n,t[y>>2]=r,t[_>>2]=o,t[d>>2]=s,O4()|0,YO(10656,T,k,y,_,d),h=l}function YO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0;d=Tt(24)|0,t1(d+4|0,t[n>>2]|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0),t[d>>2]=t[e>>2],t[e>>2]=d}function s8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0;if(qe=h,h=h+32|0,le=qe+20|0,ie=qe+8|0,Pe=qe+4|0,ke=qe,n=t[n>>2]|0,n|0){we=le+4|0,y=le+8|0,k=ie+4|0,T=ie+8|0,P=ie+8|0,q=le+8|0;do{if(d=n+4|0,_=I4(d)|0,_|0){if(s=b1(_)|0,t[le>>2]=0,t[we>>2]=0,t[y>>2]=0,o=(G1(_)|0)+1|0,$O(le,o),o|0)for(;o=o+-1|0,os(ie,t[s>>2]|0),l=t[we>>2]|0,l>>>0<(t[q>>2]|0)>>>0?(t[l>>2]=t[ie>>2],t[we>>2]=(t[we>>2]|0)+4):P4(le,ie),o;)s=s+4|0;o=V1(_)|0,t[ie>>2]=0,t[k>>2]=0,t[T>>2]=0;e:do if(t[o>>2]|0)for(s=0,l=0;;){if((s|0)==(l|0)?KO(ie,o):(t[s>>2]=t[o>>2],t[k>>2]=(t[k>>2]|0)+4),o=o+4|0,!(t[o>>2]|0))break e;s=t[k>>2]|0,l=t[P>>2]|0}while(0);t[Pe>>2]=nh(d)|0,t[ke>>2]=Dn(_)|0,XO(r,e,Pe,ke,le,ie),M4(ie),Rl(le)}n=t[n>>2]|0}while((n|0)!=0)}h=qe}function I4(e){return e=e|0,t[e+12>>2]|0}function b1(e){return e=e|0,t[e+12>>2]|0}function G1(e){return e=e|0,t[e+16>>2]|0}function $O(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=t[e>>2]|0,(t[e+8>>2]|0)-o>>2>>>0>>0&&(m8(r,n,(t[e+4>>2]|0)-o>>2,e+8|0),v8(e,r),g8(r)),h=s}function P4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=h8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,m8(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,v8(e,r),g8(r),h=d;return}}function V1(e){return e=e|0,t[e+8>>2]|0}function KO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=p8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,mI(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,vI(e,r),gI(r),h=d;return}}function nh(e){return e=e|0,t[e>>2]|0}function XO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JO(e,n,r,o,s,l)}function M4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function Rl(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function JO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+48|0,T=d+40|0,_=d+32|0,P=d+24|0,y=d+12|0,k=d,Zo(_),e=Oi(e)|0,t[P>>2]=t[n>>2],r=t[r>>2]|0,o=t[o>>2]|0,F4(y,s),QO(k,l),t[T>>2]=t[P>>2],ZO(e,T,r,o,y,k),M4(k),Rl(y),eu(_),h=d}function F4(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(pI(e,o),hI(e,t[n>>2]|0,t[r>>2]|0,o))}function QO(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(aI(e,o),dI(e,t[n>>2]|0,t[r>>2]|0,o))}function ZO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,T=d+28|0,P=d+24|0,_=d+12|0,y=d,k=ko(eI()|0)|0,t[P>>2]=t[n>>2],t[T>>2]=t[P>>2],n=lc(T)|0,r=l8(r)|0,o=L4(o)|0,t[_>>2]=t[s>>2],T=s+4|0,t[_+4>>2]=t[T>>2],P=s+8|0,t[_+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[s>>2]=0,s=R4(_)|0,t[y>>2]=t[l>>2],T=l+4|0,t[y+4>>2]=t[T>>2],P=l+8|0,t[y+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[l>>2]=0,qo(0,k|0,e|0,n|0,r|0,o|0,s|0,tI(y)|0)|0,M4(y),Rl(_),h=d}function eI(){var e=0;return c[7968]|0||(fI(10708),e=7968,t[e>>2]=1,t[e+4>>2]=0),10708}function lc(e){return e=e|0,c8(e)|0}function l8(e){return e=e|0,f8(e)|0}function L4(e){return e=e|0,ea(e)|0}function R4(e){return e=e|0,rI(e)|0}function tI(e){return e=e|0,nI(e)|0}function nI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=f8(t[(t[e>>2]|0)+(n<<2)>>2]|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function f8(e){return e=e|0,e|0}function rI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=c8((t[e>>2]|0)+(n<<2)|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function c8(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(a8()|0)|0,o?(s1(n,o),l1(r,n),UF(e,r),e=f1(n)|0):e=iI(e)|0,h=s,e|0}function a8(){var e=0;return c[7960]|0||(lI(10664),Bt(25,10664,Q|0)|0,e=7960,t[e>>2]=1,t[e+4>>2]=0),10664}function iI(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,t[_>>2]=t[e>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function d8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1656,t[r+12>>2]=n,t[e+4>>2]=r}function oI(e){e=e|0,da(e),Ve(e)}function uI(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function sI(e){e=e|0,Ve(e)}function lI(e){e=e|0,Ys(e)}function fI(e){e=e|0,Ao(e,cI()|0,5)}function cI(){return 1676}function aI(e,n){e=e|0,n=n|0;var r=0;if((p8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function dI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function p8(e){return e=e|0,1073741823}function pI(e,n){e=e|0,n=n|0;var r=0;if((h8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function hI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function h8(e){return e=e|0,1073741823}function mI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function vI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function gI(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function m8(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function v8(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function g8(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function _I(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(ie=h,h=h+32|0,T=ie+20|0,P=ie+12|0,k=ie+16|0,q=ie+4|0,we=ie,le=ie+8|0,_=o8()|0,l=t[_>>2]|0,d=t[l>>2]|0,d|0)for(y=t[_+8>>2]|0,_=t[_+4>>2]|0;os(T,d),yI(e,T,_,y),l=l+4|0,d=t[l>>2]|0,d;)y=y+1|0,_=_+1|0;if(l=u8()|0,d=t[l>>2]|0,d|0)do os(T,d),t[P>>2]=t[l+4>>2],wI(n,T,P),l=l+8|0,d=t[l>>2]|0;while((d|0)!=0);if(l=t[(sa()|0)>>2]|0,l|0)do n=t[l+4>>2]|0,os(T,t[(la(n)|0)>>2]|0),t[P>>2]=A4(n)|0,DI(r,T,P),l=t[l>>2]|0;while((l|0)!=0);if(os(k,0),l=O4()|0,t[T>>2]=t[k>>2],s8(T,l,s),l=t[(sa()|0)>>2]|0,l|0){e=T+4|0,n=T+8|0,r=T+8|0;do{if(y=t[l+4>>2]|0,os(P,t[(la(y)|0)>>2]|0),EI(q,_8(y)|0),d=t[q>>2]|0,d|0){t[T>>2]=0,t[e>>2]=0,t[n>>2]=0;do os(we,t[(la(t[d+4>>2]|0)|0)>>2]|0),_=t[e>>2]|0,_>>>0<(t[r>>2]|0)>>>0?(t[_>>2]=t[we>>2],t[e>>2]=(t[e>>2]|0)+4):P4(T,we),d=t[d>>2]|0;while((d|0)!=0);SI(o,P,T),Rl(T)}t[le>>2]=t[P>>2],k=y8(y)|0,t[T>>2]=t[le>>2],s8(T,k,s),bd(q),l=t[l>>2]|0}while((l|0)!=0)}h=ie}function yI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,RI(e,n,r,o)}function wI(e,n,r){e=e|0,n=n|0,r=r|0,LI(e,n,r)}function la(e){return e=e|0,e|0}function DI(e,n,r){e=e|0,n=n|0,r=r|0,II(e,n,r)}function _8(e){return e=e|0,e+16|0}function EI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(l=h,h=h+16|0,s=l+8|0,r=l,t[e>>2]=0,o=t[n>>2]|0,t[s>>2]=o,t[r>>2]=e,r=OI(r)|0,o|0){if(o=Tt(12)|0,d=(w8(s)|0)+4|0,e=t[d+4>>2]|0,n=o+4|0,t[n>>2]=t[d>>2],t[n+4>>2]=e,n=t[t[s>>2]>>2]|0,t[s>>2]=n,!n)e=o;else for(n=o;e=Tt(12)|0,y=(w8(s)|0)+4|0,_=t[y+4>>2]|0,d=e+4|0,t[d>>2]=t[y>>2],t[d+4>>2]=_,t[n>>2]=e,d=t[t[s>>2]>>2]|0,t[s>>2]=d,d;)n=e;t[e>>2]=t[r>>2],t[r>>2]=o}h=l}function SI(e,n,r){e=e|0,n=n|0,r=r|0,CI(e,n,r)}function y8(e){return e=e|0,e+24|0}function CI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+24|0,s=o+16|0,_=o+12|0,l=o,Zo(s),e=Oi(e)|0,t[_>>2]=t[n>>2],F4(l,r),t[d>>2]=t[_>>2],TI(e,d,l),Rl(l),eu(s),h=o}function TI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+16|0,_=o+12|0,s=o,l=ko(xI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,t[s>>2]=t[r>>2],d=r+4|0,t[s+4>>2]=t[d>>2],_=r+8|0,t[s+8>>2]=t[_>>2],t[_>>2]=0,t[d>>2]=0,t[r>>2]=0,Ts(0,l|0,e|0,n|0,R4(s)|0)|0,Rl(s),h=o}function xI(){var e=0;return c[7976]|0||(kI(10720),e=7976,t[e>>2]=1,t[e+4>>2]=0),10720}function kI(e){e=e|0,Ao(e,AI()|0,2)}function AI(){return 1732}function OI(e){return e=e|0,t[e>>2]|0}function w8(e){return e=e|0,t[e>>2]|0}function II(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function D8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+4|0,d=o,s=ko(PI()|0)|0,t[d>>2]=t[n>>2],t[l>>2]=t[d>>2],n=lc(l)|0,Ts(0,s|0,e|0,n|0,l8(r)|0)|0,h=o}function PI(){var e=0;return c[7984]|0||(MI(10732),e=7984,t[e>>2]=1,t[e+4>>2]=0),10732}function MI(e){e=e|0,Ao(e,FI()|0,2)}function FI(){return 1744}function LI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function RI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),e=Oi(e)|0,t[_>>2]=t[n>>2],r=c[r>>0]|0,o=c[o>>0]|0,t[d>>2]=t[_>>2],NI(e,d,r,o),eu(l),h=s}function NI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,d=s+4|0,_=s,l=ko(BI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,r=fa(r)|0,Bu(0,l|0,e|0,n|0,r|0,fa(o)|0)|0,h=s}function BI(){var e=0;return c[7992]|0||(UI(10744),e=7992,t[e>>2]=1,t[e+4>>2]=0),10744}function fa(e){return e=e|0,jI(e)|0}function jI(e){return e=e|0,e&255|0}function UI(e){e=e|0,Ao(e,qI()|0,3)}function qI(){return 1756}function zI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;switch(q=h,h=h+32|0,_=q+8|0,y=q+4|0,k=q+20|0,T=q,_1(e,0),o=jF(n)|0,t[_>>2]=0,P=_+4|0,t[P>>2]=0,t[_+8>>2]=0,o<<24>>24){case 0:{c[k>>0]=0,WI(y,r,k),rh(e,y)|0,ei(y);break}case 8:{P=z4(n)|0,c[k>>0]=8,os(T,t[P+4>>2]|0),HI(y,r,k,T,P+8|0),rh(e,y)|0,ei(y);break}case 9:{if(l=z4(n)|0,n=t[l+4>>2]|0,n|0)for(d=_+8|0,s=l+12|0;n=n+-1|0,os(y,t[s>>2]|0),o=t[P>>2]|0,o>>>0<(t[d>>2]|0)>>>0?(t[o>>2]=t[y>>2],t[P>>2]=(t[P>>2]|0)+4):P4(_,y),n;)s=s+4|0;c[k>>0]=9,os(T,t[l+8>>2]|0),bI(y,r,k,T,_),rh(e,y)|0,ei(y);break}default:P=z4(n)|0,c[k>>0]=o,os(T,t[P+4>>2]|0),GI(y,r,k,T),rh(e,y)|0,ei(y)}Rl(_),h=q}function WI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Zo(s),n=Oi(n)|0,iP(e,n,c[r>>0]|0),eu(s),h=o}function rh(e,n){e=e|0,n=n|0;var r=0;return r=t[e>>2]|0,r|0&&ju(r|0),t[e>>2]=t[n>>2],t[n>>2]=0,e|0}function HI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+32|0,_=l+16|0,d=l+8|0,y=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[y>>2]=t[o>>2],s=t[s>>2]|0,t[_>>2]=t[y>>2],eP(e,n,r,_,s),eu(d),h=l}function bI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+24|0,d=l+16|0,k=l+12|0,_=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[k>>2]=t[o>>2],F4(_,s),t[y>>2]=t[k>>2],XI(e,n,r,y,_),Rl(_),eu(d),h=l}function GI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),n=Oi(n)|0,r=c[r>>0]|0,t[_>>2]=t[o>>2],t[d>>2]=t[_>>2],VI(e,n,r,d),eu(l),h=s}function VI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+4|0,_=s,d=ko(YI()|0)|0,r=fa(r)|0,t[_>>2]=t[o>>2],t[l>>2]=t[_>>2],ih(e,Ts(0,d|0,n|0,r|0,lc(l)|0)|0),h=s}function YI(){var e=0;return c[8e3]|0||($I(10756),e=8e3,t[e>>2]=1,t[e+4>>2]=0),10756}function ih(e,n){e=e|0,n=n|0,_1(e,n)}function $I(e){e=e|0,Ao(e,KI()|0,2)}function KI(){return 1772}function XI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+16|0,k=l+12|0,d=l,_=ko(JI()|0)|0,r=fa(r)|0,t[k>>2]=t[o>>2],t[y>>2]=t[k>>2],o=lc(y)|0,t[d>>2]=t[s>>2],y=s+4|0,t[d+4>>2]=t[y>>2],k=s+8|0,t[d+8>>2]=t[k>>2],t[k>>2]=0,t[y>>2]=0,t[s>>2]=0,ih(e,Bu(0,_|0,n|0,r|0,o|0,R4(d)|0)|0),Rl(d),h=l}function JI(){var e=0;return c[8008]|0||(QI(10768),e=8008,t[e>>2]=1,t[e+4>>2]=0),10768}function QI(e){e=e|0,Ao(e,ZI()|0,3)}function ZI(){return 1784}function eP(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,_=l+4|0,y=l,d=ko(tP()|0)|0,r=fa(r)|0,t[y>>2]=t[o>>2],t[_>>2]=t[y>>2],o=lc(_)|0,ih(e,Bu(0,d|0,n|0,r|0,o|0,L4(s)|0)|0),h=l}function tP(){var e=0;return c[8016]|0||(nP(10780),e=8016,t[e>>2]=1,t[e+4>>2]=0),10780}function nP(e){e=e|0,Ao(e,rP()|0,3)}function rP(){return 1800}function iP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=ko(oP()|0)|0,ih(e,sf(0,o|0,n|0,fa(r)|0)|0)}function oP(){var e=0;return c[8024]|0||(uP(10792),e=8024,t[e>>2]=1,t[e+4>>2]=0),10792}function uP(e){e=e|0,Ao(e,sP()|0,1)}function sP(){return 1816}function lP(){fP(),cP(),aP()}function fP(){t[2702]=K8(65536)|0}function cP(){PP(10856)}function aP(){dP(10816)}function dP(e){e=e|0,pP(e,5044),hP(e)|0}function pP(e,n){e=e|0,n=n|0;var r=0;r=a8()|0,t[e>>2]=r,TP(r,n),Cf(t[e>>2]|0)}function hP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,mP()|0),e|0}function mP(){var e=0;return c[8032]|0||(E8(10820),Bt(64,10820,Q|0)|0,e=8032,t[e>>2]=1,t[e+4>>2]=0),Dn(10820)|0||E8(10820),10820}function E8(e){e=e|0,_P(e),sc(e,25)}function vP(e){e=e|0,gP(e+24|0)}function gP(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function _P(e){e=e|0;var n=0;n=An()|0,Nn(e,5,18,n,EP()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function yP(e,n){e=e|0,n=n|0,wP(e,n)}function wP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;r=h,h=h+16|0,o=r,s=r+4|0,Ml(s,n),t[o>>2]=Fl(s,n)|0,DP(e,o),h=r}function DP(e,n){e=e|0,n=n|0,S8(e+4|0,t[n>>2]|0),c[e+8>>0]=1}function S8(e,n){e=e|0,n=n|0,t[e>>2]=n}function EP(){return 1824}function SP(e){return e=e|0,CP(e)|0}function CP(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,Ml(s,e),S8(_,Fl(s,e)|0),l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function Qo(e){e=e|0;var n=0,r=0;return e=e+7&-8,(e>>>0<=32768?(n=t[2701]|0,e>>>0<=(65536-n|0)>>>0):0)?(r=(t[2702]|0)+n|0,t[2701]=n+e,e=r):(e=K8(e+8|0)|0,t[e>>2]=t[2703],t[2703]=e,e=e+8|0),e|0}function TP(e,n){e=e|0,n=n|0,t[e>>2]=xP()|0,t[e+4>>2]=kP()|0,t[e+12>>2]=n,t[e+8>>2]=AP()|0,t[e+32>>2]=9}function xP(){return 11744}function kP(){return 1832}function AP(){return th()|0}function OP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(IP(r),Ve(r)):n|0&&Ve(n)}function IP(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function PP(e){e=e|0,MP(e,5052),FP(e)|0,LP(e,5058,26)|0,RP(e,5069,1)|0,NP(e,5077,10)|0,BP(e,5087,19)|0,jP(e,5094,27)|0}function MP(e,n){e=e|0,n=n|0;var r=0;r=IF()|0,t[e>>2]=r,PF(r,n),Cf(t[e>>2]|0)}function FP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,vF()|0),e|0}function LP(e,n,r){return e=e|0,n=n|0,r=r|0,QM(e,Zn(n)|0,r,0),e|0}function RP(e,n,r){return e=e|0,n=n|0,r=r|0,BM(e,Zn(n)|0,r,0),e|0}function NP(e,n,r){return e=e|0,n=n|0,r=r|0,mM(e,Zn(n)|0,r,0),e|0}function BP(e,n,r){return e=e|0,n=n|0,r=r|0,eM(e,Zn(n)|0,r,0),e|0}function C8(e,n){e=e|0,n=n|0;var r=0,o=0;e:for(;;){for(r=t[2703]|0;;){if((r|0)==(n|0))break e;if(o=t[r>>2]|0,t[2703]=o,!r)r=o;else break}Ve(r)}t[2701]=e}function jP(e,n,r){return e=e|0,n=n|0,r=r|0,UP(e,Zn(n)|0,r,0),e|0}function UP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=N4()|0,e=qP(r)|0,ur(l,n,s,e,zP(r,o)|0,o)}function N4(){var e=0,n=0;if(c[8040]|0||(x8(10860),Bt(65,10860,Q|0)|0,n=8040,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10860)|0)){e=10860,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));x8(10860)}return 10860}function qP(e){return e=e|0,e|0}function zP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=N4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(T8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(WP(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function T8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function WP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=HP(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,bP(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,T8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,GP(e,s),VP(s),h=_;return}}function HP(e){return e=e|0,536870911}function bP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function GP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function VP(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function x8(e){e=e|0,KP(e)}function YP(e){e=e|0,$P(e+24|0)}function $P(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function KP(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,XP()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function XP(){return 1840}function JP(e,n,r){e=e|0,n=n|0,r=r|0,ZP(t[(QP(e)|0)>>2]|0,n,r)}function QP(e){return e=e|0,(t[(N4()|0)+24>>2]|0)+(e<<3)|0}function ZP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+1|0,s=o,Ml(l,n),n=Fl(l,n)|0,Ml(s,r),r=Fl(s,r)|0,Bl[e&31](n,r),h=o}function eM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=B4()|0,e=tM(r)|0,ur(l,n,s,e,nM(r,o)|0,o)}function B4(){var e=0,n=0;if(c[8048]|0||(A8(10896),Bt(66,10896,Q|0)|0,n=8048,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10896)|0)){e=10896,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A8(10896)}return 10896}function tM(e){return e=e|0,e|0}function nM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=B4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(k8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(rM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function rM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=iM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,oM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,k8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,uM(e,s),sM(s),h=_;return}}function iM(e){return e=e|0,536870911}function oM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function uM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function sM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function A8(e){e=e|0,cM(e)}function lM(e){e=e|0,fM(e+24|0)}function fM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function cM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,aM()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function aM(){return 1852}function dM(e,n){return e=e|0,n=n|0,hM(t[(pM(e)|0)>>2]|0,n)|0}function pM(e){return e=e|0,(t[(B4()|0)+24>>2]|0)+(e<<3)|0}function hM(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Ml(o,n),n=Fl(o,n)|0,n=ea(dc[e&31](n)|0)|0,h=r,n|0}function mM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=j4()|0,e=vM(r)|0,ur(l,n,s,e,gM(r,o)|0,o)}function j4(){var e=0,n=0;if(c[8056]|0||(I8(10932),Bt(67,10932,Q|0)|0,n=8056,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10932)|0)){e=10932,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));I8(10932)}return 10932}function vM(e){return e=e|0,e|0}function gM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=j4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(O8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(_M(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function O8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function _M(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=yM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,wM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,O8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,DM(e,s),EM(s),h=_;return}}function yM(e){return e=e|0,536870911}function wM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function DM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function EM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function I8(e){e=e|0,TM(e)}function SM(e){e=e|0,CM(e+24|0)}function CM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function TM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,7,n,xM()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function xM(){return 1860}function kM(e,n,r){return e=e|0,n=n|0,r=r|0,OM(t[(AM(e)|0)>>2]|0,n,r)|0}function AM(e){return e=e|0,(t[(j4()|0)+24>>2]|0)+(e<<3)|0}function OM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+32|0,d=o+12|0,l=o+8|0,_=o,y=o+16|0,s=o+4|0,IM(y,n),PM(_,y,n),$s(s,r),r=Ks(s,r)|0,t[d>>2]=t[_>>2],X1[e&15](l,d,r),r=MM(l)|0,ei(l),Xs(s),h=o,r|0}function IM(e,n){e=e|0,n=n|0}function PM(e,n,r){e=e|0,n=n|0,r=r|0,FM(e,r)}function MM(e){return e=e|0,Oi(e)|0}function FM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+16|0,r=s,o=n,o&1?(LM(r,0),c0(o|0,r|0)|0,RM(e,r),NM(r)):t[e>>2]=t[n>>2],h=s}function LM(e,n){e=e|0,n=n|0,wd(e,n),t[e+4>>2]=0,c[e+8>>0]=0}function RM(e,n){e=e|0,n=n|0,t[e>>2]=t[n+4>>2]}function NM(e){e=e|0,c[e+8>>0]=0}function BM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=U4()|0,e=jM(r)|0,ur(l,n,s,e,UM(r,o)|0,o)}function U4(){var e=0,n=0;if(c[8064]|0||(M8(10968),Bt(68,10968,Q|0)|0,n=8064,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10968)|0)){e=10968,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));M8(10968)}return 10968}function jM(e){return e=e|0,e|0}function UM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=U4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(P8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(qM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function P8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function qM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=zM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,WM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,P8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,HM(e,s),bM(s),h=_;return}}function zM(e){return e=e|0,536870911}function WM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function HM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function bM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function M8(e){e=e|0,YM(e)}function GM(e){e=e|0,VM(e+24|0)}function VM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function YM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,1,n,$M()|0,5),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function $M(){return 1872}function KM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JM(t[(XM(e)|0)>>2]|0,n,r,o,s,l)}function XM(e){return e=e|0,(t[(U4()|0)+24>>2]|0)+(e<<3)|0}function JM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,_=d+16|0,y=d+12|0,k=d+8|0,T=d+4|0,P=d,$s(_,n),n=Ks(_,n)|0,$s(y,r),r=Ks(y,r)|0,$s(k,o),o=Ks(k,o)|0,$s(T,s),s=Ks(T,s)|0,$s(P,l),l=Ks(P,l)|0,eD[e&1](n,r,o,s,l),Xs(P),Xs(T),Xs(k),Xs(y),Xs(_),h=d}function QM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=q4()|0,e=ZM(r)|0,ur(l,n,s,e,eF(r,o)|0,o)}function q4(){var e=0,n=0;if(c[8072]|0||(L8(11004),Bt(69,11004,Q|0)|0,n=8072,t[n>>2]=1,t[n+4>>2]=0),!(Dn(11004)|0)){e=11004,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));L8(11004)}return 11004}function ZM(e){return e=e|0,e|0}function eF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=q4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(F8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tF(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function F8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nF(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rF(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,F8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,iF(e,s),oF(s),h=_;return}}function nF(e){return e=e|0,536870911}function rF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function iF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function oF(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function L8(e){e=e|0,lF(e)}function uF(e){e=e|0,sF(e+24|0)}function sF(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lF(e){e=e|0;var n=0;n=An()|0,Nn(e,1,12,n,fF()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fF(){return 1896}function cF(e,n,r){e=e|0,n=n|0,r=r|0,dF(t[(aF(e)|0)>>2]|0,n,r)}function aF(e){return e=e|0,(t[(q4()|0)+24>>2]|0)+(e<<3)|0}function dF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+4|0,s=o,pF(l,n),n=hF(l,n)|0,$s(s,r),r=Ks(s,r)|0,Bl[e&31](n,r),Xs(s),h=o}function pF(e,n){e=e|0,n=n|0}function hF(e,n){return e=e|0,n=n|0,mF(n)|0}function mF(e){return e=e|0,e|0}function vF(){var e=0;return c[8080]|0||(R8(11040),Bt(70,11040,Q|0)|0,e=8080,t[e>>2]=1,t[e+4>>2]=0),Dn(11040)|0||R8(11040),11040}function R8(e){e=e|0,yF(e),sc(e,71)}function gF(e){e=e|0,_F(e+24|0)}function _F(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yF(e){e=e|0;var n=0;n=An()|0,Nn(e,5,7,n,SF()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wF(e){e=e|0,DF(e)}function DF(e){e=e|0,EF(e)}function EF(e){e=e|0,c[e+8>>0]=1}function SF(){return 1936}function CF(){return TF()|0}function TF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,l=e+4|0,t[l>>2]=Tt(1)|0,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],xF(o,l,s),t[r>>2]=o,h=n,e|0}function xF(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1916,t[r+12>>2]=n,t[e+4>>2]=r}function kF(e){e=e|0,da(e),Ve(e)}function AF(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function OF(e){e=e|0,Ve(e)}function IF(){var e=0;return c[8088]|0||(BF(11076),Bt(25,11076,Q|0)|0,e=8088,t[e>>2]=1,t[e+4>>2]=0),11076}function PF(e,n){e=e|0,n=n|0,t[e>>2]=MF()|0,t[e+4>>2]=FF()|0,t[e+12>>2]=n,t[e+8>>2]=LF()|0,t[e+32>>2]=10}function MF(){return 11745}function FF(){return 1940}function LF(){return eh()|0}function RF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(NF(r),Ve(r)):n|0&&Ve(n)}function NF(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function BF(e){e=e|0,Ys(e)}function os(e,n){e=e|0,n=n|0,t[e>>2]=n}function z4(e){return e=e|0,t[e>>2]|0}function jF(e){return e=e|0,c[t[e>>2]>>0]|0}function UF(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,t[o>>2]=t[e>>2],qF(n,o)|0,h=r}function qF(e,n){e=e|0,n=n|0;var r=0;return r=zF(t[e>>2]|0,n)|0,n=e+4|0,t[(t[n>>2]|0)+8>>2]=r,t[(t[n>>2]|0)+8>>2]|0}function zF(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Zo(o),e=Oi(e)|0,n=WF(e,t[n>>2]|0)|0,eu(o),h=r,n|0}function Zo(e){e=e|0,t[e>>2]=t[2701],t[e+4>>2]=t[2703]}function WF(e,n){e=e|0,n=n|0;var r=0;return r=ko(HF()|0)|0,sf(0,r|0,e|0,L4(n)|0)|0}function eu(e){e=e|0,C8(t[e>>2]|0,t[e+4>>2]|0)}function HF(){var e=0;return c[8096]|0||(bF(11120),e=8096,t[e>>2]=1,t[e+4>>2]=0),11120}function bF(e){e=e|0,Ao(e,GF()|0,1)}function GF(){return 1948}function VF(){YF()}function YF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(le=h,h=h+16|0,T=le+4|0,P=le,si(65536,10804,t[2702]|0,10812),r=o8()|0,n=t[r>>2]|0,e=t[n>>2]|0,e|0)for(o=t[r+8>>2]|0,r=t[r+4>>2]|0;As(e|0,C[r>>0]|0|0,c[o>>0]|0),n=n+4|0,e=t[n>>2]|0,e;)o=o+1|0,r=r+1|0;if(e=u8()|0,n=t[e>>2]|0,n|0)do uu(n|0,t[e+4>>2]|0),e=e+8|0,n=t[e>>2]|0;while((n|0)!=0);uu($F()|0,5167),k=sa()|0,e=t[k>>2]|0;e:do if(e|0){do KF(t[e+4>>2]|0),e=t[e>>2]|0;while((e|0)!=0);if(e=t[k>>2]|0,e|0){y=k;do{for(;s=e,e=t[e>>2]|0,s=t[s+4>>2]|0,!!(XF(s)|0);)if(t[P>>2]=y,t[T>>2]=t[P>>2],JF(k,T)|0,!e)break e;if(QF(s),y=t[y>>2]|0,n=N8(s)|0,l=Wo()|0,d=h,h=h+((1*(n<<2)|0)+15&-16)|0,_=h,h=h+((1*(n<<2)|0)+15&-16)|0,n=t[(_8(s)|0)>>2]|0,n|0)for(r=d,o=_;t[r>>2]=t[(la(t[n+4>>2]|0)|0)>>2],t[o>>2]=t[n+8>>2],n=t[n>>2]|0,n;)r=r+4|0,o=o+4|0;ie=la(s)|0,n=ZF(s)|0,r=N8(s)|0,o=eL(s)|0,Is(ie|0,n|0,d|0,_|0,r|0,o|0,A4(s)|0),b0(l|0)}while((e|0)!=0)}}while(0);if(e=t[(O4()|0)>>2]|0,e|0)do ie=e+4|0,k=I4(ie)|0,s=V1(k)|0,l=b1(k)|0,d=(G1(k)|0)+1|0,_=oh(k)|0,y=B8(ie)|0,k=Dn(k)|0,T=nh(ie)|0,P=W4(ie)|0,zo(0,s|0,l|0,d|0,_|0,y|0,k|0,T|0,P|0,H4(ie)|0),e=t[e>>2]|0;while((e|0)!=0);e=t[(sa()|0)>>2]|0;e:do if(e|0){t:for(;;){if(n=t[e+4>>2]|0,n|0?(q=t[(la(n)|0)>>2]|0,we=t[(y8(n)|0)>>2]|0,we|0):0){r=we;do{n=r+4|0,o=I4(n)|0;n:do if(o|0)switch(Dn(o)|0){case 0:break t;case 4:case 3:case 2:{_=V1(o)|0,y=b1(o)|0,k=(G1(o)|0)+1|0,T=oh(o)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,_|0,y|0,k|0,T|0,0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 1:{d=V1(o)|0,_=b1(o)|0,y=(G1(o)|0)+1|0,k=oh(o)|0,T=B8(n)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,d|0,_|0,y|0,k|0,T|0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 5:{k=V1(o)|0,T=b1(o)|0,P=(G1(o)|0)+1|0,ie=oh(o)|0,zo(q|0,k|0,T|0,P|0,ie|0,tL(o)|0,Dn(o)|0,0,0,0);break n}default:break n}while(0);r=t[r>>2]|0}while((r|0)!=0)}if(e=t[e>>2]|0,!e)break e}_n()}while(0);uf(),h=le}function $F(){return 11703}function KF(e){e=e|0,c[e+40>>0]=0}function XF(e){return e=e|0,(c[e+40>>0]|0)!=0|0}function JF(e,n){return e=e|0,n=n|0,n=nL(n)|0,e=t[n>>2]|0,t[n>>2]=t[e>>2],Ve(e),t[n>>2]|0}function QF(e){e=e|0,c[e+40>>0]=1}function N8(e){return e=e|0,t[e+20>>2]|0}function ZF(e){return e=e|0,t[e+8>>2]|0}function eL(e){return e=e|0,t[e+32>>2]|0}function oh(e){return e=e|0,t[e+4>>2]|0}function B8(e){return e=e|0,t[e+4>>2]|0}function W4(e){return e=e|0,t[e+8>>2]|0}function H4(e){return e=e|0,t[e+16>>2]|0}function tL(e){return e=e|0,t[e+20>>2]|0}function nL(e){return e=e|0,t[e>>2]|0}function uh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0;vt=h,h=h+16|0,q=vt;do if(e>>>0<245){if(k=e>>>0<11?16:e+11&-8,e=k>>>3,P=t[2783]|0,r=P>>>e,r&3|0)return n=(r&1^1)+e|0,e=11172+(n<<1<<2)|0,r=e+8|0,o=t[r>>2]|0,s=o+8|0,l=t[s>>2]|0,(e|0)==(l|0)?t[2783]=P&~(1<>2]=e,t[r>>2]=l),_e=n<<3,t[o+4>>2]=_e|3,_e=o+_e+4|0,t[_e>>2]=t[_e>>2]|1,_e=s,h=vt,_e|0;if(T=t[2785]|0,k>>>0>T>>>0){if(r|0)return n=2<>>12&16,n=n>>>d,r=n>>>5&8,n=n>>>r,s=n>>>2&4,n=n>>>s,e=n>>>1&2,n=n>>>e,o=n>>>1&1,o=(r|d|s|e|o)+(n>>>o)|0,n=11172+(o<<1<<2)|0,e=n+8|0,s=t[e>>2]|0,d=s+8|0,r=t[d>>2]|0,(n|0)==(r|0)?(e=P&~(1<>2]=n,t[e>>2]=r,e=P),l=(o<<3)-k|0,t[s+4>>2]=k|3,o=s+k|0,t[o+4>>2]=l|1,t[o+l>>2]=l,T|0&&(s=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=s,t[n+12>>2]=s,t[s+8>>2]=n,t[s+12>>2]=r),t[2785]=l,t[2788]=o,_e=d,h=vt,_e|0;if(_=t[2784]|0,_){if(r=(_&0-_)+-1|0,d=r>>>12&16,r=r>>>d,l=r>>>5&8,r=r>>>l,y=r>>>2&4,r=r>>>y,o=r>>>1&2,r=r>>>o,e=r>>>1&1,e=t[11436+((l|d|y|o|e)+(r>>>e)<<2)>>2]|0,r=(t[e+4>>2]&-8)-k|0,o=t[e+16+(((t[e+16>>2]|0)==0&1)<<2)>>2]|0,!o)y=e,l=r;else{do d=(t[o+4>>2]&-8)-k|0,y=d>>>0>>0,r=y?d:r,e=y?o:e,o=t[o+16+(((t[o+16>>2]|0)==0&1)<<2)>>2]|0;while((o|0)!=0);y=e,l=r}if(d=y+k|0,y>>>0>>0){s=t[y+24>>2]|0,n=t[y+12>>2]|0;do if((n|0)==(y|0)){if(e=y+20|0,n=t[e>>2]|0,!n&&(e=y+16|0,n=t[e>>2]|0,!n)){r=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0,r=n}else r=t[y+8>>2]|0,t[r+12>>2]=n,t[n+8>>2]=r,r=n;while(0);do if(s|0){if(n=t[y+28>>2]|0,e=11436+(n<<2)|0,(y|0)==(t[e>>2]|0)){if(t[e>>2]=r,!r){t[2784]=_&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=s,n=t[y+16>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),n=t[y+20>>2]|0,n|0&&(t[r+20>>2]=n,t[n+24>>2]=r)}while(0);return l>>>0<16?(_e=l+k|0,t[y+4>>2]=_e|3,_e=y+_e+4|0,t[_e>>2]=t[_e>>2]|1):(t[y+4>>2]=k|3,t[d+4>>2]=l|1,t[d+l>>2]=l,T|0&&(o=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=P|n,n=r,e=r+8|0),t[e>>2]=o,t[n+12>>2]=o,t[o+8>>2]=n,t[o+12>>2]=r),t[2785]=l,t[2788]=d),_e=y+8|0,h=vt,_e|0}else P=k}else P=k}else P=k}else if(e>>>0<=4294967231)if(e=e+11|0,k=e&-8,y=t[2784]|0,y){o=0-k|0,e=e>>>8,e?k>>>0>16777215?_=31:(P=(e+1048320|0)>>>16&8,pe=e<>>16&4,pe=pe<>>16&2,_=14-(T|P|_)+(pe<<_>>>15)|0,_=k>>>(_+7|0)&1|_<<1):_=0,r=t[11436+(_<<2)>>2]|0;e:do if(!r)r=0,e=0,pe=57;else for(e=0,d=k<<((_|0)==31?0:25-(_>>>1)|0),l=0;;){if(s=(t[r+4>>2]&-8)-k|0,s>>>0>>0)if(s)e=r,o=s;else{e=r,o=0,s=r,pe=61;break e}if(s=t[r+20>>2]|0,r=t[r+16+(d>>>31<<2)>>2]|0,l=(s|0)==0|(s|0)==(r|0)?l:s,s=(r|0)==0,s){r=l,pe=57;break}else d=d<<((s^1)&1)}while(0);if((pe|0)==57){if((r|0)==0&(e|0)==0){if(e=2<<_,e=y&(e|0-e),!e){P=k;break}P=(e&0-e)+-1|0,d=P>>>12&16,P=P>>>d,l=P>>>5&8,P=P>>>l,_=P>>>2&4,P=P>>>_,T=P>>>1&2,P=P>>>T,r=P>>>1&1,e=0,r=t[11436+((l|d|_|T|r)+(P>>>r)<<2)>>2]|0}r?(s=r,pe=61):(_=e,d=o)}if((pe|0)==61)for(;;)if(pe=0,r=(t[s+4>>2]&-8)-k|0,P=r>>>0>>0,r=P?r:o,e=P?s:e,s=t[s+16+(((t[s+16>>2]|0)==0&1)<<2)>>2]|0,s)o=r,pe=61;else{_=e,d=r;break}if((_|0)!=0?d>>>0<((t[2785]|0)-k|0)>>>0:0){if(l=_+k|0,_>>>0>=l>>>0)return _e=0,h=vt,_e|0;s=t[_+24>>2]|0,n=t[_+12>>2]|0;do if((n|0)==(_|0)){if(e=_+20|0,n=t[e>>2]|0,!n&&(e=_+16|0,n=t[e>>2]|0,!n)){n=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0}else _e=t[_+8>>2]|0,t[_e+12>>2]=n,t[n+8>>2]=_e;while(0);do if(s){if(e=t[_+28>>2]|0,r=11436+(e<<2)|0,(_|0)==(t[r>>2]|0)){if(t[r>>2]=n,!n){o=y&~(1<>2]|0)!=(_|0)&1)<<2)>>2]=n,!n){o=y;break}t[n+24>>2]=s,e=t[_+16>>2]|0,e|0&&(t[n+16>>2]=e,t[e+24>>2]=n),e=t[_+20>>2]|0,e&&(t[n+20>>2]=e,t[e+24>>2]=n),o=y}else o=y;while(0);do if(d>>>0>=16){if(t[_+4>>2]=k|3,t[l+4>>2]=d|1,t[l+d>>2]=d,n=d>>>3,d>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=l,t[n+12>>2]=l,t[l+8>>2]=n,t[l+12>>2]=r;break}if(n=d>>>8,n?d>>>0>16777215?n=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=d>>>(n+7|0)&1|n<<1):n=0,r=11436+(n<<2)|0,t[l+28>>2]=n,e=l+16|0,t[e+4>>2]=0,t[e>>2]=0,e=1<>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}for(e=d<<((n|0)==31?0:25-(n>>>1)|0),r=t[r>>2]|0;;){if((t[r+4>>2]&-8|0)==(d|0)){pe=97;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=96;break}}if((pe|0)==96){t[o>>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}else if((pe|0)==97){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=l,t[pe>>2]=l,t[l+8>>2]=_e,t[l+12>>2]=r,t[l+24>>2]=0;break}}else _e=d+k|0,t[_+4>>2]=_e|3,_e=_+_e+4|0,t[_e>>2]=t[_e>>2]|1;while(0);return _e=_+8|0,h=vt,_e|0}else P=k}else P=k;else P=-1;while(0);if(r=t[2785]|0,r>>>0>=P>>>0)return n=r-P|0,e=t[2788]|0,n>>>0>15?(_e=e+P|0,t[2788]=_e,t[2785]=n,t[_e+4>>2]=n|1,t[_e+n>>2]=n,t[e+4>>2]=P|3):(t[2785]=0,t[2788]=0,t[e+4>>2]=r|3,_e=e+r+4|0,t[_e>>2]=t[_e>>2]|1),_e=e+8|0,h=vt,_e|0;if(d=t[2786]|0,d>>>0>P>>>0)return qe=d-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0;if(t[2901]|0?e=t[2903]|0:(t[2903]=4096,t[2902]=4096,t[2904]=-1,t[2905]=-1,t[2906]=0,t[2894]=0,e=q&-16^1431655768,t[q>>2]=e,t[2901]=e,e=4096),_=P+48|0,y=P+47|0,l=e+y|0,s=0-e|0,k=l&s,k>>>0<=P>>>0||(e=t[2893]|0,e|0?(T=t[2891]|0,q=T+k|0,q>>>0<=T>>>0|q>>>0>e>>>0):0))return _e=0,h=vt,_e|0;e:do if(t[2894]&4)n=0,pe=133;else{r=t[2789]|0;t:do if(r){for(o=11580;e=t[o>>2]|0,!(e>>>0<=r>>>0?(ie=o+4|0,(e+(t[ie>>2]|0)|0)>>>0>r>>>0):0);)if(e=t[o+8>>2]|0,e)o=e;else{pe=118;break t}if(n=l-d&s,n>>>0<2147483647)if(e=xf(n|0)|0,(e|0)==((t[o>>2]|0)+(t[ie>>2]|0)|0)){if((e|0)!=(-1|0)){d=n,l=e,pe=135;break e}}else o=e,pe=126;else n=0}else pe=118;while(0);do if((pe|0)==118)if(r=xf(0)|0,(r|0)!=(-1|0)?(n=r,we=t[2902]|0,le=we+-1|0,n=((le&n|0)==0?0:(le+n&0-we)-n|0)+k|0,we=t[2891]|0,le=n+we|0,n>>>0>P>>>0&n>>>0<2147483647):0){if(ie=t[2893]|0,ie|0?le>>>0<=we>>>0|le>>>0>ie>>>0:0){n=0;break}if(e=xf(n|0)|0,(e|0)==(r|0)){d=n,l=r,pe=135;break e}else o=e,pe=126}else n=0;while(0);do if((pe|0)==126){if(r=0-n|0,!(_>>>0>n>>>0&(n>>>0<2147483647&(o|0)!=(-1|0))))if((o|0)==(-1|0)){n=0;break}else{d=n,l=o,pe=135;break e}if(e=t[2903]|0,e=y-n+e&0-e,e>>>0>=2147483647){d=n,l=o,pe=135;break e}if((xf(e|0)|0)==(-1|0)){xf(r|0)|0,n=0;break}else{d=e+n|0,l=o,pe=135;break e}}while(0);t[2894]=t[2894]|4,pe=133}while(0);if((((pe|0)==133?k>>>0<2147483647:0)?(qe=xf(k|0)|0,ie=xf(0)|0,Pe=ie-qe|0,ke=Pe>>>0>(P+40|0)>>>0,!((qe|0)==(-1|0)|ke^1|qe>>>0>>0&((qe|0)!=(-1|0)&(ie|0)!=(-1|0))^1)):0)&&(d=ke?Pe:n,l=qe,pe=135),(pe|0)==135){n=(t[2891]|0)+d|0,t[2891]=n,n>>>0>(t[2892]|0)>>>0&&(t[2892]=n),y=t[2789]|0;do if(y){for(n=11580;;){if(e=t[n>>2]|0,r=n+4|0,o=t[r>>2]|0,(l|0)==(e+o|0)){pe=145;break}if(s=t[n+8>>2]|0,s)n=s;else break}if(((pe|0)==145?(t[n+12>>2]&8|0)==0:0)?y>>>0>>0&y>>>0>=e>>>0:0){t[r>>2]=o+d,_e=y+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=y+_e|0,_e=(t[2786]|0)+(d-_e)|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905];break}for(l>>>0<(t[2787]|0)>>>0&&(t[2787]=l),r=l+d|0,n=11580;;){if((t[n>>2]|0)==(r|0)){pe=153;break}if(e=t[n+8>>2]|0,e)n=e;else break}if((pe|0)==153?(t[n+12>>2]&8|0)==0:0){t[n>>2]=l,T=n+4|0,t[T>>2]=(t[T>>2]|0)+d,T=l+8|0,T=l+((T&7|0)==0?0:0-T&7)|0,n=r+8|0,n=r+((n&7|0)==0?0:0-n&7)|0,k=T+P|0,_=n-T-P|0,t[T+4>>2]=P|3;do if((n|0)!=(y|0)){if((n|0)==(t[2788]|0)){_e=(t[2785]|0)+_|0,t[2785]=_e,t[2788]=k,t[k+4>>2]=_e|1,t[k+_e>>2]=_e;break}if(e=t[n+4>>2]|0,(e&3|0)==1){d=e&-8,o=e>>>3;e:do if(e>>>0<256)if(e=t[n+8>>2]|0,r=t[n+12>>2]|0,(r|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=r,t[r+8>>2]=e;break}else{l=t[n+24>>2]|0,e=t[n+12>>2]|0;do if((e|0)==(n|0)){if(o=n+16|0,r=o+4|0,e=t[r>>2]|0,!e)if(e=t[o>>2]|0,e)r=o;else{e=0;break}for(;;){if(o=e+20|0,s=t[o>>2]|0,s|0){e=s,r=o;continue}if(o=e+16|0,s=t[o>>2]|0,s)e=s,r=o;else break}t[r>>2]=0}else _e=t[n+8>>2]|0,t[_e+12>>2]=e,t[e+8>>2]=_e;while(0);if(!l)break;r=t[n+28>>2]|0,o=11436+(r<<2)|0;do if((n|0)!=(t[o>>2]|0)){if(t[l+16+(((t[l+16>>2]|0)!=(n|0)&1)<<2)>>2]=e,!e)break e}else{if(t[o>>2]=e,e|0)break;t[2784]=t[2784]&~(1<>2]=l,r=n+16|0,o=t[r>>2]|0,o|0&&(t[e+16>>2]=o,t[o+24>>2]=e),r=t[r+4>>2]|0,!r)break;t[e+20>>2]=r,t[r+24>>2]=e}while(0);n=n+d|0,s=d+_|0}else s=_;if(n=n+4|0,t[n>>2]=t[n>>2]&-2,t[k+4>>2]=s|1,t[k+s>>2]=s,n=s>>>3,s>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=k,t[n+12>>2]=k,t[k+8>>2]=n,t[k+12>>2]=r;break}n=s>>>8;do if(!n)n=0;else{if(s>>>0>16777215){n=31;break}pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=s>>>(n+7|0)&1|n<<1}while(0);if(o=11436+(n<<2)|0,t[k+28>>2]=n,e=k+16|0,t[e+4>>2]=0,t[e>>2]=0,e=t[2784]|0,r=1<>2]=k,t[k+24>>2]=o,t[k+12>>2]=k,t[k+8>>2]=k;break}for(e=s<<((n|0)==31?0:25-(n>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){pe=194;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=193;break}}if((pe|0)==193){t[o>>2]=k,t[k+24>>2]=r,t[k+12>>2]=k,t[k+8>>2]=k;break}else if((pe|0)==194){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=k,t[pe>>2]=k,t[k+8>>2]=_e,t[k+12>>2]=r,t[k+24>>2]=0;break}}else _e=(t[2786]|0)+_|0,t[2786]=_e,t[2789]=k,t[k+4>>2]=_e|1;while(0);return _e=T+8|0,h=vt,_e|0}for(n=11580;e=t[n>>2]|0,!(e>>>0<=y>>>0?(_e=e+(t[n+4>>2]|0)|0,_e>>>0>y>>>0):0);)n=t[n+8>>2]|0;s=_e+-47|0,e=s+8|0,e=s+((e&7|0)==0?0:0-e&7)|0,s=y+16|0,e=e>>>0>>0?y:e,n=e+8|0,r=l+8|0,r=(r&7|0)==0?0:0-r&7,pe=l+r|0,r=d+-40-r|0,t[2789]=pe,t[2786]=r,t[pe+4>>2]=r|1,t[pe+r+4>>2]=40,t[2790]=t[2905],r=e+4|0,t[r>>2]=27,t[n>>2]=t[2895],t[n+4>>2]=t[2896],t[n+8>>2]=t[2897],t[n+12>>2]=t[2898],t[2895]=l,t[2896]=d,t[2898]=0,t[2897]=n,n=e+24|0;do pe=n,n=n+4|0,t[n>>2]=7;while((pe+8|0)>>>0<_e>>>0);if((e|0)!=(y|0)){if(l=e-y|0,t[r>>2]=t[r>>2]&-2,t[y+4>>2]=l|1,t[e>>2]=l,n=l>>>3,l>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=y,t[n+12>>2]=y,t[y+8>>2]=n,t[y+12>>2]=r;break}if(n=l>>>8,n?l>>>0>16777215?r=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,r=14-(qe|pe|r)+(_e<>>15)|0,r=l>>>(r+7|0)&1|r<<1):r=0,o=11436+(r<<2)|0,t[y+28>>2]=r,t[y+20>>2]=0,t[s>>2]=0,n=t[2784]|0,e=1<>2]=y,t[y+24>>2]=o,t[y+12>>2]=y,t[y+8>>2]=y;break}for(e=l<<((r|0)==31?0:25-(r>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(l|0)){pe=216;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=215;break}}if((pe|0)==215){t[o>>2]=y,t[y+24>>2]=r,t[y+12>>2]=y,t[y+8>>2]=y;break}else if((pe|0)==216){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=y,t[pe>>2]=y,t[y+8>>2]=_e,t[y+12>>2]=r,t[y+24>>2]=0;break}}}else{_e=t[2787]|0,(_e|0)==0|l>>>0<_e>>>0&&(t[2787]=l),t[2895]=l,t[2896]=d,t[2898]=0,t[2792]=t[2901],t[2791]=-1,n=0;do _e=11172+(n<<1<<2)|0,t[_e+12>>2]=_e,t[_e+8>>2]=_e,n=n+1|0;while((n|0)!=32);_e=l+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=l+_e|0,_e=d+-40-_e|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905]}while(0);if(n=t[2786]|0,n>>>0>P>>>0)return qe=n-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0}return t[(ca()|0)>>2]=12,_e=0,h=vt,_e|0}function sh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(!!e){r=e+-8|0,s=t[2787]|0,e=t[e+-4>>2]|0,n=e&-8,y=r+n|0;do if(e&1)_=r,d=r;else{if(o=t[r>>2]|0,!(e&3)||(d=r+(0-o)|0,l=o+n|0,d>>>0>>0))return;if((d|0)==(t[2788]|0)){if(e=y+4|0,n=t[e>>2]|0,(n&3|0)!=3){_=d,n=l;break}t[2785]=l,t[e>>2]=n&-2,t[d+4>>2]=l|1,t[d+l>>2]=l;return}if(r=o>>>3,o>>>0<256)if(e=t[d+8>>2]|0,n=t[d+12>>2]|0,(n|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=n,t[n+8>>2]=e,_=d,n=l;break}s=t[d+24>>2]|0,e=t[d+12>>2]|0;do if((e|0)==(d|0)){if(r=d+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{e=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0}else _=t[d+8>>2]|0,t[_+12>>2]=e,t[e+8>>2]=_;while(0);if(s){if(n=t[d+28>>2]|0,r=11436+(n<<2)|0,(d|0)==(t[r>>2]|0)){if(t[r>>2]=e,!e){t[2784]=t[2784]&~(1<>2]|0)!=(d|0)&1)<<2)>>2]=e,!e){_=d,n=l;break}t[e+24>>2]=s,n=d+16|0,r=t[n>>2]|0,r|0&&(t[e+16>>2]=r,t[r+24>>2]=e),n=t[n+4>>2]|0,n?(t[e+20>>2]=n,t[n+24>>2]=e,_=d,n=l):(_=d,n=l)}else _=d,n=l}while(0);if(!(d>>>0>=y>>>0)&&(e=y+4|0,o=t[e>>2]|0,!!(o&1))){if(o&2)t[e>>2]=o&-2,t[_+4>>2]=n|1,t[d+n>>2]=n,s=n;else{if(e=t[2788]|0,(y|0)==(t[2789]|0)){if(y=(t[2786]|0)+n|0,t[2786]=y,t[2789]=_,t[_+4>>2]=y|1,(_|0)!=(e|0))return;t[2788]=0,t[2785]=0;return}if((y|0)==(e|0)){y=(t[2785]|0)+n|0,t[2785]=y,t[2788]=d,t[_+4>>2]=y|1,t[d+y>>2]=y;return}s=(o&-8)+n|0,r=o>>>3;do if(o>>>0<256)if(n=t[y+8>>2]|0,e=t[y+12>>2]|0,(e|0)==(n|0)){t[2783]=t[2783]&~(1<>2]=e,t[e+8>>2]=n;break}else{l=t[y+24>>2]|0,e=t[y+12>>2]|0;do if((e|0)==(y|0)){if(r=y+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{r=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0,r=e}else r=t[y+8>>2]|0,t[r+12>>2]=e,t[e+8>>2]=r,r=e;while(0);if(l|0){if(e=t[y+28>>2]|0,n=11436+(e<<2)|0,(y|0)==(t[n>>2]|0)){if(t[n>>2]=r,!r){t[2784]=t[2784]&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=l,e=y+16|0,n=t[e>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),e=t[e+4>>2]|0,e|0&&(t[r+20>>2]=e,t[e+24>>2]=r)}}while(0);if(t[_+4>>2]=s|1,t[d+s>>2]=s,(_|0)==(t[2788]|0)){t[2785]=s;return}}if(e=s>>>3,s>>>0<256){r=11172+(e<<1<<2)|0,n=t[2783]|0,e=1<>2]|0):(t[2783]=n|e,e=r,n=r+8|0),t[n>>2]=_,t[e+12>>2]=_,t[_+8>>2]=e,t[_+12>>2]=r;return}e=s>>>8,e?s>>>0>16777215?e=31:(d=(e+1048320|0)>>>16&8,y=e<>>16&4,y=y<>>16&2,e=14-(l|d|e)+(y<>>15)|0,e=s>>>(e+7|0)&1|e<<1):e=0,o=11436+(e<<2)|0,t[_+28>>2]=e,t[_+20>>2]=0,t[_+16>>2]=0,n=t[2784]|0,r=1<>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){e=73;break}if(o=r+16+(n>>>31<<2)|0,e=t[o>>2]|0,e)n=n<<1,r=e;else{e=72;break}}if((e|0)==72){t[o>>2]=_,t[_+24>>2]=r,t[_+12>>2]=_,t[_+8>>2]=_;break}else if((e|0)==73){d=r+8|0,y=t[d>>2]|0,t[y+12>>2]=_,t[d>>2]=_,t[_+8>>2]=y,t[_+12>>2]=r,t[_+24>>2]=0;break}}else t[2784]=n|r,t[o>>2]=_,t[_+24>>2]=o,t[_+12>>2]=_,t[_+8>>2]=_;while(0);if(y=(t[2791]|0)+-1|0,t[2791]=y,!y)e=11588;else return;for(;e=t[e>>2]|0,e;)e=e+8|0;t[2791]=-1}}}function rL(){return 11628}function iL(e){e=e|0;var n=0,r=0;return n=h,h=h+16|0,r=n,t[r>>2]=sL(t[e+60>>2]|0)|0,e=lh(Ms(6,r|0)|0)|0,h=n,e|0}function j8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0;P=h,h=h+48|0,k=P+16|0,l=P,s=P+32|0,_=e+28|0,o=t[_>>2]|0,t[s>>2]=o,y=e+20|0,o=(t[y>>2]|0)-o|0,t[s+4>>2]=o,t[s+8>>2]=n,t[s+12>>2]=r,o=o+r|0,d=e+60|0,t[l>>2]=t[d>>2],t[l+4>>2]=s,t[l+8>>2]=2,l=lh(G0(146,l|0)|0)|0;e:do if((o|0)!=(l|0)){for(n=2;!((l|0)<0);)if(o=o-l|0,we=t[s+4>>2]|0,q=l>>>0>we>>>0,s=q?s+8|0:s,n=(q<<31>>31)+n|0,we=l-(q?we:0)|0,t[s>>2]=(t[s>>2]|0)+we,q=s+4|0,t[q>>2]=(t[q>>2]|0)-we,t[k>>2]=t[d>>2],t[k+4>>2]=s,t[k+8>>2]=n,l=lh(G0(146,k|0)|0)|0,(o|0)==(l|0)){T=3;break e}t[e+16>>2]=0,t[_>>2]=0,t[y>>2]=0,t[e>>2]=t[e>>2]|32,(n|0)==2?r=0:r=r-(t[s+4>>2]|0)|0}else T=3;while(0);return(T|0)==3&&(we=t[e+44>>2]|0,t[e+16>>2]=we+(t[e+48>>2]|0),t[_>>2]=we,t[y>>2]=we),h=P,r|0}function oL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return s=h,h=h+32|0,l=s,o=s+20|0,t[l>>2]=t[e+60>>2],t[l+4>>2]=0,t[l+8>>2]=n,t[l+12>>2]=o,t[l+16>>2]=r,(lh(Uu(140,l|0)|0)|0)<0?(t[o>>2]=-1,e=-1):e=t[o>>2]|0,h=s,e|0}function lh(e){return e=e|0,e>>>0>4294963200&&(t[(ca()|0)>>2]=0-e,e=-1),e|0}function ca(){return(uL()|0)+64|0}function uL(){return b4()|0}function b4(){return 2084}function sL(e){return e=e|0,e|0}function lL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;return s=h,h=h+32|0,o=s,t[e+36>>2]=1,((t[e>>2]&64|0)==0?(t[o>>2]=t[e+60>>2],t[o+4>>2]=21523,t[o+8>>2]=s+16,su(54,o|0)|0):0)&&(c[e+75>>0]=-1),o=j8(e,n,r)|0,h=s,o|0}function U8(e,n){e=e|0,n=n|0;var r=0,o=0;if(r=c[e>>0]|0,o=c[n>>0]|0,r<<24>>24==0?1:r<<24>>24!=o<<24>>24)e=o;else{do e=e+1|0,n=n+1|0,r=c[e>>0]|0,o=c[n>>0]|0;while(!(r<<24>>24==0?1:r<<24>>24!=o<<24>>24));e=o}return(r&255)-(e&255)|0}function fL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;e:do if(!r)e=0;else{for(;o=c[e>>0]|0,s=c[n>>0]|0,o<<24>>24==s<<24>>24;)if(r=r+-1|0,r)e=e+1|0,n=n+1|0;else{e=0;break e}e=(o&255)-(s&255)|0}while(0);return e|0}function q8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;ie=h,h=h+224|0,T=ie+120|0,P=ie+80|0,we=ie,le=ie+136|0,o=P,s=o+40|0;do t[o>>2]=0,o=o+4|0;while((o|0)<(s|0));return t[T>>2]=t[r>>2],(G4(0,n,T,we,P)|0)<0?r=-1:((t[e+76>>2]|0)>-1?q=cL(e)|0:q=0,r=t[e>>2]|0,k=r&32,(c[e+74>>0]|0)<1&&(t[e>>2]=r&-33),o=e+48|0,t[o>>2]|0?r=G4(e,n,T,we,P)|0:(s=e+44|0,l=t[s>>2]|0,t[s>>2]=le,d=e+28|0,t[d>>2]=le,_=e+20|0,t[_>>2]=le,t[o>>2]=80,y=e+16|0,t[y>>2]=le+80,r=G4(e,n,T,we,P)|0,l&&(dh[t[e+36>>2]&7](e,0,0)|0,r=(t[_>>2]|0)==0?-1:r,t[s>>2]=l,t[o>>2]=0,t[y>>2]=0,t[d>>2]=0,t[_>>2]=0)),o=t[e>>2]|0,t[e>>2]=o|k,q|0&&aL(e),r=(o&32|0)==0?r:-1),h=ie,r|0}function G4(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0;zt=h,h=h+64|0,Ht=zt+16|0,It=zt,vt=zt+24|0,gn=zt+8|0,Pn=zt+20|0,t[Ht>>2]=n,qe=(e|0)!=0,pe=vt+40|0,_e=pe,vt=vt+39|0,Ln=gn+4|0,d=0,l=0,T=0;e:for(;;){do if((l|0)>-1)if((d|0)>(2147483647-l|0)){t[(ca()|0)>>2]=75,l=-1;break}else{l=d+l|0;break}while(0);if(d=c[n>>0]|0,d<<24>>24)_=n;else{ke=87;break}t:for(;;){switch(d<<24>>24){case 37:{d=_,ke=9;break t}case 0:{d=_;break t}default:}Pe=_+1|0,t[Ht>>2]=Pe,d=c[Pe>>0]|0,_=Pe}t:do if((ke|0)==9)for(;;){if(ke=0,(c[_+1>>0]|0)!=37)break t;if(d=d+1|0,_=_+2|0,t[Ht>>2]=_,(c[_>>0]|0)==37)ke=9;else break}while(0);if(d=d-n|0,qe&&ri(e,n,d),d|0){n=_;continue}y=_+1|0,d=(c[y>>0]|0)+-48|0,d>>>0<10?(Pe=(c[_+2>>0]|0)==36,ie=Pe?d:-1,T=Pe?1:T,y=Pe?_+3|0:y):ie=-1,t[Ht>>2]=y,d=c[y>>0]|0,_=(d<<24>>24)+-32|0;t:do if(_>>>0<32)for(k=0,P=d;;){if(d=1<<_,!(d&75913)){d=P;break t}if(k=d|k,y=y+1|0,t[Ht>>2]=y,d=c[y>>0]|0,_=(d<<24>>24)+-32|0,_>>>0>=32)break;P=d}else k=0;while(0);if(d<<24>>24==42){if(_=y+1|0,d=(c[_>>0]|0)+-48|0,d>>>0<10?(c[y+2>>0]|0)==36:0)t[s+(d<<2)>>2]=10,d=t[o+((c[_>>0]|0)+-48<<3)>>2]|0,T=1,y=y+3|0;else{if(T|0){l=-1;break}qe?(T=(t[r>>2]|0)+(4-1)&~(4-1),d=t[T>>2]|0,t[r>>2]=T+4,T=0,y=_):(d=0,T=0,y=_)}t[Ht>>2]=y,Pe=(d|0)<0,d=Pe?0-d|0:d,k=Pe?k|8192:k}else{if(d=z8(Ht)|0,(d|0)<0){l=-1;break}y=t[Ht>>2]|0}do if((c[y>>0]|0)==46){if((c[y+1>>0]|0)!=42){t[Ht>>2]=y+1,_=z8(Ht)|0,y=t[Ht>>2]|0;break}if(P=y+2|0,_=(c[P>>0]|0)+-48|0,_>>>0<10?(c[y+3>>0]|0)==36:0){t[s+(_<<2)>>2]=10,_=t[o+((c[P>>0]|0)+-48<<3)>>2]|0,y=y+4|0,t[Ht>>2]=y;break}if(T|0){l=-1;break e}qe?(Pe=(t[r>>2]|0)+(4-1)&~(4-1),_=t[Pe>>2]|0,t[r>>2]=Pe+4):_=0,t[Ht>>2]=P,y=P}else _=-1;while(0);for(le=0;;){if(((c[y>>0]|0)+-65|0)>>>0>57){l=-1;break e}if(Pe=y+1|0,t[Ht>>2]=Pe,P=c[(c[y>>0]|0)+-65+(5178+(le*58|0))>>0]|0,q=P&255,(q+-1|0)>>>0<8)le=q,y=Pe;else break}if(!(P<<24>>24)){l=-1;break}we=(ie|0)>-1;do if(P<<24>>24==19)if(we){l=-1;break e}else ke=49;else{if(we){t[s+(ie<<2)>>2]=q,we=o+(ie<<3)|0,ie=t[we+4>>2]|0,ke=It,t[ke>>2]=t[we>>2],t[ke+4>>2]=ie,ke=49;break}if(!qe){l=0;break e}W8(It,q,r)}while(0);if((ke|0)==49?(ke=0,!qe):0){d=0,n=Pe;continue}y=c[y>>0]|0,y=(le|0)!=0&(y&15|0)==3?y&-33:y,we=k&-65537,ie=(k&8192|0)==0?k:we;t:do switch(y|0){case 110:switch((le&255)<<24>>24){case 0:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 1:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 2:{d=t[It>>2]|0,t[d>>2]=l,t[d+4>>2]=((l|0)<0)<<31>>31,d=0,n=Pe;continue e}case 3:{g[t[It>>2]>>1]=l,d=0,n=Pe;continue e}case 4:{c[t[It>>2]>>0]=l,d=0,n=Pe;continue e}case 6:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 7:{d=t[It>>2]|0,t[d>>2]=l,t[d+4>>2]=((l|0)<0)<<31>>31,d=0,n=Pe;continue e}default:{d=0,n=Pe;continue e}}case 112:{y=120,_=_>>>0>8?_:8,n=ie|8,ke=61;break}case 88:case 120:{n=ie,ke=61;break}case 111:{y=It,n=t[y>>2]|0,y=t[y+4>>2]|0,q=pL(n,y,pe)|0,we=_e-q|0,k=0,P=5642,_=(ie&8|0)==0|(_|0)>(we|0)?_:we+1|0,we=ie,ke=67;break}case 105:case 100:if(y=It,n=t[y>>2]|0,y=t[y+4>>2]|0,(y|0)<0){n=fh(0,0,n|0,y|0)|0,y=be,k=It,t[k>>2]=n,t[k+4>>2]=y,k=1,P=5642,ke=66;break t}else{k=(ie&2049|0)!=0&1,P=(ie&2048|0)==0?(ie&1|0)==0?5642:5644:5643,ke=66;break t}case 117:{y=It,k=0,P=5642,n=t[y>>2]|0,y=t[y+4>>2]|0,ke=66;break}case 99:{c[vt>>0]=t[It>>2],n=vt,k=0,P=5642,q=pe,y=1,_=we;break}case 109:{y=hL(t[(ca()|0)>>2]|0)|0,ke=71;break}case 115:{y=t[It>>2]|0,y=y|0?y:5652,ke=71;break}case 67:{t[gn>>2]=t[It>>2],t[Ln>>2]=0,t[It>>2]=gn,q=-1,y=gn,ke=75;break}case 83:{n=t[It>>2]|0,_?(q=_,y=n,ke=75):(wi(e,32,d,0,ie),n=0,ke=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{d=vL(e,+L[It>>3],d,_,ie,y)|0,n=Pe;continue e}default:k=0,P=5642,q=pe,y=_,_=ie}while(0);t:do if((ke|0)==61)ie=It,le=t[ie>>2]|0,ie=t[ie+4>>2]|0,q=dL(le,ie,pe,y&32)|0,P=(n&8|0)==0|(le|0)==0&(ie|0)==0,k=P?0:2,P=P?5642:5642+(y>>4)|0,we=n,n=le,y=ie,ke=67;else if((ke|0)==66)q=aa(n,y,pe)|0,we=ie,ke=67;else if((ke|0)==71)ke=0,ie=mL(y,0,_)|0,le=(ie|0)==0,n=y,k=0,P=5642,q=le?y+_|0:ie,y=le?_:ie-y|0,_=we;else if((ke|0)==75){for(ke=0,P=y,n=0,_=0;k=t[P>>2]|0,!(!k||(_=H8(Pn,k)|0,(_|0)<0|_>>>0>(q-n|0)>>>0));)if(n=_+n|0,q>>>0>n>>>0)P=P+4|0;else break;if((_|0)<0){l=-1;break e}if(wi(e,32,d,n,ie),!n)n=0,ke=84;else for(k=0;;){if(_=t[y>>2]|0,!_){ke=84;break t}if(_=H8(Pn,_)|0,k=_+k|0,(k|0)>(n|0)){ke=84;break t}if(ri(e,Pn,_),k>>>0>=n>>>0){ke=84;break}else y=y+4|0}}while(0);if((ke|0)==67)ke=0,y=(n|0)!=0|(y|0)!=0,ie=(_|0)!=0|y,y=((y^1)&1)+(_e-q)|0,n=ie?q:pe,q=pe,y=ie?(_|0)>(y|0)?_:y:_,_=(_|0)>-1?we&-65537:we;else if((ke|0)==84){ke=0,wi(e,32,d,n,ie^8192),d=(d|0)>(n|0)?d:n,n=Pe;continue}le=q-n|0,we=(y|0)<(le|0)?le:y,ie=we+k|0,d=(d|0)<(ie|0)?ie:d,wi(e,32,d,ie,_),ri(e,P,k),wi(e,48,d,ie,_^65536),wi(e,48,we,le,0),ri(e,n,le),wi(e,32,d,ie,_^8192),n=Pe}e:do if((ke|0)==87&&!e)if(!T)l=0;else{for(l=1;n=t[s+(l<<2)>>2]|0,!!n;)if(W8(o+(l<<3)|0,n,r),l=l+1|0,(l|0)>=10){l=1;break e}for(;;){if(t[s+(l<<2)>>2]|0){l=-1;break e}if(l=l+1|0,(l|0)>=10){l=1;break}}}while(0);return h=zt,l|0}function cL(e){return e=e|0,0}function aL(e){e=e|0}function ri(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]&32||TL(n,r,e)|0}function z8(e){e=e|0;var n=0,r=0,o=0;if(r=t[e>>2]|0,o=(c[r>>0]|0)+-48|0,o>>>0<10){n=0;do n=o+(n*10|0)|0,r=r+1|0,t[e>>2]=r,o=(c[r>>0]|0)+-48|0;while(o>>>0<10)}else n=0;return n|0}function W8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;e:do if(n>>>0<=20)do switch(n|0){case 9:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,t[e>>2]=n;break e}case 10:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,o=e,t[o>>2]=n,t[o+4>>2]=((n|0)<0)<<31>>31;break e}case 11:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,o=e,t[o>>2]=n,t[o+4>>2]=0;break e}case 12:{o=(t[r>>2]|0)+(8-1)&~(8-1),n=o,s=t[n>>2]|0,n=t[n+4>>2]|0,t[r>>2]=o+8,o=e,t[o>>2]=s,t[o+4>>2]=n;break e}case 13:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,o=(o&65535)<<16>>16,s=e,t[s>>2]=o,t[s+4>>2]=((o|0)<0)<<31>>31;break e}case 14:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,s=e,t[s>>2]=o&65535,t[s+4>>2]=0;break e}case 15:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,o=(o&255)<<24>>24,s=e,t[s>>2]=o,t[s+4>>2]=((o|0)<0)<<31>>31;break e}case 16:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,s=e,t[s>>2]=o&255,t[s+4>>2]=0;break e}case 17:{s=(t[r>>2]|0)+(8-1)&~(8-1),l=+L[s>>3],t[r>>2]=s+8,L[e>>3]=l;break e}case 18:{s=(t[r>>2]|0)+(8-1)&~(8-1),l=+L[s>>3],t[r>>2]=s+8,L[e>>3]=l;break e}default:break e}while(0);while(0)}function dL(e,n,r,o){if(e=e|0,n=n|0,r=r|0,o=o|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,c[r>>0]=C[5694+(e&15)>>0]|0|o,e=ch(e|0,n|0,4)|0,n=be;while(!((e|0)==0&(n|0)==0));return r|0}function pL(e,n,r){if(e=e|0,n=n|0,r=r|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,c[r>>0]=e&7|48,e=ch(e|0,n|0,3)|0,n=be;while(!((e|0)==0&(n|0)==0));return r|0}function aa(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;if(n>>>0>0|(n|0)==0&e>>>0>4294967295){for(;o=K4(e|0,n|0,10,0)|0,r=r+-1|0,c[r>>0]=o&255|48,o=e,e=$4(e|0,n|0,10,0)|0,n>>>0>9|(n|0)==9&o>>>0>4294967295;)n=be;n=e}else n=e;if(n)for(;r=r+-1|0,c[r>>0]=(n>>>0)%10|0|48,!(n>>>0<10);)n=(n>>>0)/10|0;return r|0}function hL(e){return e=e|0,DL(e,t[(wL()|0)+188>>2]|0)|0}function mL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;l=n&255,o=(r|0)!=0;e:do if(o&(e&3|0)!=0)for(s=n&255;;){if((c[e>>0]|0)==s<<24>>24){d=6;break e}if(e=e+1|0,r=r+-1|0,o=(r|0)!=0,!(o&(e&3|0)!=0)){d=5;break}}else d=5;while(0);(d|0)==5&&(o?d=6:r=0);e:do if((d|0)==6&&(s=n&255,(c[e>>0]|0)!=s<<24>>24)){o=Un(l,16843009)|0;t:do if(r>>>0>3){for(;l=t[e>>2]^o,!((l&-2139062144^-2139062144)&l+-16843009|0);)if(e=e+4|0,r=r+-4|0,r>>>0<=3){d=11;break t}}else d=11;while(0);if((d|0)==11&&!r){r=0;break}for(;;){if((c[e>>0]|0)==s<<24>>24)break e;if(e=e+1|0,r=r+-1|0,!r){r=0;break}}}while(0);return(r|0?e:0)|0}function wi(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0;if(d=h,h=h+256|0,l=d,(r|0)>(o|0)&(s&73728|0)==0){if(s=r-o|0,pa(l|0,n|0,(s>>>0<256?s:256)|0)|0,s>>>0>255){n=r-o|0;do ri(e,l,256),s=s+-256|0;while(s>>>0>255);s=n&255}ri(e,l,s)}h=d}function H8(e,n){return e=e|0,n=n|0,e?e=_L(e,n,0)|0:e=0,e|0}function vL(e,n,r,o,s,l){e=e|0,n=+n,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0;Dr=h,h=h+560|0,y=Dr+8|0,Pe=Dr,zt=Dr+524|0,Pn=zt,k=Dr+512|0,t[Pe>>2]=0,gn=k+12|0,b8(n)|0,(be|0)<0?(n=-n,Ht=1,Ln=5659):(Ht=(s&2049|0)!=0&1,Ln=(s&2048|0)==0?(s&1|0)==0?5660:5665:5662),b8(n)|0,It=be&2146435072;do if(It>>>0<2146435072|(It|0)==2146435072&0<0){if(we=+gL(n,Pe)*2,d=we!=0,d&&(t[Pe>>2]=(t[Pe>>2]|0)+-1),qe=l|32,(qe|0)==97){le=l&32,q=(le|0)==0?Ln:Ln+9|0,P=Ht|2,d=12-o|0;do if(o>>>0>11|(d|0)==0)n=we;else{n=8;do d=d+-1|0,n=n*16;while((d|0)!=0);if((c[q>>0]|0)==45){n=-(n+(-we-n));break}else{n=we+n-n;break}}while(0);_=t[Pe>>2]|0,d=(_|0)<0?0-_|0:_,d=aa(d,((d|0)<0)<<31>>31,gn)|0,(d|0)==(gn|0)&&(d=k+11|0,c[d>>0]=48),c[d+-1>>0]=(_>>31&2)+43,T=d+-2|0,c[T>>0]=l+15,k=(o|0)<1,y=(s&8|0)==0,d=zt;do It=~~n,_=d+1|0,c[d>>0]=C[5694+It>>0]|le,n=(n-+(It|0))*16,((_-Pn|0)==1?!(y&(k&n==0)):0)?(c[_>>0]=46,d=d+2|0):d=_;while(n!=0);It=d-Pn|0,Pn=gn-T|0,gn=(o|0)!=0&(It+-2|0)<(o|0)?o+2|0:It,d=Pn+P+gn|0,wi(e,32,r,d,s),ri(e,q,P),wi(e,48,r,d,s^65536),ri(e,zt,It),wi(e,48,gn-It|0,0,0),ri(e,T,Pn),wi(e,32,r,d,s^8192);break}_=(o|0)<0?6:o,d?(d=(t[Pe>>2]|0)+-28|0,t[Pe>>2]=d,n=we*268435456):(n=we,d=t[Pe>>2]|0),It=(d|0)<0?y:y+288|0,y=It;do _e=~~n>>>0,t[y>>2]=_e,y=y+4|0,n=(n-+(_e>>>0))*1e9;while(n!=0);if((d|0)>0)for(k=It,P=y;;){if(T=(d|0)<29?d:29,d=P+-4|0,d>>>0>=k>>>0){y=0;do pe=X8(t[d>>2]|0,0,T|0)|0,pe=Y4(pe|0,be|0,y|0,0)|0,_e=be,ke=K4(pe|0,_e|0,1e9,0)|0,t[d>>2]=ke,y=$4(pe|0,_e|0,1e9,0)|0,d=d+-4|0;while(d>>>0>=k>>>0);y&&(k=k+-4|0,t[k>>2]=y)}for(y=P;!(y>>>0<=k>>>0);)if(d=y+-4|0,!(t[d>>2]|0))y=d;else break;if(d=(t[Pe>>2]|0)-T|0,t[Pe>>2]=d,(d|0)>0)P=y;else break}else k=It;if((d|0)<0){o=((_+25|0)/9|0)+1|0,ie=(qe|0)==102;do{if(le=0-d|0,le=(le|0)<9?le:9,k>>>0>>0){T=(1<>>le,q=0,d=k;do _e=t[d>>2]|0,t[d>>2]=(_e>>>le)+q,q=Un(_e&T,P)|0,d=d+4|0;while(d>>>0>>0);d=(t[k>>2]|0)==0?k+4|0:k,q?(t[y>>2]=q,k=d,d=y+4|0):(k=d,d=y)}else k=(t[k>>2]|0)==0?k+4|0:k,d=y;y=ie?It:k,y=(d-y>>2|0)>(o|0)?y+(o<<2)|0:d,d=(t[Pe>>2]|0)+le|0,t[Pe>>2]=d}while((d|0)<0);d=k,o=y}else d=k,o=y;if(_e=It,d>>>0>>0){if(y=(_e-d>>2)*9|0,T=t[d>>2]|0,T>>>0>=10){k=10;do k=k*10|0,y=y+1|0;while(T>>>0>=k>>>0)}}else y=0;if(ie=(qe|0)==103,ke=(_|0)!=0,k=_-((qe|0)!=102?y:0)+((ke&ie)<<31>>31)|0,(k|0)<(((o-_e>>2)*9|0)+-9|0)){if(k=k+9216|0,le=It+4+(((k|0)/9|0)+-1024<<2)|0,k=((k|0)%9|0)+1|0,(k|0)<9){T=10;do T=T*10|0,k=k+1|0;while((k|0)!=9)}else T=10;if(P=t[le>>2]|0,q=(P>>>0)%(T>>>0)|0,k=(le+4|0)==(o|0),k&(q|0)==0)k=le;else if(we=(((P>>>0)/(T>>>0)|0)&1|0)==0?9007199254740992:9007199254740994,pe=(T|0)/2|0,n=q>>>0>>0?.5:k&(q|0)==(pe|0)?1:1.5,Ht&&(pe=(c[Ln>>0]|0)==45,n=pe?-n:n,we=pe?-we:we),k=P-q|0,t[le>>2]=k,we+n!=we){if(pe=k+T|0,t[le>>2]=pe,pe>>>0>999999999)for(y=le;k=y+-4|0,t[y>>2]=0,k>>>0>>0&&(d=d+-4|0,t[d>>2]=0),pe=(t[k>>2]|0)+1|0,t[k>>2]=pe,pe>>>0>999999999;)y=k;else k=le;if(y=(_e-d>>2)*9|0,P=t[d>>2]|0,P>>>0>=10){T=10;do T=T*10|0,y=y+1|0;while(P>>>0>=T>>>0)}}else k=le;k=k+4|0,k=o>>>0>k>>>0?k:o,pe=d}else k=o,pe=d;for(qe=k;;){if(qe>>>0<=pe>>>0){Pe=0;break}if(d=qe+-4|0,!(t[d>>2]|0))qe=d;else{Pe=1;break}}o=0-y|0;do if(ie)if(d=((ke^1)&1)+_|0,(d|0)>(y|0)&(y|0)>-5?(T=l+-1|0,_=d+-1-y|0):(T=l+-2|0,_=d+-1|0),d=s&8,d)le=d;else{if(Pe?(vt=t[qe+-4>>2]|0,(vt|0)!=0):0)if((vt>>>0)%10|0)k=0;else{k=0,d=10;do d=d*10|0,k=k+1|0;while(!((vt>>>0)%(d>>>0)|0|0))}else k=9;if(d=((qe-_e>>2)*9|0)+-9|0,(T|32|0)==102){le=d-k|0,le=(le|0)>0?le:0,_=(_|0)<(le|0)?_:le,le=0;break}else{le=d+y-k|0,le=(le|0)>0?le:0,_=(_|0)<(le|0)?_:le,le=0;break}}else T=l,le=s&8;while(0);if(ie=_|le,P=(ie|0)!=0&1,q=(T|32|0)==102,q)ke=0,d=(y|0)>0?y:0;else{if(d=(y|0)<0?o:y,d=aa(d,((d|0)<0)<<31>>31,gn)|0,k=gn,(k-d|0)<2)do d=d+-1|0,c[d>>0]=48;while((k-d|0)<2);c[d+-1>>0]=(y>>31&2)+43,d=d+-2|0,c[d>>0]=T,ke=d,d=k-d|0}if(d=Ht+1+_+P+d|0,wi(e,32,r,d,s),ri(e,Ln,Ht),wi(e,48,r,d,s^65536),q){T=pe>>>0>It>>>0?It:pe,le=zt+9|0,P=le,q=zt+8|0,k=T;do{if(y=aa(t[k>>2]|0,0,le)|0,(k|0)==(T|0))(y|0)==(le|0)&&(c[q>>0]=48,y=q);else if(y>>>0>zt>>>0){pa(zt|0,48,y-Pn|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}ri(e,y,P-y|0),k=k+4|0}while(k>>>0<=It>>>0);if(ie|0&&ri(e,5710,1),k>>>0>>0&(_|0)>0)for(;;){if(y=aa(t[k>>2]|0,0,le)|0,y>>>0>zt>>>0){pa(zt|0,48,y-Pn|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}if(ri(e,y,(_|0)<9?_:9),k=k+4|0,y=_+-9|0,k>>>0>>0&(_|0)>9)_=y;else{_=y;break}}wi(e,48,_+9|0,9,0)}else{if(ie=Pe?qe:pe+4|0,(_|0)>-1){Pe=zt+9|0,le=(le|0)==0,o=Pe,P=0-Pn|0,q=zt+8|0,T=pe;do{y=aa(t[T>>2]|0,0,Pe)|0,(y|0)==(Pe|0)&&(c[q>>0]=48,y=q);do if((T|0)==(pe|0)){if(k=y+1|0,ri(e,y,1),le&(_|0)<1){y=k;break}ri(e,5710,1),y=k}else{if(y>>>0<=zt>>>0)break;pa(zt|0,48,y+P|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}while(0);Pn=o-y|0,ri(e,y,(_|0)>(Pn|0)?Pn:_),_=_-Pn|0,T=T+4|0}while(T>>>0>>0&(_|0)>-1)}wi(e,48,_+18|0,18,0),ri(e,ke,gn-ke|0)}wi(e,32,r,d,s^8192)}else zt=(l&32|0)!=0,d=Ht+3|0,wi(e,32,r,d,s&-65537),ri(e,Ln,Ht),ri(e,n!=n|!1?zt?5686:5690:zt?5678:5682,3),wi(e,32,r,d,s^8192);while(0);return h=Dr,((d|0)<(r|0)?r:d)|0}function b8(e){e=+e;var n=0;return L[j>>3]=e,n=t[j>>2]|0,be=t[j+4>>2]|0,n|0}function gL(e,n){return e=+e,n=n|0,+ +G8(e,n)}function G8(e,n){e=+e,n=n|0;var r=0,o=0,s=0;switch(L[j>>3]=e,r=t[j>>2]|0,o=t[j+4>>2]|0,s=ch(r|0,o|0,52)|0,s&2047){case 0:{e!=0?(e=+G8(e*18446744073709552e3,n),r=(t[n>>2]|0)+-64|0):r=0,t[n>>2]=r;break}case 2047:break;default:t[n>>2]=(s&2047)+-1022,t[j>>2]=r,t[j+4>>2]=o&-2146435073|1071644672,e=+L[j>>3]}return+e}function _L(e,n,r){e=e|0,n=n|0,r=r|0;do if(e){if(n>>>0<128){c[e>>0]=n,e=1;break}if(!(t[t[(yL()|0)+188>>2]>>2]|0))if((n&-128|0)==57216){c[e>>0]=n,e=1;break}else{t[(ca()|0)>>2]=84,e=-1;break}if(n>>>0<2048){c[e>>0]=n>>>6|192,c[e+1>>0]=n&63|128,e=2;break}if(n>>>0<55296|(n&-8192|0)==57344){c[e>>0]=n>>>12|224,c[e+1>>0]=n>>>6&63|128,c[e+2>>0]=n&63|128,e=3;break}if((n+-65536|0)>>>0<1048576){c[e>>0]=n>>>18|240,c[e+1>>0]=n>>>12&63|128,c[e+2>>0]=n>>>6&63|128,c[e+3>>0]=n&63|128,e=4;break}else{t[(ca()|0)>>2]=84,e=-1;break}}else e=1;while(0);return e|0}function yL(){return b4()|0}function wL(){return b4()|0}function DL(e,n){e=e|0,n=n|0;var r=0,o=0;for(o=0;;){if((C[5712+o>>0]|0)==(e|0)){e=2;break}if(r=o+1|0,(r|0)==87){r=5800,o=87,e=5;break}else o=r}if((e|0)==2&&(o?(r=5800,e=5):r=5800),(e|0)==5)for(;;){do e=r,r=r+1|0;while((c[e>>0]|0)!=0);if(o=o+-1|0,o)e=5;else break}return EL(r,t[n+20>>2]|0)|0}function EL(e,n){return e=e|0,n=n|0,SL(e,n)|0}function SL(e,n){return e=e|0,n=n|0,n?n=CL(t[n>>2]|0,t[n+4>>2]|0,e)|0:n=0,(n|0?n:e)|0}function CL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;q=(t[e>>2]|0)+1794895138|0,l=fc(t[e+8>>2]|0,q)|0,o=fc(t[e+12>>2]|0,q)|0,s=fc(t[e+16>>2]|0,q)|0;e:do if((l>>>0>>2>>>0?(P=n-(l<<2)|0,o>>>0

>>0&s>>>0

>>0):0)?((s|o)&3|0)==0:0){for(P=o>>>2,T=s>>>2,k=0;;){if(_=l>>>1,y=k+_|0,d=y<<1,s=d+P|0,o=fc(t[e+(s<<2)>>2]|0,q)|0,s=fc(t[e+(s+1<<2)>>2]|0,q)|0,!(s>>>0>>0&o>>>0<(n-s|0)>>>0)){o=0;break e}if(c[e+(s+o)>>0]|0){o=0;break e}if(o=U8(r,e+s|0)|0,!o)break;if(o=(o|0)<0,(l|0)==1){o=0;break e}else k=o?k:y,l=o?_:l-_|0}o=d+T|0,s=fc(t[e+(o<<2)>>2]|0,q)|0,o=fc(t[e+(o+1<<2)>>2]|0,q)|0,o>>>0>>0&s>>>0<(n-o|0)>>>0?o=(c[e+(o+s)>>0]|0)==0?e+o|0:0:o=0}else o=0;while(0);return o|0}function fc(e,n){e=e|0,n=n|0;var r=0;return r=Z8(e|0)|0,((n|0)==0?e:r)|0}function TL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=r+16|0,s=t[o>>2]|0,s?l=5:xL(r)|0?o=0:(s=t[o>>2]|0,l=5);e:do if((l|0)==5){if(_=r+20|0,d=t[_>>2]|0,o=d,(s-d|0)>>>0>>0){o=dh[t[r+36>>2]&7](r,e,n)|0;break}t:do if((c[r+75>>0]|0)>-1){for(d=n;;){if(!d){l=0,s=e;break t}if(s=d+-1|0,(c[e+s>>0]|0)==10)break;d=s}if(o=dh[t[r+36>>2]&7](r,e,d)|0,o>>>0>>0)break e;l=d,s=e+d|0,n=n-d|0,o=t[_>>2]|0}else l=0,s=e;while(0);vn(o|0,s|0,n|0)|0,t[_>>2]=(t[_>>2]|0)+n,o=l+n|0}while(0);return o|0}function xL(e){e=e|0;var n=0,r=0;return n=e+74|0,r=c[n>>0]|0,c[n>>0]=r+255|r,n=t[e>>2]|0,n&8?(t[e>>2]=n|32,e=-1):(t[e+8>>2]=0,t[e+4>>2]=0,r=t[e+44>>2]|0,t[e+28>>2]=r,t[e+20>>2]=r,t[e+16>>2]=r+(t[e+48>>2]|0),e=0),e|0}function Ur(e,n){e=w(e),n=w(n);var r=0,o=0;r=V8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(o=V8(n)|0,(o&2147483647)>>>0<=2139095040)if((o^r|0)<0){e=(r|0)<0?n:e;break}else{e=e>2]=e,t[j>>2]|0|0}function cc(e,n){e=w(e),n=w(n);var r=0,o=0;r=Y8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(o=Y8(n)|0,(o&2147483647)>>>0<=2139095040)if((o^r|0)<0){e=(r|0)<0?e:n;break}else{e=e>2]=e,t[j>>2]|0|0}function V4(e,n){e=w(e),n=w(n);var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;l=(D[j>>2]=e,t[j>>2]|0),_=(D[j>>2]=n,t[j>>2]|0),r=l>>>23&255,d=_>>>23&255,y=l&-2147483648,s=_<<1;e:do if((s|0)!=0?!((r|0)==255|((kL(n)|0)&2147483647)>>>0>2139095040):0){if(o=l<<1,o>>>0<=s>>>0)return n=w(e*w(0)),w((o|0)==(s|0)?n:e);if(r)o=l&8388607|8388608;else{if(r=l<<9,(r|0)>-1){o=r,r=0;do r=r+-1|0,o=o<<1;while((o|0)>-1)}else r=0;o=l<<1-r}if(d)_=_&8388607|8388608;else{if(l=_<<9,(l|0)>-1){s=0;do s=s+-1|0,l=l<<1;while((l|0)>-1)}else s=0;d=s,_=_<<1-s}s=o-_|0,l=(s|0)>-1;t:do if((r|0)>(d|0)){for(;;){if(l)if(s)o=s;else break;if(o=o<<1,r=r+-1|0,s=o-_|0,l=(s|0)>-1,(r|0)<=(d|0))break t}n=w(e*w(0));break e}while(0);if(l)if(s)o=s;else{n=w(e*w(0));break}if(o>>>0<8388608)do o=o<<1,r=r+-1|0;while(o>>>0<8388608);(r|0)>0?r=o+-8388608|r<<23:r=o>>>(1-r|0),n=(t[j>>2]=r|y,w(D[j>>2]))}else k=3;while(0);return(k|0)==3&&(n=w(e*n),n=w(n/n)),w(n)}function kL(e){return e=w(e),D[j>>2]=e,t[j>>2]|0|0}function AL(e,n){return e=e|0,n=n|0,q8(t[582]|0,e,n)|0}function $n(e){e=e|0,_n()}function da(e){e=e|0}function OL(e,n){return e=e|0,n=n|0,0}function IL(e){return e=e|0,($8(e+4|0)|0)==-1?(Nl[t[(t[e>>2]|0)+8>>2]&127](e),e=1):e=0,e|0}function $8(e){e=e|0;var n=0;return n=t[e>>2]|0,t[e>>2]=n+-1,n+-1|0}function Tf(e){e=e|0,IL(e)|0&&PL(e)}function PL(e){e=e|0;var n=0;n=e+8|0,((t[n>>2]|0)!=0?($8(n)|0)!=-1:0)||Nl[t[(t[e>>2]|0)+16>>2]&127](e)}function Tt(e){e=e|0;var n=0;for(n=(e|0)==0?1:e;e=uh(n)|0,!(e|0);){if(e=FL()|0,!e){e=0;break}fD[e&0]()}return e|0}function K8(e){return e=e|0,Tt(e)|0}function Ve(e){e=e|0,sh(e)}function ML(e){e=e|0,(c[e+11>>0]|0)<0&&Ve(t[e>>2]|0)}function FL(){var e=0;return e=t[2923]|0,t[2923]=e+0,e|0}function LL(){}function fh(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,o=n-o-(r>>>0>e>>>0|0)>>>0,be=o,e-r>>>0|0|0}function Y4(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,r=e+r>>>0,be=n+o+(r>>>0>>0|0)>>>0,r|0|0}function pa(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;if(l=e+r|0,n=n&255,(r|0)>=67){for(;e&3;)c[e>>0]=n,e=e+1|0;for(o=l&-4|0,s=o-64|0,d=n|n<<8|n<<16|n<<24;(e|0)<=(s|0);)t[e>>2]=d,t[e+4>>2]=d,t[e+8>>2]=d,t[e+12>>2]=d,t[e+16>>2]=d,t[e+20>>2]=d,t[e+24>>2]=d,t[e+28>>2]=d,t[e+32>>2]=d,t[e+36>>2]=d,t[e+40>>2]=d,t[e+44>>2]=d,t[e+48>>2]=d,t[e+52>>2]=d,t[e+56>>2]=d,t[e+60>>2]=d,e=e+64|0;for(;(e|0)<(o|0);)t[e>>2]=d,e=e+4|0}for(;(e|0)<(l|0);)c[e>>0]=n,e=e+1|0;return l-r|0}function X8(e,n,r){return e=e|0,n=n|0,r=r|0,(r|0)<32?(be=n<>>32-r,e<>>r,e>>>r|(n&(1<>>r-32|0)}function vn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;if((r|0)>=8192)return wo(e|0,n|0,r|0)|0;if(l=e|0,s=e+r|0,(e&3)==(n&3)){for(;e&3;){if(!r)return l|0;c[e>>0]=c[n>>0]|0,e=e+1|0,n=n+1|0,r=r-1|0}for(r=s&-4|0,o=r-64|0;(e|0)<=(o|0);)t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2],t[e+16>>2]=t[n+16>>2],t[e+20>>2]=t[n+20>>2],t[e+24>>2]=t[n+24>>2],t[e+28>>2]=t[n+28>>2],t[e+32>>2]=t[n+32>>2],t[e+36>>2]=t[n+36>>2],t[e+40>>2]=t[n+40>>2],t[e+44>>2]=t[n+44>>2],t[e+48>>2]=t[n+48>>2],t[e+52>>2]=t[n+52>>2],t[e+56>>2]=t[n+56>>2],t[e+60>>2]=t[n+60>>2],e=e+64|0,n=n+64|0;for(;(e|0)<(r|0);)t[e>>2]=t[n>>2],e=e+4|0,n=n+4|0}else for(r=s-4|0;(e|0)<(r|0);)c[e>>0]=c[n>>0]|0,c[e+1>>0]=c[n+1>>0]|0,c[e+2>>0]=c[n+2>>0]|0,c[e+3>>0]=c[n+3>>0]|0,e=e+4|0,n=n+4|0;for(;(e|0)<(s|0);)c[e>>0]=c[n>>0]|0,e=e+1|0,n=n+1|0;return l|0}function J8(e){e=e|0;var n=0;return n=c[ce+(e&255)>>0]|0,(n|0)<8?n|0:(n=c[ce+(e>>8&255)>>0]|0,(n|0)<8?n+8|0:(n=c[ce+(e>>16&255)>>0]|0,(n|0)<8?n+16|0:(c[ce+(e>>>24)>>0]|0)+24|0))}function Q8(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0;if(T=e,y=n,k=y,d=r,q=o,_=q,!k)return l=(s|0)!=0,_?l?(t[s>>2]=e|0,t[s+4>>2]=n&0,q=0,s=0,be=q,s|0):(q=0,s=0,be=q,s|0):(l&&(t[s>>2]=(T>>>0)%(d>>>0),t[s+4>>2]=0),q=0,s=(T>>>0)/(d>>>0)>>>0,be=q,s|0);l=(_|0)==0;do if(d){if(!l){if(l=(cr(_|0)|0)-(cr(k|0)|0)|0,l>>>0<=31){P=l+1|0,_=31-l|0,n=l-31>>31,d=P,e=T>>>(P>>>0)&n|k<<_,n=k>>>(P>>>0)&n,l=0,_=T<<_;break}return s?(t[s>>2]=e|0,t[s+4>>2]=y|n&0,q=0,s=0,be=q,s|0):(q=0,s=0,be=q,s|0)}if(l=d-1|0,l&d|0){_=(cr(d|0)|0)+33-(cr(k|0)|0)|0,le=64-_|0,P=32-_|0,y=P>>31,we=_-32|0,n=we>>31,d=_,e=P-1>>31&k>>>(we>>>0)|(k<>>(_>>>0))&n,n=n&k>>>(_>>>0),l=T<>>(we>>>0))&y|T<>31;break}return s|0&&(t[s>>2]=l&T,t[s+4>>2]=0),(d|0)==1?(we=y|n&0,le=e|0|0,be=we,le|0):(le=J8(d|0)|0,we=k>>>(le>>>0)|0,le=k<<32-le|T>>>(le>>>0)|0,be=we,le|0)}else{if(l)return s|0&&(t[s>>2]=(k>>>0)%(d>>>0),t[s+4>>2]=0),we=0,le=(k>>>0)/(d>>>0)>>>0,be=we,le|0;if(!T)return s|0&&(t[s>>2]=0,t[s+4>>2]=(k>>>0)%(_>>>0)),we=0,le=(k>>>0)/(_>>>0)>>>0,be=we,le|0;if(l=_-1|0,!(l&_))return s|0&&(t[s>>2]=e|0,t[s+4>>2]=l&k|n&0),we=0,le=k>>>((J8(_|0)|0)>>>0),be=we,le|0;if(l=(cr(_|0)|0)-(cr(k|0)|0)|0,l>>>0<=30){n=l+1|0,_=31-l|0,d=n,e=k<<_|T>>>(n>>>0),n=k>>>(n>>>0),l=0,_=T<<_;break}return s?(t[s>>2]=e|0,t[s+4>>2]=y|n&0,we=0,le=0,be=we,le|0):(we=0,le=0,be=we,le|0)}while(0);if(!d)k=_,y=0,_=0;else{P=r|0|0,T=q|o&0,k=Y4(P|0,T|0,-1,-1)|0,r=be,y=_,_=0;do o=y,y=l>>>31|y<<1,l=_|l<<1,o=e<<1|o>>>31|0,q=e>>>31|n<<1|0,fh(k|0,r|0,o|0,q|0)|0,le=be,we=le>>31|((le|0)<0?-1:0)<<1,_=we&1,e=fh(o|0,q|0,we&P|0,(((le|0)<0?-1:0)>>31|((le|0)<0?-1:0)<<1)&T|0)|0,n=be,d=d-1|0;while((d|0)!=0);k=y,y=0}return d=0,s|0&&(t[s>>2]=e,t[s+4>>2]=n),we=(l|0)>>>31|(k|d)<<1|(d<<1|l>>>31)&0|y,le=(l<<1|0>>>31)&-2|_,be=we,le|0}function $4(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,Q8(e,n,r,o,0)|0}function xf(e){e=e|0;var n=0,r=0;return r=e+15&-16|0,n=t[N>>2]|0,e=n+r|0,(r|0)>0&(e|0)<(n|0)|(e|0)<0?(vr()|0,Os(12),-1):(t[N>>2]=e,((e|0)>(Xn()|0)?(Bn()|0)==0:0)?(t[N>>2]=n,Os(12),-1):n|0)}function Y1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;if((n|0)<(e|0)&(e|0)<(n+r|0)){for(o=e,n=n+r|0,e=e+r|0;(r|0)>0;)e=e-1|0,n=n-1|0,r=r-1|0,c[e>>0]=c[n>>0]|0;e=o}else vn(e,n,r)|0;return e|0}function K4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;return l=h,h=h+16|0,s=l|0,Q8(e,n,r,o,s)|0,h=l,be=t[s+4>>2]|0,t[s>>2]|0|0}function Z8(e){return e=e|0,(e&255)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>>24|0}function RL(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,eD[e&1](n|0,r|0,o|0,s|0,l|0)}function NL(e,n,r){e=e|0,n=n|0,r=w(r),tD[e&1](n|0,w(r))}function BL(e,n,r){e=e|0,n=n|0,r=+r,nD[e&31](n|0,+r)}function jL(e,n,r,o){return e=e|0,n=n|0,r=w(r),o=w(o),w(rD[e&0](n|0,w(r),w(o)))}function UL(e,n){e=e|0,n=n|0,Nl[e&127](n|0)}function qL(e,n,r){e=e|0,n=n|0,r=r|0,Bl[e&31](n|0,r|0)}function zL(e,n){return e=e|0,n=n|0,dc[e&31](n|0)|0}function WL(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0,iD[e&1](n|0,+r,+o,s|0)}function HL(e,n,r,o){e=e|0,n=n|0,r=+r,o=+o,CR[e&1](n|0,+r,+o)}function bL(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,dh[e&7](n|0,r|0,o|0)|0}function VL(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,+TR[e&1](n|0,r|0,o|0)}function YL(e,n){return e=e|0,n=n|0,+oD[e&15](n|0)}function $L(e,n,r){return e=e|0,n=n|0,r=+r,xR[e&1](n|0,+r)|0}function KL(e,n,r){return e=e|0,n=n|0,r=r|0,J4[e&15](n|0,r|0)|0}function XL(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=+o,s=+s,l=l|0,kR[e&1](n|0,r|0,+o,+s,l|0)}function JL(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,AR[e&1](n|0,r|0,o|0,s|0,l|0,d|0)}function QL(e,n,r){return e=e|0,n=n|0,r=r|0,+uD[e&7](n|0,r|0)}function ZL(e){return e=e|0,ph[e&7]()|0}function eR(e,n,r,o,s,l){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,sD[e&1](n|0,r|0,o|0,s|0,l|0)|0}function tR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=+s,OR[e&1](n|0,r|0,o|0,+s)}function nR(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=w(o),s=s|0,l=w(l),d=d|0,lD[e&1](n|0,r|0,w(o),s|0,w(l),d|0)}function rR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,X1[e&15](n|0,r|0,o|0)}function iR(e){e=e|0,fD[e&0]()}function oR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o,cD[e&15](n|0,r|0,+o)}function uR(e,n,r){return e=e|0,n=+n,r=+r,IR[e&1](+n,+r)|0}function sR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,Q4[e&15](n|0,r|0,o|0,s|0)}function lR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,pt(0)}function fR(e,n){e=e|0,n=w(n),pt(1)}function Lo(e,n){e=e|0,n=+n,pt(2)}function cR(e,n,r){return e=e|0,n=w(n),r=w(r),pt(3),tt}function tn(e){e=e|0,pt(4)}function $1(e,n){e=e|0,n=n|0,pt(5)}function tu(e){return e=e|0,pt(6),0}function aR(e,n,r,o){e=e|0,n=+n,r=+r,o=o|0,pt(7)}function dR(e,n,r){e=e|0,n=+n,r=+r,pt(8)}function pR(e,n,r){return e=e|0,n=n|0,r=r|0,pt(9),0}function hR(e,n,r){return e=e|0,n=n|0,r=r|0,pt(10),0}function ac(e){return e=e|0,pt(11),0}function mR(e,n){return e=e|0,n=+n,pt(12),0}function K1(e,n){return e=e|0,n=n|0,pt(13),0}function vR(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0,pt(14)}function gR(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,pt(15)}function X4(e,n){return e=e|0,n=n|0,pt(16),0}function _R(){return pt(17),0}function yR(e,n,r,o,s){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,pt(18),0}function wR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o,pt(19)}function DR(e,n,r,o,s,l){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=l|0,pt(20)}function ah(e,n,r){e=e|0,n=n|0,r=r|0,pt(21)}function ER(){pt(22)}function ha(e,n,r){e=e|0,n=n|0,r=+r,pt(23)}function SR(e,n){return e=+e,n=+n,pt(24),0}function ma(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,pt(25)}var eD=[lR,_I],tD=[fR,x0],nD=[Lo,Kf,Tl,xl,hf,xo,mf,Wa,Hs,mi,Xf,Rc,Jf,ao,$o,kl,Nc,Al,vf,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo],rD=[cR],Nl=[tn,da,Km,Xm,es,a_,d_,p_,YA,$A,KA,oI,uI,sI,kF,AF,OF,Sn,Oc,pf,ti,vi,Nm,Uc,r1,Hd,Pl,mv,Av,Kc,Jc,yp,Eg,na,Ug,Yg,u_,k_,q_,J_,a4,Ct,w9,U9,ex,hx,Ix,_0,s7,S7,W7,uk,Dk,Wk,Qk,tA,_A,DA,jA,JA,eO,gO,RO,d1,vP,YP,lM,SM,GM,uF,gF,wF,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn],Bl=[$1,ja,Ua,$f,gu,co,qa,Ws,za,Mc,Fc,Lc,po,Ce,ze,Et,on,sr,mn,Zf,gd,xd,H9,rx,ck,yP,HO,C8,$1,$1,$1,$1],dc=[tu,iL,Ba,m,b,ee,Ye,Ze,ut,In,jr,gi,Pm,Ha,Ya,Fx,Tk,wO,SP,Qo,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu],iD=[aR,Sd],CR=[dR,zA],dh=[pR,j8,oL,lL,Gv,P_,a7,kM],TR=[hR,Op],oD=[ac,_i,Re,pr,Cd,ho,bs,$a,Td,qc,ac,ac,ac,ac,ac,ac],xR=[mR,Kk],J4=[K1,OL,vd,Vc,_v,ig,pg,f_,H_,_x,Xu,dM,K1,K1,K1,K1],kR=[vR,iv],AR=[gR,KM],uD=[X4,Hr,Ka,kd,Xa,Jg,X4,X4],ph=[_R,Ja,Z0,g0,oA,TA,iO,CF],sD=[yR,or],OR=[wR,m4],lD=[DR,Bc],X1=[ah,S,A0,Vn,ni,Mv,Tg,dn,C9,fo,zI,JP,cF,ah,ah,ah],fD=[ER],cD=[ha,Ic,vu,Pc,Qu,Qf,k0,v,W1,k7,Gk,ha,ha,ha,ha,ha],IR=[SR,GA],Q4=[ma,Fg,zx,V7,Lk,aA,PA,aO,qO,OP,RF,ma,ma,ma,ma,ma];return{_llvm_bswap_i32:Z8,dynCall_idd:uR,dynCall_i:ZL,_i64Subtract:fh,___udivdi3:$4,dynCall_vif:NL,setThrew:vl,dynCall_viii:rR,_bitshift64Lshr:ch,_bitshift64Shl:X8,dynCall_vi:UL,dynCall_viiddi:XL,dynCall_diii:VL,dynCall_iii:KL,_memset:pa,_sbrk:xf,_memcpy:vn,__GLOBAL__sub_I_Yoga_cpp:t0,dynCall_vii:qL,___uremdi3:K4,dynCall_vid:BL,stackAlloc:zi,_nbind_init:VF,getTempRet0:fu,dynCall_di:YL,dynCall_iid:$L,setTempRet0:gl,_i64Add:Y4,dynCall_fiff:jL,dynCall_iiii:bL,_emscripten_get_global_libc:rL,dynCall_viid:oR,dynCall_viiid:tR,dynCall_viififi:nR,dynCall_ii:zL,__GLOBAL__sub_I_Binding_cc:lP,dynCall_viiii:sR,dynCall_iiiiii:eR,stackSave:lu,dynCall_viiiii:RL,__GLOBAL__sub_I_nbind_cc:Gs,dynCall_vidd:HL,_free:sh,runPostSets:LL,dynCall_viiiiii:JL,establishStackSpace:O0,_memmove:Y1,stackRestore:Ho,_malloc:uh,__GLOBAL__sub_I_common_cc:AO,dynCall_viddi:WL,dynCall_dii:QL,dynCall_v:iR}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(i){this.name="ExitStatus",this.message="Program terminated with exit("+i+")",this.status=i}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function i(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=i)},Module.callMain=Module.callMain=function(u){u=u||[],ensureInitRuntime();var f=u.length+1;function c(){for(var x=0;x<4-1;x++)g.push(0)}var g=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];c();for(var t=0;t0||(preRun(),runDependencies>0)||Module.calledRun)return;function u(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(i),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),u()},1)):u()}Module.run=Module.run=run;function exit(i,u){u&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=i,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(i)),ENVIRONMENT_IS_NODE&&process.exit(i),Module.quit(i,new ExitStatus(i)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(i){Module.onAbort&&Module.onAbort(i),i!==void 0?(Module.print(i),Module.printErr(i),i=JSON.stringify(i)):i="",ABORT=!0,EXITSTATUS=1;var u=` -If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,f="abort("+i+") at "+stackTrace()+u;throw abortDecorators&&abortDecorators.forEach(function(c){f=c(f,i)}),f}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var hc=Me((hb,vE)=>{"use strict";var wN=hE(),DN=mE(),Py=!1,My=null;DN({},function(i,u){if(!Py){if(Py=!0,i)throw i;My=u}});if(!Py)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");vE.exports=wN(My.bind,My.lib)});var _E=Me((mb,gE)=>{"use strict";gE.exports=({onlyFirst:i=!1}={})=>{let u=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(u,i?void 0:"g")}});var Fy=Me((vb,yE)=>{"use strict";var EN=_E();yE.exports=i=>typeof i=="string"?i.replace(EN(),""):i});var Ry=Me((gb,Ly)=>{"use strict";var wE=i=>Number.isNaN(i)?!1:i>=4352&&(i<=4447||i===9001||i===9002||11904<=i&&i<=12871&&i!==12351||12880<=i&&i<=19903||19968<=i&&i<=42182||43360<=i&&i<=43388||44032<=i&&i<=55203||63744<=i&&i<=64255||65040<=i&&i<=65049||65072<=i&&i<=65131||65281<=i&&i<=65376||65504<=i&&i<=65510||110592<=i&&i<=110593||127488<=i&&i<=127569||131072<=i&&i<=262141);Ly.exports=wE;Ly.exports.default=wE});var EE=Me((_b,DE)=>{"use strict";DE.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var Mh=Me((yb,Ny)=>{"use strict";var SN=Fy(),CN=Ry(),TN=EE(),SE=i=>{if(i=i.replace(TN()," "),typeof i!="string"||i.length===0)return 0;i=SN(i);let u=0;for(let f=0;f=127&&c<=159||c>=768&&c<=879||(c>65535&&f++,u+=CN(c)?2:1)}return u};Ny.exports=SE;Ny.exports.default=SE});var jy=Me((wb,By)=>{"use strict";var xN=Mh(),CE=i=>{let u=0;for(let f of i.split(` -`))u=Math.max(u,xN(f));return u};By.exports=CE;By.exports.default=CE});var TE=Me(a2=>{"use strict";var kN=a2&&a2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(a2,"__esModule",{value:!0});var AN=kN(jy()),Uy={};a2.default=i=>{if(i.length===0)return{width:0,height:0};if(Uy[i])return Uy[i];let u=AN.default(i),f=i.split(` -`).length;return Uy[i]={width:u,height:f},{width:u,height:f}}});var xE=Me(d2=>{"use strict";var ON=d2&&d2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(d2,"__esModule",{value:!0});var hr=ON(hc()),IN=(i,u)=>{"position"in u&&i.setPositionType(u.position==="absolute"?hr.default.POSITION_TYPE_ABSOLUTE:hr.default.POSITION_TYPE_RELATIVE)},PN=(i,u)=>{"marginLeft"in u&&i.setMargin(hr.default.EDGE_START,u.marginLeft||0),"marginRight"in u&&i.setMargin(hr.default.EDGE_END,u.marginRight||0),"marginTop"in u&&i.setMargin(hr.default.EDGE_TOP,u.marginTop||0),"marginBottom"in u&&i.setMargin(hr.default.EDGE_BOTTOM,u.marginBottom||0)},MN=(i,u)=>{"paddingLeft"in u&&i.setPadding(hr.default.EDGE_LEFT,u.paddingLeft||0),"paddingRight"in u&&i.setPadding(hr.default.EDGE_RIGHT,u.paddingRight||0),"paddingTop"in u&&i.setPadding(hr.default.EDGE_TOP,u.paddingTop||0),"paddingBottom"in u&&i.setPadding(hr.default.EDGE_BOTTOM,u.paddingBottom||0)},FN=(i,u)=>{var f;"flexGrow"in u&&i.setFlexGrow((f=u.flexGrow)!==null&&f!==void 0?f:0),"flexShrink"in u&&i.setFlexShrink(typeof u.flexShrink=="number"?u.flexShrink:1),"flexDirection"in u&&(u.flexDirection==="row"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_ROW),u.flexDirection==="row-reverse"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_ROW_REVERSE),u.flexDirection==="column"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_COLUMN),u.flexDirection==="column-reverse"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in u&&(typeof u.flexBasis=="number"?i.setFlexBasis(u.flexBasis):typeof u.flexBasis=="string"?i.setFlexBasisPercent(Number.parseInt(u.flexBasis,10)):i.setFlexBasis(NaN)),"alignItems"in u&&((u.alignItems==="stretch"||!u.alignItems)&&i.setAlignItems(hr.default.ALIGN_STRETCH),u.alignItems==="flex-start"&&i.setAlignItems(hr.default.ALIGN_FLEX_START),u.alignItems==="center"&&i.setAlignItems(hr.default.ALIGN_CENTER),u.alignItems==="flex-end"&&i.setAlignItems(hr.default.ALIGN_FLEX_END)),"alignSelf"in u&&((u.alignSelf==="auto"||!u.alignSelf)&&i.setAlignSelf(hr.default.ALIGN_AUTO),u.alignSelf==="flex-start"&&i.setAlignSelf(hr.default.ALIGN_FLEX_START),u.alignSelf==="center"&&i.setAlignSelf(hr.default.ALIGN_CENTER),u.alignSelf==="flex-end"&&i.setAlignSelf(hr.default.ALIGN_FLEX_END)),"justifyContent"in u&&((u.justifyContent==="flex-start"||!u.justifyContent)&&i.setJustifyContent(hr.default.JUSTIFY_FLEX_START),u.justifyContent==="center"&&i.setJustifyContent(hr.default.JUSTIFY_CENTER),u.justifyContent==="flex-end"&&i.setJustifyContent(hr.default.JUSTIFY_FLEX_END),u.justifyContent==="space-between"&&i.setJustifyContent(hr.default.JUSTIFY_SPACE_BETWEEN),u.justifyContent==="space-around"&&i.setJustifyContent(hr.default.JUSTIFY_SPACE_AROUND))},LN=(i,u)=>{var f,c;"width"in u&&(typeof u.width=="number"?i.setWidth(u.width):typeof u.width=="string"?i.setWidthPercent(Number.parseInt(u.width,10)):i.setWidthAuto()),"height"in u&&(typeof u.height=="number"?i.setHeight(u.height):typeof u.height=="string"?i.setHeightPercent(Number.parseInt(u.height,10)):i.setHeightAuto()),"minWidth"in u&&(typeof u.minWidth=="string"?i.setMinWidthPercent(Number.parseInt(u.minWidth,10)):i.setMinWidth((f=u.minWidth)!==null&&f!==void 0?f:0)),"minHeight"in u&&(typeof u.minHeight=="string"?i.setMinHeightPercent(Number.parseInt(u.minHeight,10)):i.setMinHeight((c=u.minHeight)!==null&&c!==void 0?c:0))},RN=(i,u)=>{"display"in u&&i.setDisplay(u.display==="flex"?hr.default.DISPLAY_FLEX:hr.default.DISPLAY_NONE)},NN=(i,u)=>{if("borderStyle"in u){let f=typeof u.borderStyle=="string"?1:0;i.setBorder(hr.default.EDGE_TOP,f),i.setBorder(hr.default.EDGE_BOTTOM,f),i.setBorder(hr.default.EDGE_LEFT,f),i.setBorder(hr.default.EDGE_RIGHT,f)}};d2.default=(i,u={})=>{IN(i,u),PN(i,u),MN(i,u),FN(i,u),LN(i,u),RN(i,u),NN(i,u)}});var AE=Me((Sb,kE)=>{"use strict";kE.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var qy=Me((Cb,OE)=>{var p2=AE(),IE={};for(let i of Object.keys(p2))IE[p2[i]]=i;var Xt={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};OE.exports=Xt;for(let i of Object.keys(Xt)){if(!("channels"in Xt[i]))throw new Error("missing channels property: "+i);if(!("labels"in Xt[i]))throw new Error("missing channel labels property: "+i);if(Xt[i].labels.length!==Xt[i].channels)throw new Error("channel and label counts mismatch: "+i);let{channels:u,labels:f}=Xt[i];delete Xt[i].channels,delete Xt[i].labels,Object.defineProperty(Xt[i],"channels",{value:u}),Object.defineProperty(Xt[i],"labels",{value:f})}Xt.rgb.hsl=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.min(u,f,c),t=Math.max(u,f,c),C=t-g,A,x;t===g?A=0:u===t?A=(f-c)/C:f===t?A=2+(c-u)/C:c===t&&(A=4+(u-f)/C),A=Math.min(A*60,360),A<0&&(A+=360);let D=(g+t)/2;return t===g?x=0:D<=.5?x=C/(t+g):x=C/(2-t-g),[A,x*100,D*100]};Xt.rgb.hsv=function(i){let u,f,c,g,t,C=i[0]/255,A=i[1]/255,x=i[2]/255,D=Math.max(C,A,x),L=D-Math.min(C,A,x),N=function(j){return(D-j)/6/L+1/2};return L===0?(g=0,t=0):(t=L/D,u=N(C),f=N(A),c=N(x),C===D?g=c-f:A===D?g=1/3+u-c:x===D&&(g=2/3+f-u),g<0?g+=1:g>1&&(g-=1)),[g*360,t*100,D*100]};Xt.rgb.hwb=function(i){let u=i[0],f=i[1],c=i[2],g=Xt.rgb.hsl(i)[0],t=1/255*Math.min(u,Math.min(f,c));return c=1-1/255*Math.max(u,Math.max(f,c)),[g,t*100,c*100]};Xt.rgb.cmyk=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.min(1-u,1-f,1-c),t=(1-u-g)/(1-g)||0,C=(1-f-g)/(1-g)||0,A=(1-c-g)/(1-g)||0;return[t*100,C*100,A*100,g*100]};function BN(i,u){return(i[0]-u[0])**2+(i[1]-u[1])**2+(i[2]-u[2])**2}Xt.rgb.keyword=function(i){let u=IE[i];if(u)return u;let f=Infinity,c;for(let g of Object.keys(p2)){let t=p2[g],C=BN(i,t);C.04045?((u+.055)/1.055)**2.4:u/12.92,f=f>.04045?((f+.055)/1.055)**2.4:f/12.92,c=c>.04045?((c+.055)/1.055)**2.4:c/12.92;let g=u*.4124+f*.3576+c*.1805,t=u*.2126+f*.7152+c*.0722,C=u*.0193+f*.1192+c*.9505;return[g*100,t*100,C*100]};Xt.rgb.lab=function(i){let u=Xt.rgb.xyz(i),f=u[0],c=u[1],g=u[2];f/=95.047,c/=100,g/=108.883,f=f>.008856?f**(1/3):7.787*f+16/116,c=c>.008856?c**(1/3):7.787*c+16/116,g=g>.008856?g**(1/3):7.787*g+16/116;let t=116*c-16,C=500*(f-c),A=200*(c-g);return[t,C,A]};Xt.hsl.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100,g,t,C;if(f===0)return C=c*255,[C,C,C];c<.5?g=c*(1+f):g=c+f-c*f;let A=2*c-g,x=[0,0,0];for(let D=0;D<3;D++)t=u+1/3*-(D-1),t<0&&t++,t>1&&t--,6*t<1?C=A+(g-A)*6*t:2*t<1?C=g:3*t<2?C=A+(g-A)*(2/3-t)*6:C=A,x[D]=C*255;return x};Xt.hsl.hsv=function(i){let u=i[0],f=i[1]/100,c=i[2]/100,g=f,t=Math.max(c,.01);c*=2,f*=c<=1?c:2-c,g*=t<=1?t:2-t;let C=(c+f)/2,A=c===0?2*g/(t+g):2*f/(c+f);return[u,A*100,C*100]};Xt.hsv.rgb=function(i){let u=i[0]/60,f=i[1]/100,c=i[2]/100,g=Math.floor(u)%6,t=u-Math.floor(u),C=255*c*(1-f),A=255*c*(1-f*t),x=255*c*(1-f*(1-t));switch(c*=255,g){case 0:return[c,x,C];case 1:return[A,c,C];case 2:return[C,c,x];case 3:return[C,A,c];case 4:return[x,C,c];case 5:return[c,C,A]}};Xt.hsv.hsl=function(i){let u=i[0],f=i[1]/100,c=i[2]/100,g=Math.max(c,.01),t,C;C=(2-f)*c;let A=(2-f)*g;return t=f*g,t/=A<=1?A:2-A,t=t||0,C/=2,[u,t*100,C*100]};Xt.hwb.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100,g=f+c,t;g>1&&(f/=g,c/=g);let C=Math.floor(6*u),A=1-c;t=6*u-C,(C&1)!=0&&(t=1-t);let x=f+t*(A-f),D,L,N;switch(C){default:case 6:case 0:D=A,L=x,N=f;break;case 1:D=x,L=A,N=f;break;case 2:D=f,L=A,N=x;break;case 3:D=f,L=x,N=A;break;case 4:D=x,L=f,N=A;break;case 5:D=A,L=f,N=x;break}return[D*255,L*255,N*255]};Xt.cmyk.rgb=function(i){let u=i[0]/100,f=i[1]/100,c=i[2]/100,g=i[3]/100,t=1-Math.min(1,u*(1-g)+g),C=1-Math.min(1,f*(1-g)+g),A=1-Math.min(1,c*(1-g)+g);return[t*255,C*255,A*255]};Xt.xyz.rgb=function(i){let u=i[0]/100,f=i[1]/100,c=i[2]/100,g,t,C;return g=u*3.2406+f*-1.5372+c*-.4986,t=u*-.9689+f*1.8758+c*.0415,C=u*.0557+f*-.204+c*1.057,g=g>.0031308?1.055*g**(1/2.4)-.055:g*12.92,t=t>.0031308?1.055*t**(1/2.4)-.055:t*12.92,C=C>.0031308?1.055*C**(1/2.4)-.055:C*12.92,g=Math.min(Math.max(0,g),1),t=Math.min(Math.max(0,t),1),C=Math.min(Math.max(0,C),1),[g*255,t*255,C*255]};Xt.xyz.lab=function(i){let u=i[0],f=i[1],c=i[2];u/=95.047,f/=100,c/=108.883,u=u>.008856?u**(1/3):7.787*u+16/116,f=f>.008856?f**(1/3):7.787*f+16/116,c=c>.008856?c**(1/3):7.787*c+16/116;let g=116*f-16,t=500*(u-f),C=200*(f-c);return[g,t,C]};Xt.lab.xyz=function(i){let u=i[0],f=i[1],c=i[2],g,t,C;t=(u+16)/116,g=f/500+t,C=t-c/200;let A=t**3,x=g**3,D=C**3;return t=A>.008856?A:(t-16/116)/7.787,g=x>.008856?x:(g-16/116)/7.787,C=D>.008856?D:(C-16/116)/7.787,g*=95.047,t*=100,C*=108.883,[g,t,C]};Xt.lab.lch=function(i){let u=i[0],f=i[1],c=i[2],g;g=Math.atan2(c,f)*360/2/Math.PI,g<0&&(g+=360);let C=Math.sqrt(f*f+c*c);return[u,C,g]};Xt.lch.lab=function(i){let u=i[0],f=i[1],g=i[2]/360*2*Math.PI,t=f*Math.cos(g),C=f*Math.sin(g);return[u,t,C]};Xt.rgb.ansi16=function(i,u=null){let[f,c,g]=i,t=u===null?Xt.rgb.hsv(i)[2]:u;if(t=Math.round(t/50),t===0)return 30;let C=30+(Math.round(g/255)<<2|Math.round(c/255)<<1|Math.round(f/255));return t===2&&(C+=60),C};Xt.hsv.ansi16=function(i){return Xt.rgb.ansi16(Xt.hsv.rgb(i),i[2])};Xt.rgb.ansi256=function(i){let u=i[0],f=i[1],c=i[2];return u===f&&f===c?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(f/255*5)+Math.round(c/255*5)};Xt.ansi16.rgb=function(i){let u=i%10;if(u===0||u===7)return i>50&&(u+=3.5),u=u/10.5*255,[u,u,u];let f=(~~(i>50)+1)*.5,c=(u&1)*f*255,g=(u>>1&1)*f*255,t=(u>>2&1)*f*255;return[c,g,t]};Xt.ansi256.rgb=function(i){if(i>=232){let t=(i-232)*10+8;return[t,t,t]}i-=16;let u,f=Math.floor(i/36)/5*255,c=Math.floor((u=i%36)/6)/5*255,g=u%6/5*255;return[f,c,g]};Xt.rgb.hex=function(i){let f=(((Math.round(i[0])&255)<<16)+((Math.round(i[1])&255)<<8)+(Math.round(i[2])&255)).toString(16).toUpperCase();return"000000".substring(f.length)+f};Xt.hex.rgb=function(i){let u=i.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!u)return[0,0,0];let f=u[0];u[0].length===3&&(f=f.split("").map(A=>A+A).join(""));let c=parseInt(f,16),g=c>>16&255,t=c>>8&255,C=c&255;return[g,t,C]};Xt.rgb.hcg=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.max(Math.max(u,f),c),t=Math.min(Math.min(u,f),c),C=g-t,A,x;return C<1?A=t/(1-C):A=0,C<=0?x=0:g===u?x=(f-c)/C%6:g===f?x=2+(c-u)/C:x=4+(u-f)/C,x/=6,x%=1,[x*360,C*100,A*100]};Xt.hsl.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=f<.5?2*u*f:2*u*(1-f),g=0;return c<1&&(g=(f-.5*c)/(1-c)),[i[0],c*100,g*100]};Xt.hsv.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=u*f,g=0;return c<1&&(g=(f-c)/(1-c)),[i[0],c*100,g*100]};Xt.hcg.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100;if(f===0)return[c*255,c*255,c*255];let g=[0,0,0],t=u%1*6,C=t%1,A=1-C,x=0;switch(Math.floor(t)){case 0:g[0]=1,g[1]=C,g[2]=0;break;case 1:g[0]=A,g[1]=1,g[2]=0;break;case 2:g[0]=0,g[1]=1,g[2]=C;break;case 3:g[0]=0,g[1]=A,g[2]=1;break;case 4:g[0]=C,g[1]=0,g[2]=1;break;default:g[0]=1,g[1]=0,g[2]=A}return x=(1-f)*c,[(f*g[0]+x)*255,(f*g[1]+x)*255,(f*g[2]+x)*255]};Xt.hcg.hsv=function(i){let u=i[1]/100,f=i[2]/100,c=u+f*(1-u),g=0;return c>0&&(g=u/c),[i[0],g*100,c*100]};Xt.hcg.hsl=function(i){let u=i[1]/100,c=i[2]/100*(1-u)+.5*u,g=0;return c>0&&c<.5?g=u/(2*c):c>=.5&&c<1&&(g=u/(2*(1-c))),[i[0],g*100,c*100]};Xt.hcg.hwb=function(i){let u=i[1]/100,f=i[2]/100,c=u+f*(1-u);return[i[0],(c-u)*100,(1-c)*100]};Xt.hwb.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=1-f,g=c-u,t=0;return g<1&&(t=(c-g)/(1-g)),[i[0],g*100,t*100]};Xt.apple.rgb=function(i){return[i[0]/65535*255,i[1]/65535*255,i[2]/65535*255]};Xt.rgb.apple=function(i){return[i[0]/255*65535,i[1]/255*65535,i[2]/255*65535]};Xt.gray.rgb=function(i){return[i[0]/100*255,i[0]/100*255,i[0]/100*255]};Xt.gray.hsl=function(i){return[0,0,i[0]]};Xt.gray.hsv=Xt.gray.hsl;Xt.gray.hwb=function(i){return[0,100,i[0]]};Xt.gray.cmyk=function(i){return[0,0,0,i[0]]};Xt.gray.lab=function(i){return[i[0],0,0]};Xt.gray.hex=function(i){let u=Math.round(i[0]/100*255)&255,c=((u<<16)+(u<<8)+u).toString(16).toUpperCase();return"000000".substring(c.length)+c};Xt.rgb.gray=function(i){return[(i[0]+i[1]+i[2])/3/255*100]}});var ME=Me((Tb,PE)=>{var Fh=qy();function jN(){let i={},u=Object.keys(Fh);for(let f=u.length,c=0;c{var zy=qy(),WN=ME(),Ca={},HN=Object.keys(zy);function bN(i){let u=function(...f){let c=f[0];return c==null?c:(c.length>1&&(f=c),i(f))};return"conversion"in i&&(u.conversion=i.conversion),u}function GN(i){let u=function(...f){let c=f[0];if(c==null)return c;c.length>1&&(f=c);let g=i(f);if(typeof g=="object")for(let t=g.length,C=0;C{Ca[i]={},Object.defineProperty(Ca[i],"channels",{value:zy[i].channels}),Object.defineProperty(Ca[i],"labels",{value:zy[i].labels});let u=WN(i);Object.keys(u).forEach(c=>{let g=u[c];Ca[i][c]=GN(g),Ca[i][c].raw=bN(g)})});FE.exports=Ca});var Rh=Me((kb,RE)=>{"use strict";var NE=(i,u)=>(...f)=>`[${i(...f)+u}m`,BE=(i,u)=>(...f)=>{let c=i(...f);return`[${38+u};5;${c}m`},jE=(i,u)=>(...f)=>{let c=i(...f);return`[${38+u};2;${c[0]};${c[1]};${c[2]}m`},Lh=i=>i,UE=(i,u,f)=>[i,u,f],Ta=(i,u,f)=>{Object.defineProperty(i,u,{get:()=>{let c=f();return Object.defineProperty(i,u,{value:c,enumerable:!0,configurable:!0}),c},enumerable:!0,configurable:!0})},Wy,xa=(i,u,f,c)=>{Wy===void 0&&(Wy=LE());let g=c?10:0,t={};for(let[C,A]of Object.entries(Wy)){let x=C==="ansi16"?"ansi":C;C===u?t[x]=i(f,g):typeof A=="object"&&(t[x]=i(A[u],g))}return t};function VN(){let i=new Map,u={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};u.color.gray=u.color.blackBright,u.bgColor.bgGray=u.bgColor.bgBlackBright,u.color.grey=u.color.blackBright,u.bgColor.bgGrey=u.bgColor.bgBlackBright;for(let[f,c]of Object.entries(u)){for(let[g,t]of Object.entries(c))u[g]={open:`[${t[0]}m`,close:`[${t[1]}m`},c[g]=u[g],i.set(t[0],t[1]);Object.defineProperty(u,f,{value:c,enumerable:!1})}return Object.defineProperty(u,"codes",{value:i,enumerable:!1}),u.color.close="",u.bgColor.close="",Ta(u.color,"ansi",()=>xa(NE,"ansi16",Lh,!1)),Ta(u.color,"ansi256",()=>xa(BE,"ansi256",Lh,!1)),Ta(u.color,"ansi16m",()=>xa(jE,"rgb",UE,!1)),Ta(u.bgColor,"ansi",()=>xa(NE,"ansi16",Lh,!0)),Ta(u.bgColor,"ansi256",()=>xa(BE,"ansi256",Lh,!0)),Ta(u.bgColor,"ansi16m",()=>xa(jE,"rgb",UE,!0)),u}Object.defineProperty(RE,"exports",{enumerable:!0,get:VN})});var WE=Me((Ab,qE)=>{"use strict";var h2=Mh(),YN=Fy(),$N=Rh(),Hy=new Set(["","\x9B"]),KN=39,zE=i=>`${Hy.values().next().value}[${i}m`,XN=i=>i.split(" ").map(u=>h2(u)),by=(i,u,f)=>{let c=[...u],g=!1,t=h2(YN(i[i.length-1]));for(let[C,A]of c.entries()){let x=h2(A);if(t+x<=f?i[i.length-1]+=A:(i.push(A),t=0),Hy.has(A))g=!0;else if(g&&A==="m"){g=!1;continue}g||(t+=x,t===f&&C0&&i.length>1&&(i[i.length-2]+=i.pop())},JN=i=>{let u=i.split(" "),f=u.length;for(;f>0&&!(h2(u[f-1])>0);)f--;return f===u.length?i:u.slice(0,f).join(" ")+u.slice(f).join("")},QN=(i,u,f={})=>{if(f.trim!==!1&&i.trim()==="")return"";let c="",g="",t,C=XN(i),A=[""];for(let[x,D]of i.split(" ").entries()){f.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let L=h2(A[A.length-1]);if(x!==0&&(L>=u&&(f.wordWrap===!1||f.trim===!1)&&(A.push(""),L=0),(L>0||f.trim===!1)&&(A[A.length-1]+=" ",L++)),f.hard&&C[x]>u){let N=u-L,j=1+Math.floor((C[x]-N-1)/u);Math.floor((C[x]-1)/u)u&&L>0&&C[x]>0){if(f.wordWrap===!1&&Lu&&f.wordWrap===!1){by(A,D,u);continue}A[A.length-1]+=D}f.trim!==!1&&(A=A.map(JN)),c=A.join(` -`);for(let[x,D]of[...c].entries()){if(g+=D,Hy.has(D)){let N=parseFloat(/\d[^m]*/.exec(c.slice(x,x+4)));t=N===KN?null:N}let L=$N.codes.get(Number(t));t&&L&&(c[x+1]===` -`?g+=zE(L):D===` -`&&(g+=zE(t)))}return g};qE.exports=(i,u,f)=>String(i).normalize().replace(/\r\n/g,` -`).split(` -`).map(c=>QN(c,u,f)).join(` -`)});var GE=Me((Ob,HE)=>{"use strict";var bE="[\uD800-\uDBFF][\uDC00-\uDFFF]",ZN=i=>i&&i.exact?new RegExp(`^${bE}$`):new RegExp(bE,"g");HE.exports=ZN});var Gy=Me((Ib,VE)=>{"use strict";var eB=Ry(),tB=GE(),YE=Rh(),$E=["","\x9B"],Nh=i=>`${$E[0]}[${i}m`,KE=(i,u,f)=>{let c=[];i=[...i];for(let g of i){let t=g;g.match(";")&&(g=g.split(";")[0][0]+"0");let C=YE.codes.get(parseInt(g,10));if(C){let A=i.indexOf(C.toString());A>=0?i.splice(A,1):c.push(Nh(u?C:t))}else if(u){c.push(Nh(0));break}else c.push(Nh(t))}if(u&&(c=c.filter((g,t)=>c.indexOf(g)===t),f!==void 0)){let g=Nh(YE.codes.get(parseInt(f,10)));c=c.reduce((t,C)=>C===g?[C,...t]:[...t,C],[])}return c.join("")};VE.exports=(i,u,f)=>{let c=[...i.normalize()],g=[];f=typeof f=="number"?f:c.length;let t=!1,C,A=0,x="";for(let[D,L]of c.entries()){let N=!1;if($E.includes(L)){let j=/\d[^m]*/.exec(i.slice(D,D+18));C=j&&j.length>0?j[0]:void 0,Au&&A<=f)x+=L;else if(A===u&&!t&&C!==void 0)x=KE(g);else if(A>=f){x+=KE(g,!0,C);break}}return x}});var JE=Me((Pb,XE)=>{"use strict";var Bf=Gy(),nB=Mh();function Bh(i,u,f){if(i.charAt(u)===" ")return u;for(let c=1;c<=3;c++)if(f){if(i.charAt(u+c)===" ")return u+c}else if(i.charAt(u-c)===" ")return u-c;return u}XE.exports=(i,u,f)=>{f=dt({position:"end",preferTruncationOnSpace:!1},f);let{position:c,space:g,preferTruncationOnSpace:t}=f,C="\u2026",A=1;if(typeof i!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof i}`);if(typeof u!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof u}`);if(u<1)return"";if(u===1)return C;let x=nB(i);if(x<=u)return i;if(c==="start"){if(t){let D=Bh(i,x-u+1,!0);return C+Bf(i,D,x).trim()}return g===!0&&(C+=" ",A=2),C+Bf(i,x-u+A,x)}if(c==="middle"){g===!0&&(C=" "+C+" ",A=3);let D=Math.floor(u/2);if(t){let L=Bh(i,D),N=Bh(i,x-(u-D)+1,!0);return Bf(i,0,L)+C+Bf(i,N,x).trim()}return Bf(i,0,D)+C+Bf(i,x-(u-D)+A,x)}if(c==="end"){if(t){let D=Bh(i,u-1);return Bf(i,0,D)+C}return g===!0&&(C=" "+C,A=2),Bf(i,0,u-A)+C}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${c}`)}});var Yy=Me(m2=>{"use strict";var QE=m2&&m2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(m2,"__esModule",{value:!0});var rB=QE(WE()),iB=QE(JE()),Vy={};m2.default=(i,u,f)=>{let c=i+String(u)+String(f);if(Vy[c])return Vy[c];let g=i;if(f==="wrap"&&(g=rB.default(i,u,{trim:!1,hard:!0})),f.startsWith("truncate")){let t="end";f==="truncate-middle"&&(t="middle"),f==="truncate-start"&&(t="start"),g=iB.default(i,u,{position:t})}return Vy[c]=g,g}});var Ky=Me($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});var ZE=i=>{let u="";if(i.childNodes.length>0)for(let f of i.childNodes){let c="";f.nodeName==="#text"?c=f.nodeValue:((f.nodeName==="ink-text"||f.nodeName==="ink-virtual-text")&&(c=ZE(f)),c.length>0&&typeof f.internal_transform=="function"&&(c=f.internal_transform(c))),u+=c}return u};$y.default=ZE});var Xy=Me(Zr=>{"use strict";var v2=Zr&&Zr.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Zr,"__esModule",{value:!0});Zr.setTextNodeValue=Zr.createTextNode=Zr.setStyle=Zr.setAttribute=Zr.removeChildNode=Zr.insertBeforeNode=Zr.appendChildNode=Zr.createNode=Zr.TEXT_NAME=void 0;var oB=v2(hc()),e6=v2(TE()),uB=v2(xE()),sB=v2(Yy()),lB=v2(Ky());Zr.TEXT_NAME="#text";Zr.createNode=i=>{var u;let f={nodeName:i,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:i==="ink-virtual-text"?void 0:oB.default.Node.create()};return i==="ink-text"&&((u=f.yogaNode)===null||u===void 0||u.setMeasureFunc(fB.bind(null,f))),f};Zr.appendChildNode=(i,u)=>{var f;u.parentNode&&Zr.removeChildNode(u.parentNode,u),u.parentNode=i,i.childNodes.push(u),u.yogaNode&&((f=i.yogaNode)===null||f===void 0||f.insertChild(u.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.insertBeforeNode=(i,u,f)=>{var c,g;u.parentNode&&Zr.removeChildNode(u.parentNode,u),u.parentNode=i;let t=i.childNodes.indexOf(f);if(t>=0){i.childNodes.splice(t,0,u),u.yogaNode&&((c=i.yogaNode)===null||c===void 0||c.insertChild(u.yogaNode,t));return}i.childNodes.push(u),u.yogaNode&&((g=i.yogaNode)===null||g===void 0||g.insertChild(u.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.removeChildNode=(i,u)=>{var f,c;u.yogaNode&&((c=(f=u.parentNode)===null||f===void 0?void 0:f.yogaNode)===null||c===void 0||c.removeChild(u.yogaNode)),u.parentNode=null;let g=i.childNodes.indexOf(u);g>=0&&i.childNodes.splice(g,1),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.setAttribute=(i,u,f)=>{i.attributes[u]=f};Zr.setStyle=(i,u)=>{i.style=u,i.yogaNode&&uB.default(i.yogaNode,u)};Zr.createTextNode=i=>{let u={nodeName:"#text",nodeValue:i,yogaNode:void 0,parentNode:null,style:{}};return Zr.setTextNodeValue(u,i),u};var fB=function(i,u){var f,c;let g=i.nodeName==="#text"?i.nodeValue:lB.default(i),t=e6.default(g);if(t.width<=u||t.width>=1&&u>0&&u<1)return t;let C=(c=(f=i.style)===null||f===void 0?void 0:f.textWrap)!==null&&c!==void 0?c:"wrap",A=sB.default(g,u,C);return e6.default(A)},t6=i=>{var u;if(!(!i||!i.parentNode))return(u=i.yogaNode)!==null&&u!==void 0?u:t6(i.parentNode)},jh=i=>{let u=t6(i);u==null||u.markDirty()};Zr.setTextNodeValue=(i,u)=>{typeof u!="string"&&(u=String(u)),i.nodeValue=u,jh(i)}});var mc=Me((Rb,n6)=>{"use strict";n6.exports={BINARY_TYPES:["nodebuffer","arraybuffer","fragments"],GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),EMPTY_BUFFER:Buffer.alloc(0),NOOP:()=>{}}});var g2=Me((Nb,Jy)=>{"use strict";var{EMPTY_BUFFER:cB}=mc();function r6(i,u){if(i.length===0)return cB;if(i.length===1)return i[0];let f=Buffer.allocUnsafe(u),c=0;for(let g=0;g{"use strict";var l6=Symbol("kDone"),Qy=Symbol("kRun"),f6=class{constructor(u){this[l6]=()=>{this.pending--,this[Qy]()},this.concurrency=u||Infinity,this.jobs=[],this.pending=0}add(u){this.jobs.push(u),this[Qy]()}[Qy](){if(this.pending!==this.concurrency&&this.jobs.length){let u=this.jobs.shift();this.pending++,u(this[l6])}}};s6.exports=f6});var w2=Me((jb,a6)=>{"use strict";var _2=require("zlib"),d6=g2(),aB=c6(),{kStatusCode:p6,NOOP:dB}=mc(),pB=Buffer.from([0,0,255,255]),qh=Symbol("permessage-deflate"),Xl=Symbol("total-length"),y2=Symbol("callback"),jf=Symbol("buffers"),Zy=Symbol("error"),zh,h6=class{constructor(u,f,c){if(this._maxPayload=c|0,this._options=u||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._isServer=!!f,this._deflate=null,this._inflate=null,this.params=null,!zh){let g=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;zh=new aB(g)}}static get extensionName(){return"permessage-deflate"}offer(){let u={};return this._options.serverNoContextTakeover&&(u.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(u.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(u.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?u.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(u.client_max_window_bits=!0),u}accept(u){return u=this.normalizeParams(u),this.params=this._isServer?this.acceptAsServer(u):this.acceptAsClient(u),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let u=this._deflate[y2];this._deflate.close(),this._deflate=null,u&&u(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(u){let f=this._options,c=u.find(g=>!(f.serverNoContextTakeover===!1&&g.server_no_context_takeover||g.server_max_window_bits&&(f.serverMaxWindowBits===!1||typeof f.serverMaxWindowBits=="number"&&f.serverMaxWindowBits>g.server_max_window_bits)||typeof f.clientMaxWindowBits=="number"&&!g.client_max_window_bits));if(!c)throw new Error("None of the extension offers can be accepted");return f.serverNoContextTakeover&&(c.server_no_context_takeover=!0),f.clientNoContextTakeover&&(c.client_no_context_takeover=!0),typeof f.serverMaxWindowBits=="number"&&(c.server_max_window_bits=f.serverMaxWindowBits),typeof f.clientMaxWindowBits=="number"?c.client_max_window_bits=f.clientMaxWindowBits:(c.client_max_window_bits===!0||f.clientMaxWindowBits===!1)&&delete c.client_max_window_bits,c}acceptAsClient(u){let f=u[0];if(this._options.clientNoContextTakeover===!1&&f.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!f.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(f.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&f.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return f}normalizeParams(u){return u.forEach(f=>{Object.keys(f).forEach(c=>{let g=f[c];if(g.length>1)throw new Error(`Parameter "${c}" must have only a single value`);if(g=g[0],c==="client_max_window_bits"){if(g!==!0){let t=+g;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${c}": ${g}`);g=t}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${c}": ${g}`)}else if(c==="server_max_window_bits"){let t=+g;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${c}": ${g}`);g=t}else if(c==="client_no_context_takeover"||c==="server_no_context_takeover"){if(g!==!0)throw new TypeError(`Invalid value for parameter "${c}": ${g}`)}else throw new Error(`Unknown parameter "${c}"`);f[c]=g})}),u}decompress(u,f,c){zh.add(g=>{this._decompress(u,f,(t,C)=>{g(),c(t,C)})})}compress(u,f,c){zh.add(g=>{this._compress(u,f,(t,C)=>{g(),c(t,C)})})}_decompress(u,f,c){let g=this._isServer?"client":"server";if(!this._inflate){let t=`${g}_max_window_bits`,C=typeof this.params[t]!="number"?_2.Z_DEFAULT_WINDOWBITS:this.params[t];this._inflate=_2.createInflateRaw(zn(dt({},this._options.zlibInflateOptions),{windowBits:C})),this._inflate[qh]=this,this._inflate[Xl]=0,this._inflate[jf]=[],this._inflate.on("error",mB),this._inflate.on("data",m6)}this._inflate[y2]=c,this._inflate.write(u),f&&this._inflate.write(pB),this._inflate.flush(()=>{let t=this._inflate[Zy];if(t){this._inflate.close(),this._inflate=null,c(t);return}let C=d6.concat(this._inflate[jf],this._inflate[Xl]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[Xl]=0,this._inflate[jf]=[],f&&this.params[`${g}_no_context_takeover`]&&this._inflate.reset()),c(null,C)})}_compress(u,f,c){let g=this._isServer?"server":"client";if(!this._deflate){let t=`${g}_max_window_bits`,C=typeof this.params[t]!="number"?_2.Z_DEFAULT_WINDOWBITS:this.params[t];this._deflate=_2.createDeflateRaw(zn(dt({},this._options.zlibDeflateOptions),{windowBits:C})),this._deflate[Xl]=0,this._deflate[jf]=[],this._deflate.on("error",dB),this._deflate.on("data",hB)}this._deflate[y2]=c,this._deflate.write(u),this._deflate.flush(_2.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let t=d6.concat(this._deflate[jf],this._deflate[Xl]);f&&(t=t.slice(0,t.length-4)),this._deflate[y2]=null,this._deflate[Xl]=0,this._deflate[jf]=[],f&&this.params[`${g}_no_context_takeover`]&&this._deflate.reset(),c(null,t)})}};a6.exports=h6;function hB(i){this[jf].push(i),this[Xl]+=i.length}function m6(i){if(this[Xl]+=i.length,this[qh]._maxPayload<1||this[Xl]<=this[qh]._maxPayload){this[jf].push(i);return}this[Zy]=new RangeError("Max payload size exceeded"),this[Zy][p6]=1009,this.removeListener("data",m6),this.reset()}function mB(i){this[qh]._inflate=null,i[p6]=1007,this[y2](i)}});var t3=Me((Ub,e3)=>{"use strict";function v6(i){return i>=1e3&&i<=1014&&i!==1004&&i!==1005&&i!==1006||i>=3e3&&i<=4999}function g6(i){let u=i.length,f=0;for(;f=u||(i[f+1]&192)!=128||(i[f+2]&192)!=128||i[f]===224&&(i[f+1]&224)==128||i[f]===237&&(i[f+1]&224)==160)return!1;f+=3}else if((i[f]&248)==240){if(f+3>=u||(i[f+1]&192)!=128||(i[f+2]&192)!=128||(i[f+3]&192)!=128||i[f]===240&&(i[f+1]&240)==128||i[f]===244&&i[f+1]>143||i[f]>244)return!1;f+=4}else return!1;return!0}try{let i=require("utf-8-validate");typeof i=="object"&&(i=i.Validation.isValidUTF8),e3.exports={isValidStatusCode:v6,isValidUTF8(u){return u.length<150?g6(u):i(u)}}}catch(i){e3.exports={isValidStatusCode:v6,isValidUTF8:g6}}});var i3=Me((qb,_6)=>{"use strict";var{Writable:vB}=require("stream"),y6=w2(),{BINARY_TYPES:gB,EMPTY_BUFFER:_B,kStatusCode:yB,kWebSocket:wB}=mc(),{concat:n3,toArrayBuffer:DB,unmask:EB}=g2(),{isValidStatusCode:SB,isValidUTF8:w6}=t3(),D2=0,D6=1,E6=2,S6=3,r3=4,CB=5,C6=class extends vB{constructor(u,f,c,g){super();this._binaryType=u||gB[0],this[wB]=void 0,this._extensions=f||{},this._isServer=!!c,this._maxPayload=g|0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._state=D2,this._loop=!1}_write(u,f,c){if(this._opcode===8&&this._state==D2)return c();this._bufferedBytes+=u.length,this._buffers.push(u),this.startLoop(c)}consume(u){if(this._bufferedBytes-=u,u===this._buffers[0].length)return this._buffers.shift();if(u=c.length?f.set(this._buffers.shift(),g):(f.set(new Uint8Array(c.buffer,c.byteOffset,u),g),this._buffers[0]=c.slice(u)),u-=c.length}while(u>0);return f}startLoop(u){let f;this._loop=!0;do switch(this._state){case D2:f=this.getInfo();break;case D6:f=this.getPayloadLength16();break;case E6:f=this.getPayloadLength64();break;case S6:this.getMask();break;case r3:f=this.getData(u);break;default:this._loop=!1;return}while(this._loop);u(f)}getInfo(){if(this._bufferedBytes<2){this._loop=!1;return}let u=this.consume(2);if((u[0]&48)!=0)return this._loop=!1,ii(RangeError,"RSV2 and RSV3 must be clear",!0,1002);let f=(u[0]&64)==64;if(f&&!this._extensions[y6.extensionName])return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(this._fin=(u[0]&128)==128,this._opcode=u[0]&15,this._payloadLength=u[1]&127,this._opcode===0){if(f)return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(!this._fragmented)return this._loop=!1,ii(RangeError,"invalid opcode 0",!0,1002);this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented)return this._loop=!1,ii(RangeError,`invalid opcode ${this._opcode}`,!0,1002);this._compressed=f}else if(this._opcode>7&&this._opcode<11){if(!this._fin)return this._loop=!1,ii(RangeError,"FIN must be set",!0,1002);if(f)return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(this._payloadLength>125)return this._loop=!1,ii(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002)}else return this._loop=!1,ii(RangeError,`invalid opcode ${this._opcode}`,!0,1002);if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(u[1]&128)==128,this._isServer){if(!this._masked)return this._loop=!1,ii(RangeError,"MASK must be set",!0,1002)}else if(this._masked)return this._loop=!1,ii(RangeError,"MASK must be clear",!0,1002);if(this._payloadLength===126)this._state=D6;else if(this._payloadLength===127)this._state=E6;else return this.haveLength()}getPayloadLength16(){if(this._bufferedBytes<2){this._loop=!1;return}return this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength()}getPayloadLength64(){if(this._bufferedBytes<8){this._loop=!1;return}let u=this.consume(8),f=u.readUInt32BE(0);return f>Math.pow(2,53-32)-1?(this._loop=!1,ii(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009)):(this._payloadLength=f*Math.pow(2,32)+u.readUInt32BE(4),this.haveLength())}haveLength(){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0))return this._loop=!1,ii(RangeError,"Max payload size exceeded",!1,1009);this._masked?this._state=S6:this._state=r3}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=r3}getData(u){let f=_B;if(this._payloadLength){if(this._bufferedBytes7)return this.controlMessage(f);if(this._compressed){this._state=CB,this.decompress(f,u);return}return f.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(f)),this.dataMessage()}decompress(u,f){this._extensions[y6.extensionName].decompress(u,this._fin,(g,t)=>{if(g)return f(g);if(t.length){if(this._messageLength+=t.length,this._messageLength>this._maxPayload&&this._maxPayload>0)return f(ii(RangeError,"Max payload size exceeded",!1,1009));this._fragments.push(t)}let C=this.dataMessage();if(C)return f(C);this.startLoop(f)})}dataMessage(){if(this._fin){let u=this._messageLength,f=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let c;this._binaryType==="nodebuffer"?c=n3(f,u):this._binaryType==="arraybuffer"?c=DB(n3(f,u)):c=f,this.emit("message",c)}else{let c=n3(f,u);if(!w6(c))return this._loop=!1,ii(Error,"invalid UTF-8 sequence",!0,1007);this.emit("message",c.toString())}}this._state=D2}controlMessage(u){if(this._opcode===8)if(this._loop=!1,u.length===0)this.emit("conclude",1005,""),this.end();else{if(u.length===1)return ii(RangeError,"invalid payload length 1",!0,1002);{let f=u.readUInt16BE(0);if(!SB(f))return ii(RangeError,`invalid status code ${f}`,!0,1002);let c=u.slice(2);if(!w6(c))return ii(Error,"invalid UTF-8 sequence",!0,1007);this.emit("conclude",f,c.toString()),this.end()}}else this._opcode===9?this.emit("ping",u):this.emit("pong",u);this._state=D2}};_6.exports=C6;function ii(i,u,f,c){let g=new i(f?`Invalid WebSocket frame: ${u}`:u);return Error.captureStackTrace(g,ii),g[yB]=c,g}});var o3=Me((zb,T6)=>{"use strict";var{randomFillSync:TB}=require("crypto"),x6=w2(),{EMPTY_BUFFER:xB}=mc(),{isValidStatusCode:kB}=t3(),{mask:k6,toBuffer:Jl}=g2(),vc=Buffer.alloc(4),Ql=class{constructor(u,f){this._extensions=f||{},this._socket=u,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._deflating=!1,this._queue=[]}static frame(u,f){let c=f.mask&&f.readOnly,g=f.mask?6:2,t=u.length;u.length>=65536?(g+=8,t=127):u.length>125&&(g+=2,t=126);let C=Buffer.allocUnsafe(c?u.length+g:g);return C[0]=f.fin?f.opcode|128:f.opcode,f.rsv1&&(C[0]|=64),C[1]=t,t===126?C.writeUInt16BE(u.length,2):t===127&&(C.writeUInt32BE(0,2),C.writeUInt32BE(u.length,6)),f.mask?(TB(vc,0,4),C[1]|=128,C[g-4]=vc[0],C[g-3]=vc[1],C[g-2]=vc[2],C[g-1]=vc[3],c?(k6(u,vc,C,g,u.length),[C]):(k6(u,vc,u,0,u.length),[C,u])):[C,u]}close(u,f,c,g){let t;if(u===void 0)t=xB;else{if(typeof u!="number"||!kB(u))throw new TypeError("First argument must be a valid error code number");if(f===void 0||f==="")t=Buffer.allocUnsafe(2),t.writeUInt16BE(u,0);else{let C=Buffer.byteLength(f);if(C>123)throw new RangeError("The message must not be greater than 123 bytes");t=Buffer.allocUnsafe(2+C),t.writeUInt16BE(u,0),t.write(f,2)}}this._deflating?this.enqueue([this.doClose,t,c,g]):this.doClose(t,c,g)}doClose(u,f,c){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:8,mask:f,readOnly:!1}),c)}ping(u,f,c){let g=Jl(u);if(g.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPing,g,f,Jl.readOnly,c]):this.doPing(g,f,Jl.readOnly,c)}doPing(u,f,c,g){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:9,mask:f,readOnly:c}),g)}pong(u,f,c){let g=Jl(u);if(g.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPong,g,f,Jl.readOnly,c]):this.doPong(g,f,Jl.readOnly,c)}doPong(u,f,c,g){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:10,mask:f,readOnly:c}),g)}send(u,f,c){let g=Jl(u),t=this._extensions[x6.extensionName],C=f.binary?2:1,A=f.compress;if(this._firstFragment?(this._firstFragment=!1,A&&t&&(A=g.length>=t._threshold),this._compress=A):(A=!1,C=0),f.fin&&(this._firstFragment=!0),t){let x={fin:f.fin,rsv1:A,opcode:C,mask:f.mask,readOnly:Jl.readOnly};this._deflating?this.enqueue([this.dispatch,g,this._compress,x,c]):this.dispatch(g,this._compress,x,c)}else this.sendFrame(Ql.frame(g,{fin:f.fin,rsv1:!1,opcode:C,mask:f.mask,readOnly:Jl.readOnly}),c)}dispatch(u,f,c,g){if(!f){this.sendFrame(Ql.frame(u,c),g);return}let t=this._extensions[x6.extensionName];this._bufferedBytes+=u.length,this._deflating=!0,t.compress(u,c.fin,(C,A)=>{if(this._socket.destroyed){let x=new Error("The socket was closed while data was being compressed");typeof g=="function"&&g(x);for(let D=0;D{"use strict";var E2=class{constructor(u,f){this.target=f,this.type=u}},O6=class extends E2{constructor(u,f){super("message",f);this.data=u}},I6=class extends E2{constructor(u,f,c){super("close",c);this.wasClean=c._closeFrameReceived&&c._closeFrameSent,this.reason=f,this.code=u}},P6=class extends E2{constructor(u){super("open",u)}},M6=class extends E2{constructor(u,f){super("error",f);this.message=u.message,this.error=u}},AB={addEventListener(i,u,f){if(typeof u!="function")return;function c(x){u.call(this,new O6(x,this))}function g(x,D){u.call(this,new I6(x,D,this))}function t(x){u.call(this,new M6(x,this))}function C(){u.call(this,new P6(this))}let A=f&&f.once?"once":"on";i==="message"?(c._listener=u,this[A](i,c)):i==="close"?(g._listener=u,this[A](i,g)):i==="error"?(t._listener=u,this[A](i,t)):i==="open"?(C._listener=u,this[A](i,C)):this[A](i,u)},removeEventListener(i,u){let f=this.listeners(i);for(let c=0;c{"use strict";var S2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function rl(i,u,f){i[u]===void 0?i[u]=[f]:i[u].push(f)}function OB(i){let u=Object.create(null);if(i===void 0||i==="")return u;let f=Object.create(null),c=!1,g=!1,t=!1,C,A,x=-1,D=-1,L=0;for(;L{let f=i[u];return Array.isArray(f)||(f=[f]),f.map(c=>[u].concat(Object.keys(c).map(g=>{let t=c[g];return Array.isArray(t)||(t=[t]),t.map(C=>C===!0?g:`${g}=${C}`).join("; ")})).join("; ")).join(", ")}).join(", ")}L6.exports={format:IB,parse:OB}});var a3=Me((bb,R6)=>{"use strict";var PB=require("events"),MB=require("https"),FB=require("http"),N6=require("net"),LB=require("tls"),{randomBytes:RB,createHash:NB}=require("crypto"),{URL:s3}=require("url"),Uf=w2(),BB=i3(),jB=o3(),{BINARY_TYPES:B6,EMPTY_BUFFER:l3,GUID:UB,kStatusCode:qB,kWebSocket:No,NOOP:j6}=mc(),{addEventListener:zB,removeEventListener:WB}=F6(),{format:HB,parse:bB}=u3(),{toBuffer:GB}=g2(),U6=["CONNECTING","OPEN","CLOSING","CLOSED"],f3=[8,13],VB=30*1e3,mr=class extends PB{constructor(u,f,c){super();this._binaryType=B6[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage="",this._closeTimer=null,this._extensions={},this._protocol="",this._readyState=mr.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,u!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,Array.isArray(f)?f=f.join(", "):typeof f=="object"&&f!==null&&(c=f,f=void 0),q6(this,u,f,c)):this._isServer=!0}get binaryType(){return this._binaryType}set binaryType(u){!B6.includes(u)||(this._binaryType=u,this._receiver&&(this._receiver._binaryType=u))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(u,f,c){let g=new BB(this.binaryType,this._extensions,this._isServer,c);this._sender=new jB(u,this._extensions),this._receiver=g,this._socket=u,g[No]=this,u[No]=this,g.on("conclude",YB),g.on("drain",$B),g.on("error",KB),g.on("message",XB),g.on("ping",JB),g.on("pong",QB),u.setTimeout(0),u.setNoDelay(),f.length>0&&u.unshift(f),u.on("close",z6),u.on("data",Wh),u.on("end",W6),u.on("error",H6),this._readyState=mr.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=mr.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[Uf.extensionName]&&this._extensions[Uf.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=mr.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(u,f){if(this.readyState!==mr.CLOSED){if(this.readyState===mr.CONNECTING){let c="WebSocket was closed before the connection was established";return Zl(this,this._req,c)}if(this.readyState===mr.CLOSING){this._closeFrameSent&&this._closeFrameReceived&&this._socket.end();return}this._readyState=mr.CLOSING,this._sender.close(u,f,!this._isServer,c=>{c||(this._closeFrameSent=!0,this._closeFrameReceived&&this._socket.end())}),this._closeTimer=setTimeout(this._socket.destroy.bind(this._socket),VB)}}ping(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof u=="function"?(c=u,u=f=void 0):typeof f=="function"&&(c=f,f=void 0),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}f===void 0&&(f=!this._isServer),this._sender.ping(u||l3,f,c)}pong(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof u=="function"?(c=u,u=f=void 0):typeof f=="function"&&(c=f,f=void 0),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}f===void 0&&(f=!this._isServer),this._sender.pong(u||l3,f,c)}send(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof f=="function"&&(c=f,f={}),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}let g=dt({binary:typeof u!="string",mask:!this._isServer,compress:!0,fin:!0},f);this._extensions[Uf.extensionName]||(g.compress=!1),this._sender.send(u||l3,g,c)}terminate(){if(this.readyState!==mr.CLOSED){if(this.readyState===mr.CONNECTING){let u="WebSocket was closed before the connection was established";return Zl(this,this._req,u)}this._socket&&(this._readyState=mr.CLOSING,this._socket.destroy())}}};U6.forEach((i,u)=>{let f={enumerable:!0,value:u};Object.defineProperty(mr.prototype,i,f),Object.defineProperty(mr,i,f)});["binaryType","bufferedAmount","extensions","protocol","readyState","url"].forEach(i=>{Object.defineProperty(mr.prototype,i,{enumerable:!0})});["open","error","close","message"].forEach(i=>{Object.defineProperty(mr.prototype,`on${i}`,{configurable:!0,enumerable:!0,get(){let u=this.listeners(i);for(let f=0;f{Zl(i,j,"Opening handshake has timed out")}),j.on("error",$=>{j===null||j.aborted||(j=i._req=null,i._readyState=mr.CLOSING,i.emit("error",$),i.emitClose())}),j.on("response",$=>{let h=$.headers.location,re=$.statusCode;if(h&&g.followRedirects&&re>=300&&re<400){if(++i._redirects>g.maxRedirects){Zl(i,j,"Maximum redirects exceeded");return}j.abort();let ce=new s3(h,u);q6(i,ce,f,c)}else i.emit("unexpected-response",j,$)||Zl(i,j,`Unexpected server response: ${$.statusCode}`)}),j.on("upgrade",($,h,re)=>{if(i.emit("upgrade",$),i.readyState!==mr.CONNECTING)return;j=i._req=null;let ce=NB("sha1").update(D+UB).digest("base64");if($.headers["sec-websocket-accept"]!==ce){Zl(i,h,"Invalid Sec-WebSocket-Accept header");return}let Q=$.headers["sec-websocket-protocol"],oe=(f||"").split(/, */),Se;if(!f&&Q?Se="Server sent a subprotocol but none was requested":f&&!Q?Se="Server sent no subprotocol":Q&&!oe.includes(Q)&&(Se="Server sent an invalid subprotocol"),Se){Zl(i,h,Se);return}if(Q&&(i._protocol=Q),N)try{let me=bB($.headers["sec-websocket-extensions"]);me[Uf.extensionName]&&(N.accept(me[Uf.extensionName]),i._extensions[Uf.extensionName]=N)}catch(me){Zl(i,h,"Invalid Sec-WebSocket-Extensions header");return}i.setSocket(h,re,g.maxPayload)})}function ZB(i){return i.path=i.socketPath,N6.connect(i)}function ej(i){return i.path=void 0,!i.servername&&i.servername!==""&&(i.servername=N6.isIP(i.host)?"":i.host),LB.connect(i)}function Zl(i,u,f){i._readyState=mr.CLOSING;let c=new Error(f);Error.captureStackTrace(c,Zl),u.setHeader?(u.abort(),u.socket&&!u.socket.destroyed&&u.socket.destroy(),u.once("abort",i.emitClose.bind(i)),i.emit("error",c)):(u.destroy(c),u.once("error",i.emit.bind(i,"error")),u.once("close",i.emitClose.bind(i)))}function c3(i,u,f){if(u){let c=GB(u).length;i._socket?i._sender._bufferedBytes+=c:i._bufferedAmount+=c}if(f){let c=new Error(`WebSocket is not open: readyState ${i.readyState} (${U6[i.readyState]})`);f(c)}}function YB(i,u){let f=this[No];f._socket.removeListener("data",Wh),f._socket.resume(),f._closeFrameReceived=!0,f._closeMessage=u,f._closeCode=i,i===1005?f.close():f.close(i,u)}function $B(){this[No]._socket.resume()}function KB(i){let u=this[No];u._socket.removeListener("data",Wh),u._readyState=mr.CLOSING,u._closeCode=i[qB],u.emit("error",i),u._socket.destroy()}function b6(){this[No].emitClose()}function XB(i){this[No].emit("message",i)}function JB(i){let u=this[No];u.pong(i,!u._isServer,j6),u.emit("ping",i)}function QB(i){this[No].emit("pong",i)}function z6(){let i=this[No];this.removeListener("close",z6),this.removeListener("end",W6),i._readyState=mr.CLOSING,i._socket.read(),i._receiver.end(),this.removeListener("data",Wh),this[No]=void 0,clearTimeout(i._closeTimer),i._receiver._writableState.finished||i._receiver._writableState.errorEmitted?i.emitClose():(i._receiver.on("error",b6),i._receiver.on("finish",b6))}function Wh(i){this[No]._receiver.write(i)||this.pause()}function W6(){let i=this[No];i._readyState=mr.CLOSING,i._receiver.end(),this.end()}function H6(){let i=this[No];this.removeListener("error",H6),this.on("error",j6),i&&(i._readyState=mr.CLOSING,this.destroy())}});var $6=Me((Gb,G6)=>{"use strict";var{Duplex:tj}=require("stream");function V6(i){i.emit("close")}function nj(){!this.destroyed&&this._writableState.finished&&this.destroy()}function Y6(i){this.removeListener("error",Y6),this.destroy(),this.listenerCount("error")===0&&this.emit("error",i)}function rj(i,u){let f=!0;function c(){f&&i._socket.resume()}i.readyState===i.CONNECTING?i.once("open",function(){i._receiver.removeAllListeners("drain"),i._receiver.on("drain",c)}):(i._receiver.removeAllListeners("drain"),i._receiver.on("drain",c));let g=new tj(zn(dt({},u),{autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1}));return i.on("message",function(C){g.push(C)||(f=!1,i._socket.pause())}),i.once("error",function(C){g.destroyed||g.destroy(C)}),i.once("close",function(){g.destroyed||g.push(null)}),g._destroy=function(t,C){if(i.readyState===i.CLOSED){C(t),process.nextTick(V6,g);return}let A=!1;i.once("error",function(D){A=!0,C(D)}),i.once("close",function(){A||C(t),process.nextTick(V6,g)}),i.terminate()},g._final=function(t){if(i.readyState===i.CONNECTING){i.once("open",function(){g._final(t)});return}i._socket!==null&&(i._socket._writableState.finished?(t(),g._readableState.endEmitted&&g.destroy()):(i._socket.once("finish",function(){t()}),i.close()))},g._read=function(){i.readyState===i.OPEN&&!f&&(f=!0,i._receiver._writableState.needDrain||i._socket.resume())},g._write=function(t,C,A){if(i.readyState===i.CONNECTING){i.once("open",function(){g._write(t,C,A)});return}i.send(t,A)},g.on("end",nj),g.on("error",Y6),g}G6.exports=rj});var J6=Me((Vb,K6)=>{"use strict";var ij=require("events"),{createHash:oj}=require("crypto"),{createServer:uj,STATUS_CODES:d3}=require("http"),gc=w2(),sj=a3(),{format:lj,parse:fj}=u3(),{GUID:cj,kWebSocket:aj}=mc(),dj=/^[+/0-9A-Za-z]{22}==$/,X6=class extends ij{constructor(u,f){super();if(u=dt({maxPayload:100*1024*1024,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null},u),u.port==null&&!u.server&&!u.noServer)throw new TypeError('One of the "port", "server", or "noServer" options must be specified');if(u.port!=null?(this._server=uj((c,g)=>{let t=d3[426];g.writeHead(426,{"Content-Length":t.length,"Content-Type":"text/plain"}),g.end(t)}),this._server.listen(u.port,u.host,u.backlog,f)):u.server&&(this._server=u.server),this._server){let c=this.emit.bind(this,"connection");this._removeListeners=pj(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(g,t,C)=>{this.handleUpgrade(g,t,C,c)}})}u.perMessageDeflate===!0&&(u.perMessageDeflate={}),u.clientTracking&&(this.clients=new Set),this.options=u}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(u){if(u&&this.once("close",u),this.clients)for(let c of this.clients)c.terminate();let f=this._server;if(f&&(this._removeListeners(),this._removeListeners=this._server=null,this.options.port!=null)){f.close(()=>this.emit("close"));return}process.nextTick(hj,this)}shouldHandle(u){if(this.options.path){let f=u.url.indexOf("?");if((f!==-1?u.url.slice(0,f):u.url)!==this.options.path)return!1}return!0}handleUpgrade(u,f,c,g){f.on("error",p3);let t=u.headers["sec-websocket-key"]!==void 0?u.headers["sec-websocket-key"].trim():!1,C=+u.headers["sec-websocket-version"],A={};if(u.method!=="GET"||u.headers.upgrade.toLowerCase()!=="websocket"||!t||!dj.test(t)||C!==8&&C!==13||!this.shouldHandle(u))return Hh(f,400);if(this.options.perMessageDeflate){let x=new gc(this.options.perMessageDeflate,!0,this.options.maxPayload);try{let D=fj(u.headers["sec-websocket-extensions"]);D[gc.extensionName]&&(x.accept(D[gc.extensionName]),A[gc.extensionName]=x)}catch(D){return Hh(f,400)}}if(this.options.verifyClient){let x={origin:u.headers[`${C===8?"sec-websocket-origin":"origin"}`],secure:!!(u.socket.authorized||u.socket.encrypted),req:u};if(this.options.verifyClient.length===2){this.options.verifyClient(x,(D,L,N,j)=>{if(!D)return Hh(f,L||401,N,j);this.completeUpgrade(t,A,u,f,c,g)});return}if(!this.options.verifyClient(x))return Hh(f,401)}this.completeUpgrade(t,A,u,f,c,g)}completeUpgrade(u,f,c,g,t,C){if(!g.readable||!g.writable)return g.destroy();if(g[aj])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");let A=oj("sha1").update(u+cj).digest("base64"),x=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${A}`],D=new sj(null),L=c.headers["sec-websocket-protocol"];if(L&&(L=L.split(",").map(mj),this.options.handleProtocols?L=this.options.handleProtocols(L,c):L=L[0],L&&(x.push(`Sec-WebSocket-Protocol: ${L}`),D._protocol=L)),f[gc.extensionName]){let N=f[gc.extensionName].params,j=lj({[gc.extensionName]:[N]});x.push(`Sec-WebSocket-Extensions: ${j}`),D._extensions=f}this.emit("headers",x,c),g.write(x.concat(`\r -`).join(`\r -`)),g.removeListener("error",p3),D.setSocket(g,t,this.options.maxPayload),this.clients&&(this.clients.add(D),D.on("close",()=>this.clients.delete(D))),C(D,c)}};K6.exports=X6;function pj(i,u){for(let f of Object.keys(u))i.on(f,u[f]);return function(){for(let c of Object.keys(u))i.removeListener(c,u[c])}}function hj(i){i.emit("close")}function p3(){this.destroy()}function Hh(i,u,f,c){i.writable&&(f=f||d3[u],c=dt({Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(f)},c),i.write(`HTTP/1.1 ${u} ${d3[u]}\r -`+Object.keys(c).map(g=>`${g}: ${c[g]}`).join(`\r -`)+`\r -\r -`+f)),i.removeListener("error",p3),i.destroy()}function mj(i){return i.trim()}});var Z6=Me((Yb,Q6)=>{"use strict";var C2=a3();C2.createWebSocketStream=$6();C2.Server=J6();C2.Receiver=i3();C2.Sender=o3();Q6.exports=C2});var eS=Me(bh=>{"use strict";var vj=bh&&bh.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(bh,"__esModule",{value:!0});var gj=vj(Z6()),T2=global;T2.WebSocket||(T2.WebSocket=gj.default);T2.window||(T2.window=global);T2.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__=[{type:1,value:7,isEnabled:!0},{type:2,value:"InternalApp",isEnabled:!0,isValid:!0},{type:2,value:"InternalAppContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdoutContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStderrContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdinContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalFocusContext",isEnabled:!0,isValid:!0}]});var tS=Me((Gh,h3)=>{(function(i,u){typeof Gh=="object"&&typeof h3=="object"?h3.exports=u():typeof define=="function"&&define.amd?define([],u):typeof Gh=="object"?Gh.ReactDevToolsBackend=u():i.ReactDevToolsBackend=u()})(window,function(){return function(i){var u={};function f(c){if(u[c])return u[c].exports;var g=u[c]={i:c,l:!1,exports:{}};return i[c].call(g.exports,g,g.exports,f),g.l=!0,g.exports}return f.m=i,f.c=u,f.d=function(c,g,t){f.o(c,g)||Object.defineProperty(c,g,{enumerable:!0,get:t})},f.r=function(c){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},f.t=function(c,g){if(1&g&&(c=f(c)),8&g||4&g&&typeof c=="object"&&c&&c.__esModule)return c;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:c}),2&g&&typeof c!="string")for(var C in c)f.d(t,C,function(A){return c[A]}.bind(null,C));return t},f.n=function(c){var g=c&&c.__esModule?function(){return c.default}:function(){return c};return f.d(g,"a",g),g},f.o=function(c,g){return Object.prototype.hasOwnProperty.call(c,g)},f.p="",f(f.s=20)}([function(i,u,f){"use strict";i.exports=f(12)},function(i,u,f){"use strict";var c=Object.getOwnPropertySymbols,g=Object.prototype.hasOwnProperty,t=Object.prototype.propertyIsEnumerable;function C(A){if(A==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(A)}i.exports=function(){try{if(!Object.assign)return!1;var A=new String("abc");if(A[5]="de",Object.getOwnPropertyNames(A)[0]==="5")return!1;for(var x={},D=0;D<10;D++)x["_"+String.fromCharCode(D)]=D;if(Object.getOwnPropertyNames(x).map(function(N){return x[N]}).join("")!=="0123456789")return!1;var L={};return"abcdefghijklmnopqrst".split("").forEach(function(N){L[N]=N}),Object.keys(Object.assign({},L)).join("")==="abcdefghijklmnopqrst"}catch(N){return!1}}()?Object.assign:function(A,x){for(var D,L,N=C(A),j=1;j=J||Ft<0||Nt&&it-At>=ot}function Z(){var it=ce();if(ge(it))return Ae(it);Ue=setTimeout(Z,function(Ft){var jt=J-(Ft-be);return Nt?re(jt,ot-(Ft-At)):jt}(it))}function Ae(it){return Ue=void 0,Je&&Oe?V(it):(Oe=Le=void 0,ct)}function at(){var it=ce(),Ft=ge(it);if(Oe=arguments,Le=this,be=it,Ft){if(Ue===void 0)return ne(be);if(Nt)return Ue=setTimeout(Z,J),V(be)}return Ue===void 0&&(Ue=setTimeout(Z,J)),ct}return J=me(J)||0,oe(Te)&&(Ot=!!Te.leading,ot=(Nt="maxWait"in Te)?h(me(Te.maxWait)||0,J):ot,Je="trailing"in Te?!!Te.trailing:Je),at.cancel=function(){Ue!==void 0&&clearTimeout(Ue),At=0,Oe=be=Le=Ue=void 0},at.flush=function(){return Ue===void 0?ct:Ae(ce())},at}function oe(De){var J=g(De);return!!De&&(J=="object"||J=="function")}function Se(De){return g(De)=="symbol"||function(J){return!!J&&g(J)=="object"}(De)&&$.call(De)=="[object Symbol]"}function me(De){if(typeof De=="number")return De;if(Se(De))return NaN;if(oe(De)){var J=typeof De.valueOf=="function"?De.valueOf():De;De=oe(J)?J+"":J}if(typeof De!="string")return De===0?De:+De;De=De.replace(t,"");var Te=A.test(De);return Te||x.test(De)?D(De.slice(2),Te?2:8):C.test(De)?NaN:+De}i.exports=function(De,J,Te){var Oe=!0,Le=!0;if(typeof De!="function")throw new TypeError("Expected a function");return oe(Te)&&(Oe="leading"in Te?!!Te.leading:Oe,Le="trailing"in Te?!!Te.trailing:Le),Q(De,J,{leading:Oe,maxWait:J,trailing:Le})}}).call(this,f(4))},function(i,u,f){(function(c){function g(V){return(g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(ne){return typeof ne}:function(ne){return ne&&typeof Symbol=="function"&&ne.constructor===Symbol&&ne!==Symbol.prototype?"symbol":typeof ne})(V)}var t;u=i.exports=h,t=(c===void 0?"undefined":g(c))==="object"&&c.env&&c.env.NODE_DEBUG&&/\bsemver\b/i.test(c.env.NODE_DEBUG)?function(){var V=Array.prototype.slice.call(arguments,0);V.unshift("SEMVER"),console.log.apply(console,V)}:function(){},u.SEMVER_SPEC_VERSION="2.0.0";var C=Number.MAX_SAFE_INTEGER||9007199254740991,A=u.re=[],x=u.src=[],D=u.tokens={},L=0;function N(V){D[V]=L++}N("NUMERICIDENTIFIER"),x[D.NUMERICIDENTIFIER]="0|[1-9]\\d*",N("NUMERICIDENTIFIERLOOSE"),x[D.NUMERICIDENTIFIERLOOSE]="[0-9]+",N("NONNUMERICIDENTIFIER"),x[D.NONNUMERICIDENTIFIER]="\\d*[a-zA-Z-][a-zA-Z0-9-]*",N("MAINVERSION"),x[D.MAINVERSION]="("+x[D.NUMERICIDENTIFIER]+")\\.("+x[D.NUMERICIDENTIFIER]+")\\.("+x[D.NUMERICIDENTIFIER]+")",N("MAINVERSIONLOOSE"),x[D.MAINVERSIONLOOSE]="("+x[D.NUMERICIDENTIFIERLOOSE]+")\\.("+x[D.NUMERICIDENTIFIERLOOSE]+")\\.("+x[D.NUMERICIDENTIFIERLOOSE]+")",N("PRERELEASEIDENTIFIER"),x[D.PRERELEASEIDENTIFIER]="(?:"+x[D.NUMERICIDENTIFIER]+"|"+x[D.NONNUMERICIDENTIFIER]+")",N("PRERELEASEIDENTIFIERLOOSE"),x[D.PRERELEASEIDENTIFIERLOOSE]="(?:"+x[D.NUMERICIDENTIFIERLOOSE]+"|"+x[D.NONNUMERICIDENTIFIER]+")",N("PRERELEASE"),x[D.PRERELEASE]="(?:-("+x[D.PRERELEASEIDENTIFIER]+"(?:\\."+x[D.PRERELEASEIDENTIFIER]+")*))",N("PRERELEASELOOSE"),x[D.PRERELEASELOOSE]="(?:-?("+x[D.PRERELEASEIDENTIFIERLOOSE]+"(?:\\."+x[D.PRERELEASEIDENTIFIERLOOSE]+")*))",N("BUILDIDENTIFIER"),x[D.BUILDIDENTIFIER]="[0-9A-Za-z-]+",N("BUILD"),x[D.BUILD]="(?:\\+("+x[D.BUILDIDENTIFIER]+"(?:\\."+x[D.BUILDIDENTIFIER]+")*))",N("FULL"),N("FULLPLAIN"),x[D.FULLPLAIN]="v?"+x[D.MAINVERSION]+x[D.PRERELEASE]+"?"+x[D.BUILD]+"?",x[D.FULL]="^"+x[D.FULLPLAIN]+"$",N("LOOSEPLAIN"),x[D.LOOSEPLAIN]="[v=\\s]*"+x[D.MAINVERSIONLOOSE]+x[D.PRERELEASELOOSE]+"?"+x[D.BUILD]+"?",N("LOOSE"),x[D.LOOSE]="^"+x[D.LOOSEPLAIN]+"$",N("GTLT"),x[D.GTLT]="((?:<|>)?=?)",N("XRANGEIDENTIFIERLOOSE"),x[D.XRANGEIDENTIFIERLOOSE]=x[D.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*",N("XRANGEIDENTIFIER"),x[D.XRANGEIDENTIFIER]=x[D.NUMERICIDENTIFIER]+"|x|X|\\*",N("XRANGEPLAIN"),x[D.XRANGEPLAIN]="[v=\\s]*("+x[D.XRANGEIDENTIFIER]+")(?:\\.("+x[D.XRANGEIDENTIFIER]+")(?:\\.("+x[D.XRANGEIDENTIFIER]+")(?:"+x[D.PRERELEASE]+")?"+x[D.BUILD]+"?)?)?",N("XRANGEPLAINLOOSE"),x[D.XRANGEPLAINLOOSE]="[v=\\s]*("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:"+x[D.PRERELEASELOOSE]+")?"+x[D.BUILD]+"?)?)?",N("XRANGE"),x[D.XRANGE]="^"+x[D.GTLT]+"\\s*"+x[D.XRANGEPLAIN]+"$",N("XRANGELOOSE"),x[D.XRANGELOOSE]="^"+x[D.GTLT]+"\\s*"+x[D.XRANGEPLAINLOOSE]+"$",N("COERCE"),x[D.COERCE]="(^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])",N("COERCERTL"),A[D.COERCERTL]=new RegExp(x[D.COERCE],"g"),N("LONETILDE"),x[D.LONETILDE]="(?:~>?)",N("TILDETRIM"),x[D.TILDETRIM]="(\\s*)"+x[D.LONETILDE]+"\\s+",A[D.TILDETRIM]=new RegExp(x[D.TILDETRIM],"g"),N("TILDE"),x[D.TILDE]="^"+x[D.LONETILDE]+x[D.XRANGEPLAIN]+"$",N("TILDELOOSE"),x[D.TILDELOOSE]="^"+x[D.LONETILDE]+x[D.XRANGEPLAINLOOSE]+"$",N("LONECARET"),x[D.LONECARET]="(?:\\^)",N("CARETTRIM"),x[D.CARETTRIM]="(\\s*)"+x[D.LONECARET]+"\\s+",A[D.CARETTRIM]=new RegExp(x[D.CARETTRIM],"g"),N("CARET"),x[D.CARET]="^"+x[D.LONECARET]+x[D.XRANGEPLAIN]+"$",N("CARETLOOSE"),x[D.CARETLOOSE]="^"+x[D.LONECARET]+x[D.XRANGEPLAINLOOSE]+"$",N("COMPARATORLOOSE"),x[D.COMPARATORLOOSE]="^"+x[D.GTLT]+"\\s*("+x[D.LOOSEPLAIN]+")$|^$",N("COMPARATOR"),x[D.COMPARATOR]="^"+x[D.GTLT]+"\\s*("+x[D.FULLPLAIN]+")$|^$",N("COMPARATORTRIM"),x[D.COMPARATORTRIM]="(\\s*)"+x[D.GTLT]+"\\s*("+x[D.LOOSEPLAIN]+"|"+x[D.XRANGEPLAIN]+")",A[D.COMPARATORTRIM]=new RegExp(x[D.COMPARATORTRIM],"g"),N("HYPHENRANGE"),x[D.HYPHENRANGE]="^\\s*("+x[D.XRANGEPLAIN]+")\\s+-\\s+("+x[D.XRANGEPLAIN]+")\\s*$",N("HYPHENRANGELOOSE"),x[D.HYPHENRANGELOOSE]="^\\s*("+x[D.XRANGEPLAINLOOSE]+")\\s+-\\s+("+x[D.XRANGEPLAINLOOSE]+")\\s*$",N("STAR"),x[D.STAR]="(<|>)?=?\\s*\\*";for(var j=0;j256||!(ne.loose?A[D.LOOSE]:A[D.FULL]).test(V))return null;try{return new h(V,ne)}catch(ge){return null}}function h(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof h){if(V.loose===ne.loose)return V;V=V.version}else if(typeof V!="string")throw new TypeError("Invalid Version: "+V);if(V.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof h))return new h(V,ne);t("SemVer",V,ne),this.options=ne,this.loose=!!ne.loose;var ge=V.trim().match(ne.loose?A[D.LOOSE]:A[D.FULL]);if(!ge)throw new TypeError("Invalid Version: "+V);if(this.raw=V,this.major=+ge[1],this.minor=+ge[2],this.patch=+ge[3],this.major>C||this.major<0)throw new TypeError("Invalid major version");if(this.minor>C||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>C||this.patch<0)throw new TypeError("Invalid patch version");ge[4]?this.prerelease=ge[4].split(".").map(function(Z){if(/^[0-9]+$/.test(Z)){var Ae=+Z;if(Ae>=0&&Ae=0;)typeof this.prerelease[ge]=="number"&&(this.prerelease[ge]++,ge=-2);ge===-1&&this.prerelease.push(0)}ne&&(this.prerelease[0]===ne?isNaN(this.prerelease[1])&&(this.prerelease=[ne,0]):this.prerelease=[ne,0]);break;default:throw new Error("invalid increment argument: "+V)}return this.format(),this.raw=this.version,this},u.inc=function(V,ne,ge,Z){typeof ge=="string"&&(Z=ge,ge=void 0);try{return new h(V,ge).inc(ne,Z).version}catch(Ae){return null}},u.diff=function(V,ne){if(me(V,ne))return null;var ge=$(V),Z=$(ne),Ae="";if(ge.prerelease.length||Z.prerelease.length){Ae="pre";var at="prerelease"}for(var it in ge)if((it==="major"||it==="minor"||it==="patch")&&ge[it]!==Z[it])return Ae+it;return at},u.compareIdentifiers=ce;var re=/^[0-9]+$/;function ce(V,ne){var ge=re.test(V),Z=re.test(ne);return ge&&Z&&(V=+V,ne=+ne),V===ne?0:ge&&!Z?-1:Z&&!ge?1:V0}function Se(V,ne,ge){return Q(V,ne,ge)<0}function me(V,ne,ge){return Q(V,ne,ge)===0}function De(V,ne,ge){return Q(V,ne,ge)!==0}function J(V,ne,ge){return Q(V,ne,ge)>=0}function Te(V,ne,ge){return Q(V,ne,ge)<=0}function Oe(V,ne,ge,Z){switch(ne){case"===":return g(V)==="object"&&(V=V.version),g(ge)==="object"&&(ge=ge.version),V===ge;case"!==":return g(V)==="object"&&(V=V.version),g(ge)==="object"&&(ge=ge.version),V!==ge;case"":case"=":case"==":return me(V,ge,Z);case"!=":return De(V,ge,Z);case">":return oe(V,ge,Z);case">=":return J(V,ge,Z);case"<":return Se(V,ge,Z);case"<=":return Te(V,ge,Z);default:throw new TypeError("Invalid operator: "+ne)}}function Le(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof Le){if(V.loose===!!ne.loose)return V;V=V.value}if(!(this instanceof Le))return new Le(V,ne);t("comparator",V,ne),this.options=ne,this.loose=!!ne.loose,this.parse(V),this.semver===ot?this.value="":this.value=this.operator+this.semver.version,t("comp",this)}u.rcompareIdentifiers=function(V,ne){return ce(ne,V)},u.major=function(V,ne){return new h(V,ne).major},u.minor=function(V,ne){return new h(V,ne).minor},u.patch=function(V,ne){return new h(V,ne).patch},u.compare=Q,u.compareLoose=function(V,ne){return Q(V,ne,!0)},u.compareBuild=function(V,ne,ge){var Z=new h(V,ge),Ae=new h(ne,ge);return Z.compare(Ae)||Z.compareBuild(Ae)},u.rcompare=function(V,ne,ge){return Q(ne,V,ge)},u.sort=function(V,ne){return V.sort(function(ge,Z){return u.compareBuild(ge,Z,ne)})},u.rsort=function(V,ne){return V.sort(function(ge,Z){return u.compareBuild(Z,ge,ne)})},u.gt=oe,u.lt=Se,u.eq=me,u.neq=De,u.gte=J,u.lte=Te,u.cmp=Oe,u.Comparator=Le;var ot={};function ct(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof ct)return V.loose===!!ne.loose&&V.includePrerelease===!!ne.includePrerelease?V:new ct(V.raw,ne);if(V instanceof Le)return new ct(V.value,ne);if(!(this instanceof ct))return new ct(V,ne);if(this.options=ne,this.loose=!!ne.loose,this.includePrerelease=!!ne.includePrerelease,this.raw=V,this.set=V.split(/\s*\|\|\s*/).map(function(ge){return this.parseRange(ge.trim())},this).filter(function(ge){return ge.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+V);this.format()}function Ue(V,ne){for(var ge=!0,Z=V.slice(),Ae=Z.pop();ge&&Z.length;)ge=Z.every(function(at){return Ae.intersects(at,ne)}),Ae=Z.pop();return ge}function be(V){return!V||V.toLowerCase()==="x"||V==="*"}function At(V,ne,ge,Z,Ae,at,it,Ft,jt,hn,Un,Jt,Yt){return((ne=be(ge)?"":be(Z)?">="+ge+".0.0":be(Ae)?">="+ge+"."+Z+".0":">="+ne)+" "+(Ft=be(jt)?"":be(hn)?"<"+(+jt+1)+".0.0":be(Un)?"<"+jt+"."+(+hn+1)+".0":Jt?"<="+jt+"."+hn+"."+Un+"-"+Jt:"<="+Ft)).trim()}function Ot(V,ne,ge){for(var Z=0;Z0){var Ae=V[Z].semver;if(Ae.major===ne.major&&Ae.minor===ne.minor&&Ae.patch===ne.patch)return!0}return!1}return!0}function Nt(V,ne,ge){try{ne=new ct(ne,ge)}catch(Z){return!1}return ne.test(V)}function Je(V,ne,ge,Z){var Ae,at,it,Ft,jt;switch(V=new h(V,Z),ne=new ct(ne,Z),ge){case">":Ae=oe,at=Te,it=Se,Ft=">",jt=">=";break;case"<":Ae=Se,at=J,it=oe,Ft="<",jt="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Nt(V,ne,Z))return!1;for(var hn=0;hn=0.0.0")),Jt=Jt||cr,Yt=Yt||cr,Ae(cr.semver,Jt.semver,Z)?Jt=cr:it(cr.semver,Yt.semver,Z)&&(Yt=cr)}),Jt.operator===Ft||Jt.operator===jt||(!Yt.operator||Yt.operator===Ft)&&at(V,Yt.semver)||Yt.operator===jt&&it(V,Yt.semver))return!1}return!0}Le.prototype.parse=function(V){var ne=this.options.loose?A[D.COMPARATORLOOSE]:A[D.COMPARATOR],ge=V.match(ne);if(!ge)throw new TypeError("Invalid comparator: "+V);this.operator=ge[1]!==void 0?ge[1]:"",this.operator==="="&&(this.operator=""),ge[2]?this.semver=new h(ge[2],this.options.loose):this.semver=ot},Le.prototype.toString=function(){return this.value},Le.prototype.test=function(V){if(t("Comparator.test",V,this.options.loose),this.semver===ot||V===ot)return!0;if(typeof V=="string")try{V=new h(V,this.options)}catch(ne){return!1}return Oe(V,this.operator,this.semver,this.options)},Le.prototype.intersects=function(V,ne){if(!(V instanceof Le))throw new TypeError("a Comparator is required");var ge;if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),this.operator==="")return this.value===""||(ge=new ct(V.value,ne),Nt(this.value,ge,ne));if(V.operator==="")return V.value===""||(ge=new ct(this.value,ne),Nt(V.semver,ge,ne));var Z=!(this.operator!==">="&&this.operator!==">"||V.operator!==">="&&V.operator!==">"),Ae=!(this.operator!=="<="&&this.operator!=="<"||V.operator!=="<="&&V.operator!=="<"),at=this.semver.version===V.semver.version,it=!(this.operator!==">="&&this.operator!=="<="||V.operator!==">="&&V.operator!=="<="),Ft=Oe(this.semver,"<",V.semver,ne)&&(this.operator===">="||this.operator===">")&&(V.operator==="<="||V.operator==="<"),jt=Oe(this.semver,">",V.semver,ne)&&(this.operator==="<="||this.operator==="<")&&(V.operator===">="||V.operator===">");return Z||Ae||at&&it||Ft||jt},u.Range=ct,ct.prototype.format=function(){return this.range=this.set.map(function(V){return V.join(" ").trim()}).join("||").trim(),this.range},ct.prototype.toString=function(){return this.range},ct.prototype.parseRange=function(V){var ne=this.options.loose;V=V.trim();var ge=ne?A[D.HYPHENRANGELOOSE]:A[D.HYPHENRANGE];V=V.replace(ge,At),t("hyphen replace",V),V=V.replace(A[D.COMPARATORTRIM],"$1$2$3"),t("comparator trim",V,A[D.COMPARATORTRIM]),V=(V=(V=V.replace(A[D.TILDETRIM],"$1~")).replace(A[D.CARETTRIM],"$1^")).split(/\s+/).join(" ");var Z=ne?A[D.COMPARATORLOOSE]:A[D.COMPARATOR],Ae=V.split(" ").map(function(at){return function(it,Ft){return t("comp",it,Ft),it=function(jt,hn){return jt.trim().split(/\s+/).map(function(Un){return function(Jt,Yt){t("caret",Jt,Yt);var cr=Yt.loose?A[D.CARETLOOSE]:A[D.CARET];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn){var vr;return t("caret",Jt,w,pt,Mn,Bn,Xn),be(pt)?vr="":be(Mn)?vr=">="+pt+".0.0 <"+(+pt+1)+".0.0":be(Bn)?vr=pt==="0"?">="+pt+"."+Mn+".0 <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+".0 <"+(+pt+1)+".0.0":Xn?(t("replaceCaret pr",Xn),vr=pt==="0"?Mn==="0"?">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+Mn+"."+(+Bn+1):">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+(+pt+1)+".0.0"):(t("no pr"),vr=pt==="0"?Mn==="0"?">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+Mn+"."+(+Bn+1):">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+"."+Bn+" <"+(+pt+1)+".0.0"),t("caret return",vr),vr})}(Un,hn)}).join(" ")}(it,Ft),t("caret",it),it=function(jt,hn){return jt.trim().split(/\s+/).map(function(Un){return function(Jt,Yt){var cr=Yt.loose?A[D.TILDELOOSE]:A[D.TILDE];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn){var vr;return t("tilde",Jt,w,pt,Mn,Bn,Xn),be(pt)?vr="":be(Mn)?vr=">="+pt+".0.0 <"+(+pt+1)+".0.0":be(Bn)?vr=">="+pt+"."+Mn+".0 <"+pt+"."+(+Mn+1)+".0":Xn?(t("replaceTilde pr",Xn),vr=">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+(+Mn+1)+".0"):vr=">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+(+Mn+1)+".0",t("tilde return",vr),vr})}(Un,hn)}).join(" ")}(it,Ft),t("tildes",it),it=function(jt,hn){return t("replaceXRanges",jt,hn),jt.split(/\s+/).map(function(Un){return function(Jt,Yt){Jt=Jt.trim();var cr=Yt.loose?A[D.XRANGELOOSE]:A[D.XRANGE];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn,vr){t("xRange",Jt,w,pt,Mn,Bn,Xn,vr);var gr=be(Mn),r0=gr||be(Bn),Ci=r0||be(Xn),yo=Ci;return pt==="="&&yo&&(pt=""),vr=Yt.includePrerelease?"-0":"",gr?w=pt===">"||pt==="<"?"<0.0.0-0":"*":pt&&yo?(r0&&(Bn=0),Xn=0,pt===">"?(pt=">=",r0?(Mn=+Mn+1,Bn=0,Xn=0):(Bn=+Bn+1,Xn=0)):pt==="<="&&(pt="<",r0?Mn=+Mn+1:Bn=+Bn+1),w=pt+Mn+"."+Bn+"."+Xn+vr):r0?w=">="+Mn+".0.0"+vr+" <"+(+Mn+1)+".0.0"+vr:Ci&&(w=">="+Mn+"."+Bn+".0"+vr+" <"+Mn+"."+(+Bn+1)+".0"+vr),t("xRange return",w),w})}(Un,hn)}).join(" ")}(it,Ft),t("xrange",it),it=function(jt,hn){return t("replaceStars",jt,hn),jt.trim().replace(A[D.STAR],"")}(it,Ft),t("stars",it),it}(at,this.options)},this).join(" ").split(/\s+/);return this.options.loose&&(Ae=Ae.filter(function(at){return!!at.match(Z)})),Ae=Ae.map(function(at){return new Le(at,this.options)},this)},ct.prototype.intersects=function(V,ne){if(!(V instanceof ct))throw new TypeError("a Range is required");return this.set.some(function(ge){return Ue(ge,ne)&&V.set.some(function(Z){return Ue(Z,ne)&&ge.every(function(Ae){return Z.every(function(at){return Ae.intersects(at,ne)})})})})},u.toComparators=function(V,ne){return new ct(V,ne).set.map(function(ge){return ge.map(function(Z){return Z.value}).join(" ").trim().split(" ")})},ct.prototype.test=function(V){if(!V)return!1;if(typeof V=="string")try{V=new h(V,this.options)}catch(ge){return!1}for(var ne=0;ne":at.prerelease.length===0?at.patch++:at.prerelease.push(0),at.raw=at.format();case"":case">=":ge&&!oe(ge,at)||(ge=at);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+Ae.operator)}});return ge&&V.test(ge)?ge:null},u.validRange=function(V,ne){try{return new ct(V,ne).range||"*"}catch(ge){return null}},u.ltr=function(V,ne,ge){return Je(V,ne,"<",ge)},u.gtr=function(V,ne,ge){return Je(V,ne,">",ge)},u.outside=Je,u.prerelease=function(V,ne){var ge=$(V,ne);return ge&&ge.prerelease.length?ge.prerelease:null},u.intersects=function(V,ne,ge){return V=new ct(V,ge),ne=new ct(ne,ge),V.intersects(ne)},u.coerce=function(V,ne){if(V instanceof h)return V;if(typeof V=="number"&&(V=String(V)),typeof V!="string")return null;var ge=null;if((ne=ne||{}).rtl){for(var Z;(Z=A[D.COERCERTL].exec(V))&&(!ge||ge.index+ge[0].length!==V.length);)ge&&Z.index+Z[0].length===ge.index+ge[0].length||(ge=Z),A[D.COERCERTL].lastIndex=Z.index+Z[1].length+Z[2].length;A[D.COERCERTL].lastIndex=-1}else ge=V.match(A[D.COERCE]);return ge===null?null:$(ge[2]+"."+(ge[3]||"0")+"."+(ge[4]||"0"),ne)}}).call(this,f(5))},function(i,u){function f(g){return(f=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(g)}var c;c=function(){return this}();try{c=c||new Function("return this")()}catch(g){(typeof window=="undefined"?"undefined":f(window))==="object"&&(c=window)}i.exports=c},function(i,u){var f,c,g=i.exports={};function t(){throw new Error("setTimeout has not been defined")}function C(){throw new Error("clearTimeout has not been defined")}function A(ce){if(f===setTimeout)return setTimeout(ce,0);if((f===t||!f)&&setTimeout)return f=setTimeout,setTimeout(ce,0);try{return f(ce,0)}catch(Q){try{return f.call(null,ce,0)}catch(oe){return f.call(this,ce,0)}}}(function(){try{f=typeof setTimeout=="function"?setTimeout:t}catch(ce){f=t}try{c=typeof clearTimeout=="function"?clearTimeout:C}catch(ce){c=C}})();var x,D=[],L=!1,N=-1;function j(){L&&x&&(L=!1,x.length?D=x.concat(D):N=-1,D.length&&$())}function $(){if(!L){var ce=A(j);L=!0;for(var Q=D.length;Q;){for(x=D,D=[];++N1)for(var oe=1;oethis[C])return De(this,this[h].get(Ue)),!1;var Je=this[h].get(Ue).value;return this[N]&&(this[j]||this[N](Ue,Je.value)),Je.now=Ot,Je.maxAge=At,Je.value=be,this[A]+=Nt-Je.length,Je.length=Nt,this.get(Ue),me(this),!0}var V=new J(Ue,be,Nt,Ot,At);return V.length>this[C]?(this[N]&&this[N](Ue,be),!1):(this[A]+=V.length,this[$].unshift(V),this[h].set(Ue,this[$].head),me(this),!0)}},{key:"has",value:function(Ue){if(!this[h].has(Ue))return!1;var be=this[h].get(Ue).value;return!Se(this,be)}},{key:"get",value:function(Ue){return oe(this,Ue,!0)}},{key:"peek",value:function(Ue){return oe(this,Ue,!1)}},{key:"pop",value:function(){var Ue=this[$].tail;return Ue?(De(this,Ue),Ue.value):null}},{key:"del",value:function(Ue){De(this,this[h].get(Ue))}},{key:"load",value:function(Ue){this.reset();for(var be=Date.now(),At=Ue.length-1;At>=0;At--){var Ot=Ue[At],Nt=Ot.e||0;if(Nt===0)this.set(Ot.k,Ot.v);else{var Je=Nt-be;Je>0&&this.set(Ot.k,Ot.v,Je)}}}},{key:"prune",value:function(){var Ue=this;this[h].forEach(function(be,At){return oe(Ue,At,!1)})}},{key:"max",set:function(Ue){if(typeof Ue!="number"||Ue<0)throw new TypeError("max must be a non-negative number");this[C]=Ue||1/0,me(this)},get:function(){return this[C]}},{key:"allowStale",set:function(Ue){this[D]=!!Ue},get:function(){return this[D]}},{key:"maxAge",set:function(Ue){if(typeof Ue!="number")throw new TypeError("maxAge must be a non-negative number");this[L]=Ue,me(this)},get:function(){return this[L]}},{key:"lengthCalculator",set:function(Ue){var be=this;typeof Ue!="function"&&(Ue=ce),Ue!==this[x]&&(this[x]=Ue,this[A]=0,this[$].forEach(function(At){At.length=be[x](At.value,At.key),be[A]+=At.length})),me(this)},get:function(){return this[x]}},{key:"length",get:function(){return this[A]}},{key:"itemCount",get:function(){return this[$].length}}])&&g(Le.prototype,ot),ct&&g(Le,ct),Oe}(),oe=function(Oe,Le,ot){var ct=Oe[h].get(Le);if(ct){var Ue=ct.value;if(Se(Oe,Ue)){if(De(Oe,ct),!Oe[D])return}else ot&&(Oe[re]&&(ct.value.now=Date.now()),Oe[$].unshiftNode(ct));return Ue.value}},Se=function(Oe,Le){if(!Le||!Le.maxAge&&!Oe[L])return!1;var ot=Date.now()-Le.now;return Le.maxAge?ot>Le.maxAge:Oe[L]&&ot>Oe[L]},me=function(Oe){if(Oe[A]>Oe[C])for(var Le=Oe[$].tail;Oe[A]>Oe[C]&&Le!==null;){var ot=Le.prev;De(Oe,Le),Le=ot}},De=function(Oe,Le){if(Le){var ot=Le.value;Oe[N]&&Oe[N](ot.key,ot.value),Oe[A]-=ot.length,Oe[h].delete(ot.key),Oe[$].removeNode(Le)}},J=function Oe(Le,ot,ct,Ue,be){c(this,Oe),this.key=Le,this.value=ot,this.length=ct,this.now=Ue,this.maxAge=be||0},Te=function(Oe,Le,ot,ct){var Ue=ot.value;Se(Oe,Ue)&&(De(Oe,ot),Oe[D]||(Ue=void 0)),Ue&&Le.call(ct,Ue.value,Ue.key,Oe)};i.exports=Q},function(i,u,f){(function(c){function g(t){return(g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(C){return typeof C}:function(C){return C&&typeof Symbol=="function"&&C.constructor===Symbol&&C!==Symbol.prototype?"symbol":typeof C})(t)}i.exports=function(){if(typeof document=="undefined"||!document.addEventListener)return null;var t,C,A,x={};return x.copy=function(){var D=!1,L=null,N=!1;function j(){D=!1,L=null,N&&window.getSelection().removeAllRanges(),N=!1}return document.addEventListener("copy",function($){if(D){for(var h in L)$.clipboardData.setData(h,L[h]);$.preventDefault()}}),function($){return new Promise(function(h,re){D=!0,typeof $=="string"?L={"text/plain":$}:$ instanceof Node?L={"text/html":new XMLSerializer().serializeToString($)}:$ instanceof Object?L=$:re("Invalid data type. Must be string, DOM node, or an object mapping MIME types to strings."),function ce(Q){try{if(document.execCommand("copy"))j(),h();else{if(Q)throw j(),new Error("Unable to copy. Perhaps it's not available in your browser?");(function(){var oe=document.getSelection();if(!document.queryCommandEnabled("copy")&&oe.isCollapsed){var Se=document.createRange();Se.selectNodeContents(document.body),oe.removeAllRanges(),oe.addRange(Se),N=!0}})(),ce(!0)}}catch(oe){j(),re(oe)}}(!1)})}}(),x.paste=(A=!1,document.addEventListener("paste",function(D){if(A){A=!1,D.preventDefault();var L=t;t=null,L(D.clipboardData.getData(C))}}),function(D){return new Promise(function(L,N){A=!0,t=L,C=D||"text/plain";try{document.execCommand("paste")||(A=!1,N(new Error("Unable to paste. Pasting only works in Internet Explorer at the moment.")))}catch(j){A=!1,N(new Error(j))}})}),typeof ClipboardEvent=="undefined"&&window.clipboardData!==void 0&&window.clipboardData.setData!==void 0&&(function(D){function L(me,De){return function(){me.apply(De,arguments)}}function N(me){if(g(this)!="object")throw new TypeError("Promises must be constructed via new");if(typeof me!="function")throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],Q(me,L($,this),L(h,this))}function j(me){var De=this;return this._state===null?void this._deferreds.push(me):void oe(function(){var J=De._state?me.onFulfilled:me.onRejected;if(J!==null){var Te;try{Te=J(De._value)}catch(Oe){return void me.reject(Oe)}me.resolve(Te)}else(De._state?me.resolve:me.reject)(De._value)})}function $(me){try{if(me===this)throw new TypeError("A promise cannot be resolved with itself.");if(me&&(g(me)=="object"||typeof me=="function")){var De=me.then;if(typeof De=="function")return void Q(L(De,me),L($,this),L(h,this))}this._state=!0,this._value=me,re.call(this)}catch(J){h.call(this,J)}}function h(me){this._state=!1,this._value=me,re.call(this)}function re(){for(var me=0,De=this._deferreds.length;De>me;me++)j.call(this,this._deferreds[me]);this._deferreds=null}function ce(me,De,J,Te){this.onFulfilled=typeof me=="function"?me:null,this.onRejected=typeof De=="function"?De:null,this.resolve=J,this.reject=Te}function Q(me,De,J){var Te=!1;try{me(function(Oe){Te||(Te=!0,De(Oe))},function(Oe){Te||(Te=!0,J(Oe))})}catch(Oe){if(Te)return;Te=!0,J(Oe)}}var oe=N.immediateFn||typeof c=="function"&&c||function(me){setTimeout(me,1)},Se=Array.isArray||function(me){return Object.prototype.toString.call(me)==="[object Array]"};N.prototype.catch=function(me){return this.then(null,me)},N.prototype.then=function(me,De){var J=this;return new N(function(Te,Oe){j.call(J,new ce(me,De,Te,Oe))})},N.all=function(){var me=Array.prototype.slice.call(arguments.length===1&&Se(arguments[0])?arguments[0]:arguments);return new N(function(De,J){function Te(ot,ct){try{if(ct&&(g(ct)=="object"||typeof ct=="function")){var Ue=ct.then;if(typeof Ue=="function")return void Ue.call(ct,function(be){Te(ot,be)},J)}me[ot]=ct,--Oe==0&&De(me)}catch(be){J(be)}}if(me.length===0)return De([]);for(var Oe=me.length,Le=0;LeTe;Te++)me[Te].then(De,J)})},i.exports?i.exports=N:D.Promise||(D.Promise=N)}(this),x.copy=function(D){return new Promise(function(L,N){if(typeof D!="string"&&!("text/plain"in D))throw new Error("You must provide a text/plain type.");var j=typeof D=="string"?D:D["text/plain"];window.clipboardData.setData("Text",j)?L():N(new Error("Copying was rejected."))})},x.paste=function(){return new Promise(function(D,L){var N=window.clipboardData.getData("Text");N?D(N):L(new Error("Pasting was rejected."))})}),x}()}).call(this,f(13).setImmediate)},function(i,u,f){"use strict";i.exports=f(15)},function(i,u,f){"use strict";f.r(u),u.default=`:root { - /** - * IMPORTANT: When new theme variables are added below\u2013 also add them to SettingsContext updateThemeVariables() - */ - - /* Light theme */ - --light-color-attribute-name: #ef6632; - --light-color-attribute-name-not-editable: #23272f; - --light-color-attribute-name-inverted: rgba(255, 255, 255, 0.7); - --light-color-attribute-value: #1a1aa6; - --light-color-attribute-value-inverted: #ffffff; - --light-color-attribute-editable-value: #1a1aa6; - --light-color-background: #ffffff; - --light-color-background-hover: rgba(0, 136, 250, 0.1); - --light-color-background-inactive: #e5e5e5; - --light-color-background-invalid: #fff0f0; - --light-color-background-selected: #0088fa; - --light-color-button-background: #ffffff; - --light-color-button-background-focus: #ededed; - --light-color-button: #5f6673; - --light-color-button-disabled: #cfd1d5; - --light-color-button-active: #0088fa; - --light-color-button-focus: #23272f; - --light-color-button-hover: #23272f; - --light-color-border: #eeeeee; - --light-color-commit-did-not-render-fill: #cfd1d5; - --light-color-commit-did-not-render-fill-text: #000000; - --light-color-commit-did-not-render-pattern: #cfd1d5; - --light-color-commit-did-not-render-pattern-text: #333333; - --light-color-commit-gradient-0: #37afa9; - --light-color-commit-gradient-1: #63b19e; - --light-color-commit-gradient-2: #80b393; - --light-color-commit-gradient-3: #97b488; - --light-color-commit-gradient-4: #abb67d; - --light-color-commit-gradient-5: #beb771; - --light-color-commit-gradient-6: #cfb965; - --light-color-commit-gradient-7: #dfba57; - --light-color-commit-gradient-8: #efbb49; - --light-color-commit-gradient-9: #febc38; - --light-color-commit-gradient-text: #000000; - --light-color-component-name: #6a51b2; - --light-color-component-name-inverted: #ffffff; - --light-color-component-badge-background: rgba(0, 0, 0, 0.1); - --light-color-component-badge-background-inverted: rgba(255, 255, 255, 0.25); - --light-color-component-badge-count: #777d88; - --light-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); - --light-color-context-background: rgba(0,0,0,.9); - --light-color-context-background-hover: rgba(255, 255, 255, 0.1); - --light-color-context-background-selected: #178fb9; - --light-color-context-border: #3d424a; - --light-color-context-text: #ffffff; - --light-color-context-text-selected: #ffffff; - --light-color-dim: #777d88; - --light-color-dimmer: #cfd1d5; - --light-color-dimmest: #eff0f1; - --light-color-error-background: hsl(0, 100%, 97%); - --light-color-error-border: hsl(0, 100%, 92%); - --light-color-error-text: #ff0000; - --light-color-expand-collapse-toggle: #777d88; - --light-color-link: #0000ff; - --light-color-modal-background: rgba(255, 255, 255, 0.75); - --light-color-record-active: #fc3a4b; - --light-color-record-hover: #3578e5; - --light-color-record-inactive: #0088fa; - --light-color-scroll-thumb: #c2c2c2; - --light-color-scroll-track: #fafafa; - --light-color-search-match: yellow; - --light-color-search-match-current: #f7923b; - --light-color-selected-tree-highlight-active: rgba(0, 136, 250, 0.1); - --light-color-selected-tree-highlight-inactive: rgba(0, 0, 0, 0.05); - --light-color-shadow: rgba(0, 0, 0, 0.25); - --light-color-tab-selected-border: #0088fa; - --light-color-text: #000000; - --light-color-text-invalid: #ff0000; - --light-color-text-selected: #ffffff; - --light-color-toggle-background-invalid: #fc3a4b; - --light-color-toggle-background-on: #0088fa; - --light-color-toggle-background-off: #cfd1d5; - --light-color-toggle-text: #ffffff; - --light-color-tooltip-background: rgba(0, 0, 0, 0.9); - --light-color-tooltip-text: #ffffff; - - /* Dark theme */ - --dark-color-attribute-name: #9d87d2; - --dark-color-attribute-name-not-editable: #ededed; - --dark-color-attribute-name-inverted: #282828; - --dark-color-attribute-value: #cedae0; - --dark-color-attribute-value-inverted: #ffffff; - --dark-color-attribute-editable-value: yellow; - --dark-color-background: #282c34; - --dark-color-background-hover: rgba(255, 255, 255, 0.1); - --dark-color-background-inactive: #3d424a; - --dark-color-background-invalid: #5c0000; - --dark-color-background-selected: #178fb9; - --dark-color-button-background: #282c34; - --dark-color-button-background-focus: #3d424a; - --dark-color-button: #afb3b9; - --dark-color-button-active: #61dafb; - --dark-color-button-disabled: #4f5766; - --dark-color-button-focus: #a2e9fc; - --dark-color-button-hover: #ededed; - --dark-color-border: #3d424a; - --dark-color-commit-did-not-render-fill: #777d88; - --dark-color-commit-did-not-render-fill-text: #000000; - --dark-color-commit-did-not-render-pattern: #666c77; - --dark-color-commit-did-not-render-pattern-text: #ffffff; - --dark-color-commit-gradient-0: #37afa9; - --dark-color-commit-gradient-1: #63b19e; - --dark-color-commit-gradient-2: #80b393; - --dark-color-commit-gradient-3: #97b488; - --dark-color-commit-gradient-4: #abb67d; - --dark-color-commit-gradient-5: #beb771; - --dark-color-commit-gradient-6: #cfb965; - --dark-color-commit-gradient-7: #dfba57; - --dark-color-commit-gradient-8: #efbb49; - --dark-color-commit-gradient-9: #febc38; - --dark-color-commit-gradient-text: #000000; - --dark-color-component-name: #61dafb; - --dark-color-component-name-inverted: #282828; - --dark-color-component-badge-background: rgba(255, 255, 255, 0.25); - --dark-color-component-badge-background-inverted: rgba(0, 0, 0, 0.25); - --dark-color-component-badge-count: #8f949d; - --dark-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); - --dark-color-context-background: rgba(255,255,255,.9); - --dark-color-context-background-hover: rgba(0, 136, 250, 0.1); - --dark-color-context-background-selected: #0088fa; - --dark-color-context-border: #eeeeee; - --dark-color-context-text: #000000; - --dark-color-context-text-selected: #ffffff; - --dark-color-dim: #8f949d; - --dark-color-dimmer: #777d88; - --dark-color-dimmest: #4f5766; - --dark-color-error-background: #200; - --dark-color-error-border: #900; - --dark-color-error-text: #f55; - --dark-color-expand-collapse-toggle: #8f949d; - --dark-color-link: #61dafb; - --dark-color-modal-background: rgba(0, 0, 0, 0.75); - --dark-color-record-active: #fc3a4b; - --dark-color-record-hover: #a2e9fc; - --dark-color-record-inactive: #61dafb; - --dark-color-scroll-thumb: #afb3b9; - --dark-color-scroll-track: #313640; - --dark-color-search-match: yellow; - --dark-color-search-match-current: #f7923b; - --dark-color-selected-tree-highlight-active: rgba(23, 143, 185, 0.15); - --dark-color-selected-tree-highlight-inactive: rgba(255, 255, 255, 0.05); - --dark-color-shadow: rgba(0, 0, 0, 0.5); - --dark-color-tab-selected-border: #178fb9; - --dark-color-text: #ffffff; - --dark-color-text-invalid: #ff8080; - --dark-color-text-selected: #ffffff; - --dark-color-toggle-background-invalid: #fc3a4b; - --dark-color-toggle-background-on: #178fb9; - --dark-color-toggle-background-off: #777d88; - --dark-color-toggle-text: #ffffff; - --dark-color-tooltip-background: rgba(255, 255, 255, 0.9); - --dark-color-tooltip-text: #000000; - - /* Font smoothing */ - --light-font-smoothing: auto; - --dark-font-smoothing: antialiased; - --font-smoothing: auto; - - /* Compact density */ - --compact-font-size-monospace-small: 9px; - --compact-font-size-monospace-normal: 11px; - --compact-font-size-monospace-large: 15px; - --compact-font-size-sans-small: 10px; - --compact-font-size-sans-normal: 12px; - --compact-font-size-sans-large: 14px; - --compact-line-height-data: 18px; - --compact-root-font-size: 16px; - - /* Comfortable density */ - --comfortable-font-size-monospace-small: 10px; - --comfortable-font-size-monospace-normal: 13px; - --comfortable-font-size-monospace-large: 17px; - --comfortable-font-size-sans-small: 12px; - --comfortable-font-size-sans-normal: 14px; - --comfortable-font-size-sans-large: 16px; - --comfortable-line-height-data: 22px; - --comfortable-root-font-size: 20px; - - /* GitHub.com system fonts */ - --font-family-monospace: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, - Courier, monospace; - --font-family-sans: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, - Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; - - /* Constant values shared between JS and CSS */ - --interaction-commit-size: 10px; - --interaction-label-width: 200px; -} -`},function(i,u,f){"use strict";function c(x){var D=this;if(D instanceof c||(D=new c),D.tail=null,D.head=null,D.length=0,x&&typeof x.forEach=="function")x.forEach(function(j){D.push(j)});else if(arguments.length>0)for(var L=0,N=arguments.length;L1)L=D;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");N=this.head.next,L=this.head.value}for(var j=0;N!==null;j++)L=x(L,N.value,j),N=N.next;return L},c.prototype.reduceReverse=function(x,D){var L,N=this.tail;if(arguments.length>1)L=D;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");N=this.tail.prev,L=this.tail.value}for(var j=this.length-1;N!==null;j--)L=x(L,N.value,j),N=N.prev;return L},c.prototype.toArray=function(){for(var x=new Array(this.length),D=0,L=this.head;L!==null;D++)x[D]=L.value,L=L.next;return x},c.prototype.toArrayReverse=function(){for(var x=new Array(this.length),D=0,L=this.tail;L!==null;D++)x[D]=L.value,L=L.prev;return x},c.prototype.slice=function(x,D){(D=D||this.length)<0&&(D+=this.length),(x=x||0)<0&&(x+=this.length);var L=new c;if(Dthis.length&&(D=this.length);for(var N=0,j=this.head;j!==null&&Nthis.length&&(D=this.length);for(var N=this.length,j=this.tail;j!==null&&N>D;N--)j=j.prev;for(;j!==null&&N>x;N--,j=j.prev)L.push(j.value);return L},c.prototype.splice=function(x,D){x>this.length&&(x=this.length-1),x<0&&(x=this.length+x);for(var L=0,N=this.head;N!==null&&L=0&&(A._idleTimeoutId=setTimeout(function(){A._onTimeout&&A._onTimeout()},x))},f(14),u.setImmediate=typeof self!="undefined"&&self.setImmediate||c!==void 0&&c.setImmediate||this&&this.setImmediate,u.clearImmediate=typeof self!="undefined"&&self.clearImmediate||c!==void 0&&c.clearImmediate||this&&this.clearImmediate}).call(this,f(4))},function(i,u,f){(function(c,g){(function(t,C){"use strict";if(!t.setImmediate){var A,x,D,L,N,j=1,$={},h=!1,re=t.document,ce=Object.getPrototypeOf&&Object.getPrototypeOf(t);ce=ce&&ce.setTimeout?ce:t,{}.toString.call(t.process)==="[object process]"?A=function(Se){g.nextTick(function(){oe(Se)})}:function(){if(t.postMessage&&!t.importScripts){var Se=!0,me=t.onmessage;return t.onmessage=function(){Se=!1},t.postMessage("","*"),t.onmessage=me,Se}}()?(L="setImmediate$"+Math.random()+"$",N=function(Se){Se.source===t&&typeof Se.data=="string"&&Se.data.indexOf(L)===0&&oe(+Se.data.slice(L.length))},t.addEventListener?t.addEventListener("message",N,!1):t.attachEvent("onmessage",N),A=function(Se){t.postMessage(L+Se,"*")}):t.MessageChannel?((D=new MessageChannel).port1.onmessage=function(Se){oe(Se.data)},A=function(Se){D.port2.postMessage(Se)}):re&&"onreadystatechange"in re.createElement("script")?(x=re.documentElement,A=function(Se){var me=re.createElement("script");me.onreadystatechange=function(){oe(Se),me.onreadystatechange=null,x.removeChild(me),me=null},x.appendChild(me)}):A=function(Se){setTimeout(oe,0,Se)},ce.setImmediate=function(Se){typeof Se!="function"&&(Se=new Function(""+Se));for(var me=new Array(arguments.length-1),De=0;Dene;ne++)if((V=Q(Je,Ot,ne))!==-1){ce=ne,Ot=V;break e}Ot=-1}}e:{if(Je=Nt,(V=j().get(At.primitive))!==void 0){for(ne=0;neOt-Je?null:Nt.slice(Je,Ot-1))!==null){if(Ot=0,Le!==null){for(;OtOt;Le--)ot=Ue.pop()}for(Le=Nt.length-Ot-1;1<=Le;Le--)Ot=[],ot.push({id:null,isStateEditable:!1,name:Se(Nt[Le-1].functionName),value:void 0,subHooks:Ot}),Ue.push(ot),ot=Ot;Le=Nt}Ot=(Nt=At.primitive)==="Context"||Nt==="DebugValue"?null:ct++,ot.push({id:Ot,isStateEditable:Nt==="Reducer"||Nt==="State",name:Nt,value:At.value,subHooks:[]})}return function ge(Z,Ae){for(var at=[],it=0;it-1&&($=$.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(\),.*$)/g,""));var h=$.replace(/^\s+/,"").replace(/\(eval code/g,"("),re=h.match(/ (\((.+):(\d+):(\d+)\)$)/),ce=(h=re?h.replace(re[0],""):h).split(/\s+/).slice(1),Q=this.extractLocation(re?re[1]:ce.pop()),oe=ce.join(" ")||void 0,Se=["eval",""].indexOf(Q[0])>-1?void 0:Q[0];return new x({functionName:oe,fileName:Se,lineNumber:Q[1],columnNumber:Q[2],source:$})},this)},parseFFOrSafari:function(j){return j.stack.split(` -`).filter(function($){return!$.match(N)},this).map(function($){if($.indexOf(" > eval")>-1&&($=$.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),$.indexOf("@")===-1&&$.indexOf(":")===-1)return new x({functionName:$});var h=/((.*".+"[^@]*)?[^@]*)(?:@)/,re=$.match(h),ce=re&&re[1]?re[1]:void 0,Q=this.extractLocation($.replace(h,""));return new x({functionName:ce,fileName:Q[0],lineNumber:Q[1],columnNumber:Q[2],source:$})},this)},parseOpera:function(j){return!j.stacktrace||j.message.indexOf(` -`)>-1&&j.message.split(` -`).length>j.stacktrace.split(` -`).length?this.parseOpera9(j):j.stack?this.parseOpera11(j):this.parseOpera10(j)},parseOpera9:function(j){for(var $=/Line (\d+).*script (?:in )?(\S+)/i,h=j.message.split(` -`),re=[],ce=2,Q=h.length;ce/,"$2").replace(/\([^)]*\)/g,"")||void 0;Q.match(/\(([^)]*)\)/)&&(h=Q.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var Se=h===void 0||h==="[arguments not available]"?void 0:h.split(",");return new x({functionName:oe,args:Se,fileName:ce[0],lineNumber:ce[1],columnNumber:ce[2],source:$})},this)}}})=="function"?c.apply(u,g):c)===void 0||(i.exports=t)})()},function(i,u,f){var c,g,t;(function(C,A){"use strict";g=[],(t=typeof(c=function(){function x(oe){return oe.charAt(0).toUpperCase()+oe.substring(1)}function D(oe){return function(){return this[oe]}}var L=["isConstructor","isEval","isNative","isToplevel"],N=["columnNumber","lineNumber"],j=["fileName","functionName","source"],$=L.concat(N,j,["args"]);function h(oe){if(oe)for(var Se=0;Se<$.length;Se++)oe[$[Se]]!==void 0&&this["set"+x($[Se])](oe[$[Se]])}h.prototype={getArgs:function(){return this.args},setArgs:function(oe){if(Object.prototype.toString.call(oe)!=="[object Array]")throw new TypeError("Args must be an Array");this.args=oe},getEvalOrigin:function(){return this.evalOrigin},setEvalOrigin:function(oe){if(oe instanceof h)this.evalOrigin=oe;else{if(!(oe instanceof Object))throw new TypeError("Eval Origin must be an Object or StackFrame");this.evalOrigin=new h(oe)}},toString:function(){var oe=this.getFileName()||"",Se=this.getLineNumber()||"",me=this.getColumnNumber()||"",De=this.getFunctionName()||"";return this.getIsEval()?oe?"[eval] ("+oe+":"+Se+":"+me+")":"[eval]:"+Se+":"+me:De?De+" ("+oe+":"+Se+":"+me+")":oe+":"+Se+":"+me}},h.fromString=function(oe){var Se=oe.indexOf("("),me=oe.lastIndexOf(")"),De=oe.substring(0,Se),J=oe.substring(Se+1,me).split(","),Te=oe.substring(me+1);if(Te.indexOf("@")===0)var Oe=/@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(Te,""),Le=Oe[1],ot=Oe[2],ct=Oe[3];return new h({functionName:De,args:J||void 0,fileName:Le,lineNumber:ot||void 0,columnNumber:ct||void 0})};for(var re=0;re1?de-1:0),ve=1;ve=0&&de.splice(W,1)}}}])&&c(R.prototype,U),H&&c(R,H),F}(),t=f(2),C=f.n(t);try{var A=f(9).default,x=function(F){var R=new RegExp("".concat(F,": ([0-9]+)")),U=A.match(R);return parseInt(U[1],10)};x("comfortable-line-height-data"),x("compact-line-height-data")}catch(F){}function D(F){try{return sessionStorage.getItem(F)}catch(R){return null}}function L(F){try{sessionStorage.removeItem(F)}catch(R){}}function N(F,R){try{return sessionStorage.setItem(F,R)}catch(U){}}var j=function(F,R){return F===R},$=f(1),h=f.n($);function re(F){return F.ownerDocument?F.ownerDocument.defaultView:null}function ce(F){var R=re(F);return R?R.frameElement:null}function Q(F){var R=me(F);return oe([F.getBoundingClientRect(),{top:R.borderTop,left:R.borderLeft,bottom:R.borderBottom,right:R.borderRight,width:0,height:0}])}function oe(F){return F.reduce(function(R,U){return R==null?U:{top:R.top+U.top,left:R.left+U.left,width:R.width,height:R.height,bottom:R.bottom+U.bottom,right:R.right+U.right}})}function Se(F,R){var U=ce(F);if(U&&U!==R){for(var H=[F.getBoundingClientRect()],fe=U,ue=!1;fe;){var de=Q(fe);if(H.push(de),fe=ce(fe),ue)break;fe&&re(fe)===R&&(ue=!0)}return oe(H)}return F.getBoundingClientRect()}function me(F){var R=window.getComputedStyle(F);return{borderLeft:parseInt(R.borderLeftWidth,10),borderRight:parseInt(R.borderRightWidth,10),borderTop:parseInt(R.borderTopWidth,10),borderBottom:parseInt(R.borderBottomWidth,10),marginLeft:parseInt(R.marginLeft,10),marginRight:parseInt(R.marginRight,10),marginTop:parseInt(R.marginTop,10),marginBottom:parseInt(R.marginBottom,10),paddingLeft:parseInt(R.paddingLeft,10),paddingRight:parseInt(R.paddingRight,10),paddingTop:parseInt(R.paddingTop,10),paddingBottom:parseInt(R.paddingBottom,10)}}function De(F,R){var U;if(typeof Symbol=="undefined"||F[Symbol.iterator]==null){if(Array.isArray(F)||(U=function(ve,Fe){if(!!ve){if(typeof ve=="string")return J(ve,Fe);var Ge=Object.prototype.toString.call(ve).slice(8,-1);if(Ge==="Object"&&ve.constructor&&(Ge=ve.constructor.name),Ge==="Map"||Ge==="Set")return Array.from(ve);if(Ge==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Ge))return J(ve,Fe)}}(F))||R&&F&&typeof F.length=="number"){U&&(F=U);var H=0,fe=function(){};return{s:fe,n:function(){return H>=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function J(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);Ude.left+de.width&&(K=de.left+de.width-Ge-5),{style:{top:ve+="px",left:K+="px"}}}(R,U,{width:H.width,height:H.height});h()(this.tip.style,fe.style)}}]),F}(),Ue=function(){function F(){Te(this,F);var R=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.window=R;var U=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.tipBoundsWindow=U;var H=R.document;this.container=H.createElement("div"),this.container.style.zIndex="10000000",this.tip=new ct(H,this.container),this.rects=[],H.body.appendChild(this.container)}return Le(F,[{key:"remove",value:function(){this.tip.remove(),this.rects.forEach(function(R){R.remove()}),this.rects.length=0,this.container.parentNode&&this.container.parentNode.removeChild(this.container)}},{key:"inspect",value:function(R,U){for(var H=this,fe=R.filter(function(Xe){return Xe.nodeType===Node.ELEMENT_NODE});this.rects.length>fe.length;)this.rects.pop().remove();if(fe.length!==0){for(;this.rects.length1&&arguments[1]!==void 0?arguments[1]:j,je=void 0,Xe=[],rt=void 0,st=!1,xt=function(lt,Rt){return xe(lt,Xe[Rt])},wt=function(){for(var lt=arguments.length,Rt=Array(lt),yn=0;yn5&&arguments[5]!==void 0?arguments[5]:0,W=cl(F);switch(W){case"html_element":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.tagName,type:W};case"function":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:typeof F.name!="function"&&F.name?F.name:"function",type:W};case"string":return F.length<=500?F:F.slice(0,500)+"...";case"bigint":case"symbol":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.toString(),type:W};case"react_element":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:al(F)||"Unknown",type:W};case"array_buffer":case"data_view":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:W==="data_view"?"DataView":"ArrayBuffer",size:F.byteLength,type:W};case"array":return ue=fe(H),de>=2&&!ue?yo(W,!0,F,R,H):F.map(function(Ge,K){return Ds(Ge,R,U,H.concat([K]),fe,ue?1:de+1)});case"html_all_collection":case"typed_array":case"iterator":if(ue=fe(H),de>=2&&!ue)return yo(W,!0,F,R,H);var ve={unserializable:!0,type:W,readonly:!0,size:W==="typed_array"?F.length:void 0,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.constructor&&F.constructor.name!=="Object"?F.constructor.name:""};return r0(F[Symbol.iterator])&&Array.from(F).forEach(function(Ge,K){return ve[K]=Ds(Ge,R,U,H.concat([K]),fe,ue?1:de+1)}),U.push(H),ve;case"opaque_iterator":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F[Symbol.toStringTag],type:W};case"date":case"regexp":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.toString(),type:W};case"object":if(ue=fe(H),de>=2&&!ue)return yo(W,!0,F,R,H);var Fe={};return Es(F).forEach(function(Ge){var K=Ge.toString();Fe[K]=Ds(F[Ge],R,U,H.concat([K]),fe,ue?1:de+1)}),Fe;case"infinity":case"nan":case"undefined":return R.push(H),{type:W};default:return F}}function Mu(F){return(Mu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Gf(F){return function(R){if(Array.isArray(R))return iu(R)}(F)||function(R){if(typeof Symbol!="undefined"&&Symbol.iterator in Object(R))return Array.from(R)}(F)||function(R,U){if(!!R){if(typeof R=="string")return iu(R,U);var H=Object.prototype.toString.call(R).slice(8,-1);if(H==="Object"&&R.constructor&&(H=R.constructor.name),H==="Map"||H==="Set")return Array.from(R);if(H==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(H))return iu(R,U)}}(F)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function iu(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);UR.toString()?1:R.toString()>F.toString()?-1:0}function Es(F){for(var R=[],U=F,H=function(){var fe=[].concat(Gf(Object.keys(U)),Gf(Object.getOwnPropertySymbols(U))),ue=Object.getOwnPropertyDescriptors(U);fe.forEach(function(de){ue[de].enumerable&&R.push(de)}),U=Object.getPrototypeOf(U)};U!=null;)H();return R}function Uo(F){var R=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Anonymous",U=ou.get(F);if(U!=null)return U;var H=R;return typeof F.displayName=="string"?H=F.displayName:typeof F.name=="string"&&F.name!==""&&(H=F.name),ou.set(F,H),H}var sl=0;function Ss(){return++sl}function Cs(F){var R=ol.get(F);if(R!==void 0)return R;for(var U=new Array(F.length),H=0;H1&&arguments[1]!==void 0?arguments[1]:50;return F.length>R?F.substr(0,R)+"\u2026":F}function Mr(F,R){if(F!=null&&hasOwnProperty.call(F,Ci.type))return R?F[Ci.preview_long]:F[Ci.preview_short];switch(cl(F)){case"html_element":return"<".concat(Ui(F.tagName.toLowerCase())," />");case"function":return Ui("\u0192 ".concat(typeof F.name=="function"?"":F.name,"() {}"));case"string":return'"'.concat(F,'"');case"bigint":return Ui(F.toString()+"n");case"regexp":case"symbol":return Ui(F.toString());case"react_element":return"<".concat(Ui(al(F)||"Unknown")," />");case"array_buffer":return"ArrayBuffer(".concat(F.byteLength,")");case"data_view":return"DataView(".concat(F.buffer.byteLength,")");case"array":if(R){for(var U="",H=0;H0&&(U+=", "),!((U+=Mr(F[H],!1)).length>50));H++);return"[".concat(Ui(U),"]")}var fe=hasOwnProperty.call(F,Ci.size)?F[Ci.size]:F.length;return"Array(".concat(fe,")");case"typed_array":var ue="".concat(F.constructor.name,"(").concat(F.length,")");if(R){for(var de="",W=0;W0&&(de+=", "),!((de+=F[W]).length>50));W++);return"".concat(ue," [").concat(Ui(de),"]")}return ue;case"iterator":var ve=F.constructor.name;if(R){for(var Fe=Array.from(F),Ge="",K=0;K0&&(Ge+=", "),Array.isArray(xe)){var je=Mr(xe[0],!0),Xe=Mr(xe[1],!1);Ge+="".concat(je," => ").concat(Xe)}else Ge+=Mr(xe,!1);if(Ge.length>50)break}return"".concat(ve,"(").concat(F.size,") {").concat(Ui(Ge),"}")}return"".concat(ve,"(").concat(F.size,")");case"opaque_iterator":return F[Symbol.toStringTag];case"date":return F.toString();case"object":if(R){for(var rt=Es(F).sort(ul),st="",xt=0;xt0&&(st+=", "),(st+="".concat(wt.toString(),": ").concat(Mr(F[wt],!1))).length>50)break}return"{".concat(Ui(st),"}")}return"{\u2026}";case"boolean":case"number":case"infinity":case"nan":case"null":case"undefined":return F;default:try{return Ui(""+F)}catch(lt){return"unserializable"}}}var Ac=f(7);function of(F){return(of=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Ts(F,R){var U=Object.keys(F);if(Object.getOwnPropertySymbols){var H=Object.getOwnPropertySymbols(F);R&&(H=H.filter(function(fe){return Object.getOwnPropertyDescriptor(F,fe).enumerable})),U.push.apply(U,H)}return U}function xs(F){for(var R=1;R2&&arguments[2]!==void 0?arguments[2]:[];if(F!==null){var H=[],fe=[],ue=Ds(F,H,fe,U,R);return{data:ue,cleaned:H,unserializable:fe}}return null}function qo(F){var R,U,H=(R=F,U=new Set,JSON.stringify(R,function(de,W){if(of(W)==="object"&&W!==null){if(U.has(W))return;U.add(W)}return typeof W=="bigint"?W.toString()+"n":W})),fe=H===void 0?"undefined":H,ue=window.__REACT_DEVTOOLS_GLOBAL_HOOK__.clipboardCopyText;typeof ue=="function"?ue(fe).catch(function(de){}):Object(Ac.copy)(fe)}function kr(F,R){var U=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,H=R[U],fe=Array.isArray(F)?F.slice():xs({},F);return U+1===R.length?Array.isArray(fe)?fe.splice(H,1):delete fe[H]:fe[H]=kr(F[H],R,U+1),fe}function Fr(F,R,U){var H=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,fe=R[H],ue=Array.isArray(F)?F.slice():xs({},F);if(H+1===R.length){var de=U[H];ue[de]=ue[fe],Array.isArray(ue)?ue.splice(fe,1):delete ue[fe]}else ue[fe]=Fr(F[fe],R,U,H+1);return ue}function si(F,R,U){var H=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;if(H>=R.length)return U;var fe=R[H],ue=Array.isArray(F)?F.slice():xs({},F);return ue[fe]=si(F[fe],R,U,H+1),ue}var H0=f(8);function b0(F,R){var U=Object.keys(F);if(Object.getOwnPropertySymbols){var H=Object.getOwnPropertySymbols(F);R&&(H=H.filter(function(fe){return Object.getOwnPropertyDescriptor(F,fe).enumerable})),U.push.apply(U,H)}return U}function Bt(F){for(var R=1;R=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function As(F,R){if(F){if(typeof F=="string")return uu(F,R);var U=Object.prototype.toString.call(F).slice(8,-1);return U==="Object"&&F.constructor&&(U=F.constructor.name),U==="Map"||U==="Set"?Array.from(F):U==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(U)?uu(F,R):void 0}}function uu(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);U0){var et=ue(X);if(et!=null){var Dt,bt=ks(du);try{for(bt.s();!(Dt=bt.n()).done;)if(Dt.value.test(et))return!0}catch(fn){bt.e(fn)}finally{bt.f()}}}if(Y!=null&&Yu.size>0){var Zt,qt=Y.fileName,Ut=ks(Yu);try{for(Ut.s();!(Zt=Ut.n()).done;)if(Zt.value.test(qt))return!0}catch(fn){Ut.e(fn)}finally{Ut.f()}}return!1}function Gr(X){var Y=X.type;switch(X.tag){case Xe:case ar:return 1;case je:case rn:return 5;case wt:return 6;case lt:return 11;case yn:return 7;case Rt:case sn:case xt:return 9;case Hn:case Cr:return 8;case He:return 12;case Qe:return 13;default:switch(de(Y)){case 60111:case"Symbol(react.concurrent_mode)":case"Symbol(react.async_mode)":return 9;case 60109:case"Symbol(react.provider)":return 2;case 60110:case"Symbol(react.context)":return 2;case 60108:case"Symbol(react.strict_mode)":return 9;case 60114:case"Symbol(react.profiler)":return 10;default:return 9}}}function ir(X){if(Co.has(X))return X;var Y=X.alternate;return Y!=null&&Co.has(Y)?Y:(Co.add(X),X)}window.__REACT_DEVTOOLS_COMPONENT_FILTERS__!=null?qs(window.__REACT_DEVTOOLS_COMPONENT_FILTERS__):qs([{type:1,value:7,isEnabled:!0}]);var L0=new Map,Y0=new Map,Co=new Set,$u=new Map,Vo=new Map,Rr=-1;function Jn(X){if(!L0.has(X)){var Y=Ss();L0.set(X,Y),Y0.set(Y,X)}return L0.get(X)}function ai(X){switch(Gr(X)){case 1:if(N0!==null){var Y=Jn(ir(X)),ye=Vr(X);ye!==null&&N0.set(Y,ye)}}}var o0={};function Vr(X){switch(Gr(X)){case 1:var Y=X.stateNode,ye=o0,he=o0;return Y!=null&&(Y.constructor&&Y.constructor.contextType!=null?he=Y.context:(ye=Y.context)&&Object.keys(ye).length===0&&(ye=o0)),[ye,he];default:return null}}function ff(X){switch(Gr(X)){case 1:if(N0!==null){var Y=Jn(ir(X)),ye=N0.has(Y)?N0.get(Y):null,he=Vr(X);if(ye==null||he==null)return null;var We=Ru(ye,2),et=We[0],Dt=We[1],bt=Ru(he,2),Zt=bt[0],qt=bt[1];if(Zt!==o0)return $0(et,Zt);if(qt!==o0)return Dt!==qt}}return null}function cf(X,Y){if(X==null||Y==null)return!1;if(Y.hasOwnProperty("baseState")&&Y.hasOwnProperty("memoizedState")&&Y.hasOwnProperty("next")&&Y.hasOwnProperty("queue"))for(;Y!==null;){if(Y.memoizedState!==X.memoizedState)return!0;Y=Y.next,X=X.next}return!1}function $0(X,Y){if(X==null||Y==null||Y.hasOwnProperty("baseState")&&Y.hasOwnProperty("memoizedState")&&Y.hasOwnProperty("next")&&Y.hasOwnProperty("queue"))return null;var ye,he=[],We=ks(new Set([].concat(c0(Object.keys(X)),c0(Object.keys(Y)))));try{for(We.s();!(ye=We.n()).done;){var et=ye.value;X[et]!==Y[et]&&he.push(et)}}catch(Dt){We.e(Dt)}finally{We.f()}return he}function K0(X,Y){switch(Y.tag){case Xe:case je:case rt:case Hn:case Cr:return(zo(Y)&K)===K;default:return X.memoizedProps!==Y.memoizedProps||X.memoizedState!==Y.memoizedState||X.ref!==Y.ref}}var ae=[],Be=[],Ie=[],ht=[],mt=new Map,wn=0,Gn=null;function $t(X){ae.push(X)}function X0(X){if(ae.length!==0||Be.length!==0||Ie.length!==0||Gn!==null||u0){var Y=Be.length+Ie.length+(Gn===null?0:1),ye=new Array(3+wn+(Y>0?2+Y:0)+ae.length),he=0;if(ye[he++]=R,ye[he++]=Rr,ye[he++]=wn,mt.forEach(function(bt,Zt){ye[he++]=Zt.length;for(var qt=Cs(Zt),Ut=0;Ut0){ye[he++]=2,ye[he++]=Y;for(var We=Be.length-1;We>=0;We--)ye[he++]=Be[We];for(var et=0;et0?X.forEach(function(Y){F.emit("operations",Y)}):(Fn!==null&&(zr=!0),F.getFiberRoots(R).forEach(function(Y){T0(Rr=Jn(ir(Y.current)),Y.current),u0&&Y.memoizedInteractions!=null&&(uo={changeDescriptions:To?new Map:null,durations:[],commitTime:Os()-v0,interactions:Array.from(Y.memoizedInteractions).map(function(ye){return Bt(Bt({},ye),{},{timestamp:ye.timestamp-v0})}),maxActualDuration:0,priorityLevel:null}),$r(Y.current,null,!1,!1),X0(),Rr=-1}))},getBestMatchForTrackedPath:function(){if(Fn===null||pi===null)return null;for(var X=pi;X!==null&&F0(X);)X=X.return;return X===null?null:{id:Jn(ir(X)),isFullMatch:Br===Fn.length-1}},getDisplayNameForFiberID:function(X){var Y=Y0.get(X);return Y!=null?ue(Y):null},getFiberIDForNative:function(X){var Y=arguments.length>1&&arguments[1]!==void 0&&arguments[1],ye=U.findFiberByHostInstance(X);if(ye!=null){if(Y)for(;ye!==null&&F0(ye);)ye=ye.return;return Jn(ir(ye))}return null},getInstanceAndStyle:function(X){var Y=null,ye=null,he=J0(X);return he!==null&&(Y=he.stateNode,he.memoizedProps!==null&&(ye=he.memoizedProps.style)),{instance:Y,style:ye}},getOwnersList:function(X){var Y=J0(X);if(Y==null)return null;var ye=Y._debugOwner,he=[{displayName:ue(Y)||"Anonymous",id:X,type:Gr(Y)}];if(ye)for(var We=ye;We!==null;)he.unshift({displayName:ue(We)||"Anonymous",id:Jn(ir(We)),type:Gr(We)}),We=We._debugOwner||null;return he},getPathForElement:function(X){var Y=Y0.get(X);if(Y==null)return null;for(var ye=[];Y!==null;)ye.push(Ai(Y)),Y=Y.return;return ye.reverse(),ye},getProfilingData:function(){var X=[];if(pu===null)throw Error("getProfilingData() called before any profiling data was recorded");return pu.forEach(function(Y,ye){var he=[],We=[],et=new Map,Dt=new Map,bt=so!==null&&so.get(ye)||"Unknown";C0!=null&&C0.forEach(function(Zt,qt){di!=null&&di.get(qt)===ye&&We.push([qt,Zt])}),Y.forEach(function(Zt,qt){var Ut=Zt.changeDescriptions,fn=Zt.durations,_t=Zt.interactions,_r=Zt.maxActualDuration,Wr=Zt.priorityLevel,Ar=Zt.commitTime,z=[];_t.forEach(function(s0){et.has(s0.id)||et.set(s0.id,s0),z.push(s0.id);var t0=Dt.get(s0.id);t0!=null?t0.push(qt):Dt.set(s0.id,[qt])});for(var dr=[],Or=[],Qn=0;Qn1?kn.set(Ut,fn-1):kn.delete(Ut),wr.delete(Zt)}(Rr),Yr(ye,!1))}else T0(Rr,ye),$r(ye,null,!1,!1);if(u0&&We){var bt=pu.get(Rr);bt!=null?bt.push(uo):pu.set(Rr,[uo])}X0(),oo&&F.emit("traceUpdates",Hi),Rr=-1},handleCommitFiberUnmount:function(X){Yr(X,!1)},inspectElement:function(X,Y){if(Tr(X)){if(Y!=null){R0(Y);var ye=null;return Y[0]==="hooks"&&(ye="hooks"),{id:X,type:"hydrated-path",path:Y,value:qi(Ti(S0,Y),Nr(null,ye),Y)}}return{id:X,type:"no-change"}}if(El=!1,S0!==null&&S0.id===X||(Q0={}),(S0=af(X))===null)return{id:X,type:"not-found"};Y!=null&&R0(Y),function(We){var et=We.hooks,Dt=We.id,bt=We.props,Zt=Y0.get(Dt);if(Zt!=null){var qt=Zt.elementType,Ut=Zt.stateNode,fn=Zt.tag,_t=Zt.type;switch(fn){case Xe:case ar:case rn:H.$r=Ut;break;case je:H.$r={hooks:et,props:bt,type:_t};break;case wt:H.$r={props:bt,type:_t.render};break;case Hn:case Cr:H.$r={props:bt,type:qt!=null&&qt.type!=null?qt.type:_t};break;default:H.$r=null}}else console.warn('Could not find Fiber with id "'.concat(Dt,'"'))}(S0);var he=Bt({},S0);return he.context=qi(he.context,Nr("context",null)),he.hooks=qi(he.hooks,Nr("hooks","hooks")),he.props=qi(he.props,Nr("props",null)),he.state=qi(he.state,Nr("state",null)),{id:X,type:"full-data",value:he}},logElementToConsole:function(X){var Y=Tr(X)?S0:af(X);if(Y!==null){var ye=typeof console.groupCollapsed=="function";ye&&console.groupCollapsed("[Click to expand] %c<".concat(Y.displayName||"Component"," />"),"color: var(--dom-tag-name-color); font-weight: normal;"),Y.props!==null&&console.log("Props:",Y.props),Y.state!==null&&console.log("State:",Y.state),Y.hooks!==null&&console.log("Hooks:",Y.hooks);var he=zs(X);he!==null&&console.log("Nodes:",he),Y.source!==null&&console.log("Location:",Y.source),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),ye&&console.groupEnd()}else console.warn('Could not find Fiber with id "'.concat(X,'"'))},prepareViewAttributeSource:function(X,Y){Tr(X)&&(window.$attribute=Ti(S0,Y))},prepareViewElementSource:function(X){var Y=Y0.get(X);if(Y!=null){var ye=Y.elementType,he=Y.tag,We=Y.type;switch(he){case Xe:case ar:case rn:case je:H.$type=We;break;case wt:H.$type=We.render;break;case Hn:case Cr:H.$type=ye!=null&&ye.type!=null?ye.type:We;break;default:H.$type=null}}else console.warn('Could not find Fiber with id "'.concat(X,'"'))},overrideSuspense:function(X,Y){if(typeof Eo!="function"||typeof So!="function")throw new Error("Expected overrideSuspense() to not get called for earlier React versions.");Y?(B0.add(X),B0.size===1&&Eo(hu)):(B0.delete(X),B0.size===0&&Eo(Cl));var ye=Y0.get(X);ye!=null&&So(ye)},overrideValueAtPath:function(X,Y,ye,he,We){var et=J0(Y);if(et!==null){var Dt=et.stateNode;switch(X){case"context":switch(he=he.slice(1),et.tag){case Xe:he.length===0?Dt.context=We:fl(Dt.context,he,We),Dt.forceUpdate()}break;case"hooks":typeof p0=="function"&&p0(et,ye,he,We);break;case"props":switch(et.tag){case Xe:et.pendingProps=si(Dt.props,he,We),Dt.forceUpdate();break;default:typeof xi=="function"&&xi(et,he,We)}break;case"state":switch(et.tag){case Xe:fl(Dt.state,he,We),Dt.forceUpdate()}}}},renamePath:function(X,Y,ye,he,We){var et=J0(Y);if(et!==null){var Dt=et.stateNode;switch(X){case"context":switch(he=he.slice(1),We=We.slice(1),et.tag){case Xe:he.length===0||ll(Dt.context,he,We),Dt.forceUpdate()}break;case"hooks":typeof ci=="function"&&ci(et,ye,he,We);break;case"props":Dt===null?typeof qr=="function"&&qr(et,he,We):(et.pendingProps=Fr(Dt.props,he,We),Dt.forceUpdate());break;case"state":ll(Dt.state,he,We),Dt.forceUpdate()}}},renderer:U,setTraceUpdatesEnabled:function(X){oo=X},setTrackedPath:lo,startProfiling:Sl,stopProfiling:function(){u0=!1,To=!1},storeAsGlobal:function(X,Y,ye){if(Tr(X)){var he=Ti(S0,Y),We="$reactTemp".concat(ye);window[We]=he,console.log(We),console.log(he)}},updateComponentFilters:function(X){if(u0)throw Error("Cannot modify filter preferences while profiling");F.getFiberRoots(R).forEach(function(Y){Rr=Jn(ir(Y.current)),m0(Y.current),Yr(Y.current,!1),Rr=-1}),qs(X),kn.clear(),F.getFiberRoots(R).forEach(function(Y){T0(Rr=Jn(ir(Y.current)),Y.current),$r(Y.current,null,!1,!1),X0(Y),Rr=-1})}}}var _n;function Nu(F){return(Nu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Wo(F,R,U){if(_n===void 0)try{throw Error()}catch(fe){var H=fe.stack.trim().match(/\n( *(at )?)/);_n=H&&H[1]||""}return` -`+_n+F}var su=!1;function Ps(F,R,U){if(!F||su)return"";var H,fe=Error.prepareStackTrace;Error.prepareStackTrace=void 0,su=!0;var ue=U.current;U.current=null;try{if(R){var de=function(){throw Error()};if(Object.defineProperty(de.prototype,"props",{set:function(){throw Error()}}),(typeof Reflect=="undefined"?"undefined":Nu(Reflect))==="object"&&Reflect.construct){try{Reflect.construct(de,[])}catch(xe){H=xe}Reflect.construct(F,[],de)}else{try{de.call()}catch(xe){H=xe}F.call(de.prototype)}}else{try{throw Error()}catch(xe){H=xe}F()}}catch(xe){if(xe&&H&&typeof xe.stack=="string"){for(var W=xe.stack.split(` -`),ve=H.stack.split(` -`),Fe=W.length-1,Ge=ve.length-1;Fe>=1&&Ge>=0&&W[Fe]!==ve[Ge];)Ge--;for(;Fe>=1&&Ge>=0;Fe--,Ge--)if(W[Fe]!==ve[Ge]){if(Fe!==1||Ge!==1)do if(Fe--,--Ge<0||W[Fe]!==ve[Ge])return` -`+W[Fe].replace(" at new "," at ");while(Fe>=1&&Ge>=0);break}}}finally{su=!1,Error.prepareStackTrace=fe,U.current=ue}var K=F?F.displayName||F.name:"";return K?Wo(K):""}function pl(F,R,U,H){return Ps(F,!1,H)}function Vf(F,R,U){var H=F.HostComponent,fe=F.LazyComponent,ue=F.SuspenseComponent,de=F.SuspenseListComponent,W=F.FunctionComponent,ve=F.IndeterminateComponent,Fe=F.SimpleMemoComponent,Ge=F.ForwardRef,K=F.Block,xe=F.ClassComponent;switch(R.tag){case H:return Wo(R.type);case fe:return Wo("Lazy");case ue:return Wo("Suspense");case de:return Wo("SuspenseList");case W:case ve:case Fe:return pl(R.type,0,0,U);case Ge:return pl(R.type.render,0,0,U);case K:return pl(R.type._render,0,0,U);case xe:return function(je,Xe,rt,st){return Ps(je,!0,st)}(R.type,0,0,U);default:return""}}function hl(F,R,U){try{var H="",fe=R;do H+=Vf(F,fe,U),fe=fe.return;while(fe);return H}catch(ue){return` -Error generating stack: `+ue.message+` -`+ue.stack}}function Bu(F,R){var U;if(typeof Symbol=="undefined"||F[Symbol.iterator]==null){if(Array.isArray(F)||(U=function(ve,Fe){if(!!ve){if(typeof ve=="string")return ju(ve,Fe);var Ge=Object.prototype.toString.call(ve).slice(8,-1);if(Ge==="Object"&&ve.constructor&&(Ge=ve.constructor.name),Ge==="Map"||Ge==="Set")return Array.from(ve);if(Ge==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Ge))return ju(ve,Fe)}}(F))||R&&F&&typeof F.length=="number"){U&&(F=U);var H=0,fe=function(){};return{s:fe,n:function(){return H>=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function ju(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);U0?Fe[Fe.length-1]:null,xe=K!==null&&(ro.test(K)||Ms.test(K));if(!xe){var je,Xe=Bu(ml.values());try{for(Xe.s();!(je=Xe.n()).done;){var rt=je.value,st=rt.currentDispatcherRef,xt=rt.getCurrentFiber,wt=rt.workTagMap,lt=xt();if(lt!=null){var Rt=hl(wt,lt,st);Rt!==""&&Fe.push(Rt);break}}}catch(yn){Xe.e(yn)}finally{Xe.f()}}}catch(yn){}ue.apply(void 0,Fe)};de.__REACT_DEVTOOLS_ORIGINAL_METHOD__=ue,Uu[fe]=de}catch(W){}})}}function O0(F){return(O0=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function vl(F,R){for(var U=0;UF.length)&&(R=F.length);for(var U=0,H=new Array(R);U1?W-1:0),Fe=1;Fe0?K[K.length-1]:0),K.push(St),W.set(Ne,Fe(ft._topLevelWrapper));try{var Qt=He.apply(this,Qe);return K.pop(),Qt}catch(bn){throw K=[],bn}finally{if(K.length===0){var Cn=W.get(Ne);if(Cn===void 0)throw new Error("Expected to find root ID.");yn(Cn)}}},performUpdateIfNecessary:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);var St=ln(Ne);try{var Qt=He.apply(this,Qe),Cn=ln(Ne);return Ge(St,Cn)||Xe(Ne,ft,Cn),K.pop(),Qt}catch(p0){throw K=[],p0}finally{if(K.length===0){var bn=W.get(Ne);if(bn===void 0)throw new Error("Expected to find root ID.");yn(bn)}}},receiveComponent:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);var St=ln(Ne);try{var Qt=He.apply(this,Qe),Cn=ln(Ne);return Ge(St,Cn)||Xe(Ne,ft,Cn),K.pop(),Qt}catch(p0){throw K=[],p0}finally{if(K.length===0){var bn=W.get(Ne);if(bn===void 0)throw new Error("Expected to find root ID.");yn(bn)}}},unmountComponent:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);try{var St=He.apply(this,Qe);return K.pop(),function(Cn,bn){wt.push(bn),ue.delete(bn)}(0,ft),St}catch(Cn){throw K=[],Cn}finally{if(K.length===0){var Qt=W.get(Ne);if(Qt===void 0)throw new Error("Expected to find root ID.");yn(Qt)}}}}));var st=[],xt=new Map,wt=[],lt=0,Rt=null;function yn(He){if(st.length!==0||wt.length!==0||Rt!==null){var Qe=wt.length+(Rt===null?0:1),Ne=new Array(3+lt+(Qe>0?2+Qe:0)+st.length),ft=0;if(Ne[ft++]=R,Ne[ft++]=He,Ne[ft++]=lt,xt.forEach(function(Cn,bn){Ne[ft++]=bn.length;for(var p0=Cs(bn),h0=0;h00){Ne[ft++]=2,Ne[ft++]=Qe;for(var St=0;St"),"color: var(--dom-tag-name-color); font-weight: normal;"),Qe.props!==null&&console.log("Props:",Qe.props),Qe.state!==null&&console.log("State:",Qe.state),Qe.context!==null&&console.log("Context:",Qe.context);var ft=fe(He);ft!==null&&console.log("Node:",ft),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),Ne&&console.groupEnd()}else console.warn('Could not find element with id "'.concat(He,'"'))},overrideSuspense:function(){throw new Error("overrideSuspense not supported by this renderer")},overrideValueAtPath:function(He,Qe,Ne,ft,St){var Qt=ue.get(Qe);if(Qt!=null){var Cn=Qt._instance;if(Cn!=null)switch(He){case"context":fl(Cn.context,ft,St),a0(Cn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var bn=Qt._currentElement;Qt._currentElement=V0(V0({},bn),{},{props:si(bn.props,ft,St)}),a0(Cn);break;case"state":fl(Cn.state,ft,St),a0(Cn)}}},renamePath:function(He,Qe,Ne,ft,St){var Qt=ue.get(Qe);if(Qt!=null){var Cn=Qt._instance;if(Cn!=null)switch(He){case"context":ll(Cn.context,ft,St),a0(Cn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var bn=Qt._currentElement;Qt._currentElement=V0(V0({},bn),{},{props:Fr(bn.props,ft,St)}),a0(Cn);break;case"state":ll(Cn.state,ft,St),a0(Cn)}}},prepareViewAttributeSource:function(He,Qe){var Ne=Cr(He);Ne!==null&&(window.$attribute=Ti(Ne,Qe))},prepareViewElementSource:function(He){var Qe=ue.get(He);if(Qe!=null){var Ne=Qe._currentElement;Ne!=null?H.$type=Ne.type:console.warn('Could not find element with id "'.concat(He,'"'))}else console.warn('Could not find instance with id "'.concat(He,'"'))},renderer:U,setTraceUpdatesEnabled:function(He){},setTrackedPath:function(He){},startProfiling:function(){},stopProfiling:function(){},storeAsGlobal:function(He,Qe,Ne){var ft=Cr(He);if(ft!==null){var St=Ti(ft,Qe),Qt="$reactTemp".concat(Ne);window[Qt]=St,console.log(Qt),console.log(St)}},updateComponentFilters:function(He){}}}function nr(F,R){var U=!1,H={bottom:0,left:0,right:0,top:0},fe=R[F];if(fe!=null){for(var ue=0,de=Object.keys(H);ue0?"development":"production";var st=Function.prototype.toString;if(rt.Mount&&rt.Mount._renderNewRootComponent){var xt=st.call(rt.Mount._renderNewRootComponent);return xt.indexOf("function")!==0?"production":xt.indexOf("storedMeasure")!==-1?"development":xt.indexOf("should be a pure function")!==-1?xt.indexOf("NODE_ENV")!==-1||xt.indexOf("development")!==-1||xt.indexOf("true")!==-1?"development":xt.indexOf("nextElement")!==-1||xt.indexOf("nextComponent")!==-1?"unminified":"development":xt.indexOf("nextElement")!==-1||xt.indexOf("nextComponent")!==-1?"unminified":"outdated"}}catch(wt){}return"production"}(ve);try{var K=window.__REACT_DEVTOOLS_APPEND_COMPONENT_STACK__!==!1,xe=window.__REACT_DEVTOOLS_BREAK_ON_CONSOLE_ERRORS__===!0;(K||xe)&&(zi(ve),Ho({appendComponentStack:K,breakOnConsoleErrors:xe}))}catch(rt){}var je=F.__REACT_DEVTOOLS_ATTACH__;if(typeof je=="function"){var Xe=je(W,Fe,ve,F);W.rendererInterfaces.set(Fe,Xe)}return W.emit("renderer",{id:Fe,renderer:ve,reactBuildType:Ge}),Fe},on:function(ve,Fe){ue[ve]||(ue[ve]=[]),ue[ve].push(Fe)},off:function(ve,Fe){if(ue[ve]){var Ge=ue[ve].indexOf(Fe);Ge!==-1&&ue[ve].splice(Ge,1),ue[ve].length||delete ue[ve]}},sub:function(ve,Fe){return W.on(ve,Fe),function(){return W.off(ve,Fe)}},supportsFiber:!0,checkDCE:function(ve){try{Function.prototype.toString.call(ve).indexOf("^_^")>-1&&(U=!0,setTimeout(function(){throw new Error("React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build")}))}catch(Fe){}},onCommitFiberUnmount:function(ve,Fe){var Ge=fe.get(ve);Ge!=null&&Ge.handleCommitFiberUnmount(Fe)},onCommitFiberRoot:function(ve,Fe,Ge){var K=W.getFiberRoots(ve),xe=Fe.current,je=K.has(Fe),Xe=xe.memoizedState==null||xe.memoizedState.element==null;je||Xe?je&&Xe&&K.delete(Fe):K.add(Fe);var rt=fe.get(ve);rt!=null&&rt.handleCommitFiberRoot(Fe,Ge)}};Object.defineProperty(F,"__REACT_DEVTOOLS_GLOBAL_HOOK__",{configurable:!1,enumerable:!1,get:function(){return W}})})(window);var M0=window.__REACT_DEVTOOLS_GLOBAL_HOOK__,au=[{type:1,value:7,isEnabled:!0}];function Lr(F){if(M0!=null){var R=F||{},U=R.host,H=U===void 0?"localhost":U,fe=R.nativeStyleEditorValidAttributes,ue=R.useHttps,de=ue!==void 0&&ue,W=R.port,ve=W===void 0?8097:W,Fe=R.websocket,Ge=R.resolveRNStyle,K=Ge===void 0?null:Ge,xe=R.isAppActive,je=de?"wss":"ws",Xe=null;if((xe===void 0?function(){return!0}:xe)()){var rt=null,st=[],xt=je+"://"+H+":"+ve,wt=Fe||new window.WebSocket(xt);wt.onclose=function(){rt!==null&&rt.emit("shutdown"),lt()},wt.onerror=function(){lt()},wt.onmessage=function(Rt){var yn;try{if(typeof Rt.data!="string")throw Error();yn=JSON.parse(Rt.data)}catch(sn){return void console.error("[React DevTools] Failed to parse JSON: "+Rt.data)}st.forEach(function(sn){try{sn(yn)}catch(ar){throw console.log("[React DevTools] Error calling listener",yn),console.log("error:",ar),ar}})},wt.onopen=function(){(rt=new Do({listen:function(rn){return st.push(rn),function(){var Hn=st.indexOf(rn);Hn>=0&&st.splice(Hn,1)}},send:function(rn,Hn,d0){wt.readyState===wt.OPEN?wt.send(JSON.stringify({event:rn,payload:Hn})):(rt!==null&&rt.shutdown(),lt())}})).addListener("inspectElement",function(rn){var Hn=rn.id,d0=rn.rendererID,Cr=Rt.rendererInterfaces[d0];if(Cr!=null){var He=Cr.findNativeNodesForFiberID(Hn);He!=null&&He[0]!=null&&Rt.emit("showNativeHighlight",He[0])}}),rt.addListener("updateComponentFilters",function(rn){au=rn}),window.__REACT_DEVTOOLS_COMPONENT_FILTERS__==null&&rt.send("overrideComponentFilters",au);var Rt=new I0(rt);if(Rt.addListener("shutdown",function(){M0.emit("shutdown")}),function(rn,Hn,d0){if(rn==null)return function(){};var Cr=[rn.sub("renderer-attached",function(Ne){var ft=Ne.id,St=(Ne.renderer,Ne.rendererInterface);Hn.setRendererInterface(ft,St),St.flushInitialOperations()}),rn.sub("unsupported-renderer-version",function(Ne){Hn.onUnsupportedRenderer(Ne)}),rn.sub("operations",Hn.onHookOperations),rn.sub("traceUpdates",Hn.onTraceUpdates)],He=function(Ne,ft){var St=rn.rendererInterfaces.get(Ne);St==null&&(typeof ft.findFiberByHostInstance=="function"?St=uf(rn,Ne,ft,d0):ft.ComponentTree&&(St=lf(rn,Ne,ft,d0)),St!=null&&rn.rendererInterfaces.set(Ne,St)),St!=null?rn.emit("renderer-attached",{id:Ne,renderer:ft,rendererInterface:St}):rn.emit("unsupported-renderer-version",Ne)};rn.renderers.forEach(function(Ne,ft){He(ft,Ne)}),Cr.push(rn.sub("renderer",function(Ne){var ft=Ne.id,St=Ne.renderer;He(ft,St)})),rn.emit("react-devtools",Hn),rn.reactDevtoolsAgent=Hn;var Qe=function(){Cr.forEach(function(Ne){return Ne()}),rn.rendererInterfaces.forEach(function(Ne){Ne.cleanup()}),rn.reactDevtoolsAgent=null};Hn.addListener("shutdown",Qe),Cr.push(function(){Hn.removeListener("shutdown",Qe)})}(M0,Rt,window),K!=null||M0.resolveRNStyle!=null)Gu(rt,Rt,K||M0.resolveRNStyle,fe||M0.nativeStyleEditorValidAttributes||null);else{var yn,sn,ar=function(){rt!==null&&Gu(rt,Rt,yn,sn)};M0.hasOwnProperty("resolveRNStyle")||Object.defineProperty(M0,"resolveRNStyle",{enumerable:!1,get:function(){return yn},set:function(rn){yn=rn,ar()}}),M0.hasOwnProperty("nativeStyleEditorValidAttributes")||Object.defineProperty(M0,"nativeStyleEditorValidAttributes",{enumerable:!1,get:function(){return sn},set:function(rn){sn=rn,ar()}})}}}else lt()}function lt(){Xe===null&&(Xe=setTimeout(function(){return Lr(F)},2e3))}}}])})});var rS=Me(nS=>{"use strict";Object.defineProperty(nS,"__esModule",{value:!0});eS();var _j=tS();_j.connectToDevTools()});var lS=Me(x2=>{"use strict";var iS=x2&&x2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(x2,"__esModule",{value:!0});var oS=Ay(),yj=iS(lE()),uS=iS(hc()),no=Xy();process.env.DEV==="true"&&rS();var sS=i=>{i==null||i.unsetMeasureFunc(),i==null||i.freeRecursive()};x2.default=yj.default({schedulePassiveEffects:oS.unstable_scheduleCallback,cancelPassiveEffects:oS.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:i=>{if(i.isStaticDirty){i.isStaticDirty=!1,typeof i.onImmediateRender=="function"&&i.onImmediateRender();return}typeof i.onRender=="function"&&i.onRender()},getChildHostContext:(i,u)=>{let f=i.isInsideText,c=u==="ink-text"||u==="ink-virtual-text";return f===c?i:{isInsideText:c}},shouldSetTextContent:()=>!1,createInstance:(i,u,f,c)=>{if(c.isInsideText&&i==="ink-box")throw new Error(" can\u2019t be nested inside component");let g=i==="ink-text"&&c.isInsideText?"ink-virtual-text":i,t=no.createNode(g);for(let[C,A]of Object.entries(u))C!=="children"&&(C==="style"?no.setStyle(t,A):C==="internal_transform"?t.internal_transform=A:C==="internal_static"?t.internal_static=!0:no.setAttribute(t,C,A));return t},createTextInstance:(i,u,f)=>{if(!f.isInsideText)throw new Error(`Text string "${i}" must be rendered inside component`);return no.createTextNode(i)},resetTextContent:()=>{},hideTextInstance:i=>{no.setTextNodeValue(i,"")},unhideTextInstance:(i,u)=>{no.setTextNodeValue(i,u)},getPublicInstance:i=>i,hideInstance:i=>{var u;(u=i.yogaNode)===null||u===void 0||u.setDisplay(uS.default.DISPLAY_NONE)},unhideInstance:i=>{var u;(u=i.yogaNode)===null||u===void 0||u.setDisplay(uS.default.DISPLAY_FLEX)},appendInitialChild:no.appendChildNode,appendChild:no.appendChildNode,insertBefore:no.insertBeforeNode,finalizeInitialChildren:(i,u,f,c)=>(i.internal_static&&(c.isStaticDirty=!0,c.staticNode=i),!1),supportsMutation:!0,appendChildToContainer:no.appendChildNode,insertInContainerBefore:no.insertBeforeNode,removeChildFromContainer:(i,u)=>{no.removeChildNode(i,u),sS(u.yogaNode)},prepareUpdate:(i,u,f,c,g)=>{i.internal_static&&(g.isStaticDirty=!0);let t={},C=Object.keys(c);for(let A of C)if(c[A]!==f[A]){if(A==="style"&&typeof c.style=="object"&&typeof f.style=="object"){let D=c.style,L=f.style,N=Object.keys(D);for(let j of N){if(j==="borderStyle"||j==="borderColor"){if(typeof t.style!="object"){let $={};t.style=$}t.style.borderStyle=D.borderStyle,t.style.borderColor=D.borderColor}if(D[j]!==L[j]){if(typeof t.style!="object"){let $={};t.style=$}t.style[j]=D[j]}}continue}t[A]=c[A]}return t},commitUpdate:(i,u)=>{for(let[f,c]of Object.entries(u))f!=="children"&&(f==="style"?no.setStyle(i,c):f==="internal_transform"?i.internal_transform=c:f==="internal_static"?i.internal_static=!0:no.setAttribute(i,f,c))},commitTextUpdate:(i,u,f)=>{no.setTextNodeValue(i,f)},removeChild:(i,u)=>{no.removeChildNode(i,u),sS(u.yogaNode)}})});var cS=Me((Jb,fS)=>{"use strict";fS.exports=(i,u=1,f)=>{if(f=dt({indent:" ",includeEmptyLines:!1},f),typeof i!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof i}\``);if(typeof u!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof u}\``);if(typeof f.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof f.indent}\``);if(u===0)return i;let c=f.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return i.replace(c,f.indent.repeat(u))}});var aS=Me(k2=>{"use strict";var wj=k2&&k2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(k2,"__esModule",{value:!0});var Vh=wj(hc());k2.default=i=>i.getComputedWidth()-i.getComputedPadding(Vh.default.EDGE_LEFT)-i.getComputedPadding(Vh.default.EDGE_RIGHT)-i.getComputedBorder(Vh.default.EDGE_LEFT)-i.getComputedBorder(Vh.default.EDGE_RIGHT)});var pS=Me((Zb,dS)=>{dS.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var mS=Me((eG,m3)=>{"use strict";var hS=pS();m3.exports=hS;m3.exports.default=hS});var gS=Me((tG,vS)=>{"use strict";vS.exports=(i,u=process.argv)=>{let f=i.startsWith("-")?"":i.length===1?"-":"--",c=u.indexOf(f+i),g=u.indexOf("--");return c!==-1&&(g===-1||c{"use strict";var Dj=require("os"),yS=require("tty"),Pu=gS(),{env:oi}=process,qf;Pu("no-color")||Pu("no-colors")||Pu("color=false")||Pu("color=never")?qf=0:(Pu("color")||Pu("colors")||Pu("color=true")||Pu("color=always"))&&(qf=1);"FORCE_COLOR"in oi&&(oi.FORCE_COLOR==="true"?qf=1:oi.FORCE_COLOR==="false"?qf=0:qf=oi.FORCE_COLOR.length===0?1:Math.min(parseInt(oi.FORCE_COLOR,10),3));function v3(i){return i===0?!1:{level:i,hasBasic:!0,has256:i>=2,has16m:i>=3}}function g3(i,u){if(qf===0)return 0;if(Pu("color=16m")||Pu("color=full")||Pu("color=truecolor"))return 3;if(Pu("color=256"))return 2;if(i&&!u&&qf===void 0)return 0;let f=qf||0;if(oi.TERM==="dumb")return f;if(process.platform==="win32"){let c=Dj.release().split(".");return Number(c[0])>=10&&Number(c[2])>=10586?Number(c[2])>=14931?3:2:1}if("CI"in oi)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(c=>c in oi)||oi.CI_NAME==="codeship"?1:f;if("TEAMCITY_VERSION"in oi)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(oi.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in oi)return 1;if(oi.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in oi){let c=parseInt((oi.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(oi.TERM_PROGRAM){case"iTerm.app":return c>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(oi.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(oi.TERM)||"COLORTERM"in oi?1:f}function Ej(i){let u=g3(i,i&&i.isTTY);return v3(u)}_S.exports={supportsColor:Ej,stdout:v3(g3(!0,yS.isatty(1))),stderr:v3(g3(!0,yS.isatty(2)))}});var ES=Me((rG,DS)=>{"use strict";var Sj=(i,u,f)=>{let c=i.indexOf(u);if(c===-1)return i;let g=u.length,t=0,C="";do C+=i.substr(t,c-t)+u+f,t=c+g,c=i.indexOf(u,t);while(c!==-1);return C+=i.substr(t),C},Cj=(i,u,f,c)=>{let g=0,t="";do{let C=i[c-1]==="\r";t+=i.substr(g,(C?c-1:c)-g)+u+(C?`\r -`:` -`)+f,g=c+1,c=i.indexOf(` -`,g)}while(c!==-1);return t+=i.substr(g),t};DS.exports={stringReplaceAll:Sj,stringEncaseCRLFWithFirstIndex:Cj}});var kS=Me((iG,SS)=>{"use strict";var Tj=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,CS=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,xj=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,kj=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,Aj=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function TS(i){let u=i[0]==="u",f=i[1]==="{";return u&&!f&&i.length===5||i[0]==="x"&&i.length===3?String.fromCharCode(parseInt(i.slice(1),16)):u&&f?String.fromCodePoint(parseInt(i.slice(2,-1),16)):Aj.get(i)||i}function Oj(i,u){let f=[],c=u.trim().split(/\s*,\s*/g),g;for(let t of c){let C=Number(t);if(!Number.isNaN(C))f.push(C);else if(g=t.match(xj))f.push(g[2].replace(kj,(A,x,D)=>x?TS(x):D));else throw new Error(`Invalid Chalk template style argument: ${t} (in style '${i}')`)}return f}function Ij(i){CS.lastIndex=0;let u=[],f;for(;(f=CS.exec(i))!==null;){let c=f[1];if(f[2]){let g=Oj(c,f[2]);u.push([c].concat(g))}else u.push([c])}return u}function xS(i,u){let f={};for(let g of u)for(let t of g.styles)f[t[0]]=g.inverse?null:t.slice(1);let c=i;for(let[g,t]of Object.entries(f))if(!!Array.isArray(t)){if(!(g in c))throw new Error(`Unknown Chalk style: ${g}`);c=t.length>0?c[g](...t):c[g]}return c}SS.exports=(i,u)=>{let f=[],c=[],g=[];if(u.replace(Tj,(t,C,A,x,D,L)=>{if(C)g.push(TS(C));else if(x){let N=g.join("");g=[],c.push(f.length===0?N:xS(i,f)(N)),f.push({inverse:A,styles:Ij(x)})}else if(D){if(f.length===0)throw new Error("Found extraneous } in Chalk template literal");c.push(xS(i,f)(g.join(""))),g=[],f.pop()}else g.push(L)}),c.push(g.join("")),f.length>0){let t=`Chalk template literal is missing ${f.length} closing bracket${f.length===1?"":"s"} (\`}\`)`;throw new Error(t)}return c.join("")}});var Jh=Me((oG,AS)=>{"use strict";var A2=Rh(),{stdout:_3,stderr:y3}=wS(),{stringReplaceAll:Pj,stringEncaseCRLFWithFirstIndex:Mj}=ES(),{isArray:Yh}=Array,OS=["ansi","ansi","ansi256","ansi16m"],ka=Object.create(null),Fj=(i,u={})=>{if(u.level&&!(Number.isInteger(u.level)&&u.level>=0&&u.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let f=_3?_3.level:0;i.level=u.level===void 0?f:u.level},IS=class{constructor(u){return PS(u)}},PS=i=>{let u={};return Fj(u,i),u.template=(...f)=>MS(u.template,...f),Object.setPrototypeOf(u,$h.prototype),Object.setPrototypeOf(u.template,u),u.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},u.template.Instance=IS,u.template};function $h(i){return PS(i)}for(let[i,u]of Object.entries(A2))ka[i]={get(){let f=Kh(this,w3(u.open,u.close,this._styler),this._isEmpty);return Object.defineProperty(this,i,{value:f}),f}};ka.visible={get(){let i=Kh(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:i}),i}};var LS=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let i of LS)ka[i]={get(){let{level:u}=this;return function(...f){let c=w3(A2.color[OS[u]][i](...f),A2.color.close,this._styler);return Kh(this,c,this._isEmpty)}}};for(let i of LS){let u="bg"+i[0].toUpperCase()+i.slice(1);ka[u]={get(){let{level:f}=this;return function(...c){let g=w3(A2.bgColor[OS[f]][i](...c),A2.bgColor.close,this._styler);return Kh(this,g,this._isEmpty)}}}}var Lj=Object.defineProperties(()=>{},zn(dt({},ka),{level:{enumerable:!0,get(){return this._generator.level},set(i){this._generator.level=i}}})),w3=(i,u,f)=>{let c,g;return f===void 0?(c=i,g=u):(c=f.openAll+i,g=u+f.closeAll),{open:i,close:u,openAll:c,closeAll:g,parent:f}},Kh=(i,u,f)=>{let c=(...g)=>Yh(g[0])&&Yh(g[0].raw)?RS(c,MS(c,...g)):RS(c,g.length===1?""+g[0]:g.join(" "));return Object.setPrototypeOf(c,Lj),c._generator=i,c._styler=u,c._isEmpty=f,c},RS=(i,u)=>{if(i.level<=0||!u)return i._isEmpty?"":u;let f=i._styler;if(f===void 0)return u;let{openAll:c,closeAll:g}=f;if(u.indexOf("")!==-1)for(;f!==void 0;)u=Pj(u,f.close,f.open),f=f.parent;let t=u.indexOf(` -`);return t!==-1&&(u=Mj(u,g,c,t)),c+u+g},D3,MS=(i,...u)=>{let[f]=u;if(!Yh(f)||!Yh(f.raw))return u.join(" ");let c=u.slice(1),g=[f.raw[0]];for(let t=1;t{"use strict";var Rj=O2&&O2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(O2,"__esModule",{value:!0});var I2=Rj(Jh()),Nj=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,Bj=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,Qh=(i,u)=>u==="foreground"?i:"bg"+i[0].toUpperCase()+i.slice(1);O2.default=(i,u,f)=>{if(!u)return i;if(u in I2.default){let g=Qh(u,f);return I2.default[g](i)}if(u.startsWith("#")){let g=Qh("hex",f);return I2.default[g](u)(i)}if(u.startsWith("ansi")){let g=Bj.exec(u);if(!g)return i;let t=Qh(g[1],f),C=Number(g[2]);return I2.default[t](C)(i)}if(u.startsWith("rgb")||u.startsWith("hsl")||u.startsWith("hsv")||u.startsWith("hwb")){let g=Nj.exec(u);if(!g)return i;let t=Qh(g[1],f),C=Number(g[2]),A=Number(g[3]),x=Number(g[4]);return I2.default[t](C,A,x)(i)}return i}});var BS=Me(P2=>{"use strict";var NS=P2&&P2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(P2,"__esModule",{value:!0});var jj=NS(mS()),S3=NS(E3());P2.default=(i,u,f,c)=>{if(typeof f.style.borderStyle=="string"){let g=f.yogaNode.getComputedWidth(),t=f.yogaNode.getComputedHeight(),C=f.style.borderColor,A=jj.default[f.style.borderStyle],x=S3.default(A.topLeft+A.horizontal.repeat(g-2)+A.topRight,C,"foreground"),D=(S3.default(A.vertical,C,"foreground")+` -`).repeat(t-2),L=S3.default(A.bottomLeft+A.horizontal.repeat(g-2)+A.bottomRight,C,"foreground");c.write(i,u,x,{transformers:[]}),c.write(i,u+1,D,{transformers:[]}),c.write(i+g-1,u+1,D,{transformers:[]}),c.write(i,u+t-1,L,{transformers:[]})}}});var US=Me(M2=>{"use strict";var _c=M2&&M2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(M2,"__esModule",{value:!0});var Uj=_c(hc()),qj=_c(jy()),zj=_c(cS()),Wj=_c(Yy()),Hj=_c(aS()),bj=_c(Ky()),Gj=_c(BS()),Vj=(i,u)=>{var f;let c=(f=i.childNodes[0])===null||f===void 0?void 0:f.yogaNode;if(c){let g=c.getComputedLeft(),t=c.getComputedTop();u=` -`.repeat(t)+zj.default(u,g)}return u},jS=(i,u,f)=>{var c;let{offsetX:g=0,offsetY:t=0,transformers:C=[],skipStaticElements:A}=f;if(A&&i.internal_static)return;let{yogaNode:x}=i;if(x){if(x.getDisplay()===Uj.default.DISPLAY_NONE)return;let D=g+x.getComputedLeft(),L=t+x.getComputedTop(),N=C;if(typeof i.internal_transform=="function"&&(N=[i.internal_transform,...C]),i.nodeName==="ink-text"){let j=bj.default(i);if(j.length>0){let $=qj.default(j),h=Hj.default(x);if($>h){let re=(c=i.style.textWrap)!==null&&c!==void 0?c:"wrap";j=Wj.default(j,h,re)}j=Vj(i,j),u.write(D,L,j,{transformers:N})}return}if(i.nodeName==="ink-box"&&Gj.default(D,L,i,u),i.nodeName==="ink-root"||i.nodeName==="ink-box")for(let j of i.childNodes)jS(j,u,{offsetX:D,offsetY:L,transformers:N,skipStaticElements:A})}};M2.default=jS});var zS=Me((fG,qS)=>{"use strict";qS.exports=i=>{i=Object.assign({onlyFirst:!1},i);let u=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(u,i.onlyFirst?void 0:"g")}});var HS=Me((cG,C3)=>{"use strict";var Yj=zS(),WS=i=>typeof i=="string"?i.replace(Yj(),""):i;C3.exports=WS;C3.exports.default=WS});var VS=Me((aG,bS)=>{"use strict";var GS="[\uD800-\uDBFF][\uDC00-\uDFFF]";bS.exports=i=>i&&i.exact?new RegExp(`^${GS}$`):new RegExp(GS,"g")});var $S=Me((dG,T3)=>{"use strict";var $j=HS(),Kj=VS(),YS=i=>$j(i).replace(Kj()," ").length;T3.exports=YS;T3.exports.default=YS});var QS=Me(F2=>{"use strict";var KS=F2&&F2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(F2,"__esModule",{value:!0});var XS=KS(Gy()),Xj=KS($S()),JS=class{constructor(u){this.writes=[];let{width:f,height:c}=u;this.width=f,this.height=c}write(u,f,c,g){let{transformers:t}=g;!c||this.writes.push({x:u,y:f,text:c,transformers:t})}get(){let u=[];for(let c=0;cc.trimRight()).join(` -`),height:u.length}}};F2.default=JS});var t5=Me(L2=>{"use strict";var x3=L2&&L2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(L2,"__esModule",{value:!0});var Jj=x3(hc()),ZS=x3(US()),e5=x3(QS());L2.default=(i,u)=>{var f;if(i.yogaNode.setWidth(u),i.yogaNode){i.yogaNode.calculateLayout(void 0,void 0,Jj.default.DIRECTION_LTR);let c=new e5.default({width:i.yogaNode.getComputedWidth(),height:i.yogaNode.getComputedHeight()});ZS.default(i,c,{skipStaticElements:!0});let g;((f=i.staticNode)===null||f===void 0?void 0:f.yogaNode)&&(g=new e5.default({width:i.staticNode.yogaNode.getComputedWidth(),height:i.staticNode.yogaNode.getComputedHeight()}),ZS.default(i.staticNode,g,{skipStaticElements:!1}));let{output:t,height:C}=c.get();return{output:t,outputHeight:C,staticOutput:g?`${g.get().output} -`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var o5=Me((mG,n5)=>{"use strict";var r5=require("stream"),i5=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],k3={},Qj=i=>{let u=new r5.PassThrough,f=new r5.PassThrough;u.write=g=>i("stdout",g),f.write=g=>i("stderr",g);let c=new console.Console(u,f);for(let g of i5)k3[g]=console[g],console[g]=c[g];return()=>{for(let g of i5)console[g]=k3[g];k3={}}};n5.exports=Qj});var O3=Me(A3=>{"use strict";Object.defineProperty(A3,"__esModule",{value:!0});A3.default=new WeakMap});var P3=Me(I3=>{"use strict";Object.defineProperty(I3,"__esModule",{value:!0});var Zj=lr(),u5=Zj.createContext({exit:()=>{}});u5.displayName="InternalAppContext";I3.default=u5});var F3=Me(M3=>{"use strict";Object.defineProperty(M3,"__esModule",{value:!0});var eU=lr(),s5=eU.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});s5.displayName="InternalStdinContext";M3.default=s5});var R3=Me(L3=>{"use strict";Object.defineProperty(L3,"__esModule",{value:!0});var tU=lr(),l5=tU.createContext({stdout:void 0,write:()=>{}});l5.displayName="InternalStdoutContext";L3.default=l5});var B3=Me(N3=>{"use strict";Object.defineProperty(N3,"__esModule",{value:!0});var nU=lr(),f5=nU.createContext({stderr:void 0,write:()=>{}});f5.displayName="InternalStderrContext";N3.default=f5});var Zh=Me(j3=>{"use strict";Object.defineProperty(j3,"__esModule",{value:!0});var rU=lr(),c5=rU.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});c5.displayName="InternalFocusContext";j3.default=c5});var d5=Me((EG,a5)=>{"use strict";var iU=/[|\\{}()[\]^$+*?.-]/g;a5.exports=i=>{if(typeof i!="string")throw new TypeError("Expected a string");return i.replace(iU,"\\$&")}});var v5=Me((SG,p5)=>{"use strict";var oU=d5(),h5=[].concat(require("module").builtinModules,"bootstrap_node","node").map(i=>new RegExp(`(?:\\(${i}\\.js:\\d+:\\d+\\)$|^\\s*at ${i}\\.js:\\d+:\\d+$)`));h5.push(/\(internal\/[^:]+:\d+:\d+\)$/,/\s*at internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var em=class{constructor(u){u=dt({ignoredPackages:[]},u),"internals"in u||(u.internals=em.nodeInternals()),"cwd"in u||(u.cwd=process.cwd()),this._cwd=u.cwd.replace(/\\/g,"/"),this._internals=[].concat(u.internals,uU(u.ignoredPackages)),this._wrapCallSite=u.wrapCallSite||!1}static nodeInternals(){return[...h5]}clean(u,f=0){f=" ".repeat(f),Array.isArray(u)||(u=u.split(` -`)),!/^\s*at /.test(u[0])&&/^\s*at /.test(u[1])&&(u=u.slice(1));let c=!1,g=null,t=[];return u.forEach(C=>{if(C=C.replace(/\\/g,"/"),this._internals.some(x=>x.test(C)))return;let A=/^\s*at /.test(C);c?C=C.trimEnd().replace(/^(\s+)at /,"$1"):(C=C.trim(),A&&(C=C.slice(3))),C=C.replace(`${this._cwd}/`,""),C&&(A?(g&&(t.push(g),g=null),t.push(C)):(c=!0,g=C))}),t.map(C=>`${f}${C} -`).join("")}captureString(u,f=this.captureString){typeof u=="function"&&(f=u,u=Infinity);let{stackTraceLimit:c}=Error;u&&(Error.stackTraceLimit=u);let g={};Error.captureStackTrace(g,f);let{stack:t}=g;return Error.stackTraceLimit=c,this.clean(t)}capture(u,f=this.capture){typeof u=="function"&&(f=u,u=Infinity);let{prepareStackTrace:c,stackTraceLimit:g}=Error;Error.prepareStackTrace=(A,x)=>this._wrapCallSite?x.map(this._wrapCallSite):x,u&&(Error.stackTraceLimit=u);let t={};Error.captureStackTrace(t,f);let{stack:C}=t;return Object.assign(Error,{prepareStackTrace:c,stackTraceLimit:g}),C}at(u=this.at){let[f]=this.capture(1,u);if(!f)return{};let c={line:f.getLineNumber(),column:f.getColumnNumber()};m5(c,f.getFileName(),this._cwd),f.isConstructor()&&(c.constructor=!0),f.isEval()&&(c.evalOrigin=f.getEvalOrigin()),f.isNative()&&(c.native=!0);let g;try{g=f.getTypeName()}catch(A){}g&&g!=="Object"&&g!=="[object Object]"&&(c.type=g);let t=f.getFunctionName();t&&(c.function=t);let C=f.getMethodName();return C&&t!==C&&(c.method=C),c}parseLine(u){let f=u&&u.match(sU);if(!f)return null;let c=f[1]==="new",g=f[2],t=f[3],C=f[4],A=Number(f[5]),x=Number(f[6]),D=f[7],L=f[8],N=f[9],j=f[10]==="native",$=f[11]===")",h,re={};if(L&&(re.line=Number(L)),N&&(re.column=Number(N)),$&&D){let ce=0;for(let Q=D.length-1;Q>0;Q--)if(D.charAt(Q)===")")ce++;else if(D.charAt(Q)==="("&&D.charAt(Q-1)===" "&&(ce--,ce===-1&&D.charAt(Q-1)===" ")){let oe=D.slice(0,Q-1);D=D.slice(Q+1),g+=` (${oe}`;break}}if(g){let ce=g.match(lU);ce&&(g=ce[1],h=ce[2])}return m5(re,D,this._cwd),c&&(re.constructor=!0),t&&(re.evalOrigin=t,re.evalLine=A,re.evalColumn=x,re.evalFile=C&&C.replace(/\\/g,"/")),j&&(re.native=!0),g&&(re.function=g),h&&g!==h&&(re.method=h),re}};function m5(i,u,f){u&&(u=u.replace(/\\/g,"/"),u.startsWith(`${f}/`)&&(u=u.slice(f.length+1)),i.file=u)}function uU(i){if(i.length===0)return[];let u=i.map(f=>oU(f));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${u.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var sU=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),lU=/^(.*?) \[as (.*?)\]$/;p5.exports=em});var _5=Me((CG,g5)=>{"use strict";g5.exports=(i,u)=>i.replace(/^\t+/gm,f=>" ".repeat(f.length*(u||2)))});var w5=Me((TG,y5)=>{"use strict";var fU=_5(),cU=(i,u)=>{let f=[],c=i-u,g=i+u;for(let t=c;t<=g;t++)f.push(t);return f};y5.exports=(i,u,f)=>{if(typeof i!="string")throw new TypeError("Source code is missing.");if(!u||u<1)throw new TypeError("Line number must start from `1`.");if(i=fU(i).split(/\r?\n/),!(u>i.length))return f=dt({around:3},f),cU(u,f.around).filter(c=>i[c-1]!==void 0).map(c=>({line:c,value:i[c-1]}))}});var tm=Me(hs=>{"use strict";var aU=hs&&hs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),dU=hs&&hs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),pU=hs&&hs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&aU(u,i,f);return dU(u,i),u},hU=hs&&hs.__rest||function(i,u){var f={};for(var c in i)Object.prototype.hasOwnProperty.call(i,c)&&u.indexOf(c)<0&&(f[c]=i[c]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var g=0,c=Object.getOwnPropertySymbols(i);g{var{children:f}=i,c=hU(i,["children"]);let g=Object.assign(Object.assign({},c),{marginLeft:c.marginLeft||c.marginX||c.margin||0,marginRight:c.marginRight||c.marginX||c.margin||0,marginTop:c.marginTop||c.marginY||c.margin||0,marginBottom:c.marginBottom||c.marginY||c.margin||0,paddingLeft:c.paddingLeft||c.paddingX||c.padding||0,paddingRight:c.paddingRight||c.paddingX||c.padding||0,paddingTop:c.paddingTop||c.paddingY||c.padding||0,paddingBottom:c.paddingBottom||c.paddingY||c.padding||0});return D5.default.createElement("ink-box",{ref:u,style:g},f)});U3.displayName="Box";U3.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};hs.default=U3});var W3=Me(R2=>{"use strict";var q3=R2&&R2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(R2,"__esModule",{value:!0});var mU=q3(lr()),Aa=q3(Jh()),E5=q3(E3()),z3=({color:i,backgroundColor:u,dimColor:f,bold:c,italic:g,underline:t,strikethrough:C,inverse:A,wrap:x,children:D})=>{if(D==null)return null;let L=N=>(f&&(N=Aa.default.dim(N)),i&&(N=E5.default(N,i,"foreground")),u&&(N=E5.default(N,u,"background")),c&&(N=Aa.default.bold(N)),g&&(N=Aa.default.italic(N)),t&&(N=Aa.default.underline(N)),C&&(N=Aa.default.strikethrough(N)),A&&(N=Aa.default.inverse(N)),N);return mU.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:x},internal_transform:L},D)};z3.displayName="Text";z3.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};R2.default=z3});var x5=Me(ms=>{"use strict";var vU=ms&&ms.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),gU=ms&&ms.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),_U=ms&&ms.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&vU(u,i,f);return gU(u,i),u},N2=ms&&ms.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(ms,"__esModule",{value:!0});var S5=_U(require("fs")),ui=N2(lr()),C5=N2(v5()),yU=N2(w5()),ef=N2(tm()),il=N2(W3()),T5=new C5.default({cwd:process.cwd(),internals:C5.default.nodeInternals()}),wU=({error:i})=>{let u=i.stack?i.stack.split(` -`).slice(1):void 0,f=u?T5.parseLine(u[0]):void 0,c,g=0;if((f==null?void 0:f.file)&&(f==null?void 0:f.line)&&S5.existsSync(f.file)){let t=S5.readFileSync(f.file,"utf8");if(c=yU.default(t,f.line),c)for(let{line:C}of c)g=Math.max(g,String(C).length)}return ui.default.createElement(ef.default,{flexDirection:"column",padding:1},ui.default.createElement(ef.default,null,ui.default.createElement(il.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),ui.default.createElement(il.default,null," ",i.message)),f&&ui.default.createElement(ef.default,{marginTop:1},ui.default.createElement(il.default,{dimColor:!0},f.file,":",f.line,":",f.column)),f&&c&&ui.default.createElement(ef.default,{marginTop:1,flexDirection:"column"},c.map(({line:t,value:C})=>ui.default.createElement(ef.default,{key:t},ui.default.createElement(ef.default,{width:g+1},ui.default.createElement(il.default,{dimColor:t!==f.line,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0},String(t).padStart(g," "),":")),ui.default.createElement(il.default,{key:t,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0}," "+C)))),i.stack&&ui.default.createElement(ef.default,{marginTop:1,flexDirection:"column"},i.stack.split(` -`).slice(1).map(t=>{let C=T5.parseLine(t);return C?ui.default.createElement(ef.default,{key:t},ui.default.createElement(il.default,{dimColor:!0},"- "),ui.default.createElement(il.default,{dimColor:!0,bold:!0},C.function),ui.default.createElement(il.default,{dimColor:!0,color:"gray"}," ","(",C.file,":",C.line,":",C.column,")")):ui.default.createElement(ef.default,{key:t},ui.default.createElement(il.default,{dimColor:!0},"- "),ui.default.createElement(il.default,{dimColor:!0,bold:!0},t))})))};ms.default=wU});var A5=Me(vs=>{"use strict";var DU=vs&&vs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),EU=vs&&vs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),SU=vs&&vs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&DU(u,i,f);return EU(u,i),u},yc=vs&&vs.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(vs,"__esModule",{value:!0});var wc=SU(lr()),k5=yc(gy()),CU=yc(P3()),TU=yc(F3()),xU=yc(R3()),kU=yc(B3()),AU=yc(Zh()),OU=yc(x5()),IU=" ",PU="",MU="",H3=class extends wc.PureComponent{constructor(){super(...arguments);this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=u=>{let{stdin:f}=this.props;if(!this.isRawModeSupported())throw f===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(f.setEncoding("utf8"),u){this.rawModeEnabledCount===0&&(f.addListener("data",this.handleInput),f.resume(),f.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount==0&&(f.setRawMode(!1),f.removeListener("data",this.handleInput),f.pause())},this.handleInput=u=>{u===""&&this.props.exitOnCtrlC&&this.handleExit(),u===MU&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(u===IU&&this.focusNext(),u===PU&&this.focusPrevious())},this.handleExit=u=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(u)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(u=>{let f=u.focusables[0].id;return{activeFocusId:this.findNextFocusable(u)||f}})},this.focusPrevious=()=>{this.setState(u=>{let f=u.focusables[u.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(u)||f}})},this.addFocusable=(u,{autoFocus:f})=>{this.setState(c=>{let g=c.activeFocusId;return!g&&f&&(g=u),{activeFocusId:g,focusables:[...c.focusables,{id:u,isActive:!0}]}})},this.removeFocusable=u=>{this.setState(f=>({activeFocusId:f.activeFocusId===u?void 0:f.activeFocusId,focusables:f.focusables.filter(c=>c.id!==u)}))},this.activateFocusable=u=>{this.setState(f=>({focusables:f.focusables.map(c=>c.id!==u?c:{id:u,isActive:!0})}))},this.deactivateFocusable=u=>{this.setState(f=>({activeFocusId:f.activeFocusId===u?void 0:f.activeFocusId,focusables:f.focusables.map(c=>c.id!==u?c:{id:u,isActive:!1})}))},this.findNextFocusable=u=>{let f=u.focusables.findIndex(c=>c.id===u.activeFocusId);for(let c=f+1;c{let f=u.focusables.findIndex(c=>c.id===u.activeFocusId);for(let c=f-1;c>=0;c--)if(u.focusables[c].isActive)return u.focusables[c].id}}static getDerivedStateFromError(u){return{error:u}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return wc.default.createElement(CU.default.Provider,{value:{exit:this.handleExit}},wc.default.createElement(TU.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},wc.default.createElement(xU.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},wc.default.createElement(kU.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},wc.default.createElement(AU.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious}},this.state.error?wc.default.createElement(OU.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){k5.default.hide(this.props.stdout)}componentWillUnmount(){k5.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(u){this.handleExit(u)}};vs.default=H3;H3.displayName="InternalApp"});var M5=Me(gs=>{"use strict";var FU=gs&&gs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),LU=gs&&gs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),RU=gs&&gs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&FU(u,i,f);return LU(u,i),u},_s=gs&&gs.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(gs,"__esModule",{value:!0});var NU=_s(lr()),O5=AD(),BU=_s(WD()),jU=_s(ay()),UU=_s(KD()),qU=_s(JD()),nm=_s(lS()),zU=_s(t5()),WU=_s(vy()),HU=_s(o5()),bU=RU(Xy()),GU=_s(O3()),VU=_s(A5()),Oa=process.env.CI==="false"?!1:UU.default,I5=()=>{},P5=class{constructor(u){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:f,outputHeight:c,staticOutput:g}=zU.default(this.rootNode,this.options.stdout.columns||80),t=g&&g!==` -`;if(this.options.debug){t&&(this.fullStaticOutput+=g),this.options.stdout.write(this.fullStaticOutput+f);return}if(Oa){t&&this.options.stdout.write(g),this.lastOutput=f;return}if(t&&(this.fullStaticOutput+=g),c>=this.options.stdout.rows){this.options.stdout.write(jU.default.clearTerminal+this.fullStaticOutput+f),this.lastOutput=f;return}t&&(this.log.clear(),this.options.stdout.write(g),this.log(f)),!t&&f!==this.lastOutput&&this.throttledLog(f),this.lastOutput=f},qU.default(this),this.options=u,this.rootNode=bU.createNode("ink-root"),this.rootNode.onRender=u.debug?this.onRender:O5.throttle(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=BU.default.create(u.stdout),this.throttledLog=u.debug?this.log:O5.throttle(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=nm.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=WU.default(this.unmount,{alwaysLast:!1}),process.env.DEV==="true"&&nm.default.injectIntoDevTools({bundleType:0,version:"16.13.1",rendererPackageName:"ink"}),u.patchConsole&&this.patchConsole(),Oa||(u.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{u.stdout.off("resize",this.onRender)})}render(u){let f=NU.default.createElement(VU.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},u);nm.default.updateContainer(f,this.container,null,I5)}writeToStdout(u){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(u+this.fullStaticOutput+this.lastOutput);return}if(Oa){this.options.stdout.write(u);return}this.log.clear(),this.options.stdout.write(u),this.log(this.lastOutput)}}writeToStderr(u){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(u),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(Oa){this.options.stderr.write(u);return}this.log.clear(),this.options.stderr.write(u),this.log(this.lastOutput)}}unmount(u){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),Oa?this.options.stdout.write(this.lastOutput+` -`):this.options.debug||this.log.done(),this.isUnmounted=!0,nm.default.updateContainer(null,this.container,null,I5),GU.default.delete(this.options.stdout),u instanceof Error?this.rejectExitPromise(u):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((u,f)=>{this.resolveExitPromise=u,this.rejectExitPromise=f})),this.exitPromise}clear(){!Oa&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=HU.default((u,f)=>{u==="stdout"&&this.writeToStdout(f),u==="stderr"&&(f.startsWith("The above error occurred")||this.writeToStderr(f))}))}};gs.default=P5});var L5=Me(B2=>{"use strict";var F5=B2&&B2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(B2,"__esModule",{value:!0});var YU=F5(M5()),rm=F5(O3()),$U=require("stream"),JU=(i,u)=>{let f=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},KU(u)),c=XU(f.stdout,()=>new YU.default(f));return c.render(i),{rerender:c.render,unmount:()=>c.unmount(),waitUntilExit:c.waitUntilExit,cleanup:()=>rm.default.delete(f.stdout),clear:c.clear}};B2.default=JU;var KU=(i={})=>i instanceof $U.Stream?{stdout:i,stdin:process.stdin}:i,XU=(i,u)=>{let f;return rm.default.has(i)?f=rm.default.get(i):(f=u(),rm.default.set(i,f)),f}});var N5=Me(tf=>{"use strict";var QU=tf&&tf.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),ZU=tf&&tf.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),eq=tf&&tf.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&QU(u,i,f);return ZU(u,i),u};Object.defineProperty(tf,"__esModule",{value:!0});var j2=eq(lr()),R5=i=>{let{items:u,children:f,style:c}=i,[g,t]=j2.useState(0),C=j2.useMemo(()=>u.slice(g),[u,g]);j2.useLayoutEffect(()=>{t(u.length)},[u.length]);let A=C.map((D,L)=>f(D,g+L)),x=j2.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},c),[c]);return j2.default.createElement("ink-box",{internal_static:!0,style:x},A)};R5.displayName="Static";tf.default=R5});var j5=Me(U2=>{"use strict";var tq=U2&&U2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(U2,"__esModule",{value:!0});var nq=tq(lr()),B5=({children:i,transform:u})=>i==null?null:nq.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:u},i);B5.displayName="Transform";U2.default=B5});var q5=Me(q2=>{"use strict";var rq=q2&&q2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(q2,"__esModule",{value:!0});var iq=rq(lr()),U5=({count:i=1})=>iq.default.createElement("ink-text",null,` -`.repeat(i));U5.displayName="Newline";q2.default=U5});var H5=Me(z2=>{"use strict";var z5=z2&&z2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(z2,"__esModule",{value:!0});var oq=z5(lr()),uq=z5(tm()),W5=()=>oq.default.createElement(uq.default,{flexGrow:1});W5.displayName="Spacer";z2.default=W5});var im=Me(W2=>{"use strict";var sq=W2&&W2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(W2,"__esModule",{value:!0});var lq=lr(),fq=sq(F3()),cq=()=>lq.useContext(fq.default);W2.default=cq});var G5=Me(H2=>{"use strict";var aq=H2&&H2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(H2,"__esModule",{value:!0});var b5=lr(),dq=aq(im()),pq=(i,u={})=>{let{stdin:f,setRawMode:c,internal_exitOnCtrlC:g}=dq.default();b5.useEffect(()=>{if(u.isActive!==!1)return c(!0),()=>{c(!1)}},[u.isActive,c]),b5.useEffect(()=>{if(u.isActive===!1)return;let t=C=>{let A=String(C),x={upArrow:A==="",downArrow:A==="",leftArrow:A==="",rightArrow:A==="",pageDown:A==="[6~",pageUp:A==="[5~",return:A==="\r",escape:A==="",ctrl:!1,shift:!1,tab:A===" "||A==="",backspace:A==="\b",delete:A==="\x7F"||A==="[3~",meta:!1};A<=""&&!x.return&&(A=String.fromCharCode(A.charCodeAt(0)+"a".charCodeAt(0)-1),x.ctrl=!0),A.startsWith("")&&(A=A.slice(1),x.meta=!0);let D=A>="A"&&A<="Z",L=A>="\u0410"&&A<="\u042F";A.length===1&&(D||L)&&(x.shift=!0),x.tab&&A==="[Z"&&(x.shift=!0),(x.tab||x.backspace||x.delete)&&(A=""),(!(A==="c"&&x.ctrl)||!g)&&i(A,x)};return f==null||f.on("data",t),()=>{f==null||f.off("data",t)}},[u.isActive,f,g,i])};H2.default=pq});var V5=Me(b2=>{"use strict";var hq=b2&&b2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(b2,"__esModule",{value:!0});var mq=lr(),vq=hq(P3()),gq=()=>mq.useContext(vq.default);b2.default=gq});var Y5=Me(G2=>{"use strict";var _q=G2&&G2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(G2,"__esModule",{value:!0});var yq=lr(),wq=_q(R3()),Dq=()=>yq.useContext(wq.default);G2.default=Dq});var $5=Me(V2=>{"use strict";var Eq=V2&&V2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(V2,"__esModule",{value:!0});var Sq=lr(),Cq=Eq(B3()),Tq=()=>Sq.useContext(Cq.default);V2.default=Tq});var X5=Me(Y2=>{"use strict";var K5=Y2&&Y2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Y2,"__esModule",{value:!0});var $2=lr(),xq=K5(Zh()),kq=K5(im()),Aq=({isActive:i=!0,autoFocus:u=!1}={})=>{let{isRawModeSupported:f,setRawMode:c}=kq.default(),{activeId:g,add:t,remove:C,activate:A,deactivate:x}=$2.useContext(xq.default),D=$2.useMemo(()=>Math.random().toString().slice(2,7),[]);return $2.useEffect(()=>(t(D,{autoFocus:u}),()=>{C(D)}),[D,u]),$2.useEffect(()=>{i?A(D):x(D)},[i,D]),$2.useEffect(()=>{if(!(!f||!i))return c(!0),()=>{c(!1)}},[i]),{isFocused:Boolean(D)&&g===D}};Y2.default=Aq});var J5=Me(K2=>{"use strict";var Oq=K2&&K2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(K2,"__esModule",{value:!0});var Iq=lr(),Pq=Oq(Zh()),Mq=()=>{let i=Iq.useContext(Pq.default);return{enableFocus:i.enableFocus,disableFocus:i.disableFocus,focusNext:i.focusNext,focusPrevious:i.focusPrevious}};K2.default=Mq});var Q5=Me(b3=>{"use strict";Object.defineProperty(b3,"__esModule",{value:!0});b3.default=i=>{var u,f,c,g;return{width:(f=(u=i.yogaNode)===null||u===void 0?void 0:u.getComputedWidth())!==null&&f!==void 0?f:0,height:(g=(c=i.yogaNode)===null||c===void 0?void 0:c.getComputedHeight())!==null&&g!==void 0?g:0}}});var ys=Me(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});var Fq=L5();Object.defineProperty(ji,"render",{enumerable:!0,get:function(){return Fq.default}});var Lq=tm();Object.defineProperty(ji,"Box",{enumerable:!0,get:function(){return Lq.default}});var Rq=W3();Object.defineProperty(ji,"Text",{enumerable:!0,get:function(){return Rq.default}});var Nq=N5();Object.defineProperty(ji,"Static",{enumerable:!0,get:function(){return Nq.default}});var Bq=j5();Object.defineProperty(ji,"Transform",{enumerable:!0,get:function(){return Bq.default}});var jq=q5();Object.defineProperty(ji,"Newline",{enumerable:!0,get:function(){return jq.default}});var Uq=H5();Object.defineProperty(ji,"Spacer",{enumerable:!0,get:function(){return Uq.default}});var qq=G5();Object.defineProperty(ji,"useInput",{enumerable:!0,get:function(){return qq.default}});var zq=V5();Object.defineProperty(ji,"useApp",{enumerable:!0,get:function(){return zq.default}});var Wq=im();Object.defineProperty(ji,"useStdin",{enumerable:!0,get:function(){return Wq.default}});var Hq=Y5();Object.defineProperty(ji,"useStdout",{enumerable:!0,get:function(){return Hq.default}});var bq=$5();Object.defineProperty(ji,"useStderr",{enumerable:!0,get:function(){return bq.default}});var Gq=X5();Object.defineProperty(ji,"useFocus",{enumerable:!0,get:function(){return Gq.default}});var Vq=J5();Object.defineProperty(ji,"useFocusManager",{enumerable:!0,get:function(){return Vq.default}});var Yq=Q5();Object.defineProperty(ji,"measureElement",{enumerable:!0,get:function(){return Yq.default}})});var lC=Me(X2=>{"use strict";Object.defineProperty(X2,"__esModule",{value:!0});X2.UncontrolledTextInput=void 0;var oC=lr(),Y3=lr(),uC=ys(),Sc=Jh(),sC=({value:i,placeholder:u="",focus:f=!0,mask:c,highlightPastedText:g=!1,showCursor:t=!0,onChange:C,onSubmit:A})=>{let[{cursorOffset:x,cursorWidth:D},L]=Y3.useState({cursorOffset:(i||"").length,cursorWidth:0});Y3.useEffect(()=>{L(re=>{if(!f||!t)return re;let ce=i||"";return re.cursorOffset>ce.length-1?{cursorOffset:ce.length,cursorWidth:0}:re})},[i,f,t]);let N=g?D:0,j=c?c.repeat(i.length):i,$=j,h=u?Sc.grey(u):void 0;if(t&&f){h=u.length>0?Sc.inverse(u[0])+Sc.grey(u.slice(1)):Sc.inverse(" "),$=j.length>0?"":Sc.inverse(" ");let re=0;for(let ce of j)re>=x-N&&re<=x?$+=Sc.inverse(ce):$+=ce,re++;j.length>0&&x===j.length&&($+=Sc.inverse(" "))}return uC.useInput((re,ce)=>{if(ce.upArrow||ce.downArrow||ce.ctrl&&re==="c"||ce.tab||ce.shift&&ce.tab)return;if(ce.return){A&&A(i);return}let Q=x,oe=i,Se=0;ce.leftArrow?t&&Q--:ce.rightArrow?t&&Q++:ce.backspace||ce.delete?x>0&&(oe=i.slice(0,x-1)+i.slice(x,i.length),Q--):(oe=i.slice(0,x)+re+i.slice(x,i.length),Q+=re.length,re.length>1&&(Se=re.length)),x<0&&(Q=0),x>i.length&&(Q=i.length),L({cursorOffset:Q,cursorWidth:Se}),oe!==i&&C(oe)},{isActive:f}),oC.createElement(uC.Text,null,u?j.length>0?$:h:$)};X2.default=sC;X2.UncontrolledTextInput=i=>{let[u,f]=Y3.useState("");return oC.createElement(sC,Object.assign({},i,{value:u,onChange:f}))}});var cC=Me(pm=>{"use strict";Object.defineProperty(pm,"__esModule",{value:!0});function J2(i){let u=[...i.caches],f=u.shift();return f===void 0?fC():{get(c,g,t={miss:()=>Promise.resolve()}){return f.get(c,g,t).catch(()=>J2({caches:u}).get(c,g,t))},set(c,g){return f.set(c,g).catch(()=>J2({caches:u}).set(c,g))},delete(c){return f.delete(c).catch(()=>J2({caches:u}).delete(c))},clear(){return f.clear().catch(()=>J2({caches:u}).clear())}}}function fC(){return{get(i,u,f={miss:()=>Promise.resolve()}){return u().then(g=>Promise.all([g,f.miss(g)])).then(([g])=>g)},set(i,u){return Promise.resolve(u)},delete(i){return Promise.resolve()},clear(){return Promise.resolve()}}}pm.createFallbackableCache=J2;pm.createNullCache=fC});var dC=Me((fV,aC)=>{aC.exports=cC()});var pC=Me($3=>{"use strict";Object.defineProperty($3,"__esModule",{value:!0});function $q(i={serializable:!0}){let u={};return{get(f,c,g={miss:()=>Promise.resolve()}){let t=JSON.stringify(f);if(t in u)return Promise.resolve(i.serializable?JSON.parse(u[t]):u[t]);let C=c(),A=g&&g.miss||(()=>Promise.resolve());return C.then(x=>A(x)).then(()=>C)},set(f,c){return u[JSON.stringify(f)]=i.serializable?JSON.stringify(c):c,Promise.resolve(c)},delete(f){return delete u[JSON.stringify(f)],Promise.resolve()},clear(){return u={},Promise.resolve()}}}$3.createInMemoryCache=$q});var mC=Me((aV,hC)=>{hC.exports=pC()});var gC=Me(ws=>{"use strict";Object.defineProperty(ws,"__esModule",{value:!0});function Kq(i,u,f){let c={"x-algolia-api-key":f,"x-algolia-application-id":u};return{headers(){return i===K3.WithinHeaders?c:{}},queryParameters(){return i===K3.WithinQueryParameters?c:{}}}}function Xq(i){let u=0,f=()=>(u++,new Promise(c=>{setTimeout(()=>{c(i(f))},Math.min(100*u,1e3))}));return i(f)}function vC(i,u=(f,c)=>Promise.resolve()){return Object.assign(i,{wait(f){return vC(i.then(c=>Promise.all([u(c,f),c])).then(c=>c[1]))}})}function Jq(i){let u=i.length-1;for(u;u>0;u--){let f=Math.floor(Math.random()*(u+1)),c=i[u];i[u]=i[f],i[f]=c}return i}function Qq(i,u){return Object.keys(u!==void 0?u:{}).forEach(f=>{i[f]=u[f](i)}),i}function Zq(i,...u){let f=0;return i.replace(/%s/g,()=>encodeURIComponent(u[f++]))}var ez="4.2.0",tz=i=>()=>i.transporter.requester.destroy(),K3={WithinQueryParameters:0,WithinHeaders:1};ws.AuthMode=K3;ws.addMethods=Qq;ws.createAuth=Kq;ws.createRetryablePromise=Xq;ws.createWaitablePromise=vC;ws.destroy=tz;ws.encode=Zq;ws.shuffle=Jq;ws.version=ez});var Q2=Me((pV,_C)=>{_C.exports=gC()});var yC=Me(X3=>{"use strict";Object.defineProperty(X3,"__esModule",{value:!0});var nz={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};X3.MethodEnum=nz});var Z2=Me((mV,wC)=>{wC.exports=yC()});var RC=Me(y0=>{"use strict";Object.defineProperty(y0,"__esModule",{value:!0});var DC=Z2();function J3(i,u){let f=i||{},c=f.data||{};return Object.keys(f).forEach(g=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(g)===-1&&(c[g]=f[g])}),{data:Object.entries(c).length>0?c:void 0,timeout:f.timeout||u,headers:f.headers||{},queryParameters:f.queryParameters||{},cacheable:f.cacheable}}var hm={Read:1,Write:2,Any:3},Ia={Up:1,Down:2,Timeouted:3},EC=2*60*1e3;function Q3(i,u=Ia.Up){return zn(dt({},i),{status:u,lastUpdate:Date.now()})}function SC(i){return i.status===Ia.Up||Date.now()-i.lastUpdate>EC}function CC(i){return i.status===Ia.Timeouted&&Date.now()-i.lastUpdate<=EC}function Z3(i){return{protocol:i.protocol||"https",url:i.url,accept:i.accept||hm.Any}}function rz(i,u){return Promise.all(u.map(f=>i.get(f,()=>Promise.resolve(Q3(f))))).then(f=>{let c=f.filter(A=>SC(A)),g=f.filter(A=>CC(A)),t=[...c,...g],C=t.length>0?t.map(A=>Z3(A)):u;return{getTimeout(A,x){return(g.length===0&&A===0?1:g.length+3+A)*x},statelessHosts:C}})}var iz=({isTimedOut:i,status:u})=>!i&&~~u==0,oz=i=>{let u=i.status;return i.isTimedOut||iz(i)||~~(u/100)!=2&&~~(u/100)!=4},uz=({status:i})=>~~(i/100)==2,sz=(i,u)=>oz(i)?u.onRetry(i):uz(i)?u.onSucess(i):u.onFail(i);function PC(i,u,f,c){let g=[],t=AC(f,c),C=OC(i,c),A=f.method,x=f.method!==DC.MethodEnum.Get?{}:dt(dt({},f.data),c.data),D=dt(dt(dt({"x-algolia-agent":i.userAgent.value},i.queryParameters),x),c.queryParameters),L=0,N=(j,$)=>{let h=j.pop();if(h===void 0)throw IC(ew(g));let re={data:t,headers:C,method:A,url:kC(h,f.path,D),connectTimeout:$(L,i.timeouts.connect),responseTimeout:$(L,c.timeout)},ce=oe=>{let Se={request:re,response:oe,host:h,triesLeft:j.length};return g.push(Se),Se},Q={onSucess:oe=>TC(oe),onRetry(oe){let Se=ce(oe);return oe.isTimedOut&&L++,Promise.all([i.logger.info("Retryable failure",tw(Se)),i.hostsCache.set(h,Q3(h,oe.isTimedOut?Ia.Timeouted:Ia.Down))]).then(()=>N(j,$))},onFail(oe){throw ce(oe),xC(oe,ew(g))}};return i.requester.send(re).then(oe=>sz(oe,Q))};return rz(i.hostsCache,u).then(j=>N([...j.statelessHosts].reverse(),j.getTimeout))}function lz(i){let{hostsCache:u,logger:f,requester:c,requestsCache:g,responsesCache:t,timeouts:C,userAgent:A,hosts:x,queryParameters:D,headers:L}=i,N={hostsCache:u,logger:f,requester:c,requestsCache:g,responsesCache:t,timeouts:C,userAgent:A,headers:L,queryParameters:D,hosts:x.map(j=>Z3(j)),read(j,$){let h=J3($,N.timeouts.read),re=()=>PC(N,N.hosts.filter(oe=>(oe.accept&hm.Read)!=0),j,h);if((h.cacheable!==void 0?h.cacheable:j.cacheable)!==!0)return re();let Q={request:j,mappedRequestOptions:h,transporter:{queryParameters:N.queryParameters,headers:N.headers}};return N.responsesCache.get(Q,()=>N.requestsCache.get(Q,()=>N.requestsCache.set(Q,re()).then(oe=>Promise.all([N.requestsCache.delete(Q),oe]),oe=>Promise.all([N.requestsCache.delete(Q),Promise.reject(oe)])).then(([oe,Se])=>Se)),{miss:oe=>N.responsesCache.set(Q,oe)})},write(j,$){return PC(N,N.hosts.filter(h=>(h.accept&hm.Write)!=0),j,J3($,N.timeouts.write))}};return N}function fz(i){let u={value:`Algolia for JavaScript (${i})`,add(f){let c=`; ${f.segment}${f.version!==void 0?` (${f.version})`:""}`;return u.value.indexOf(c)===-1&&(u.value=`${u.value}${c}`),u}};return u}function TC(i){try{return JSON.parse(i.content)}catch(u){throw MC(u.message,i)}}function xC({content:i,status:u},f){let c=i;try{c=JSON.parse(i).message}catch(g){}return FC(c,u,f)}function cz(i,...u){let f=0;return i.replace(/%s/g,()=>encodeURIComponent(u[f++]))}function kC(i,u,f){let c=LC(f),g=`${i.protocol}://${i.url}/${u.charAt(0)==="/"?u.substr(1):u}`;return c.length&&(g+=`?${c}`),g}function LC(i){let u=f=>Object.prototype.toString.call(f)==="[object Object]"||Object.prototype.toString.call(f)==="[object Array]";return Object.keys(i).map(f=>cz("%s=%s",f,u(i[f])?JSON.stringify(i[f]):i[f])).join("&")}function AC(i,u){if(i.method===DC.MethodEnum.Get||i.data===void 0&&u.data===void 0)return;let f=Array.isArray(i.data)?i.data:dt(dt({},i.data),u.data);return JSON.stringify(f)}function OC(i,u){let f=dt(dt({},i.headers),u.headers),c={};return Object.keys(f).forEach(g=>{let t=f[g];c[g.toLowerCase()]=t}),c}function ew(i){return i.map(u=>tw(u))}function tw(i){let u=i.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return zn(dt({},i),{request:zn(dt({},i.request),{headers:dt(dt({},i.request.headers),u)})})}function FC(i,u,f){return{name:"ApiError",message:i,status:u,transporterStackTrace:f}}function MC(i,u){return{name:"DeserializationError",message:i,response:u}}function IC(i){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:i}}y0.CallEnum=hm;y0.HostStatusEnum=Ia;y0.createApiError=FC;y0.createDeserializationError=MC;y0.createMappedRequestOptions=J3;y0.createRetryError=IC;y0.createStatefulHost=Q3;y0.createStatelessHost=Z3;y0.createTransporter=lz;y0.createUserAgent=fz;y0.deserializeFailure=xC;y0.deserializeSuccess=TC;y0.isStatefulHostTimeouted=CC;y0.isStatefulHostUp=SC;y0.serializeData=AC;y0.serializeHeaders=OC;y0.serializeQueryParameters=LC;y0.serializeUrl=kC;y0.stackFrameWithoutCredentials=tw;y0.stackTraceWithoutCredentials=ew});var ed=Me((gV,NC)=>{NC.exports=RC()});var BC=Me(Hf=>{"use strict";Object.defineProperty(Hf,"__esModule",{value:!0});var Pa=Q2(),az=ed(),td=Z2(),dz=i=>{let u=i.region||"us",f=Pa.createAuth(Pa.AuthMode.WithinHeaders,i.appId,i.apiKey),c=az.createTransporter(zn(dt({hosts:[{url:`analytics.${u}.algolia.com`}]},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/json"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)})),g=i.appId;return Pa.addMethods({appId:g,transporter:c},i.methods)},pz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Post,path:"2/abtests",data:u},f),hz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Delete,path:Pa.encode("2/abtests/%s",u)},f),mz=i=>(u,f)=>i.transporter.read({method:td.MethodEnum.Get,path:Pa.encode("2/abtests/%s",u)},f),vz=i=>u=>i.transporter.read({method:td.MethodEnum.Get,path:"2/abtests"},u),gz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Post,path:Pa.encode("2/abtests/%s/stop",u)},f);Hf.addABTest=pz;Hf.createAnalyticsClient=dz;Hf.deleteABTest=hz;Hf.getABTest=mz;Hf.getABTests=vz;Hf.stopABTest=gz});var UC=Me((yV,jC)=>{jC.exports=BC()});var zC=Me(nd=>{"use strict";Object.defineProperty(nd,"__esModule",{value:!0});var nw=Q2(),_z=ed(),qC=Z2(),yz=i=>{let u=i.region||"us",f=nw.createAuth(nw.AuthMode.WithinHeaders,i.appId,i.apiKey),c=_z.createTransporter(zn(dt({hosts:[{url:`recommendation.${u}.algolia.com`}]},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/json"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)}));return nw.addMethods({appId:i.appId,transporter:c},i.methods)},wz=i=>u=>i.transporter.read({method:qC.MethodEnum.Get,path:"1/strategies/personalization"},u),Dz=i=>(u,f)=>i.transporter.write({method:qC.MethodEnum.Post,path:"1/strategies/personalization",data:u},f);nd.createRecommendationClient=yz;nd.getPersonalizationStrategy=wz;nd.setPersonalizationStrategy=Dz});var HC=Me((DV,WC)=>{WC.exports=zC()});var nT=Me(yt=>{"use strict";Object.defineProperty(yt,"__esModule",{value:!0});var Wt=Q2(),jo=ed(),Rn=Z2(),Ez=require("crypto");function mm(i){let u=f=>i.request(f).then(c=>{if(i.batch!==void 0&&i.batch(c.hits),!i.shouldStop(c))return c.cursor?u({cursor:c.cursor}):u({page:(f.page||0)+1})});return u({})}var Sz=i=>{let u=i.appId,f=Wt.createAuth(i.authMode!==void 0?i.authMode:Wt.AuthMode.WithinHeaders,u,i.apiKey),c=jo.createTransporter(zn(dt({hosts:[{url:`${u}-dsn.algolia.net`,accept:jo.CallEnum.Read},{url:`${u}.algolia.net`,accept:jo.CallEnum.Write}].concat(Wt.shuffle([{url:`${u}-1.algolianet.com`},{url:`${u}-2.algolianet.com`},{url:`${u}-3.algolianet.com`}]))},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/x-www-form-urlencoded"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)})),g={transporter:c,appId:u,addAlgoliaAgent(t,C){c.userAgent.add({segment:t,version:C})},clearCache(){return Promise.all([c.requestsCache.clear(),c.responsesCache.clear()]).then(()=>{})}};return Wt.addMethods(g,i.methods)};function bC(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function GC(){return{name:"ObjectNotFoundError",message:"Object not found."}}function VC(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Cz=i=>(u,f)=>{let A=f||{},{queryParameters:c}=A,g=Si(A,["queryParameters"]),t=dt({acl:u},c!==void 0?{queryParameters:c}:{}),C=(x,D)=>Wt.createRetryablePromise(L=>rd(i)(x.key,D).catch(N=>{if(N.status!==404)throw N;return L()}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:"1/keys",data:t},g),C)},Tz=i=>(u,f,c)=>{let g=jo.createMappedRequestOptions(c);return g.queryParameters["X-Algolia-User-ID"]=u,i.transporter.write({method:Rn.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:f}},g)},xz=i=>(u,f,c)=>i.transporter.write({method:Rn.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:u,cluster:f}},c),vm=i=>(u,f,c)=>{let g=(t,C)=>id(i)(u,{methods:{waitTask:z0}}).waitTask(t.taskID,C);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",u),data:{operation:"copy",destination:f}},c),g)},kz=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Rules]})),Az=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Settings]})),Oz=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Synonyms]})),Iz=i=>(u,f)=>{let c=(g,t)=>Wt.createRetryablePromise(C=>rd(i)(u,t).then(C).catch(A=>{if(A.status!==404)throw A}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/keys/%s",u)},f),c)},Pz=()=>(i,u)=>{let f=jo.serializeQueryParameters(u),c=Ez.createHmac("sha256",i).update(f).digest("hex");return Buffer.from(c+f).toString("base64")},rd=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/keys/%s",u)},f),Mz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/logs"},u),Fz=()=>i=>{let u=Buffer.from(i,"base64").toString("ascii"),f=/validUntil=(\d+)/,c=u.match(f);if(c===null)throw VC();return parseInt(c[1],10)-Math.round(new Date().getTime()/1e3)},Lz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping/top"},u),Rz=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/clusters/mapping/%s",u)},f),Nz=i=>u=>{let g=u||{},{retrieveMappings:f}=g,c=Si(g,["retrieveMappings"]);return f===!0&&(c.getClusters=!0),i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping/pending"},c)},id=i=>(u,f={})=>{let c={transporter:i.transporter,appId:i.appId,indexName:u};return Wt.addMethods(c,f.methods)},Bz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/keys"},u),jz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters"},u),Uz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/indexes"},u),qz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping"},u),zz=i=>(u,f,c)=>{let g=(t,C)=>id(i)(u,{methods:{waitTask:z0}}).waitTask(t.taskID,C);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",u),data:{operation:"move",destination:f}},c),g)},Wz=i=>(u,f)=>{let c=(g,t)=>Promise.all(Object.keys(g.taskID).map(C=>id(i)(C,{methods:{waitTask:z0}}).waitTask(g.taskID[C],t)));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:u}},f),c)},Hz=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:u}},f),bz=i=>(u,f)=>{let c=u.map(g=>zn(dt({},g),{params:jo.serializeQueryParameters(g.params||{})}));return i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:c},cacheable:!0},f)},Gz=i=>(u,f)=>Promise.all(u.map(c=>{let A=c.params,{facetName:g,facetQuery:t}=A,C=Si(A,["facetName","facetQuery"]);return id(i)(c.indexName,{methods:{searchForFacetValues:YC}}).searchForFacetValues(g,t,dt(dt({},f),C))})),Vz=i=>(u,f)=>{let c=jo.createMappedRequestOptions(f);return c.queryParameters["X-Algolia-User-ID"]=u,i.transporter.write({method:Rn.MethodEnum.Delete,path:"1/clusters/mapping"},c)},Yz=i=>(u,f)=>{let c=(g,t)=>Wt.createRetryablePromise(C=>rd(i)(u,t).catch(A=>{if(A.status!==404)throw A;return C()}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/keys/%s/restore",u)},f),c)},$z=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:u}},f),Kz=i=>(u,f)=>{let c=Object.assign({},f),L=f||{},{queryParameters:g}=L,t=Si(L,["queryParameters"]),C=g?{queryParameters:g}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],x=N=>Object.keys(c).filter(j=>A.indexOf(j)!==-1).every(j=>N[j]===c[j]),D=(N,j)=>Wt.createRetryablePromise($=>rd(i)(u,j).then(h=>x(h)?Promise.resolve():$()));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Put,path:Wt.encode("1/keys/%s",u),data:C},t),D)},$C=i=>(u,f)=>{let c=(g,t)=>z0(i)(g.taskID,t);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/batch",i.indexName),data:{requests:u}},f),c)},Xz=i=>u=>mm(zn(dt({},u),{shouldStop:f=>f.cursor===void 0,request:f=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/browse",i.indexName),data:f},u)})),Jz=i=>u=>{let f=dt({hitsPerPage:1e3},u);return mm(zn(dt({},f),{shouldStop:c=>c.hits.lengthzn(dt({},g),{hits:g.hits.map(t=>(delete t._highlightResult,t))}))}}))},Qz=i=>u=>{let f=dt({hitsPerPage:1e3},u);return mm(zn(dt({},f),{shouldStop:c=>c.hits.lengthzn(dt({},g),{hits:g.hits.map(t=>(delete t._highlightResult,t))}))}}))},_m=i=>(u,f,c)=>{let x=c||{},{batchSize:g}=x,t=Si(x,["batchSize"]),C={taskIDs:[],objectIDs:[]},A=(D=0)=>{let L=[],N;for(N=D;N({action:f,body:j})),t).then(j=>(C.objectIDs=C.objectIDs.concat(j.objectIDs),C.taskIDs.push(j.taskID),N++,A(N)))};return Wt.createWaitablePromise(A(),(D,L)=>Promise.all(D.taskIDs.map(N=>z0(i)(N,L))))},Zz=i=>u=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/clear",i.indexName)},u),(f,c)=>z0(i)(f.taskID,c)),eW=i=>u=>{let t=u||{},{forwardToReplicas:f}=t,c=Si(t,["forwardToReplicas"]),g=jo.createMappedRequestOptions(c);return f&&(g.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/clear",i.indexName)},g),(C,A)=>z0(i)(C.taskID,A))},tW=i=>u=>{let t=u||{},{forwardToReplicas:f}=t,c=Si(t,["forwardToReplicas"]),g=jo.createMappedRequestOptions(c);return f&&(g.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/clear",i.indexName)},g),(C,A)=>z0(i)(C.taskID,A))},nW=i=>(u,f)=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/deleteByQuery",i.indexName),data:u},f),(c,g)=>z0(i)(c.taskID,g)),rW=i=>u=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s",i.indexName)},u),(f,c)=>z0(i)(f.taskID,c)),iW=i=>(u,f)=>Wt.createWaitablePromise(JC(i)([u],f).then(c=>({taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),JC=i=>(u,f)=>{let c=u.map(g=>({objectID:g}));return _m(i)(c,Cc.DeleteObject,f)},oW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/rules/%s",i.indexName,u)},t),(A,x)=>z0(i)(A.taskID,x))},uW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/synonyms/%s",i.indexName,u)},t),(A,x)=>z0(i)(A.taskID,x))},sW=i=>u=>QC(i)(u).then(()=>!0).catch(f=>{if(f.status!==404)throw f;return!1}),lW=i=>(u,f)=>{let x=f||{},{query:c,paginate:g}=x,t=Si(x,["query","paginate"]),C=0,A=()=>ZC(i)(c||"",zn(dt({},t),{page:C})).then(D=>{for(let[L,N]of Object.entries(D.hits))if(u(N))return{object:N,position:parseInt(L,10),page:C};if(C++,g===!1||C>=D.nbPages)throw GC();return A()});return A()},fW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/%s",i.indexName,u)},f),cW=()=>(i,u)=>{for(let[f,c]of Object.entries(i.hits))if(c.objectID===u)return parseInt(f,10);return-1},aW=i=>(u,f)=>{let C=f||{},{attributesToRetrieve:c}=C,g=Si(C,["attributesToRetrieve"]),t=u.map(A=>dt({indexName:i.indexName,objectID:A},c?{attributesToRetrieve:c}:{}));return i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:t}},g)},dW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/rules/%s",i.indexName,u)},f),QC=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/settings",i.indexName),data:{getVersion:2}},u),pW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/synonyms/%s",i.indexName,u)},f),eT=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/task/%s",i.indexName,u.toString())},f),hW=i=>(u,f)=>Wt.createWaitablePromise(tT(i)([u],f).then(c=>({objectID:c.objectIDs[0],taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),tT=i=>(u,f)=>{let C=f||{},{createIfNotExists:c}=C,g=Si(C,["createIfNotExists"]),t=c?Cc.PartialUpdateObject:Cc.PartialUpdateObjectNoCreate;return _m(i)(u,t,g)},mW=i=>(u,f)=>{let h=f||{},{safe:c,autoGenerateObjectIDIfNotExist:g,batchSize:t}=h,C=Si(h,["safe","autoGenerateObjectIDIfNotExist","batchSize"]),A=(re,ce,Q,oe)=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",re),data:{operation:Q,destination:ce}},oe),(Se,me)=>z0(i)(Se.taskID,me)),x=Math.random().toString(36).substring(7),D=`${i.indexName}_tmp_${x}`,L=rw({appId:i.appId,transporter:i.transporter,indexName:D}),N=[],j=A(i.indexName,D,"copy",zn(dt({},C),{scope:["settings","synonyms","rules"]}));N.push(j);let $=(c?j.wait(C):j).then(()=>{let re=L(u,zn(dt({},C),{autoGenerateObjectIDIfNotExist:g,batchSize:t}));return N.push(re),c?re.wait(C):re}).then(()=>{let re=A(D,i.indexName,"move",C);return N.push(re),c?re.wait(C):re}).then(()=>Promise.all(N)).then(([re,ce,Q])=>({objectIDs:ce.objectIDs,taskIDs:[re.taskID,...ce.taskIDs,Q.taskID]}));return Wt.createWaitablePromise($,(re,ce)=>Promise.all(N.map(Q=>Q.wait(ce))))},vW=i=>(u,f)=>iw(i)(u,zn(dt({},f),{clearExistingRules:!0})),gW=i=>(u,f)=>ow(i)(u,zn(dt({},f),{replaceExistingSynonyms:!0})),_W=i=>(u,f)=>Wt.createWaitablePromise(rw(i)([u],f).then(c=>({objectID:c.objectIDs[0],taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),rw=i=>(u,f)=>{let C=f||{},{autoGenerateObjectIDIfNotExist:c}=C,g=Si(C,["autoGenerateObjectIDIfNotExist"]),t=c?Cc.AddObject:Cc.UpdateObject;if(t===Cc.UpdateObject){for(let A of u)if(A.objectID===void 0)return Wt.createWaitablePromise(Promise.reject(bC()))}return _m(i)(u,t,g)},yW=i=>(u,f)=>iw(i)([u],f),iw=i=>(u,f)=>{let A=f||{},{forwardToReplicas:c,clearExistingRules:g}=A,t=Si(A,["forwardToReplicas","clearExistingRules"]),C=jo.createMappedRequestOptions(t);return c&&(C.queryParameters.forwardToReplicas=1),g&&(C.queryParameters.clearExistingRules=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/batch",i.indexName),data:u},C),(x,D)=>z0(i)(x.taskID,D))},wW=i=>(u,f)=>ow(i)([u],f),ow=i=>(u,f)=>{let A=f||{},{forwardToReplicas:c,replaceExistingSynonyms:g}=A,t=Si(A,["forwardToReplicas","replaceExistingSynonyms"]),C=jo.createMappedRequestOptions(t);return c&&(C.queryParameters.forwardToReplicas=1),g&&(C.queryParameters.replaceExistingSynonyms=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/batch",i.indexName),data:u},C),(x,D)=>z0(i)(x.taskID,D))},ZC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/query",i.indexName),data:{query:u},cacheable:!0},f),YC=i=>(u,f,c)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/facets/%s/query",i.indexName,u),data:{facetQuery:f},cacheable:!0},c),KC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/search",i.indexName),data:{query:u}},f),XC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/search",i.indexName),data:{query:u}},f),DW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Put,path:Wt.encode("1/indexes/%s/settings",i.indexName),data:u},t),(A,x)=>z0(i)(A.taskID,x))},z0=i=>(u,f)=>Wt.createRetryablePromise(c=>eT(i)(u,f).then(g=>g.status!=="published"?c():void 0)),EW={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",ListIndexes:"listIndexes",Logs:"logs",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},Cc={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject"},gm={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},SW={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},CW={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};yt.ApiKeyACLEnum=EW;yt.BatchActionEnum=Cc;yt.ScopeEnum=gm;yt.StrategyEnum=SW;yt.SynonymEnum=CW;yt.addApiKey=Cz;yt.assignUserID=Tz;yt.assignUserIDs=xz;yt.batch=$C;yt.browseObjects=Xz;yt.browseRules=Jz;yt.browseSynonyms=Qz;yt.chunkedBatch=_m;yt.clearObjects=Zz;yt.clearRules=eW;yt.clearSynonyms=tW;yt.copyIndex=vm;yt.copyRules=kz;yt.copySettings=Az;yt.copySynonyms=Oz;yt.createBrowsablePromise=mm;yt.createMissingObjectIDError=bC;yt.createObjectNotFoundError=GC;yt.createSearchClient=Sz;yt.createValidUntilNotFoundError=VC;yt.deleteApiKey=Iz;yt.deleteBy=nW;yt.deleteIndex=rW;yt.deleteObject=iW;yt.deleteObjects=JC;yt.deleteRule=oW;yt.deleteSynonym=uW;yt.exists=sW;yt.findObject=lW;yt.generateSecuredApiKey=Pz;yt.getApiKey=rd;yt.getLogs=Mz;yt.getObject=fW;yt.getObjectPosition=cW;yt.getObjects=aW;yt.getRule=dW;yt.getSecuredApiKeyRemainingValidity=Fz;yt.getSettings=QC;yt.getSynonym=pW;yt.getTask=eT;yt.getTopUserIDs=Lz;yt.getUserID=Rz;yt.hasPendingMappings=Nz;yt.initIndex=id;yt.listApiKeys=Bz;yt.listClusters=jz;yt.listIndices=Uz;yt.listUserIDs=qz;yt.moveIndex=zz;yt.multipleBatch=Wz;yt.multipleGetObjects=Hz;yt.multipleQueries=bz;yt.multipleSearchForFacetValues=Gz;yt.partialUpdateObject=hW;yt.partialUpdateObjects=tT;yt.removeUserID=Vz;yt.replaceAllObjects=mW;yt.replaceAllRules=vW;yt.replaceAllSynonyms=gW;yt.restoreApiKey=Yz;yt.saveObject=_W;yt.saveObjects=rw;yt.saveRule=yW;yt.saveRules=iw;yt.saveSynonym=wW;yt.saveSynonyms=ow;yt.search=ZC;yt.searchForFacetValues=YC;yt.searchRules=KC;yt.searchSynonyms=XC;yt.searchUserIDs=$z;yt.setSettings=DW;yt.updateApiKey=Kz;yt.waitTask=z0});var iT=Me((SV,rT)=>{rT.exports=nT()});var oT=Me(ym=>{"use strict";Object.defineProperty(ym,"__esModule",{value:!0});function TW(){return{debug(i,u){return Promise.resolve()},info(i,u){return Promise.resolve()},error(i,u){return Promise.resolve()}}}var xW={Debug:1,Info:2,Error:3};ym.LogLevelEnum=xW;ym.createNullLogger=TW});var sT=Me((TV,uT)=>{uT.exports=oT()});var cT=Me(uw=>{"use strict";Object.defineProperty(uw,"__esModule",{value:!0});var lT=require("http"),fT=require("https"),kW=require("url");function AW(){let i={keepAlive:!0},u=new lT.Agent(i),f=new fT.Agent(i);return{send(c){return new Promise(g=>{let t=kW.parse(c.url),C=t.query===null?t.pathname:`${t.pathname}?${t.query}`,A=dt({agent:t.protocol==="https:"?f:u,hostname:t.hostname,path:C,method:c.method,headers:c.headers},t.port!==void 0?{port:t.port||""}:{}),x=(t.protocol==="https:"?fT:lT).request(A,j=>{let $="";j.on("data",h=>$+=h),j.on("end",()=>{clearTimeout(L),clearTimeout(N),g({status:j.statusCode||0,content:$,isTimedOut:!1})})}),D=(j,$)=>setTimeout(()=>{x.abort(),g({status:0,content:$,isTimedOut:!0})},j*1e3),L=D(c.connectTimeout,"Connection timeout"),N;x.on("error",j=>{clearTimeout(L),clearTimeout(N),g({status:0,content:j.message,isTimedOut:!1})}),x.once("response",()=>{clearTimeout(L),N=D(c.responseTimeout,"Socket timeout")}),c.data!==void 0&&x.write(c.data),x.end()})},destroy(){return u.destroy(),f.destroy(),Promise.resolve()}}}uw.createNodeHttpRequester=AW});var dT=Me((kV,aT)=>{aT.exports=cT()});var vT=Me((AV,pT)=>{"use strict";var hT=dC(),OW=mC(),Ma=UC(),sw=Q2(),lw=HC(),Mt=iT(),IW=sT(),PW=dT(),MW=ed();function mT(i,u,f){let c={appId:i,apiKey:u,timeouts:{connect:2,read:5,write:30},requester:PW.createNodeHttpRequester(),logger:IW.createNullLogger(),responsesCache:hT.createNullCache(),requestsCache:hT.createNullCache(),hostsCache:OW.createInMemoryCache(),userAgent:MW.createUserAgent(sw.version).add({segment:"Node.js",version:process.versions.node})};return Mt.createSearchClient(zn(dt(dt({},c),f),{methods:{search:Mt.multipleQueries,searchForFacetValues:Mt.multipleSearchForFacetValues,multipleBatch:Mt.multipleBatch,multipleGetObjects:Mt.multipleGetObjects,multipleQueries:Mt.multipleQueries,copyIndex:Mt.copyIndex,copySettings:Mt.copySettings,copyRules:Mt.copyRules,copySynonyms:Mt.copySynonyms,moveIndex:Mt.moveIndex,listIndices:Mt.listIndices,getLogs:Mt.getLogs,listClusters:Mt.listClusters,multipleSearchForFacetValues:Mt.multipleSearchForFacetValues,getApiKey:Mt.getApiKey,addApiKey:Mt.addApiKey,listApiKeys:Mt.listApiKeys,updateApiKey:Mt.updateApiKey,deleteApiKey:Mt.deleteApiKey,restoreApiKey:Mt.restoreApiKey,assignUserID:Mt.assignUserID,assignUserIDs:Mt.assignUserIDs,getUserID:Mt.getUserID,searchUserIDs:Mt.searchUserIDs,listUserIDs:Mt.listUserIDs,getTopUserIDs:Mt.getTopUserIDs,removeUserID:Mt.removeUserID,hasPendingMappings:Mt.hasPendingMappings,generateSecuredApiKey:Mt.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Mt.getSecuredApiKeyRemainingValidity,destroy:sw.destroy,initIndex:g=>t=>Mt.initIndex(g)(t,{methods:{batch:Mt.batch,delete:Mt.deleteIndex,getObject:Mt.getObject,getObjects:Mt.getObjects,saveObject:Mt.saveObject,saveObjects:Mt.saveObjects,search:Mt.search,searchForFacetValues:Mt.searchForFacetValues,waitTask:Mt.waitTask,setSettings:Mt.setSettings,getSettings:Mt.getSettings,partialUpdateObject:Mt.partialUpdateObject,partialUpdateObjects:Mt.partialUpdateObjects,deleteObject:Mt.deleteObject,deleteObjects:Mt.deleteObjects,deleteBy:Mt.deleteBy,clearObjects:Mt.clearObjects,browseObjects:Mt.browseObjects,getObjectPosition:Mt.getObjectPosition,findObject:Mt.findObject,exists:Mt.exists,saveSynonym:Mt.saveSynonym,saveSynonyms:Mt.saveSynonyms,getSynonym:Mt.getSynonym,searchSynonyms:Mt.searchSynonyms,browseSynonyms:Mt.browseSynonyms,deleteSynonym:Mt.deleteSynonym,clearSynonyms:Mt.clearSynonyms,replaceAllObjects:Mt.replaceAllObjects,replaceAllSynonyms:Mt.replaceAllSynonyms,searchRules:Mt.searchRules,getRule:Mt.getRule,deleteRule:Mt.deleteRule,saveRule:Mt.saveRule,saveRules:Mt.saveRules,replaceAllRules:Mt.replaceAllRules,browseRules:Mt.browseRules,clearRules:Mt.clearRules}}),initAnalytics:()=>g=>Ma.createAnalyticsClient(zn(dt(dt({},c),g),{methods:{addABTest:Ma.addABTest,getABTest:Ma.getABTest,getABTests:Ma.getABTests,stopABTest:Ma.stopABTest,deleteABTest:Ma.deleteABTest}})),initRecommendation:()=>g=>lw.createRecommendationClient(zn(dt(dt({},c),g),{methods:{getPersonalizationStrategy:lw.getPersonalizationStrategy,setPersonalizationStrategy:lw.setPersonalizationStrategy}}))}}))}mT.version=sw.version;pT.exports=mT});var _T=Me((OV,fw)=>{var gT=vT();fw.exports=gT;fw.exports.default=gT});var rf=Me(dw=>{"use strict";Object.defineProperty(dw,"__esModule",{value:!0});dw.default=kT;function kT(){}kT.prototype={diff:function(u,f){var c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},g=c.callback;typeof c=="function"&&(g=c,c={}),this.options=c;var t=this;function C(re){return g?(setTimeout(function(){g(void 0,re)},0),!0):re}u=this.castInput(u),f=this.castInput(f),u=this.removeEmpty(this.tokenize(u)),f=this.removeEmpty(this.tokenize(f));var A=f.length,x=u.length,D=1,L=A+x,N=[{newPos:-1,components:[]}],j=this.extractCommon(N[0],f,u,0);if(N[0].newPos+1>=A&&j+1>=x)return C([{value:this.join(f),count:f.length}]);function $(){for(var re=-1*D;re<=D;re+=2){var ce=void 0,Q=N[re-1],oe=N[re+1],Se=(oe?oe.newPos:0)-re;Q&&(N[re-1]=void 0);var me=Q&&Q.newPos+1=A&&Se+1>=x)return C(LW(t,ce.components,f,u,t.useLongestToken));N[re]=ce}D++}if(g)(function re(){setTimeout(function(){if(D>L)return g();$()||re()},0)})();else for(;D<=L;){var h=$();if(h)return h}},pushComponent:function(u,f,c){var g=u[u.length-1];g&&g.added===f&&g.removed===c?u[u.length-1]={count:g.count+1,added:f,removed:c}:u.push({count:1,added:f,removed:c})},extractCommon:function(u,f,c,g){for(var t=f.length,C=c.length,A=u.newPos,x=A-g,D=0;A+1$.length?re:$}),D.value=i.join(L)}else D.value=i.join(f.slice(A,A+D.count));A+=D.count,D.added||(x+=D.count)}}var j=u[C-1];return C>1&&typeof j.value=="string"&&(j.added||j.removed)&&i.equals("",j.value)&&(u[C-2].value+=j.value,u.pop()),u}function RW(i){return{newPos:i.newPos,components:i.components.slice(0)}}});var OT=Me(ld=>{"use strict";Object.defineProperty(ld,"__esModule",{value:!0});ld.diffChars=NW;ld.characterDiff=void 0;var jW=BW(rf());function BW(i){return i&&i.__esModule?i:{default:i}}var AT=new jW.default;ld.characterDiff=AT;function NW(i,u,f){return AT.diff(i,u,f)}});var hw=Me(pw=>{"use strict";Object.defineProperty(pw,"__esModule",{value:!0});pw.generateOptions=UW;function UW(i,u){if(typeof i=="function")u.callback=i;else if(i)for(var f in i)i.hasOwnProperty(f)&&(u[f]=i[f]);return u}});var MT=Me(Fa=>{"use strict";Object.defineProperty(Fa,"__esModule",{value:!0});Fa.diffWords=qW;Fa.diffWordsWithSpace=zW;Fa.wordDiff=void 0;var HW=WW(rf()),bW=hw();function WW(i){return i&&i.__esModule?i:{default:i}}var IT=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,PT=/\S/,fd=new HW.default;Fa.wordDiff=fd;fd.equals=function(i,u){return this.options.ignoreCase&&(i=i.toLowerCase(),u=u.toLowerCase()),i===u||this.options.ignoreWhitespace&&!PT.test(i)&&!PT.test(u)};fd.tokenize=function(i){for(var u=i.split(/(\s+|[()[\]{}'"]|\b)/),f=0;f{"use strict";Object.defineProperty(La,"__esModule",{value:!0});La.diffLines=GW;La.diffTrimmedLines=VW;La.lineDiff=void 0;var $W=YW(rf()),KW=hw();function YW(i){return i&&i.__esModule?i:{default:i}}var Dm=new $W.default;La.lineDiff=Dm;Dm.tokenize=function(i){var u=[],f=i.split(/(\n|\r\n)/);f[f.length-1]||f.pop();for(var c=0;c{"use strict";Object.defineProperty(cd,"__esModule",{value:!0});cd.diffSentences=XW;cd.sentenceDiff=void 0;var QW=JW(rf());function JW(i){return i&&i.__esModule?i:{default:i}}var mw=new QW.default;cd.sentenceDiff=mw;mw.tokenize=function(i){return i.split(/(\S.+?[.!?])(?=\s+|$)/)};function XW(i,u,f){return mw.diff(i,u,f)}});var LT=Me(ad=>{"use strict";Object.defineProperty(ad,"__esModule",{value:!0});ad.diffCss=ZW;ad.cssDiff=void 0;var tH=eH(rf());function eH(i){return i&&i.__esModule?i:{default:i}}var vw=new tH.default;ad.cssDiff=vw;vw.tokenize=function(i){return i.split(/([{}:;,]|\s+)/)};function ZW(i,u,f){return vw.diff(i,u,f)}});var NT=Me(Ra=>{"use strict";Object.defineProperty(Ra,"__esModule",{value:!0});Ra.diffJson=nH;Ra.canonicalize=Sm;Ra.jsonDiff=void 0;var RT=rH(rf()),iH=Em();function rH(i){return i&&i.__esModule?i:{default:i}}function Cm(i){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Cm=function(f){return typeof f}:Cm=function(f){return f&&typeof Symbol=="function"&&f.constructor===Symbol&&f!==Symbol.prototype?"symbol":typeof f},Cm(i)}var oH=Object.prototype.toString,xc=new RT.default;Ra.jsonDiff=xc;xc.useLongestToken=!0;xc.tokenize=iH.lineDiff.tokenize;xc.castInput=function(i){var u=this.options,f=u.undefinedReplacement,c=u.stringifyReplacer,g=c===void 0?function(t,C){return typeof C=="undefined"?f:C}:c;return typeof i=="string"?i:JSON.stringify(Sm(i,null,null,g),g," ")};xc.equals=function(i,u){return RT.default.prototype.equals.call(xc,i.replace(/,([\r\n])/g,"$1"),u.replace(/,([\r\n])/g,"$1"))};function nH(i,u,f){return xc.diff(i,u,f)}function Sm(i,u,f,c,g){u=u||[],f=f||[],c&&(i=c(g,i));var t;for(t=0;t{"use strict";Object.defineProperty(dd,"__esModule",{value:!0});dd.diffArrays=uH;dd.arrayDiff=void 0;var lH=sH(rf());function sH(i){return i&&i.__esModule?i:{default:i}}var pd=new lH.default;dd.arrayDiff=pd;pd.tokenize=function(i){return i.slice()};pd.join=pd.removeEmpty=function(i){return i};function uH(i,u,f){return pd.diff(i,u,f)}});var Tm=Me(gw=>{"use strict";Object.defineProperty(gw,"__esModule",{value:!0});gw.parsePatch=fH;function fH(i){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},f=i.split(/\r\n|[\n\v\f\r\x85]/),c=i.match(/\r\n|[\n\v\f\r\x85]/g)||[],g=[],t=0;function C(){var D={};for(g.push(D);t{"use strict";Object.defineProperty(_w,"__esModule",{value:!0});_w.default=cH;function cH(i,u,f){var c=!0,g=!1,t=!1,C=1;return function A(){if(c&&!t){if(g?C++:c=!1,i+C<=f)return C;t=!0}if(!g)return t||(c=!0),u<=i-C?-C++:(g=!0,A())}}});var zT=Me(xm=>{"use strict";Object.defineProperty(xm,"__esModule",{value:!0});xm.applyPatch=UT;xm.applyPatches=aH;var qT=Tm(),pH=dH(jT());function dH(i){return i&&i.__esModule?i:{default:i}}function UT(i,u){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof u=="string"&&(u=(0,qT.parsePatch)(u)),Array.isArray(u)){if(u.length>1)throw new Error("applyPatch only works with a single input.");u=u[0]}var c=i.split(/\r\n|[\n\v\f\r\x85]/),g=i.match(/\r\n|[\n\v\f\r\x85]/g)||[],t=u.hunks,C=f.compareLine||function(Ot,Nt,Je,V){return Nt===V},A=0,x=f.fuzzFactor||0,D=0,L=0,N,j;function $(Ot,Nt){for(var Je=0;Je0?V[0]:" ",ge=V.length>0?V.substr(1):V;if(ne===" "||ne==="-"){if(!C(Nt+1,c[Nt],ne,ge)&&(A++,A>x))return!1;Nt++}}return!0}for(var h=0;h0?Le[0]:" ",ct=Le.length>0?Le.substr(1):Le,Ue=J.linedelimiters[Oe];if(ot===" ")Te++;else if(ot==="-")c.splice(Te,1),g.splice(Te,1);else if(ot==="+")c.splice(Te,0,ct),g.splice(Te,0,Ue),Te++;else if(ot==="\\"){var be=J.lines[Oe-1]?J.lines[Oe-1][0]:null;be==="+"?N=!0:be==="-"&&(j=!0)}}}if(N)for(;!c[c.length-1];)c.pop(),g.pop();else j&&(c.push(""),g.push(` -`));for(var At=0;At{"use strict";Object.defineProperty(hd,"__esModule",{value:!0});hd.structuredPatch=WT;hd.createTwoFilesPatch=HT;hd.createPatch=hH;var mH=Em();function yw(i){return _H(i)||gH(i)||vH()}function vH(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function gH(i){if(Symbol.iterator in Object(i)||Object.prototype.toString.call(i)==="[object Arguments]")return Array.from(i)}function _H(i){if(Array.isArray(i)){for(var u=0,f=new Array(i.length);u0?x(J.lines.slice(-C.context)):[],L-=j.length,N-=j.length)}(De=j).push.apply(De,yw(me.map(function(At){return(Se.added?"+":"-")+At}))),Se.added?h+=me.length:$+=me.length}else{if(L)if(me.length<=C.context*2&&oe=A.length-2&&me.length<=C.context){var ct=/\n$/.test(f),Ue=/\n$/.test(c),be=me.length==0&&j.length>ot.oldLines;!ct&&be&&j.splice(ot.oldLines,0,"\\ No newline at end of file"),(!ct&&!be||!Ue)&&j.push("\\ No newline at end of file")}D.push(ot),L=0,N=0,j=[]}$+=me.length,h+=me.length}},ce=0;ce{"use strict";Object.defineProperty(km,"__esModule",{value:!0});km.arrayEqual=yH;km.arrayStartsWith=bT;function yH(i,u){return i.length!==u.length?!1:bT(i,u)}function bT(i,u){if(u.length>i.length)return!1;for(var f=0;f{"use strict";Object.defineProperty(Am,"__esModule",{value:!0});Am.calcLineCount=VT;Am.merge=wH;var DH=ww(),EH=Tm(),Dw=GT();function Na(i){return TH(i)||CH(i)||SH()}function SH(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function CH(i){if(Symbol.iterator in Object(i)||Object.prototype.toString.call(i)==="[object Arguments]")return Array.from(i)}function TH(i){if(Array.isArray(i)){for(var u=0,f=new Array(i.length);u{"use strict";Object.defineProperty(Cw,"__esModule",{value:!0});Cw.convertChangesToDMP=OH;function OH(i){for(var u=[],f,c,g=0;g{"use strict";Object.defineProperty(Tw,"__esModule",{value:!0});Tw.convertChangesToXML=IH;function IH(i){for(var u=[],f=0;f"):c.removed&&u.push(""),u.push(PH(c.value)),c.added?u.push(""):c.removed&&u.push("")}return u.join("")}function PH(i){var u=i;return u=u.replace(/&/g,"&"),u=u.replace(//g,">"),u=u.replace(/"/g,"""),u}});var f9=Me(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});Object.defineProperty(w0,"Diff",{enumerable:!0,get:function(){return MH.default}});Object.defineProperty(w0,"diffChars",{enumerable:!0,get:function(){return FH.diffChars}});Object.defineProperty(w0,"diffWords",{enumerable:!0,get:function(){return o9.diffWords}});Object.defineProperty(w0,"diffWordsWithSpace",{enumerable:!0,get:function(){return o9.diffWordsWithSpace}});Object.defineProperty(w0,"diffLines",{enumerable:!0,get:function(){return u9.diffLines}});Object.defineProperty(w0,"diffTrimmedLines",{enumerable:!0,get:function(){return u9.diffTrimmedLines}});Object.defineProperty(w0,"diffSentences",{enumerable:!0,get:function(){return LH.diffSentences}});Object.defineProperty(w0,"diffCss",{enumerable:!0,get:function(){return RH.diffCss}});Object.defineProperty(w0,"diffJson",{enumerable:!0,get:function(){return s9.diffJson}});Object.defineProperty(w0,"canonicalize",{enumerable:!0,get:function(){return s9.canonicalize}});Object.defineProperty(w0,"diffArrays",{enumerable:!0,get:function(){return NH.diffArrays}});Object.defineProperty(w0,"applyPatch",{enumerable:!0,get:function(){return l9.applyPatch}});Object.defineProperty(w0,"applyPatches",{enumerable:!0,get:function(){return l9.applyPatches}});Object.defineProperty(w0,"parsePatch",{enumerable:!0,get:function(){return BH.parsePatch}});Object.defineProperty(w0,"merge",{enumerable:!0,get:function(){return jH.merge}});Object.defineProperty(w0,"structuredPatch",{enumerable:!0,get:function(){return xw.structuredPatch}});Object.defineProperty(w0,"createTwoFilesPatch",{enumerable:!0,get:function(){return xw.createTwoFilesPatch}});Object.defineProperty(w0,"createPatch",{enumerable:!0,get:function(){return xw.createPatch}});Object.defineProperty(w0,"convertChangesToDMP",{enumerable:!0,get:function(){return UH.convertChangesToDMP}});Object.defineProperty(w0,"convertChangesToXML",{enumerable:!0,get:function(){return qH.convertChangesToXML}});var MH=zH(rf()),FH=OT(),o9=MT(),u9=Em(),LH=FT(),RH=LT(),s9=NT(),NH=BT(),l9=zT(),BH=Tm(),jH=n9(),xw=ww(),UH=r9(),qH=i9();function zH(i){return i&&i.__esModule?i:{default:i}}});var HH={};jR(HH,{default:()=>GH});var wT=Er(require("@yarnpkg/cli")),Tc=Er(require("@yarnpkg/core"));var Z5=Er(ys()),Dc=Er(lr()),om=(0,Dc.memo)(({active:i})=>{let u=(0,Dc.useMemo)(()=>i?"\u25C9":"\u25EF",[i]),f=(0,Dc.useMemo)(()=>i?"green":"yellow",[i]);return Dc.default.createElement(Z5.Text,{color:f},u)});var Wf=Er(ys()),Bo=Er(lr());var eC=Er(ys()),um=Er(lr());function zf({active:i},u,f){let{stdin:c}=(0,eC.useStdin)(),g=(0,um.useCallback)((t,C)=>u(t,C),f);(0,um.useEffect)(()=>{if(!(!i||!c))return c.on("keypress",g),()=>{c.off("keypress",g)}},[i,g,c])}var sm;(function(f){f.BEFORE="before",f.AFTER="after"})(sm||(sm={}));var tC=function({active:i},u,f){zf({active:i},(c,g)=>{g.name==="tab"&&(g.shift?u(sm.BEFORE):u(sm.AFTER))},f)};var lm=function(i,u,{active:f,minus:c,plus:g,set:t,loop:C=!0}){zf({active:f},(A,x)=>{let D=u.indexOf(i);switch(x.name){case c:{let L=D-1;if(C){t(u[(u.length+L)%u.length]);return}if(L<0)return;t(u[L])}break;case g:{let L=D+1;if(C){t(u[L%u.length]);return}if(L>=u.length)return;t(u[L])}break}},[u,i,g,t,C])};var fm=({active:i=!0,children:u=[],radius:f=10,size:c=1,loop:g=!0,onFocusRequest:t,willReachEnd:C})=>{let A=ce=>{if(ce.key===null)throw new Error("Expected all children to have a key");return ce.key},x=Bo.default.Children.map(u,ce=>A(ce)),D=x[0],[L,N]=(0,Bo.useState)(D),j=x.indexOf(L);(0,Bo.useEffect)(()=>{x.includes(L)||N(D)},[u]),(0,Bo.useEffect)(()=>{C&&j>=x.length-2&&C()},[j]),tC({active:i&&!!t},ce=>{t==null||t(ce)},[t]),lm(L,x,{active:i,minus:"up",plus:"down",set:N,loop:g});let $=j-f,h=j+f;h>x.length&&($-=h-x.length,h=x.length),$<0&&(h+=-$,$=0),h>=x.length&&(h=x.length-1);let re=[];for(let ce=$;ce<=h;++ce){let Q=x[ce],oe=i&&Q===L;re.push(Bo.default.createElement(Wf.Box,{key:Q,height:c},Bo.default.createElement(Wf.Box,{marginLeft:1,marginRight:1},Bo.default.createElement(Wf.Text,null,oe?Bo.default.createElement(Wf.Text,{color:"cyan",bold:!0},">"):" ")),Bo.default.createElement(Wf.Box,null,Bo.default.cloneElement(u[ce],{active:oe}))))}return Bo.default.createElement(Wf.Box,{flexDirection:"column",width:"100%"},re)};var cm=Er(lr());var nC=Er(ys()),nf=Er(lr()),rC=Er(require("readline")),G3=nf.default.createContext(null),iC=({children:i})=>{let{stdin:u,setRawMode:f}=(0,nC.useStdin)();(0,nf.useEffect)(()=>{f&&f(!0),u&&(0,rC.emitKeypressEvents)(u)},[u,f]);let[c,g]=(0,nf.useState)(new Map),t=(0,nf.useMemo)(()=>({getAll:()=>c,get:C=>c.get(C),set:(C,A)=>g(new Map([...c,[C,A]]))}),[c,g]);return nf.default.createElement(G3.Provider,{value:t,children:i})};function Ec(i,u){let f=(0,cm.useContext)(G3);if(f===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof i=="undefined")return f.getAll();let c=(0,cm.useCallback)(t=>{f.set(i,t)},[i,f.set]),g=f.get(i);return typeof g=="undefined"&&(g=u),[g,c]}var am=Er(ys()),V3=Er(lr());async function dm(i,u){let f,c=t=>{let{exit:C}=(0,am.useApp)();zf({active:!0},(A,x)=>{x.name==="return"&&(f=t,C())},[C,t])},{waitUntilExit:g}=(0,am.render)(V3.default.createElement(iC,null,V3.default.createElement(i,zn(dt({},u),{useSubmit:c}))));return await g(),f}var DT=Er(require("clipanion")),ET=Er(lC()),un=Er(ys()),Pt=Er(lr());var yT=Er(_T()),cw={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},FW=(0,yT.default)(cw.appId,cw.apiKey).initIndex(cw.indexName),aw=async(i,u=0)=>await FW.search(i,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:u,hitsPerPage:10});var od=["regular","dev","peer"],ud=class extends wT.BaseCommand{async execute(){let u=await Tc.Configuration.find(this.context.cwd,this.context.plugins),f=()=>Pt.default.createElement(un.Box,{flexDirection:"row"},Pt.default.createElement(un.Box,{flexDirection:"column",width:48},Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},""),"/",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to move between packages.")),Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to select a package.")),Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," again to change the target."))),Pt.default.createElement(un.Box,{flexDirection:"column"},Pt.default.createElement(un.Box,{marginLeft:1},Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),Pt.default.createElement(un.Box,{marginLeft:1},Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),c=()=>Pt.default.createElement(Pt.default.Fragment,null,Pt.default.createElement(un.Box,{width:15},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Owner")),Pt.default.createElement(un.Box,{width:11},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Version")),Pt.default.createElement(un.Box,{width:10},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Downloads"))),g=()=>Pt.default.createElement(un.Box,{width:17},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Target")),t=({hit:$,active:h})=>{let[re,ce]=Ec($.name,null);zf({active:h},(Se,me)=>{if(me.name!=="space")return;if(!re){ce(od[0]);return}let De=od.indexOf(re)+1;De===od.length?ce(null):ce(od[De])},[re,ce]);let Q=Tc.structUtils.parseIdent($.name),oe=Tc.structUtils.prettyIdent(u,Q);return Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Box,{width:45},Pt.default.createElement(un.Text,{bold:!0,wrap:"wrap"},oe)),Pt.default.createElement(un.Box,{width:14,marginLeft:1},Pt.default.createElement(un.Text,{bold:!0,wrap:"truncate"},$.owner.name)),Pt.default.createElement(un.Box,{width:10,marginLeft:1},Pt.default.createElement(un.Text,{italic:!0,wrap:"truncate"},$.version)),Pt.default.createElement(un.Box,{width:16,marginLeft:1},Pt.default.createElement(un.Text,null,$.humanDownloadsLast30Days)))},C=({name:$,active:h})=>{let[re]=Ec($,null),ce=Tc.structUtils.parseIdent($);return Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Box,{width:47},Pt.default.createElement(un.Text,{bold:!0}," - ",Tc.structUtils.prettyIdent(u,ce))),od.map(Q=>Pt.default.createElement(un.Box,{key:Q,width:14,marginLeft:1},Pt.default.createElement(un.Text,null," ",Pt.default.createElement(om,{active:re===Q})," ",Pt.default.createElement(un.Text,{bold:!0},Q)))))},A=()=>Pt.default.createElement(un.Box,{marginTop:1},Pt.default.createElement(un.Text,null,"Powered by Algolia.")),D=await dm(({useSubmit:$})=>{let h=Ec();$(h);let re=Array.from(h.keys()).filter(Le=>h.get(Le)!==null),[ce,Q]=(0,Pt.useState)(""),[oe,Se]=(0,Pt.useState)(0),[me,De]=(0,Pt.useState)([]),J=Le=>{Le.match(/\t| /)||Q(Le)},Te=async()=>{Se(0);let Le=await aw(ce);Le.query===ce&&De(Le.hits)},Oe=async()=>{let Le=await aw(ce,oe+1);Le.query===ce&&Le.page-1===oe&&(Se(Le.page),De([...me,...Le.hits]))};return(0,Pt.useEffect)(()=>{ce?Te():De([])},[ce]),Pt.default.createElement(un.Box,{flexDirection:"column"},Pt.default.createElement(f,null),Pt.default.createElement(un.Box,{flexDirection:"row",marginTop:1},Pt.default.createElement(un.Text,{bold:!0},"Search: "),Pt.default.createElement(un.Box,{width:41},Pt.default.createElement(ET.default,{value:ce,onChange:J,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),Pt.default.createElement(c,null)),me.length?Pt.default.createElement(fm,{radius:2,loop:!1,children:me.map(Le=>Pt.default.createElement(t,{key:Le.name,hit:Le,active:!1})),willReachEnd:Oe}):Pt.default.createElement(un.Text,{color:"gray"},"Start typing..."),Pt.default.createElement(un.Box,{flexDirection:"row",marginTop:1},Pt.default.createElement(un.Box,{width:49},Pt.default.createElement(un.Text,{bold:!0},"Selected:")),Pt.default.createElement(g,null)),re.length?re.map(Le=>Pt.default.createElement(C,{key:Le,name:Le,active:!1})):Pt.default.createElement(un.Text,{color:"gray"},"No selected packages..."),Pt.default.createElement(A,null))},{});if(typeof D=="undefined")return 1;let L=Array.from(D.keys()).filter($=>D.get($)==="regular"),N=Array.from(D.keys()).filter($=>D.get($)==="dev"),j=Array.from(D.keys()).filter($=>D.get($)==="peer");return L.length&&await this.cli.run(["add",...L]),N.length&&await this.cli.run(["add","--dev",...N]),j&&await this.cli.run(["add","--peer",...j]),0}};ud.paths=[["search"]],ud.usage=DT.Command.Usage({category:"Interactive commands",description:"open the search interface",details:` - This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. - `,examples:[["Open the search window","yarn search"]]});var ST=ud;var Im=Er(require("@yarnpkg/cli")),W0=Er(require("@yarnpkg/core"));var sd=Er(ys()),bf=Er(lr());var CT=Er(ys()),TT=Er(lr()),wm=({length:i,active:u})=>{if(i===0)return null;let f=i>1?` ${"-".repeat(i-1)}`:" ";return TT.default.createElement(CT.Text,{dimColor:!u},f)};var xT=function({active:i,skewer:u,options:f,value:c,onChange:g,sizes:t=[]}){let C=f.filter(({label:x})=>!!x).map(({value:x})=>x),A=f.findIndex(x=>x.value===c&&x.label!="");return lm(c,C,{active:i,minus:"left",plus:"right",set:g}),bf.default.createElement(bf.default.Fragment,null,f.map(({label:x},D)=>{let L=D===A,N=t[D]-1||0,j=x.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),$=Math.max(0,N-j.length-2);return x?bf.default.createElement(sd.Box,{key:x,width:N,marginLeft:1},bf.default.createElement(sd.Text,{wrap:"truncate"},bf.default.createElement(om,{active:L})," ",x),u?bf.default.createElement(wm,{active:i,length:$}):null):bf.default.createElement(sd.Box,{key:`spacer-${D}`,width:N,marginLeft:1})}))};var c9=Er(require("@yarnpkg/plugin-essentials")),a9=Er(require("clipanion")),d9=Er(f9()),tr=Er(ys()),pn=Er(lr()),p9=Er(require("semver")),h9=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/,WH=10,md=class extends Im.BaseCommand{async execute(){let u=await W0.Configuration.find(this.context.cwd,this.context.plugins),{project:f,workspace:c}=await W0.Project.find(u,this.context.cwd),g=await W0.Cache.find(u);if(!c)throw new Im.WorkspaceRequiredError(f.cwd,this.context.cwd);await f.restoreInstallState({restoreResolutions:!1});let t=(Q,oe)=>{let Se=(0,d9.diffWords)(Q,oe),me="";for(let De of Se)De.added?me+=W0.formatUtils.pretty(u,De.value,"green"):De.removed||(me+=De.value);return me},C=(Q,oe)=>{if(Q===oe)return oe;let Se=W0.structUtils.parseRange(Q),me=W0.structUtils.parseRange(oe),De=Se.selector.match(h9),J=me.selector.match(h9);if(!De||!J)return t(Q,oe);let Te=["gray","red","yellow","green","magenta"],Oe=null,Le="";for(let ot=1;ot{let me=await c9.suggestUtils.fetchDescriptorFrom(Q,Se,{project:f,cache:g,preserveModifier:oe,workspace:c});return me!==null?me.range:Q.range},x=async Q=>{let oe=p9.default.valid(Q.range)?`^${Q.range}`:Q.range,[Se,me]=await Promise.all([A(Q,Q.range,oe).catch(()=>null),A(Q,Q.range,"latest").catch(()=>null)]),De=[{value:null,label:Q.range}];return Se&&Se!==Q.range?De.push({value:Se,label:C(Q.range,Se)}):De.push({value:null,label:""}),me&&me!==Se&&me!==Q.range?De.push({value:me,label:C(Q.range,me)}):De.push({value:null,label:""}),De},D=()=>pn.default.createElement(tr.Box,{flexDirection:"row"},pn.default.createElement(tr.Box,{flexDirection:"column",width:49},pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},""),"/",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to select packages.")),pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},""),"/",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to select versions."))),pn.default.createElement(tr.Box,{flexDirection:"column"},pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to install.")),pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),L=()=>pn.default.createElement(tr.Box,{flexDirection:"row",paddingTop:1,paddingBottom:1},pn.default.createElement(tr.Box,{width:50},pn.default.createElement(tr.Text,{bold:!0},pn.default.createElement(tr.Text,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Current")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Range")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Latest"))),N=({active:Q,descriptor:oe,suggestions:Se})=>{let[me,De]=Ec(oe.descriptorHash,null),J=W0.structUtils.stringifyIdent(oe),Te=Math.max(0,45-J.length);return pn.default.createElement(pn.default.Fragment,null,pn.default.createElement(tr.Box,null,pn.default.createElement(tr.Box,{width:45},pn.default.createElement(tr.Text,{bold:!0},W0.structUtils.prettyIdent(u,oe)),pn.default.createElement(wm,{active:Q,length:Te})),Se!==null?pn.default.createElement(xT,{active:Q,options:Se,value:me,skewer:!0,onChange:De,sizes:[17,17,17]}):pn.default.createElement(tr.Box,{marginLeft:2},pn.default.createElement(tr.Text,{color:"gray"},"Fetching suggestions..."))))},j=({dependencies:Q})=>{let[oe,Se]=(0,pn.useState)(null),me=(0,pn.useRef)(!0);return(0,pn.useEffect)(()=>()=>{me.current=!1}),(0,pn.useEffect)(()=>{Promise.all(Q.map(De=>x(De))).then(De=>{let J=Q.map((Te,Oe)=>{let Le=De[Oe];return[Te,Le]}).filter(([Te,Oe])=>Oe.filter(Le=>Le.label!=="").length>1);me.current&&Se(J)})},[]),oe?oe.length?pn.default.createElement(fm,{radius:WH,children:oe.map(([De,J])=>pn.default.createElement(N,{key:De.descriptorHash,active:!1,descriptor:De,suggestions:J}))}):pn.default.createElement(tr.Text,null,"No upgrades found"):pn.default.createElement(tr.Text,null,"Fetching suggestions...")},h=await dm(({useSubmit:Q})=>{Q(Ec());let oe=new Map;for(let me of f.workspaces)for(let De of["dependencies","devDependencies"])for(let J of me.manifest[De].values())f.tryWorkspaceByDescriptor(J)===null&&oe.set(J.descriptorHash,J);let Se=W0.miscUtils.sortMap(oe.values(),me=>W0.structUtils.stringifyDescriptor(me));return pn.default.createElement(tr.Box,{flexDirection:"column"},pn.default.createElement(D,null),pn.default.createElement(L,null),pn.default.createElement(j,{dependencies:Se}))},{});if(typeof h=="undefined")return 1;let re=!1;for(let Q of f.workspaces)for(let oe of["dependencies","devDependencies"]){let Se=Q.manifest[oe];for(let me of Se.values()){let De=h.get(me.descriptorHash);typeof De!="undefined"&&De!==null&&(Se.set(me.identHash,W0.structUtils.makeDescriptor(me,De)),re=!0)}}return re?(await W0.StreamReport.start({configuration:u,stdout:this.context.stdout,includeLogs:!this.context.quiet},async Q=>{await f.install({cache:g,report:Q})})).exitCode():0}};md.paths=[["upgrade-interactive"]],md.usage=a9.Command.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` - This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade. - `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]});var m9=md;var bH={commands:[ST,m9]},GH=bH;return HH;})(); -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ -/** - * @license - * Lodash - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react-debug-tools.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.18.0 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v0.24.0 - * react-reconciler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -/** @license React v16.13.1 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -return plugin; -} -}; diff --git a/tgui/.yarn/releases/yarn-3.3.1.cjs b/tgui/.yarn/releases/yarn-3.3.1.cjs deleted file mode 100644 index 53a282e439a..00000000000 --- a/tgui/.yarn/releases/yarn-3.3.1.cjs +++ /dev/null @@ -1,823 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var dfe=Object.create;var jS=Object.defineProperty;var Cfe=Object.getOwnPropertyDescriptor;var mfe=Object.getOwnPropertyNames;var Efe=Object.getPrototypeOf,Ife=Object.prototype.hasOwnProperty;var J=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var y=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ht=(r,e)=>{for(var t in e)jS(r,t,{get:e[t],enumerable:!0})},yfe=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of mfe(e))!Ife.call(r,n)&&n!==t&&jS(r,n,{get:()=>e[n],enumerable:!(i=Cfe(e,n))||i.enumerable});return r};var ne=(r,e,t)=>(t=r!=null?dfe(Efe(r)):{},yfe(e||!r||!r.__esModule?jS(t,"default",{value:r,enumerable:!0}):t,r));var aK=y((uZe,oK)=>{oK.exports=sK;sK.sync=Gfe;var iK=J("fs");function Hfe(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{uK.exports=lK;lK.sync=Yfe;var AK=J("fs");function lK(r,e,t){AK.stat(r,function(i,n){t(i,i?!1:cK(n,e))})}function Yfe(r,e){return cK(AK.statSync(r),e)}function cK(r,e){return r.isFile()&&jfe(r,e)}function jfe(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var hK=y((hZe,fK)=>{var fZe=J("fs"),OI;process.platform==="win32"||global.TESTING_WINDOWS?OI=aK():OI=gK();fK.exports=av;av.sync=qfe;function av(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){av(r,e||{},function(s,o){s?n(s):i(o)})})}OI(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function qfe(r,e){try{return OI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var yK=y((pZe,IK)=>{var _g=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",pK=J("path"),Jfe=_g?";":":",dK=hK(),CK=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),mK=(r,e)=>{let t=e.colon||Jfe,i=r.match(/\//)||_g&&r.match(/\\/)?[""]:[..._g?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=_g?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=_g?n.split(t):[""];return _g&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},EK=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=mK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(CK(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=pK.join(h,r),C=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];dK(c+p,{pathExt:s},(C,w)=>{if(!C&&w)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},Wfe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=mK(r,e),s=[];for(let o=0;o{"use strict";var wK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};Av.exports=wK;Av.exports.default=wK});var vK=y((CZe,SK)=>{"use strict";var bK=J("path"),zfe=yK(),Vfe=BK();function QK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=zfe.sync(r.command,{path:t[Vfe({env:t})],pathExt:e?bK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=bK.resolve(n?r.options.cwd:"",o)),o}function Xfe(r){return QK(r)||QK(r,!0)}SK.exports=Xfe});var xK=y((mZe,cv)=>{"use strict";var lv=/([()\][%!^"`<>&|;, *?])/g;function _fe(r){return r=r.replace(lv,"^$1"),r}function Zfe(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(lv,"^$1"),e&&(r=r.replace(lv,"^$1")),r}cv.exports.command=_fe;cv.exports.argument=Zfe});var DK=y((EZe,PK)=>{"use strict";PK.exports=/^#!(.*)/});var RK=y((IZe,kK)=>{"use strict";var $fe=DK();kK.exports=(r="")=>{let e=r.match($fe);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var NK=y((yZe,FK)=>{"use strict";var uv=J("fs"),ehe=RK();function the(r){let t=Buffer.alloc(150),i;try{i=uv.openSync(r,"r"),uv.readSync(i,t,0,150,0),uv.closeSync(i)}catch{}return ehe(t.toString())}FK.exports=the});var MK=y((wZe,OK)=>{"use strict";var rhe=J("path"),TK=vK(),LK=xK(),ihe=NK(),nhe=process.platform==="win32",she=/\.(?:com|exe)$/i,ohe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function ahe(r){r.file=TK(r);let e=r.file&&ihe(r.file);return e?(r.args.unshift(r.file),r.command=e,TK(r)):r.file}function Ahe(r){if(!nhe)return r;let e=ahe(r),t=!she.test(e);if(r.options.forceShell||t){let i=ohe.test(e);r.command=rhe.normalize(r.command),r.command=LK.command(r.command),r.args=r.args.map(s=>LK.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function lhe(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:Ahe(i)}OK.exports=lhe});var HK=y((BZe,KK)=>{"use strict";var gv=process.platform==="win32";function fv(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function che(r,e){if(!gv)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=UK(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function UK(r,e){return gv&&r===1&&!e.file?fv(e.original,"spawn"):null}function uhe(r,e){return gv&&r===1&&!e.file?fv(e.original,"spawnSync"):null}KK.exports={hookChildProcess:che,verifyENOENT:UK,verifyENOENTSync:uhe,notFoundError:fv}});var dv=y((bZe,Zg)=>{"use strict";var GK=J("child_process"),hv=MK(),pv=HK();function YK(r,e,t){let i=hv(r,e,t),n=GK.spawn(i.command,i.args,i.options);return pv.hookChildProcess(n,i),n}function ghe(r,e,t){let i=hv(r,e,t),n=GK.spawnSync(i.command,i.args,i.options);return n.error=n.error||pv.verifyENOENTSync(n.status,i),n}Zg.exports=YK;Zg.exports.spawn=YK;Zg.exports.sync=ghe;Zg.exports._parse=hv;Zg.exports._enoent=pv});var qK=y((QZe,jK)=>{"use strict";function fhe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function uc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,uc)}fhe(uc,Error);uc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",re=de(">>",!1),me=">&",tt=de(">&",!1),Rt=">",It=de(">",!1),Ur="<<<",oi=de("<<<",!1),pi="<&",pr=de("<&",!1),di="<",ai=de("<",!1),Os=function(m){return{type:"argument",segments:[].concat(...m)}},dr=function(m){return m},Bi="$'",_n=de("$'",!1),pa="'",EA=de("'",!1),kg=function(m){return[{type:"text",text:m}]},Zn='""',IA=de('""',!1),da=function(){return{type:"text",text:""}},Jp='"',yA=de('"',!1),wA=function(m){return m},Br=function(m){return{type:"arithmetic",arithmetic:m,quoted:!0}},Vl=function(m){return{type:"shell",shell:m,quoted:!0}},Rg=function(m){return{type:"variable",...m,quoted:!0}},Eo=function(m){return{type:"text",text:m}},Fg=function(m){return{type:"arithmetic",arithmetic:m,quoted:!1}},Wp=function(m){return{type:"shell",shell:m,quoted:!1}},zp=function(m){return{type:"variable",...m,quoted:!1}},Pr=function(m){return{type:"glob",pattern:m}},oe=/^[^']/,Io=Ye(["'"],!0,!1),kn=function(m){return m.join("")},Ng=/^[^$"]/,bt=Ye(["$",'"'],!0,!1),Xl=`\\ -`,Rn=de(`\\ -`,!1),$n=function(){return""},es="\\",ut=de("\\",!1),yo=/^[\\$"`]/,at=Ye(["\\","$",'"',"`"],!1,!1),ln=function(m){return m},S="\\a",Lt=de("\\a",!1),Tg=function(){return"a"},_l="\\b",Vp=de("\\b",!1),Xp=function(){return"\b"},_p=/^[Ee]/,Zp=Ye(["E","e"],!1,!1),$p=function(){return"\x1B"},G="\\f",yt=de("\\f",!1),BA=function(){return"\f"},Wi="\\n",Zl=de("\\n",!1),We=function(){return` -`},Ca="\\r",Lg=de("\\r",!1),uI=function(){return"\r"},ed="\\t",gI=de("\\t",!1),ar=function(){return" "},Fn="\\v",$l=de("\\v",!1),td=function(){return"\v"},Ms=/^[\\'"?]/,ma=Ye(["\\","'",'"',"?"],!1,!1),cn=function(m){return String.fromCharCode(parseInt(m,16))},ke="\\x",Og=de("\\x",!1),ec="\\u",Us=de("\\u",!1),tc="\\U",bA=de("\\U",!1),Mg=function(m){return String.fromCodePoint(parseInt(m,16))},Ug=/^[0-7]/,Ea=Ye([["0","7"]],!1,!1),Ia=/^[0-9a-fA-f]/,$e=Ye([["0","9"],["a","f"],["A","f"]],!1,!1),wo=rt(),QA="-",rc=de("-",!1),Ks="+",ic=de("+",!1),fI=".",rd=de(".",!1),Kg=function(m,Q,F){return{type:"number",value:(m==="-"?-1:1)*parseFloat(Q.join("")+"."+F.join(""))}},id=function(m,Q){return{type:"number",value:(m==="-"?-1:1)*parseInt(Q.join(""))}},hI=function(m){return{type:"variable",...m}},nc=function(m){return{type:"variable",name:m}},pI=function(m){return m},Hg="*",SA=de("*",!1),Nr="/",dI=de("/",!1),Hs=function(m,Q,F){return{type:Q==="*"?"multiplication":"division",right:F}},Gs=function(m,Q){return Q.reduce((F,K)=>({left:F,...K}),m)},Gg=function(m,Q,F){return{type:Q==="+"?"addition":"subtraction",right:F}},vA="$((",R=de("$((",!1),q="))",pe=de("))",!1),Ne=function(m){return m},xe="$(",qe=de("$(",!1),dt=function(m){return m},Ft="${",Nn=de("${",!1),vS=":-",AU=de(":-",!1),lU=function(m,Q){return{name:m,defaultValue:Q}},xS=":-}",cU=de(":-}",!1),uU=function(m){return{name:m,defaultValue:[]}},PS=":+",gU=de(":+",!1),fU=function(m,Q){return{name:m,alternativeValue:Q}},DS=":+}",hU=de(":+}",!1),pU=function(m){return{name:m,alternativeValue:[]}},kS=function(m){return{name:m}},dU="$",CU=de("$",!1),mU=function(m){return e.isGlobPattern(m)},EU=function(m){return m},RS=/^[a-zA-Z0-9_]/,FS=Ye([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),NS=function(){return O()},TS=/^[$@*?#a-zA-Z0-9_\-]/,LS=Ye(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),IU=/^[(){}<>$|&; \t"']/,Yg=Ye(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),OS=/^[<>&; \t"']/,MS=Ye(["<",">","&",";"," "," ",'"',"'"],!1,!1),CI=/^[ \t]/,mI=Ye([" "," "],!1,!1),b=0,Fe=0,xA=[{line:1,column:1}],d=0,E=[],I=0,k;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function O(){return r.substring(Fe,b)}function X(){return Et(Fe,b)}function te(m,Q){throw Q=Q!==void 0?Q:Et(Fe,b),Fi([At(m)],r.substring(Fe,b),Q)}function ye(m,Q){throw Q=Q!==void 0?Q:Et(Fe,b),Tn(m,Q)}function de(m,Q){return{type:"literal",text:m,ignoreCase:Q}}function Ye(m,Q,F){return{type:"class",parts:m,inverted:Q,ignoreCase:F}}function rt(){return{type:"any"}}function wt(){return{type:"end"}}function At(m){return{type:"other",description:m}}function et(m){var Q=xA[m],F;if(Q)return Q;for(F=m-1;!xA[F];)F--;for(Q=xA[F],Q={line:Q.line,column:Q.column};Fd&&(d=b,E=[]),E.push(m))}function Tn(m,Q){return new uc(m,null,null,Q)}function Fi(m,Q,F){return new uc(uc.buildMessage(m,Q),m,Q,F)}function PA(){var m,Q;return m=b,Q=Kr(),Q===t&&(Q=null),Q!==t&&(Fe=m,Q=s(Q)),m=Q,m}function Kr(){var m,Q,F,K,ce;if(m=b,Q=Hr(),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();F!==t?(K=ya(),K!==t?(ce=ts(),ce===t&&(ce=null),ce!==t?(Fe=m,Q=o(Q,K,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;if(m===t)if(m=b,Q=Hr(),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();F!==t?(K=ya(),K===t&&(K=null),K!==t?(Fe=m,Q=a(Q,K),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function ts(){var m,Q,F,K,ce;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(F=Kr(),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=l(F),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function ya(){var m;return r.charCodeAt(b)===59?(m=c,b++):(m=t,I===0&&Be(u)),m===t&&(r.charCodeAt(b)===38?(m=g,b++):(m=t,I===0&&Be(f))),m}function Hr(){var m,Q,F;return m=b,Q=yU(),Q!==t?(F=$ge(),F===t&&(F=null),F!==t?(Fe=m,Q=h(Q,F),m=Q):(b=m,m=t)):(b=m,m=t),m}function $ge(){var m,Q,F,K,ce,Qe,ft;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(F=efe(),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=Hr(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(Fe=m,Q=p(F,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function efe(){var m;return r.substr(b,2)===C?(m=C,b+=2):(m=t,I===0&&Be(w)),m===t&&(r.substr(b,2)===B?(m=B,b+=2):(m=t,I===0&&Be(v))),m}function yU(){var m,Q,F;return m=b,Q=ife(),Q!==t?(F=tfe(),F===t&&(F=null),F!==t?(Fe=m,Q=D(Q,F),m=Q):(b=m,m=t)):(b=m,m=t),m}function tfe(){var m,Q,F,K,ce,Qe,ft;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(F=rfe(),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=yU(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(Fe=m,Q=T(F,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function rfe(){var m;return r.substr(b,2)===H?(m=H,b+=2):(m=t,I===0&&Be(j)),m===t&&(r.charCodeAt(b)===124?(m=$,b++):(m=t,I===0&&Be(V))),m}function EI(){var m,Q,F,K,ce,Qe;if(m=b,Q=FU(),Q!==t)if(r.charCodeAt(b)===61?(F=W,b++):(F=t,I===0&&Be(Z)),F!==t)if(K=bU(),K!==t){for(ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();ce!==t?(Fe=m,Q=A(Q,K),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;else b=m,m=t;if(m===t)if(m=b,Q=FU(),Q!==t)if(r.charCodeAt(b)===61?(F=W,b++):(F=t,I===0&&Be(Z)),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=ae(Q),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function ife(){var m,Q,F,K,ce,Qe,ft,Bt,Vr,Ci,rs;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(r.charCodeAt(b)===40?(F=ge,b++):(F=t,I===0&&Be(_)),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=Kr(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();if(Qe!==t)if(r.charCodeAt(b)===41?(ft=L,b++):(ft=t,I===0&&Be(N)),ft!==t){for(Bt=[],Vr=Me();Vr!==t;)Bt.push(Vr),Vr=Me();if(Bt!==t){for(Vr=[],Ci=nd();Ci!==t;)Vr.push(Ci),Ci=nd();if(Vr!==t){for(Ci=[],rs=Me();rs!==t;)Ci.push(rs),rs=Me();Ci!==t?(Fe=m,Q=ue(ce,Vr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t)if(r.charCodeAt(b)===123?(F=we,b++):(F=t,I===0&&Be(Te)),F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t)if(ce=Kr(),ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();if(Qe!==t)if(r.charCodeAt(b)===125?(ft=Pe,b++):(ft=t,I===0&&Be(Le)),ft!==t){for(Bt=[],Vr=Me();Vr!==t;)Bt.push(Vr),Vr=Me();if(Bt!==t){for(Vr=[],Ci=nd();Ci!==t;)Vr.push(Ci),Ci=nd();if(Vr!==t){for(Ci=[],rs=Me();rs!==t;)Ci.push(rs),rs=Me();Ci!==t?(Fe=m,Q=se(ce,Vr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t){for(F=[],K=EI();K!==t;)F.push(K),K=EI();if(F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();if(K!==t){if(ce=[],Qe=BU(),Qe!==t)for(;Qe!==t;)ce.push(Qe),Qe=BU();else ce=t;if(ce!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(Fe=m,Q=Ae(F,ce),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t}else b=m,m=t;if(m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t){if(F=[],K=EI(),K!==t)for(;K!==t;)F.push(K),K=EI();else F=t;if(F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=be(F),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}}}return m}function wU(){var m,Q,F,K,ce;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t){if(F=[],K=II(),K!==t)for(;K!==t;)F.push(K),K=II();else F=t;if(F!==t){for(K=[],ce=Me();ce!==t;)K.push(ce),ce=Me();K!==t?(Fe=m,Q=fe(F),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t;return m}function BU(){var m,Q,F;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();if(Q!==t?(F=nd(),F!==t?(Fe=m,Q=le(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t){for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();Q!==t?(F=II(),F!==t?(Fe=m,Q=le(F),m=Q):(b=m,m=t)):(b=m,m=t)}return m}function nd(){var m,Q,F,K,ce;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();return Q!==t?(Ge.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(ie)),F===t&&(F=null),F!==t?(K=nfe(),K!==t?(ce=II(),ce!==t?(Fe=m,Q=Y(F,K,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function nfe(){var m;return r.substr(b,2)===he?(m=he,b+=2):(m=t,I===0&&Be(re)),m===t&&(r.substr(b,2)===me?(m=me,b+=2):(m=t,I===0&&Be(tt)),m===t&&(r.charCodeAt(b)===62?(m=Rt,b++):(m=t,I===0&&Be(It)),m===t&&(r.substr(b,3)===Ur?(m=Ur,b+=3):(m=t,I===0&&Be(oi)),m===t&&(r.substr(b,2)===pi?(m=pi,b+=2):(m=t,I===0&&Be(pr)),m===t&&(r.charCodeAt(b)===60?(m=di,b++):(m=t,I===0&&Be(ai))))))),m}function II(){var m,Q,F;for(m=b,Q=[],F=Me();F!==t;)Q.push(F),F=Me();return Q!==t?(F=bU(),F!==t?(Fe=m,Q=le(F),m=Q):(b=m,m=t)):(b=m,m=t),m}function bU(){var m,Q,F;if(m=b,Q=[],F=QU(),F!==t)for(;F!==t;)Q.push(F),F=QU();else Q=t;return Q!==t&&(Fe=m,Q=Os(Q)),m=Q,m}function QU(){var m,Q;return m=b,Q=sfe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q,m===t&&(m=b,Q=ofe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q,m===t&&(m=b,Q=afe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q,m===t&&(m=b,Q=Afe(),Q!==t&&(Fe=m,Q=dr(Q)),m=Q))),m}function sfe(){var m,Q,F,K;return m=b,r.substr(b,2)===Bi?(Q=Bi,b+=2):(Q=t,I===0&&Be(_n)),Q!==t?(F=ufe(),F!==t?(r.charCodeAt(b)===39?(K=pa,b++):(K=t,I===0&&Be(EA)),K!==t?(Fe=m,Q=kg(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function ofe(){var m,Q,F,K;return m=b,r.charCodeAt(b)===39?(Q=pa,b++):(Q=t,I===0&&Be(EA)),Q!==t?(F=lfe(),F!==t?(r.charCodeAt(b)===39?(K=pa,b++):(K=t,I===0&&Be(EA)),K!==t?(Fe=m,Q=kg(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function afe(){var m,Q,F,K;if(m=b,r.substr(b,2)===Zn?(Q=Zn,b+=2):(Q=t,I===0&&Be(IA)),Q!==t&&(Fe=m,Q=da()),m=Q,m===t)if(m=b,r.charCodeAt(b)===34?(Q=Jp,b++):(Q=t,I===0&&Be(yA)),Q!==t){for(F=[],K=SU();K!==t;)F.push(K),K=SU();F!==t?(r.charCodeAt(b)===34?(K=Jp,b++):(K=t,I===0&&Be(yA)),K!==t?(Fe=m,Q=wA(F),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function Afe(){var m,Q,F;if(m=b,Q=[],F=vU(),F!==t)for(;F!==t;)Q.push(F),F=vU();else Q=t;return Q!==t&&(Fe=m,Q=wA(Q)),m=Q,m}function SU(){var m,Q;return m=b,Q=kU(),Q!==t&&(Fe=m,Q=Br(Q)),m=Q,m===t&&(m=b,Q=RU(),Q!==t&&(Fe=m,Q=Vl(Q)),m=Q,m===t&&(m=b,Q=GS(),Q!==t&&(Fe=m,Q=Rg(Q)),m=Q,m===t&&(m=b,Q=cfe(),Q!==t&&(Fe=m,Q=Eo(Q)),m=Q))),m}function vU(){var m,Q;return m=b,Q=kU(),Q!==t&&(Fe=m,Q=Fg(Q)),m=Q,m===t&&(m=b,Q=RU(),Q!==t&&(Fe=m,Q=Wp(Q)),m=Q,m===t&&(m=b,Q=GS(),Q!==t&&(Fe=m,Q=zp(Q)),m=Q,m===t&&(m=b,Q=hfe(),Q!==t&&(Fe=m,Q=Pr(Q)),m=Q,m===t&&(m=b,Q=ffe(),Q!==t&&(Fe=m,Q=Eo(Q)),m=Q)))),m}function lfe(){var m,Q,F;for(m=b,Q=[],oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io));F!==t;)Q.push(F),oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io));return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function cfe(){var m,Q,F;if(m=b,Q=[],F=xU(),F===t&&(Ng.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(bt))),F!==t)for(;F!==t;)Q.push(F),F=xU(),F===t&&(Ng.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(bt)));else Q=t;return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function xU(){var m,Q,F;return m=b,r.substr(b,2)===Xl?(Q=Xl,b+=2):(Q=t,I===0&&Be(Rn)),Q!==t&&(Fe=m,Q=$n()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(yo.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(at)),F!==t?(Fe=m,Q=ln(F),m=Q):(b=m,m=t)):(b=m,m=t)),m}function ufe(){var m,Q,F;for(m=b,Q=[],F=PU(),F===t&&(oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io)));F!==t;)Q.push(F),F=PU(),F===t&&(oe.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Io)));return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function PU(){var m,Q,F;return m=b,r.substr(b,2)===S?(Q=S,b+=2):(Q=t,I===0&&Be(Lt)),Q!==t&&(Fe=m,Q=Tg()),m=Q,m===t&&(m=b,r.substr(b,2)===_l?(Q=_l,b+=2):(Q=t,I===0&&Be(Vp)),Q!==t&&(Fe=m,Q=Xp()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(_p.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(Zp)),F!==t?(Fe=m,Q=$p(),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===G?(Q=G,b+=2):(Q=t,I===0&&Be(yt)),Q!==t&&(Fe=m,Q=BA()),m=Q,m===t&&(m=b,r.substr(b,2)===Wi?(Q=Wi,b+=2):(Q=t,I===0&&Be(Zl)),Q!==t&&(Fe=m,Q=We()),m=Q,m===t&&(m=b,r.substr(b,2)===Ca?(Q=Ca,b+=2):(Q=t,I===0&&Be(Lg)),Q!==t&&(Fe=m,Q=uI()),m=Q,m===t&&(m=b,r.substr(b,2)===ed?(Q=ed,b+=2):(Q=t,I===0&&Be(gI)),Q!==t&&(Fe=m,Q=ar()),m=Q,m===t&&(m=b,r.substr(b,2)===Fn?(Q=Fn,b+=2):(Q=t,I===0&&Be($l)),Q!==t&&(Fe=m,Q=td()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(Ms.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(ma)),F!==t?(Fe=m,Q=ln(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=gfe()))))))))),m}function gfe(){var m,Q,F,K,ce,Qe,ft,Bt,Vr,Ci,rs,YS;return m=b,r.charCodeAt(b)===92?(Q=es,b++):(Q=t,I===0&&Be(ut)),Q!==t?(F=US(),F!==t?(Fe=m,Q=cn(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===ke?(Q=ke,b+=2):(Q=t,I===0&&Be(Og)),Q!==t?(F=b,K=b,ce=US(),ce!==t?(Qe=Ln(),Qe!==t?(ce=[ce,Qe],K=ce):(b=K,K=t)):(b=K,K=t),K===t&&(K=US()),K!==t?F=r.substring(F,b):F=K,F!==t?(Fe=m,Q=cn(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===ec?(Q=ec,b+=2):(Q=t,I===0&&Be(Us)),Q!==t?(F=b,K=b,ce=Ln(),ce!==t?(Qe=Ln(),Qe!==t?(ft=Ln(),ft!==t?(Bt=Ln(),Bt!==t?(ce=[ce,Qe,ft,Bt],K=ce):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t),K!==t?F=r.substring(F,b):F=K,F!==t?(Fe=m,Q=cn(F),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===tc?(Q=tc,b+=2):(Q=t,I===0&&Be(bA)),Q!==t?(F=b,K=b,ce=Ln(),ce!==t?(Qe=Ln(),Qe!==t?(ft=Ln(),ft!==t?(Bt=Ln(),Bt!==t?(Vr=Ln(),Vr!==t?(Ci=Ln(),Ci!==t?(rs=Ln(),rs!==t?(YS=Ln(),YS!==t?(ce=[ce,Qe,ft,Bt,Vr,Ci,rs,YS],K=ce):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t)):(b=K,K=t),K!==t?F=r.substring(F,b):F=K,F!==t?(Fe=m,Q=Mg(F),m=Q):(b=m,m=t)):(b=m,m=t)))),m}function US(){var m;return Ug.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be(Ea)),m}function Ln(){var m;return Ia.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be($e)),m}function ffe(){var m,Q,F,K,ce;if(m=b,Q=[],F=b,r.charCodeAt(b)===92?(K=es,b++):(K=t,I===0&&Be(ut)),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t),F===t&&(F=b,K=b,I++,ce=NU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t)),F!==t)for(;F!==t;)Q.push(F),F=b,r.charCodeAt(b)===92?(K=es,b++):(K=t,I===0&&Be(ut)),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t),F===t&&(F=b,K=b,I++,ce=NU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t));else Q=t;return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function KS(){var m,Q,F,K,ce,Qe;if(m=b,r.charCodeAt(b)===45?(Q=QA,b++):(Q=t,I===0&&Be(rc)),Q===t&&(r.charCodeAt(b)===43?(Q=Ks,b++):(Q=t,I===0&&Be(ic))),Q===t&&(Q=null),Q!==t){if(F=[],Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie)),K!==t)for(;K!==t;)F.push(K),Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie));else F=t;if(F!==t)if(r.charCodeAt(b)===46?(K=fI,b++):(K=t,I===0&&Be(rd)),K!==t){if(ce=[],Ge.test(r.charAt(b))?(Qe=r.charAt(b),b++):(Qe=t,I===0&&Be(ie)),Qe!==t)for(;Qe!==t;)ce.push(Qe),Ge.test(r.charAt(b))?(Qe=r.charAt(b),b++):(Qe=t,I===0&&Be(ie));else ce=t;ce!==t?(Fe=m,Q=Kg(Q,F,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;if(m===t){if(m=b,r.charCodeAt(b)===45?(Q=QA,b++):(Q=t,I===0&&Be(rc)),Q===t&&(r.charCodeAt(b)===43?(Q=Ks,b++):(Q=t,I===0&&Be(ic))),Q===t&&(Q=null),Q!==t){if(F=[],Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie)),K!==t)for(;K!==t;)F.push(K),Ge.test(r.charAt(b))?(K=r.charAt(b),b++):(K=t,I===0&&Be(ie));else F=t;F!==t?(Fe=m,Q=id(Q,F),m=Q):(b=m,m=t)}else b=m,m=t;if(m===t&&(m=b,Q=GS(),Q!==t&&(Fe=m,Q=hI(Q)),m=Q,m===t&&(m=b,Q=sc(),Q!==t&&(Fe=m,Q=nc(Q)),m=Q,m===t)))if(m=b,r.charCodeAt(b)===40?(Q=ge,b++):(Q=t,I===0&&Be(_)),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();if(F!==t)if(K=DU(),K!==t){for(ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();ce!==t?(r.charCodeAt(b)===41?(Qe=L,b++):(Qe=t,I===0&&Be(N)),Qe!==t?(Fe=m,Q=pI(K),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t}return m}function HS(){var m,Q,F,K,ce,Qe,ft,Bt;if(m=b,Q=KS(),Q!==t){for(F=[],K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===42?(Qe=Hg,b++):(Qe=t,I===0&&Be(SA)),Qe===t&&(r.charCodeAt(b)===47?(Qe=Nr,b++):(Qe=t,I===0&&Be(dI))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=KS(),Bt!==t?(Fe=K,ce=Hs(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t;for(;K!==t;){for(F.push(K),K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===42?(Qe=Hg,b++):(Qe=t,I===0&&Be(SA)),Qe===t&&(r.charCodeAt(b)===47?(Qe=Nr,b++):(Qe=t,I===0&&Be(dI))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=KS(),Bt!==t?(Fe=K,ce=Hs(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t}F!==t?(Fe=m,Q=Gs(Q,F),m=Q):(b=m,m=t)}else b=m,m=t;return m}function DU(){var m,Q,F,K,ce,Qe,ft,Bt;if(m=b,Q=HS(),Q!==t){for(F=[],K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===43?(Qe=Ks,b++):(Qe=t,I===0&&Be(ic)),Qe===t&&(r.charCodeAt(b)===45?(Qe=QA,b++):(Qe=t,I===0&&Be(rc))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=HS(),Bt!==t?(Fe=K,ce=Gg(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t;for(;K!==t;){for(F.push(K),K=b,ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();if(ce!==t)if(r.charCodeAt(b)===43?(Qe=Ks,b++):(Qe=t,I===0&&Be(ic)),Qe===t&&(r.charCodeAt(b)===45?(Qe=QA,b++):(Qe=t,I===0&&Be(rc))),Qe!==t){for(ft=[],Bt=Me();Bt!==t;)ft.push(Bt),Bt=Me();ft!==t?(Bt=HS(),Bt!==t?(Fe=K,ce=Gg(Q,Qe,Bt),K=ce):(b=K,K=t)):(b=K,K=t)}else b=K,K=t;else b=K,K=t}F!==t?(Fe=m,Q=Gs(Q,F),m=Q):(b=m,m=t)}else b=m,m=t;return m}function kU(){var m,Q,F,K,ce,Qe;if(m=b,r.substr(b,3)===vA?(Q=vA,b+=3):(Q=t,I===0&&Be(R)),Q!==t){for(F=[],K=Me();K!==t;)F.push(K),K=Me();if(F!==t)if(K=DU(),K!==t){for(ce=[],Qe=Me();Qe!==t;)ce.push(Qe),Qe=Me();ce!==t?(r.substr(b,2)===q?(Qe=q,b+=2):(Qe=t,I===0&&Be(pe)),Qe!==t?(Fe=m,Q=Ne(K),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;return m}function RU(){var m,Q,F,K;return m=b,r.substr(b,2)===xe?(Q=xe,b+=2):(Q=t,I===0&&Be(qe)),Q!==t?(F=Kr(),F!==t?(r.charCodeAt(b)===41?(K=L,b++):(K=t,I===0&&Be(N)),K!==t?(Fe=m,Q=dt(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function GS(){var m,Q,F,K,ce,Qe;return m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,2)===vS?(K=vS,b+=2):(K=t,I===0&&Be(AU)),K!==t?(ce=wU(),ce!==t?(r.charCodeAt(b)===125?(Qe=Pe,b++):(Qe=t,I===0&&Be(Le)),Qe!==t?(Fe=m,Q=lU(F,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,3)===xS?(K=xS,b+=3):(K=t,I===0&&Be(cU)),K!==t?(Fe=m,Q=uU(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,2)===PS?(K=PS,b+=2):(K=t,I===0&&Be(gU)),K!==t?(ce=wU(),ce!==t?(r.charCodeAt(b)===125?(Qe=Pe,b++):(Qe=t,I===0&&Be(Le)),Qe!==t?(Fe=m,Q=fU(F,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.substr(b,3)===DS?(K=DS,b+=3):(K=t,I===0&&Be(hU)),K!==t?(Fe=m,Q=pU(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&Be(Nn)),Q!==t?(F=sc(),F!==t?(r.charCodeAt(b)===125?(K=Pe,b++):(K=t,I===0&&Be(Le)),K!==t?(Fe=m,Q=kS(F),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.charCodeAt(b)===36?(Q=dU,b++):(Q=t,I===0&&Be(CU)),Q!==t?(F=sc(),F!==t?(Fe=m,Q=kS(F),m=Q):(b=m,m=t)):(b=m,m=t)))))),m}function hfe(){var m,Q,F;return m=b,Q=pfe(),Q!==t?(Fe=b,F=mU(Q),F?F=void 0:F=t,F!==t?(Fe=m,Q=EU(Q),m=Q):(b=m,m=t)):(b=m,m=t),m}function pfe(){var m,Q,F,K,ce;if(m=b,Q=[],F=b,K=b,I++,ce=TU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t),F!==t)for(;F!==t;)Q.push(F),F=b,K=b,I++,ce=TU(),I--,ce===t?K=void 0:(b=K,K=t),K!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&Be(wo)),ce!==t?(Fe=F,K=ln(ce),F=K):(b=F,F=t)):(b=F,F=t);else Q=t;return Q!==t&&(Fe=m,Q=kn(Q)),m=Q,m}function FU(){var m,Q,F;if(m=b,Q=[],RS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(FS)),F!==t)for(;F!==t;)Q.push(F),RS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(FS));else Q=t;return Q!==t&&(Fe=m,Q=NS()),m=Q,m}function sc(){var m,Q,F;if(m=b,Q=[],TS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(LS)),F!==t)for(;F!==t;)Q.push(F),TS.test(r.charAt(b))?(F=r.charAt(b),b++):(F=t,I===0&&Be(LS));else Q=t;return Q!==t&&(Fe=m,Q=NS()),m=Q,m}function NU(){var m;return IU.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be(Yg)),m}function TU(){var m;return OS.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&Be(MS)),m}function Me(){var m,Q;if(m=[],CI.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&Be(mI)),Q!==t)for(;Q!==t;)m.push(Q),CI.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&Be(mI));else m=t;return m}if(k=n(),k!==t&&b===r.length)return k;throw k!==t&&b{"use strict";function phe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function fc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,fc)}phe(fc,Error);fc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=v,j=[]),j.push(ie))}function Le(ie,Y){return new fc(ie,null,null,Y)}function se(ie,Y,he){return new fc(fc.buildMessage(ie,Y),ie,Y,he)}function Ae(){var ie,Y,he,re;return ie=v,Y=be(),Y!==t?(r.charCodeAt(v)===47?(he=s,v++):(he=t,$===0&&Pe(o)),he!==t?(re=be(),re!==t?(D=ie,Y=a(Y,re),ie=Y):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t),ie===t&&(ie=v,Y=be(),Y!==t&&(D=ie,Y=l(Y)),ie=Y),ie}function be(){var ie,Y,he,re;return ie=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(he=c,v++):(he=t,$===0&&Pe(u)),he!==t?(re=Ge(),re!==t?(D=ie,Y=g(Y,re),ie=Y):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t),ie===t&&(ie=v,Y=fe(),Y!==t&&(D=ie,Y=f(Y)),ie=Y),ie}function fe(){var ie,Y,he,re,me;return ie=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Pe(u)),Y!==t?(he=le(),he!==t?(r.charCodeAt(v)===47?(re=s,v++):(re=t,$===0&&Pe(o)),re!==t?(me=le(),me!==t?(D=ie,Y=h(),ie=Y):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t)):(v=ie,ie=t),ie===t&&(ie=v,Y=le(),Y!==t&&(D=ie,Y=h()),ie=Y),ie}function le(){var ie,Y,he;if(ie=v,Y=[],p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(C)),he!==t)for(;he!==t;)Y.push(he),p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(C));else Y=t;return Y!==t&&(D=ie,Y=h()),ie=Y,ie}function Ge(){var ie,Y,he;if(ie=v,Y=[],w.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(B)),he!==t)for(;he!==t;)Y.push(he),w.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Pe(B));else Y=t;return Y!==t&&(D=ie,Y=h()),ie=Y,ie}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v{"use strict";function XK(r){return typeof r>"u"||r===null}function Che(r){return typeof r=="object"&&r!==null}function mhe(r){return Array.isArray(r)?r:XK(r)?[]:[r]}function Ehe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function md(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}md.prototype=Object.create(Error.prototype);md.prototype.constructor=md;md.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};_K.exports=md});var e2=y((YZe,$K)=>{"use strict";var ZK=pc();function wv(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}wv.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),ZK.repeat(" ",e)+i+a+s+` -`+ZK.repeat(" ",e+this.position-n+i.length)+"^"};wv.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: -`+t)),i};$K.exports=wv});var Ai=y((jZe,r2)=>{"use strict";var t2=tf(),whe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Bhe=["scalar","sequence","mapping"];function bhe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function Qhe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(whe.indexOf(t)===-1)throw new t2('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=bhe(e.styleAliases||null),Bhe.indexOf(this.kind)===-1)throw new t2('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}r2.exports=Qhe});var dc=y((qZe,n2)=>{"use strict";var i2=pc(),jI=tf(),She=Ai();function Bv(r,e,t){var i=[];return r.include.forEach(function(n){t=Bv(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function vhe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var xhe=Ai();s2.exports=new xhe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var A2=y((WZe,a2)=>{"use strict";var Phe=Ai();a2.exports=new Phe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var c2=y((zZe,l2)=>{"use strict";var Dhe=Ai();l2.exports=new Dhe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var qI=y((VZe,u2)=>{"use strict";var khe=dc();u2.exports=new khe({explicit:[o2(),A2(),c2()]})});var f2=y((XZe,g2)=>{"use strict";var Rhe=Ai();function Fhe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function Nhe(){return null}function The(r){return r===null}g2.exports=new Rhe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Fhe,construct:Nhe,predicate:The,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var p2=y((_Ze,h2)=>{"use strict";var Lhe=Ai();function Ohe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function Mhe(r){return r==="true"||r==="True"||r==="TRUE"}function Uhe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}h2.exports=new Lhe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Ohe,construct:Mhe,predicate:Uhe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var C2=y((ZZe,d2)=>{"use strict";var Khe=pc(),Hhe=Ai();function Ghe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function Yhe(r){return 48<=r&&r<=55}function jhe(r){return 48<=r&&r<=57}function qhe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var I2=y(($Ze,E2)=>{"use strict";var m2=pc(),zhe=Ai(),Vhe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Xhe(r){return!(r===null||!Vhe.test(r)||r[r.length-1]==="_")}function _he(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var Zhe=/^[-+]?[0-9]+e/;function $he(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(m2.isNegativeZero(r))return"-0.0";return t=r.toString(10),Zhe.test(t)?t.replace("e",".e"):t}function epe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||m2.isNegativeZero(r))}E2.exports=new zhe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Xhe,construct:_he,predicate:epe,represent:$he,defaultStyle:"lowercase"})});var bv=y((e$e,y2)=>{"use strict";var tpe=dc();y2.exports=new tpe({include:[qI()],implicit:[f2(),p2(),C2(),I2()]})});var Qv=y((t$e,w2)=>{"use strict";var rpe=dc();w2.exports=new rpe({include:[bv()]})});var S2=y((r$e,Q2)=>{"use strict";var ipe=Ai(),B2=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),b2=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function npe(r){return r===null?!1:B2.exec(r)!==null||b2.exec(r)!==null}function spe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=B2.exec(r),e===null&&(e=b2.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function ope(r){return r.toISOString()}Q2.exports=new ipe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:npe,construct:spe,instanceOf:Date,represent:ope})});var x2=y((i$e,v2)=>{"use strict";var ape=Ai();function Ape(r){return r==="<<"||r===null}v2.exports=new ape("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Ape})});var k2=y((n$e,D2)=>{"use strict";var Cc;try{P2=J,Cc=P2("buffer").Buffer}catch{}var P2,lpe=Ai(),Sv=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function cpe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=Sv;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8===0}function upe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=Sv,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),Cc?Cc.from?Cc.from(a):new Cc(a):a}function gpe(r){var e="",t=0,i,n,s=r.length,o=Sv;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function fpe(r){return Cc&&Cc.isBuffer(r)}D2.exports=new lpe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:cpe,construct:upe,predicate:fpe,represent:gpe})});var F2=y((s$e,R2)=>{"use strict";var hpe=Ai(),ppe=Object.prototype.hasOwnProperty,dpe=Object.prototype.toString;function Cpe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var Epe=Ai(),Ipe=Object.prototype.toString;function ype(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var Bpe=Ai(),bpe=Object.prototype.hasOwnProperty;function Qpe(r){if(r===null)return!0;var e,t=r;for(e in t)if(bpe.call(t,e)&&t[e]!==null)return!1;return!0}function Spe(r){return r!==null?r:{}}L2.exports=new Bpe("tag:yaml.org,2002:set",{kind:"mapping",resolve:Qpe,construct:Spe})});var nf=y((A$e,M2)=>{"use strict";var vpe=dc();M2.exports=new vpe({include:[Qv()],implicit:[S2(),x2()],explicit:[k2(),F2(),T2(),O2()]})});var K2=y((l$e,U2)=>{"use strict";var xpe=Ai();function Ppe(){return!0}function Dpe(){}function kpe(){return""}function Rpe(r){return typeof r>"u"}U2.exports=new xpe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:Ppe,construct:Dpe,predicate:Rpe,represent:kpe})});var G2=y((c$e,H2)=>{"use strict";var Fpe=Ai();function Npe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function Tpe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Lpe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function Ope(r){return Object.prototype.toString.call(r)==="[object RegExp]"}H2.exports=new Fpe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:Npe,construct:Tpe,predicate:Ope,represent:Lpe})});var q2=y((u$e,j2)=>{"use strict";var JI;try{Y2=J,JI=Y2("esprima")}catch{typeof window<"u"&&(JI=window.esprima)}var Y2,Mpe=Ai();function Upe(r){if(r===null)return!1;try{var e="("+r+")",t=JI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function Kpe(r){var e="("+r+")",t=JI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function Hpe(r){return r.toString()}function Gpe(r){return Object.prototype.toString.call(r)==="[object Function]"}j2.exports=new Mpe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:Upe,construct:Kpe,predicate:Gpe,represent:Hpe})});var Ed=y((g$e,W2)=>{"use strict";var J2=dc();W2.exports=J2.DEFAULT=new J2({include:[nf()],explicit:[K2(),G2(),q2()]})});var gH=y((f$e,Id)=>{"use strict";var Qa=pc(),eH=tf(),Ype=e2(),tH=nf(),jpe=Ed(),NA=Object.prototype.hasOwnProperty,WI=1,rH=2,iH=3,zI=4,vv=1,qpe=2,z2=3,Jpe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Wpe=/[\x85\u2028\u2029]/,zpe=/[,\[\]\{\}]/,nH=/^(?:!|!!|![a-z\-]+!)$/i,sH=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function V2(r){return Object.prototype.toString.call(r)}function So(r){return r===10||r===13}function Ec(r){return r===9||r===32}function fn(r){return r===9||r===32||r===10||r===13}function sf(r){return r===44||r===91||r===93||r===123||r===125}function Vpe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Xpe(r){return r===120?2:r===117?4:r===85?8:0}function _pe(r){return 48<=r&&r<=57?r-48:-1}function X2(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` -`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"\x1B":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function Zpe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var oH=new Array(256),aH=new Array(256);for(mc=0;mc<256;mc++)oH[mc]=X2(mc)?1:0,aH[mc]=X2(mc);var mc;function $pe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||jpe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function AH(r,e){return new eH(e,new Ype(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function gt(r,e){throw AH(r,e)}function VI(r,e){r.onWarning&&r.onWarning.call(null,AH(r,e))}var _2={YAML:function(e,t,i){var n,s,o;e.version!==null&>(e,"duplication of %YAML directive"),i.length!==1&>(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&>(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&>(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&VI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&>(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],nH.test(n)||gt(e,"ill-formed tag handle (first argument) of the TAG directive"),NA.call(e.tagMap,n)&>(e,'there is a previously declared suffix for "'+n+'" tag handle'),sH.test(s)||gt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function FA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Qa.repeat(` -`,e-1))}function ede(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),fn(h)||sf(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),fn(n)||t&&sf(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),fn(n)||t&&sf(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),fn(i))break}else{if(r.position===r.lineStart&&XI(r)||t&&sf(h))break;if(So(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,_r(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(FA(r,s,o,!1),Pv(r,r.line-l),s=o=r.position,a=!1),Ec(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return FA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function tde(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(FA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else So(t)?(FA(r,i,n,!0),Pv(r,_r(r,!1,e)),i=n=r.position):r.position===r.lineStart&&XI(r)?gt(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);gt(r,"unexpected end of the stream within a single quoted scalar")}function rde(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return FA(r,t,r.position,!0),r.position++,!0;if(a===92){if(FA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),So(a))_r(r,!1,e);else if(a<256&&oH[a])r.result+=aH[a],r.position++;else if((o=Xpe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=Vpe(a))>=0?s=(s<<4)+o:gt(r,"expected hexadecimal character");r.result+=Zpe(s),r.position++}else gt(r,"unknown escape sequence");t=i=r.position}else So(a)?(FA(r,t,i,!0),Pv(r,_r(r,!1,e)),t=i=r.position):r.position===r.lineStart&&XI(r)?gt(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}gt(r,"unexpected end of the stream within a double quoted scalar")}function ide(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,w;if(w=r.input.charCodeAt(r.position),w===91)l=93,g=!1,s=[];else if(w===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),w=r.input.charCodeAt(++r.position);w!==0;){if(_r(r,!0,e),w=r.input.charCodeAt(r.position),w===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||gt(r,"missed comma between flow collection entries"),p=h=C=null,c=u=!1,w===63&&(a=r.input.charCodeAt(r.position+1),fn(a)&&(c=u=!0,r.position++,_r(r,!0,e))),i=r.line,af(r,e,WI,!1,!0),p=r.tag,h=r.result,_r(r,!0,e),w=r.input.charCodeAt(r.position),(u||r.line===i)&&w===58&&(c=!0,w=r.input.charCodeAt(++r.position),_r(r,!0,e),af(r,e,WI,!1,!0),C=r.result),g?of(r,s,f,p,h,C):c?s.push(of(r,null,f,p,h,C)):s.push(h),_r(r,!0,e),w=r.input.charCodeAt(r.position),w===44?(t=!0,w=r.input.charCodeAt(++r.position)):t=!1}gt(r,"unexpected end of the stream within a flow collection")}function nde(r,e){var t,i,n=vv,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)vv===n?n=g===43?z2:qpe:gt(r,"repeat of a chomping mode identifier");else if((u=_pe(g))>=0)u===0?gt(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?gt(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Ec(g)){do g=r.input.charCodeAt(++r.position);while(Ec(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!So(g)&&g!==0)}for(;g!==0;){for(xv(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),So(g)){l++;continue}if(r.lineIndente)&&l!==0)gt(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(af(r,e,zI,!0,n)&&(p?f=r.result:h=r.result),p||(of(r,c,u,g,f,h,s,o),g=f=h=null),_r(r,!0,-1),w=r.input.charCodeAt(r.position)),r.lineIndent>e&&w!==0)gt(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):gt(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):gt(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function lde(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(_r(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&>(r,"directive name must not be less than one character in length");o!==0;){for(;Ec(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!So(o));break}if(So(o))break;for(t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&xv(r),NA.call(_2,i)?_2[i](r,i,n):VI(r,'unknown document directive "'+i+'"')}if(_r(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,_r(r,!0,-1)):s&>(r,"directives end mark is expected"),af(r,r.lineIndent-1,zI,!1,!0),_r(r,!0,-1),r.checkLineBreaks&&Wpe.test(r.input.slice(e,r.position))&&VI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&XI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,_r(r,!0,-1));return}if(r.position"u"&&(t=e,e=null);var i=lH(r,t);if(typeof e!="function")return i;for(var n=0,s=i.length;n"u"&&(t=e,e=null),cH(r,e,Qa.extend({schema:tH},t))}function ude(r,e){return uH(r,Qa.extend({schema:tH},e))}Id.exports.loadAll=cH;Id.exports.load=uH;Id.exports.safeLoadAll=cde;Id.exports.safeLoad=ude});var TH=y((h$e,Fv)=>{"use strict";var wd=pc(),Bd=tf(),gde=Ed(),fde=nf(),IH=Object.prototype.toString,yH=Object.prototype.hasOwnProperty,hde=9,yd=10,pde=13,dde=32,Cde=33,mde=34,wH=35,Ede=37,Ide=38,yde=39,wde=42,BH=44,Bde=45,bH=58,bde=61,Qde=62,Sde=63,vde=64,QH=91,SH=93,xde=96,vH=123,Pde=124,xH=125,Ti={};Ti[0]="\\0";Ti[7]="\\a";Ti[8]="\\b";Ti[9]="\\t";Ti[10]="\\n";Ti[11]="\\v";Ti[12]="\\f";Ti[13]="\\r";Ti[27]="\\e";Ti[34]='\\"';Ti[92]="\\\\";Ti[133]="\\N";Ti[160]="\\_";Ti[8232]="\\L";Ti[8233]="\\P";var Dde=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function kde(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&pH(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Af(o))return _I;a=s>0?r.charCodeAt(s-1):null,f=f&&pH(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?DH:kH:t>9&&PH(r)?_I:c?FH:RH}function Ode(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&Dde.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Fde(r,l)}switch(Lde(e,o,r.indent,s,a)){case DH:return e;case kH:return"'"+e.replace(/'/g,"''")+"'";case RH:return"|"+dH(e,r.indent)+CH(hH(e,n));case FH:return">"+dH(e,r.indent)+CH(hH(Mde(e,s),n));case _I:return'"'+Ude(e,s)+'"';default:throw new Bd("impossible error: invalid scalar style")}}()}function dH(r,e){var t=PH(r)?String(e):"",i=r[r.length-1]===` -`,n=i&&(r[r.length-2]===` -`||r===` -`),s=n?"+":i?"":"-";return t+s+` -`}function CH(r){return r[r.length-1]===` -`?r.slice(0,-1):r}function Mde(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` -`);return c=c!==-1?c:r.length,t.lastIndex=c,mH(r.slice(0,c),e)}(),n=r[0]===` -`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+mH(l,e),n=s}return i}function mH(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+r.slice(n,s),n=s+1),o=a;return l+=` -`,r.length-n>e&&o>n?l+=r.slice(n,o)+` -`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Ude(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=fH((t-55296)*1024+i-56320+65536),s++;continue}n=Ti[t],e+=!n&&Af(t)?r[s]:n||fH(t)}return e}function Kde(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),Ic(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function Yde(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new Bd("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&yd===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=Dv(r,e)),Ic(r,e+1,u,!0,g)&&(r.dump&&yd===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function EH(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function Ic(r,e,t,i,n,s){r.tag=null,r.dump=t,EH(r,t,!1)||EH(r,t,!0);var o=IH.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(Yde(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(Gde(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(Hde(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(Kde(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&Ode(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new Bd("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function jde(r,e){var t=[],i=[],n,s;for(kv(r,t,i),n=0,s=i.length;n{"use strict";var ZI=gH(),LH=TH();function $I(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Tr.exports.Type=Ai();Tr.exports.Schema=dc();Tr.exports.FAILSAFE_SCHEMA=qI();Tr.exports.JSON_SCHEMA=bv();Tr.exports.CORE_SCHEMA=Qv();Tr.exports.DEFAULT_SAFE_SCHEMA=nf();Tr.exports.DEFAULT_FULL_SCHEMA=Ed();Tr.exports.load=ZI.load;Tr.exports.loadAll=ZI.loadAll;Tr.exports.safeLoad=ZI.safeLoad;Tr.exports.safeLoadAll=ZI.safeLoadAll;Tr.exports.dump=LH.dump;Tr.exports.safeDump=LH.safeDump;Tr.exports.YAMLException=tf();Tr.exports.MINIMAL_SCHEMA=qI();Tr.exports.SAFE_SCHEMA=nf();Tr.exports.DEFAULT_SCHEMA=Ed();Tr.exports.scan=$I("scan");Tr.exports.parse=$I("parse");Tr.exports.compose=$I("compose");Tr.exports.addConstructor=$I("addConstructor")});var UH=y((d$e,MH)=>{"use strict";var Jde=OH();MH.exports=Jde});var HH=y((C$e,KH)=>{"use strict";function Wde(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function yc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,yc)}Wde(yc,Error);yc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[Ne]:pe})))},H=function(R){return R},j=function(R){return R},$=Ms("correct indentation"),V=" ",W=ar(" ",!1),Z=function(R){return R.length===vA*Gg},A=function(R){return R.length===(vA+1)*Gg},ae=function(){return vA++,!0},ge=function(){return vA--,!0},_=function(){return Lg()},L=Ms("pseudostring"),N=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,ue=Fn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),we=/^[^\r\n\t ,\][{}:#"']/,Te=Fn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Pe=function(){return Lg().replace(/^ *| *$/g,"")},Le="--",se=ar("--",!1),Ae=/^[a-zA-Z\/0-9]/,be=Fn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),fe=/^[^\r\n\t :,]/,le=Fn(["\r",` -`," "," ",":",","],!0,!1),Ge="null",ie=ar("null",!1),Y=function(){return null},he="true",re=ar("true",!1),me=function(){return!0},tt="false",Rt=ar("false",!1),It=function(){return!1},Ur=Ms("string"),oi='"',pi=ar('"',!1),pr=function(){return""},di=function(R){return R},ai=function(R){return R.join("")},Os=/^[^"\\\0-\x1F\x7F]/,dr=Fn(['"',"\\",["\0",""],"\x7F"],!0,!1),Bi='\\"',_n=ar('\\"',!1),pa=function(){return'"'},EA="\\\\",kg=ar("\\\\",!1),Zn=function(){return"\\"},IA="\\/",da=ar("\\/",!1),Jp=function(){return"/"},yA="\\b",wA=ar("\\b",!1),Br=function(){return"\b"},Vl="\\f",Rg=ar("\\f",!1),Eo=function(){return"\f"},Fg="\\n",Wp=ar("\\n",!1),zp=function(){return` -`},Pr="\\r",oe=ar("\\r",!1),Io=function(){return"\r"},kn="\\t",Ng=ar("\\t",!1),bt=function(){return" "},Xl="\\u",Rn=ar("\\u",!1),$n=function(R,q,pe,Ne){return String.fromCharCode(parseInt(`0x${R}${q}${pe}${Ne}`))},es=/^[0-9a-fA-F]/,ut=Fn([["0","9"],["a","f"],["A","F"]],!1,!1),yo=Ms("blank space"),at=/^[ \t]/,ln=Fn([" "," "],!1,!1),S=Ms("white space"),Lt=/^[ \t\n\r]/,Tg=Fn([" "," ",` -`,"\r"],!1,!1),_l=`\r -`,Vp=ar(`\r -`,!1),Xp=` -`,_p=ar(` -`,!1),Zp="\r",$p=ar("\r",!1),G=0,yt=0,BA=[{line:1,column:1}],Wi=0,Zl=[],We=0,Ca;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Lg(){return r.substring(yt,G)}function uI(){return cn(yt,G)}function ed(R,q){throw q=q!==void 0?q:cn(yt,G),ec([Ms(R)],r.substring(yt,G),q)}function gI(R,q){throw q=q!==void 0?q:cn(yt,G),Og(R,q)}function ar(R,q){return{type:"literal",text:R,ignoreCase:q}}function Fn(R,q,pe){return{type:"class",parts:R,inverted:q,ignoreCase:pe}}function $l(){return{type:"any"}}function td(){return{type:"end"}}function Ms(R){return{type:"other",description:R}}function ma(R){var q=BA[R],pe;if(q)return q;for(pe=R-1;!BA[pe];)pe--;for(q=BA[pe],q={line:q.line,column:q.column};peWi&&(Wi=G,Zl=[]),Zl.push(R))}function Og(R,q){return new yc(R,null,null,q)}function ec(R,q,pe){return new yc(yc.buildMessage(R,q),R,q,pe)}function Us(){var R;return R=Mg(),R}function tc(){var R,q,pe;for(R=G,q=[],pe=bA();pe!==t;)q.push(pe),pe=bA();return q!==t&&(yt=R,q=s(q)),R=q,R}function bA(){var R,q,pe,Ne,xe;return R=G,q=Ia(),q!==t?(r.charCodeAt(G)===45?(pe=o,G++):(pe=t,We===0&&ke(a)),pe!==t?(Ne=Nr(),Ne!==t?(xe=Ea(),xe!==t?(yt=R,q=l(xe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function Mg(){var R,q,pe;for(R=G,q=[],pe=Ug();pe!==t;)q.push(pe),pe=Ug();return q!==t&&(yt=R,q=c(q)),R=q,R}function Ug(){var R,q,pe,Ne,xe,qe,dt,Ft,Nn;if(R=G,q=Nr(),q===t&&(q=null),q!==t){if(pe=G,r.charCodeAt(G)===35?(Ne=u,G++):(Ne=t,We===0&&ke(g)),Ne!==t){if(xe=[],qe=G,dt=G,We++,Ft=Gs(),We--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,We===0&&ke(f)),Ft!==t?(dt=[dt,Ft],qe=dt):(G=qe,qe=t)):(G=qe,qe=t),qe!==t)for(;qe!==t;)xe.push(qe),qe=G,dt=G,We++,Ft=Gs(),We--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,We===0&&ke(f)),Ft!==t?(dt=[dt,Ft],qe=dt):(G=qe,qe=t)):(G=qe,qe=t);else xe=t;xe!==t?(Ne=[Ne,xe],pe=Ne):(G=pe,pe=t)}else G=pe,pe=t;if(pe===t&&(pe=null),pe!==t){if(Ne=[],xe=Hs(),xe!==t)for(;xe!==t;)Ne.push(xe),xe=Hs();else Ne=t;Ne!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=Ia(),q!==t?(pe=rc(),pe!==t?(Ne=Nr(),Ne===t&&(Ne=null),Ne!==t?(r.charCodeAt(G)===58?(xe=p,G++):(xe=t,We===0&&ke(C)),xe!==t?(qe=Nr(),qe===t&&(qe=null),qe!==t?(dt=Ea(),dt!==t?(yt=R,q=w(pe,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Ia(),q!==t?(pe=Ks(),pe!==t?(Ne=Nr(),Ne===t&&(Ne=null),Ne!==t?(r.charCodeAt(G)===58?(xe=p,G++):(xe=t,We===0&&ke(C)),xe!==t?(qe=Nr(),qe===t&&(qe=null),qe!==t?(dt=Ea(),dt!==t?(yt=R,q=w(pe,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=Ia(),q!==t)if(pe=Ks(),pe!==t)if(Ne=Nr(),Ne!==t)if(xe=fI(),xe!==t){if(qe=[],dt=Hs(),dt!==t)for(;dt!==t;)qe.push(dt),dt=Hs();else qe=t;qe!==t?(yt=R,q=w(pe,xe),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=Ia(),q!==t)if(pe=Ks(),pe!==t){if(Ne=[],xe=G,qe=Nr(),qe===t&&(qe=null),qe!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,We===0&&ke(v)),dt!==t?(Ft=Nr(),Ft===t&&(Ft=null),Ft!==t?(Nn=Ks(),Nn!==t?(yt=xe,qe=D(pe,Nn),xe=qe):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t),xe!==t)for(;xe!==t;)Ne.push(xe),xe=G,qe=Nr(),qe===t&&(qe=null),qe!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,We===0&&ke(v)),dt!==t?(Ft=Nr(),Ft===t&&(Ft=null),Ft!==t?(Nn=Ks(),Nn!==t?(yt=xe,qe=D(pe,Nn),xe=qe):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t)):(G=xe,xe=t);else Ne=t;Ne!==t?(xe=Nr(),xe===t&&(xe=null),xe!==t?(r.charCodeAt(G)===58?(qe=p,G++):(qe=t,We===0&&ke(C)),qe!==t?(dt=Nr(),dt===t&&(dt=null),dt!==t?(Ft=Ea(),Ft!==t?(yt=R,q=T(pe,Ne,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function Ea(){var R,q,pe,Ne,xe,qe,dt;if(R=G,q=G,We++,pe=G,Ne=Gs(),Ne!==t?(xe=$e(),xe!==t?(r.charCodeAt(G)===45?(qe=o,G++):(qe=t,We===0&&ke(a)),qe!==t?(dt=Nr(),dt!==t?(Ne=[Ne,xe,qe,dt],pe=Ne):(G=pe,pe=t)):(G=pe,pe=t)):(G=pe,pe=t)):(G=pe,pe=t),We--,pe!==t?(G=q,q=void 0):q=t,q!==t?(pe=Hs(),pe!==t?(Ne=wo(),Ne!==t?(xe=tc(),xe!==t?(qe=QA(),qe!==t?(yt=R,q=H(xe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Gs(),q!==t?(pe=wo(),pe!==t?(Ne=Mg(),Ne!==t?(xe=QA(),xe!==t?(yt=R,q=H(Ne),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=ic(),q!==t){if(pe=[],Ne=Hs(),Ne!==t)for(;Ne!==t;)pe.push(Ne),Ne=Hs();else pe=t;pe!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function Ia(){var R,q,pe;for(We++,R=G,q=[],r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));pe!==t;)q.push(pe),r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));return q!==t?(yt=G,pe=Z(q),pe?pe=void 0:pe=t,pe!==t?(q=[q,pe],R=q):(G=R,R=t)):(G=R,R=t),We--,R===t&&(q=t,We===0&&ke($)),R}function $e(){var R,q,pe;for(R=G,q=[],r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));pe!==t;)q.push(pe),r.charCodeAt(G)===32?(pe=V,G++):(pe=t,We===0&&ke(W));return q!==t?(yt=G,pe=A(q),pe?pe=void 0:pe=t,pe!==t?(q=[q,pe],R=q):(G=R,R=t)):(G=R,R=t),R}function wo(){var R;return yt=G,R=ae(),R?R=void 0:R=t,R}function QA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function rc(){var R;return R=nc(),R===t&&(R=rd()),R}function Ks(){var R,q,pe;if(R=nc(),R===t){if(R=G,q=[],pe=Kg(),pe!==t)for(;pe!==t;)q.push(pe),pe=Kg();else q=t;q!==t&&(yt=R,q=_()),R=q}return R}function ic(){var R;return R=id(),R===t&&(R=hI(),R===t&&(R=nc(),R===t&&(R=rd()))),R}function fI(){var R;return R=id(),R===t&&(R=nc(),R===t&&(R=Kg())),R}function rd(){var R,q,pe,Ne,xe,qe;if(We++,R=G,N.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(ue)),q!==t){for(pe=[],Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(we.test(r.charAt(G))?(qe=r.charAt(G),G++):(qe=t,We===0&&ke(Te)),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);Ne!==t;)pe.push(Ne),Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(we.test(r.charAt(G))?(qe=r.charAt(G),G++):(qe=t,We===0&&ke(Te)),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);pe!==t?(yt=R,q=Pe(),R=q):(G=R,R=t)}else G=R,R=t;return We--,R===t&&(q=t,We===0&&ke(L)),R}function Kg(){var R,q,pe,Ne,xe;if(R=G,r.substr(G,2)===Le?(q=Le,G+=2):(q=t,We===0&&ke(se)),q===t&&(q=null),q!==t)if(Ae.test(r.charAt(G))?(pe=r.charAt(G),G++):(pe=t,We===0&&ke(be)),pe!==t){for(Ne=[],fe.test(r.charAt(G))?(xe=r.charAt(G),G++):(xe=t,We===0&&ke(le));xe!==t;)Ne.push(xe),fe.test(r.charAt(G))?(xe=r.charAt(G),G++):(xe=t,We===0&&ke(le));Ne!==t?(yt=R,q=Pe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function id(){var R,q;return R=G,r.substr(G,4)===Ge?(q=Ge,G+=4):(q=t,We===0&&ke(ie)),q!==t&&(yt=R,q=Y()),R=q,R}function hI(){var R,q;return R=G,r.substr(G,4)===he?(q=he,G+=4):(q=t,We===0&&ke(re)),q!==t&&(yt=R,q=me()),R=q,R===t&&(R=G,r.substr(G,5)===tt?(q=tt,G+=5):(q=t,We===0&&ke(Rt)),q!==t&&(yt=R,q=It()),R=q),R}function nc(){var R,q,pe,Ne;return We++,R=G,r.charCodeAt(G)===34?(q=oi,G++):(q=t,We===0&&ke(pi)),q!==t?(r.charCodeAt(G)===34?(pe=oi,G++):(pe=t,We===0&&ke(pi)),pe!==t?(yt=R,q=pr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=oi,G++):(q=t,We===0&&ke(pi)),q!==t?(pe=pI(),pe!==t?(r.charCodeAt(G)===34?(Ne=oi,G++):(Ne=t,We===0&&ke(pi)),Ne!==t?(yt=R,q=di(pe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),We--,R===t&&(q=t,We===0&&ke(Ur)),R}function pI(){var R,q,pe;if(R=G,q=[],pe=Hg(),pe!==t)for(;pe!==t;)q.push(pe),pe=Hg();else q=t;return q!==t&&(yt=R,q=ai(q)),R=q,R}function Hg(){var R,q,pe,Ne,xe,qe;return Os.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,We===0&&ke(dr)),R===t&&(R=G,r.substr(G,2)===Bi?(q=Bi,G+=2):(q=t,We===0&&ke(_n)),q!==t&&(yt=R,q=pa()),R=q,R===t&&(R=G,r.substr(G,2)===EA?(q=EA,G+=2):(q=t,We===0&&ke(kg)),q!==t&&(yt=R,q=Zn()),R=q,R===t&&(R=G,r.substr(G,2)===IA?(q=IA,G+=2):(q=t,We===0&&ke(da)),q!==t&&(yt=R,q=Jp()),R=q,R===t&&(R=G,r.substr(G,2)===yA?(q=yA,G+=2):(q=t,We===0&&ke(wA)),q!==t&&(yt=R,q=Br()),R=q,R===t&&(R=G,r.substr(G,2)===Vl?(q=Vl,G+=2):(q=t,We===0&&ke(Rg)),q!==t&&(yt=R,q=Eo()),R=q,R===t&&(R=G,r.substr(G,2)===Fg?(q=Fg,G+=2):(q=t,We===0&&ke(Wp)),q!==t&&(yt=R,q=zp()),R=q,R===t&&(R=G,r.substr(G,2)===Pr?(q=Pr,G+=2):(q=t,We===0&&ke(oe)),q!==t&&(yt=R,q=Io()),R=q,R===t&&(R=G,r.substr(G,2)===kn?(q=kn,G+=2):(q=t,We===0&&ke(Ng)),q!==t&&(yt=R,q=bt()),R=q,R===t&&(R=G,r.substr(G,2)===Xl?(q=Xl,G+=2):(q=t,We===0&&ke(Rn)),q!==t?(pe=SA(),pe!==t?(Ne=SA(),Ne!==t?(xe=SA(),xe!==t?(qe=SA(),qe!==t?(yt=R,q=$n(pe,Ne,xe,qe),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function SA(){var R;return es.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,We===0&&ke(ut)),R}function Nr(){var R,q;if(We++,R=[],at.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(ln)),q!==t)for(;q!==t;)R.push(q),at.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(ln));else R=t;return We--,R===t&&(q=t,We===0&&ke(yo)),R}function dI(){var R,q;if(We++,R=[],Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(Tg)),q!==t)for(;q!==t;)R.push(q),Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,We===0&&ke(Tg));else R=t;return We--,R===t&&(q=t,We===0&&ke(S)),R}function Hs(){var R,q,pe,Ne,xe,qe;if(R=G,q=Gs(),q!==t){for(pe=[],Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(qe=Gs(),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);Ne!==t;)pe.push(Ne),Ne=G,xe=Nr(),xe===t&&(xe=null),xe!==t?(qe=Gs(),qe!==t?(xe=[xe,qe],Ne=xe):(G=Ne,Ne=t)):(G=Ne,Ne=t);pe!==t?(q=[q,pe],R=q):(G=R,R=t)}else G=R,R=t;return R}function Gs(){var R;return r.substr(G,2)===_l?(R=_l,G+=2):(R=t,We===0&&ke(Vp)),R===t&&(r.charCodeAt(G)===10?(R=Xp,G++):(R=t,We===0&&ke(_p)),R===t&&(r.charCodeAt(G)===13?(R=Zp,G++):(R=t,We===0&&ke($p)))),R}let Gg=2,vA=0;if(Ca=n(),Ca!==t&&G===r.length)return Ca;throw Ca!==t&&G{"use strict";var $de=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=$de(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};Tv.exports=JH;Tv.exports.default=JH});var zH=y((B$e,eCe)=>{eCe.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var wc=y(Mn=>{"use strict";var XH=zH(),vo=process.env;Object.defineProperty(Mn,"_vendors",{value:XH.map(function(r){return r.constant})});Mn.name=null;Mn.isPR=null;XH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return VH(i)});if(Mn[r.constant]=t,t)switch(Mn.name=r.name,typeof r.pr){case"string":Mn.isPR=!!vo[r.pr];break;case"object":"env"in r.pr?Mn.isPR=r.pr.env in vo&&vo[r.pr.env]!==r.pr.ne:"any"in r.pr?Mn.isPR=r.pr.any.some(function(i){return!!vo[i]}):Mn.isPR=VH(r.pr);break;default:Mn.isPR=null}});Mn.isCI=!!(vo.CI||vo.CONTINUOUS_INTEGRATION||vo.BUILD_NUMBER||vo.RUN_ID||Mn.name);function VH(r){return typeof r=="string"?!!vo[r]:Object.keys(r).every(function(e){return vo[e]===r[e]})}});var ry=y(Un=>{"use strict";Object.defineProperty(Un,"__esModule",{value:!0});var tCe=0,rCe=1,iCe=2,nCe="",sCe="\0",oCe=-1,aCe=/^(-h|--help)(?:=([0-9]+))?$/,ACe=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,lCe=/^-[a-zA-Z]{2,}$/,cCe=/^([^=]+)=([\s\S]*)$/,uCe=process.env.DEBUG_CLI==="1";Un.BATCH_REGEX=lCe;Un.BINDING_REGEX=cCe;Un.DEBUG=uCe;Un.END_OF_INPUT=sCe;Un.HELP_COMMAND_INDEX=oCe;Un.HELP_REGEX=aCe;Un.NODE_ERRORED=iCe;Un.NODE_INITIAL=tCe;Un.NODE_SUCCESS=rCe;Un.OPTION_REGEX=ACe;Un.START_OF_INPUT=nCe});var iy=y(Qd=>{"use strict";Object.defineProperty(Qd,"__esModule",{value:!0});var gCe=ry(),Lv=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},Ov=class extends Error{constructor(e,t){if(super(),this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${Uv(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${Uv(e)}`}},Mv=class extends Error{constructor(e,t){super(),this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${Uv(e)}`}},Uv=r=>`While running ${r.filter(e=>e!==gCe.END_OF_INPUT).map(e=>{let t=JSON.stringify(e);return e.match(/\s/)||e.length===0||t!==`"${e}"`?t:e}).join(" ")}`;Qd.AmbiguousSyntaxError=Mv;Qd.UnknownSyntaxError=Ov;Qd.UsageError=Lv});var va=y(TA=>{"use strict";Object.defineProperty(TA,"__esModule",{value:!0});var _H=iy(),ZH=Symbol("clipanion/isOption");function fCe(r){return{...r,[ZH]:!0}}function hCe(r,e){return typeof r>"u"?[r,e]:typeof r=="object"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function Kv(r,e=!1){let t=r.replace(/^\.: /,"");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function $H(r,e){return e.length===1?new _H.UsageError(`${r}: ${Kv(e[0],!0)}`):new _H.UsageError(`${r}: -${e.map(t=>` -- ${Kv(t)}`).join("")}`)}function pCe(r,e,t){if(typeof t>"u")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw $H(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}TA.applyValidator=pCe;TA.cleanValidationError=Kv;TA.formatError=$H;TA.isOptionSymbol=ZH;TA.makeCommandOption=fCe;TA.rerouteArguments=hCe});var ns=y(st=>{"use strict";Object.defineProperty(st,"__esModule",{value:!0});var eG=/^[a-zA-Z_][a-zA-Z0-9_]*$/,tG=/^#[0-9a-f]{6}$/i,rG=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,iG=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,nG=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,Hv=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,sG=r=>()=>r;function Qt({test:r}){return sG(r)()}function Zr(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function LA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:eG.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function Bc(r,e){return t=>{let i=r[e];return r[e]=t,Bc(r,e).bind(null,i)}}function oG(r,e){return t=>{r[e]=t}}function ny(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}var aG=()=>Qt({test:(r,e)=>!0});function dCe(r){return Qt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Zr(r)})`):!0})}var CCe=()=>Qt({test:(r,e)=>typeof r!="string"?pt(e,`Expected a string (got ${Zr(r)})`):!0});function mCe(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return Qt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Zr(i)})`)})}var ECe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),ICe=()=>Qt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i=ECe.get(r);if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Zr(r)})`)}return!0}}),yCe=()=>Qt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch{}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Zr(r)})`)}return!0}}),wCe=()=>Qt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"&&Hv.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch{}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n<"u")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Zr(r)})`)}return!0}}),BCe=(r,{delimiter:e}={})=>Qt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e<"u"&&typeof(i==null?void 0:i.coercions)<"u"){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Zr(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=AG(r.length);return Qt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e<"u"&&typeof(n==null?void 0:n.coercions)<"u"){if(typeof(n==null?void 0:n.coercion)>"u")return pt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Zr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;aQt({test:(t,i)=>{if(typeof t!="object"||t===null)return pt(i,`Expected an object (got ${Zr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return Qt({test:(i,n)=>{if(typeof i!="object"||i===null)return pt(n,`Expected an object (got ${Zr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=pt(Object.assign(Object.assign({},n),{p:LA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<"u"?a=c(u,Object.assign(Object.assign({},n),{p:LA(n,l),coercion:Bc(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:LA(n,l)}),`Extraneous property (got ${Zr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:oG(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},vCe=r=>Qt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Zr(e)})`)}),xCe=(r,{exclusive:e=!1}={})=>Qt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<"u"?[]:void 0;for(let c=0,u=r.length;c1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),PCe=(r,e)=>Qt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<"u"?Bc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)<"u"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<"u")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<"u"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),DCe=r=>Qt({test:(e,t)=>typeof e>"u"?!0:r(e,t)}),kCe=r=>Qt({test:(e,t)=>e===null?!0:r(e,t)}),RCe=r=>Qt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),FCe=r=>Qt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),AG=r=>Qt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),NCe=({map:r}={})=>Qt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sQt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),LCe=()=>Qt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),OCe=r=>Qt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),MCe=r=>Qt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),UCe=(r,e)=>Qt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),KCe=(r,e)=>Qt({test:(t,i)=>t>=r&&tQt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),GCe=r=>Qt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Zr(e)})`)}),YCe=()=>Qt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),jCe=()=>Qt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),qCe=()=>Qt({test:(r,e)=>nG.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Zr(r)})`)}),JCe=()=>Qt({test:(r,e)=>Hv.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Zr(r)})`)}),WCe=({alpha:r=!1})=>Qt({test:(e,t)=>(r?tG.test(e):rG.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Zr(e)})`)}),zCe=()=>Qt({test:(r,e)=>iG.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Zr(r)})`)}),VCe=(r=aG())=>Qt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Zr(e)})`)}return r(i,t)}}),XCe=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${ny(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},_Ce=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${ny(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},ZCe=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(st.KeyRelationship||(st.KeyRelationship={}));var $Ce={[st.KeyRelationship.Forbids]:{expect:!1,message:"forbids using"},[st.KeyRelationship.Requires]:{expect:!0,message:"requires using"}},eme=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=$Ce[e];return Qt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property "${r}" ${o.message} ${ny(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})};st.applyCascade=PCe;st.base64RegExp=iG;st.colorStringAlphaRegExp=rG;st.colorStringRegExp=tG;st.computeKey=LA;st.getPrintable=Zr;st.hasExactLength=AG;st.hasForbiddenKeys=_Ce;st.hasKeyRelationship=eme;st.hasMaxLength=FCe;st.hasMinLength=RCe;st.hasMutuallyExclusiveKeys=ZCe;st.hasRequiredKeys=XCe;st.hasUniqueItems=NCe;st.isArray=BCe;st.isAtLeast=OCe;st.isAtMost=MCe;st.isBase64=zCe;st.isBoolean=ICe;st.isDate=wCe;st.isDict=QCe;st.isEnum=mCe;st.isHexColor=WCe;st.isISO8601=JCe;st.isInExclusiveRange=KCe;st.isInInclusiveRange=UCe;st.isInstanceOf=vCe;st.isInteger=HCe;st.isJSON=VCe;st.isLiteral=dCe;st.isLowerCase=YCe;st.isNegative=TCe;st.isNullable=kCe;st.isNumber=yCe;st.isObject=SCe;st.isOneOf=xCe;st.isOptional=DCe;st.isPositive=LCe;st.isString=CCe;st.isTuple=bCe;st.isUUID4=qCe;st.isUnknown=aG;st.isUpperCase=jCe;st.iso8601RegExp=Hv;st.makeCoercionFn=Bc;st.makeSetter=oG;st.makeTrait=sG;st.makeValidator=Qt;st.matchesRegExp=GCe;st.plural=ny;st.pushError=pt;st.simpleKeyRegExp=eG;st.uuid4RegExp=nG});var bc=y(Gv=>{"use strict";Object.defineProperty(Gv,"__esModule",{value:!0});var lG=va();function tme(r){if(r&&r.__esModule)return r;var e=Object.create(null);return r&&Object.keys(r).forEach(function(t){if(t!=="default"){var i=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:function(){return r[t]}})}}),e.default=r,Object.freeze(e)}var Sd=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(function(){return tme(ns())}),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw lG.formatError("Invalid option schema",l);for(let[,g]of c)g()}else if(t!=null)throw new Error("Invalid command schema");let i=await this.execute();return typeof i<"u"?i:0}};Sd.isOption=lG.isOptionSymbol;Sd.Default=[];Gv.Command=Sd});var jv=y(vd=>{"use strict";Object.defineProperty(vd,"__esModule",{value:!0});var cG=80,Yv=Array(cG).fill("\u2501");for(let r=0;r<=24;++r)Yv[Yv.length-r]=`\x1B[38;5;${232+r}m\u2501`;var rme={header:r=>`\x1B[1m\u2501\u2501\u2501 ${r}${r.length`\x1B[1m${r}\x1B[22m`,error:r=>`\x1B[31m\x1B[1m${r}\x1B[22m\x1B[39m`,code:r=>`\x1B[36m${r}\x1B[39m`},ime={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function nme(r){let e=r.split(` -`),t=e.filter(n=>n.match(/\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function sme(r,{format:e,paragraphs:t}){return r=r.replace(/\r\n?/g,` -`),r=nme(r),r=r.replace(/^\n+|\n+$/g,""),r=r.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),r=r.replace(/\n(\n)?\n*/g,"$1"),t&&(r=r.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),r=r.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r} -`:""}vd.formatMarkdownish=sme;vd.richFormat=rme;vd.textFormat=ime});var ly=y(Ar=>{"use strict";Object.defineProperty(Ar,"__esModule",{value:!0});var lt=ry(),ay=iy();function Vi(r){lt.DEBUG&&console.log(r)}var uG={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:lt.HELP_COMMAND_INDEX};function qv(){return{nodes:[Li(),Li(),Li()]}}function gG(r){let e=qv(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(lt.NODE_INITIAL)}function hG(r,{prefix:e=""}={}){if(lt.DEBUG){Vi(`${e}Nodes are:`);for(let t=0;tl!==lt.NODE_ERRORED).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===lt.NODE_ERRORED))throw new ay.UnknownSyntaxError(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=pG(a)}if(i.length>0){Vi(" Results:");for(let s of i)Vi(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else Vi(" No results");return i}function ome(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,lt.END_OF_INPUT)){for(let{to:t}of r.statics[lt.END_OF_INPUT])if(t===lt.NODE_SUCCESS)return!0}return!1}function ame(r,e,t){let i=t&&e.length>0?[""]:[],n=Jv(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let C=r.nodes[p],w=Object.keys(C.statics);for(let B of Object.keys(C.statics)){let v=w[0];for(let{to:D,reducer:T}of C.statics[v])T==="pushPath"&&(u||l.push(v),g.push(D))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=ome(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==lt.END_OF_INPUT||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===lt.NODE_ERRORED)continue;let p=IG(f,c);if(p!==null)for(let C of p)a([...i,C],l)}}return[...s].sort()}function Ame(r,e){let t=Jv(r,[...e,lt.END_OF_INPUT]);return dG(e,t.map(({state:i})=>i))}function pG(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function dG(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new ay.UnknownSyntaxError(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=CG(c);if(u.length>1)throw new ay.AmbiguousSyntaxError(r,u.map(g=>g.candidateUsage));return u[0]}function CG(r){let e=[],t=[];for(let i of r)i.selectedIndex===lt.HELP_COMMAND_INDEX?t.push(i):e.push(i);return t.length>0&&e.push({...uG,path:mG(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])}),e}function mG(r,e,...t){return e===void 0?Array.from(r):mG(r.filter((i,n)=>i===e[n]),...t)}function Li(){return{dynamics:[],shortcuts:[],statics:{}}}function Wv(r){return r===lt.NODE_SUCCESS||r===lt.NODE_ERRORED}function sy(r,e=0){return{to:Wv(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function EG(r,e=0){let t=Li();for(let[i,n]of r.dynamics)t.dynamics.push([i,sy(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(sy(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>sy(s,e));return t}function Ei(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function Qc(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function xo(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function xd(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function IG(r,e){let t=Array.isArray(r)?Pd[r[0]]:Pd[r];if(typeof t.suggest>"u")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var Pd={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(r,e)=>r.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&<.BATCH_REGEX.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(lt.BINDING_REGEX);return!r.ignoreOptions&&!!n&<.OPTION_REGEX.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&<.HELP_REGEX.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith("-")&<.OPTION_REGEX.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith("-")&&!lt.OPTION_REGEX.test(e)};Pd.isOption.suggest=(r,e,t=!0)=>t?null:[e];var oy={setCandidateState:(r,e,t)=>({...r,...t}),setSelectedIndex:(r,e,t)=>({...r,selectedIndex:t}),pushBatch:(r,e)=>({...r,options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(lt.BINDING_REGEX);return{...r,options:r.options.concat({name:t,value:i})}},pushPath:(r,e)=>({...r,path:r.path.concat(e)}),pushPositional:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:Po})}),pushTrue:(r,e,t=e)=>({...r,options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>({...r,options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>({...r,options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i={...r,options:[...r.options]},n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t={...r,options:[...r.options]},i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>({...r,ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(lt.HELP_REGEX);return typeof i<"u"?{...r,options:[{name:"-c",value:String(t)},{name:"-i",value:i}]}:{...r,options:[{name:"-c",value:String(t)}]}},setError:(r,e,t)=>e===lt.END_OF_INPUT?{...r,errorMessage:`${t}.`}:{...r,errorMessage:`${t} ("${e}").`},setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return{...r,errorMessage:`Not enough arguments to option ${t.name}.`}}},Po=Symbol(),Ay=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===Po)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!t&&this.arity.extra!==Po?this.arity.extra.push(e):this.arity.extra!==Po&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===Po)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Po?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=qv(),t=lt.NODE_INITIAL,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=ss(e,Li()),xo(e,lt.NODE_INITIAL,lt.START_OF_INPUT,t,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=ss(e,Li());Qc(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=ss(e,Li());Ei(e,l,"isHelp",f,["useHelp",this.cliIndex]),xo(e,f,lt.END_OF_INPUT,lt.NODE_SUCCESS,["setSelectedIndex",lt.HELP_COMMAND_INDEX]),this.registerOptions(e,l)}this.arity.leading.length>0&&xo(e,l,lt.END_OF_INPUT,lt.NODE_ERRORED,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&xo(e,h,lt.END_OF_INPUT,lt.NODE_ERRORED,["setError","Not enough positional arguments"]),Ei(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Po||this.arity.extra.length>0){let f=ss(e,Li());if(Qc(e,c,f),this.arity.extra===Po){let h=ss(e,Li());this.arity.proxy||this.registerOptions(e,h),Ei(e,c,s,h,"pushExtraNoLimits"),Ei(e,h,s,h,"pushExtraNoLimits"),Qc(e,h,f)}else for(let h=0;h0&&xo(e,u,lt.END_OF_INPUT,lt.NODE_ERRORED,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)Ei(e,t,["isOption",s,i.hidden||s!==n],t,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&Ei(e,t,["isNegatedOption",s],t,["pushFalse",s]);else{let s=ss(e,Li());for(let o of i.names)Ei(e,t,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eAme(i,n),suggest:(n,s)=>ame(i,n,s)}}};Ar.CliBuilder=Dd;Ar.CommandBuilder=Ay;Ar.NoLimits=Po;Ar.aggregateHelpStates=CG;Ar.cloneNode=EG;Ar.cloneTransition=sy;Ar.debug=Vi;Ar.debugMachine=hG;Ar.execute=xd;Ar.injectNode=ss;Ar.isTerminalNode=Wv;Ar.makeAnyOfMachine=gG;Ar.makeNode=Li;Ar.makeStateMachine=qv;Ar.reducers=oy;Ar.registerDynamic=Ei;Ar.registerShortcut=Qc;Ar.registerStatic=xo;Ar.runMachineInternal=Jv;Ar.selectBestState=dG;Ar.simplifyMachine=fG;Ar.suggest=IG;Ar.tests=Pd;Ar.trimSmallerBranches=pG});var yG=y(zv=>{"use strict";Object.defineProperty(zv,"__esModule",{value:!0});var lme=bc(),kd=class extends lme.Command{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,t){let i=new kd(t);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};zv.HelpCommand=kd});var vG=y(Vv=>{"use strict";Object.defineProperty(Vv,"__esModule",{value:!0});var cme=ry(),wG=bc(),ume=J("tty"),gme=ly(),hn=jv(),fme=yG();function hme(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var BG=hme(ume),bG=Symbol("clipanion/errorCommand");function pme(){return process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}var OA=class{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new gme.CliBuilder({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new OA(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[wG.Command.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a<"u")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case cme.HELP_COMMAND_INDEX:return fme.HelpCommand.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[bG]=a,l}}break}}async run(e,t){var i;let n,s={...OA.defaultContext,...t},o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,{...s,...u}),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?dme(s):SG,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage>"u")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category<"u"?hn.formatMarkdownish(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description<"u"?hn.formatMarkdownish(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details<"u"?hn.formatMarkdownish(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples<"u"?i.usage.examples.map(([f,h])=>[hn.formatMarkdownish(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage<"u";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof wG.Command?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=hn.formatMarkdownish(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(t).header("Usage")} -`,a+=` -`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g} -`,f.length>0){a+=` -`,a+=`${hn.richFormat.header("Options")} -`;let h=f.reduce((p,C)=>Math.max(p,C.definition.length),0);a+=` -`;for(let{definition:p,description:C}of f)a+=` ${this.format(t).bold(p.padEnd(h))} ${hn.formatMarkdownish(C,{format:this.format(t),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(t).header("Details")} -`,a+=` -`,a+=hn.formatMarkdownish(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(t).header("Examples")} -`;for(let[h,p]of u)a+=` -`,a+=hn.formatMarkdownish(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(t).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l} -`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage>"u")continue;let p=typeof f.usage.category<"u"?hn.formatMarkdownish(f.usage.category,{format:this.format(t),paragraphs:!1}):null,C=l.get(p);typeof C>"u"&&l.set(p,C=[]);let{usage:w}=this.getUsageByIndex(h);C.push({commandClass:f,usage:w})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel<"u",g=typeof this.binaryVersion<"u";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)} -`:a+=`${this.format(t).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(t).bold(n)}${this.binaryName} -`):a+=`${this.format(t).bold(n)}${this.binaryName} -`;for(let f of c){let h=l.get(f).slice().sort((C,w)=>C.usage.localeCompare(w.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` -`,a+=`${this.format(t).header(`${p}`)} -`;for(let{commandClass:C,usage:w}of h){let B=C.usage.description||"undocumented";a+=` -`,a+=` ${this.format(t).bold(w)} -`,a+=` ${hn.formatMarkdownish(B,{format:this.format(t),paragraphs:!1})}`}}a+=` -`,a+=hn.formatMarkdownish("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[bG])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l<"u"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:OA.defaultContext.colorDepth>1)?hn.richFormat:hn.textFormat}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};OA.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:"getColorDepth"in BG.default.WriteStream.prototype?BG.default.WriteStream.prototype.getColorDepth():pme()};var QG;function dme(r){let e=QG;if(typeof e>"u"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return SG;let{AsyncLocalStorage:t}=J("async_hooks");e=QG=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l>"u"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l>"u"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function SG(r){return r()}Vv.Cli=OA});var xG=y(Xv=>{"use strict";Object.defineProperty(Xv,"__esModule",{value:!0});var Cme=bc(),cy=class extends Cme.Command{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};cy.paths=[["--clipanion=definitions"]];Xv.DefinitionsCommand=cy});var PG=y(_v=>{"use strict";Object.defineProperty(_v,"__esModule",{value:!0});var mme=bc(),uy=class extends mme.Command{async execute(){this.context.stdout.write(this.cli.usage())}};uy.paths=[["-h"],["--help"]];_v.HelpCommand=uy});var DG=y(Zv=>{"use strict";Object.defineProperty(Zv,"__esModule",{value:!0});var Eme=bc(),gy=class extends Eme.Command{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};gy.paths=[["-v"],["--version"]];Zv.VersionCommand=gy});var kG=y(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});var Ime=xG(),yme=PG(),wme=DG();Rd.DefinitionsCommand=Ime.DefinitionsCommand;Rd.HelpCommand=yme.HelpCommand;Rd.VersionCommand=wme.VersionCommand});var FG=y($v=>{"use strict";Object.defineProperty($v,"__esModule",{value:!0});var RG=va();function Bme(r,e,t){let[i,n]=RG.rerouteArguments(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return RG.makeCommandOption({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i<"u"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}$v.Array=Bme});var TG=y(ex=>{"use strict";Object.defineProperty(ex,"__esModule",{value:!0});var NG=va();function bme(r,e,t){let[i,n]=NG.rerouteArguments(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return NG.makeCommandOption({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}ex.Boolean=bme});var OG=y(tx=>{"use strict";Object.defineProperty(tx,"__esModule",{value:!0});var LG=va();function Qme(r,e,t){let[i,n]=LG.rerouteArguments(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return LG.makeCommandOption({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}tx.Counter=Qme});var MG=y(rx=>{"use strict";Object.defineProperty(rx,"__esModule",{value:!0});var Sme=va();function vme(r={}){return Sme.makeCommandOption({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}rx.Proxy=vme});var UG=y(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var xme=va(),Pme=ly();function Dme(r={}){return xme.makeCommandOption({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Pme.NoLimits||a.extra===!1&&oo)}})}ix.Rest=Dme});var KG=y(nx=>{"use strict";Object.defineProperty(nx,"__esModule",{value:!0});var Fd=va(),kme=ly();function Rme(r,e,t){let[i,n]=Fd.rerouteArguments(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return Fd.makeCommandOption({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?Fd.applyValidator(g!=null?g:c,f,n.validator):f}})}function Fme(r={}){let{required:e=!0}=r;return Fd.makeCommandOption({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;o{"use strict";Object.defineProperty(pn,"__esModule",{value:!0});var lf=va(),Tme=FG(),Lme=TG(),Ome=OG(),Mme=MG(),Ume=UG(),Kme=KG();pn.applyValidator=lf.applyValidator;pn.cleanValidationError=lf.cleanValidationError;pn.formatError=lf.formatError;pn.isOptionSymbol=lf.isOptionSymbol;pn.makeCommandOption=lf.makeCommandOption;pn.rerouteArguments=lf.rerouteArguments;pn.Array=Tme.Array;pn.Boolean=Lme.Boolean;pn.Counter=Ome.Counter;pn.Proxy=Mme.Proxy;pn.Rest=Ume.Rest;pn.String=Kme.String});var Xe=y(MA=>{"use strict";Object.defineProperty(MA,"__esModule",{value:!0});var Hme=iy(),Gme=bc(),Yme=jv(),jme=vG(),qme=kG(),Jme=HG();MA.UsageError=Hme.UsageError;MA.Command=Gme.Command;MA.formatMarkdownish=Yme.formatMarkdownish;MA.Cli=jme.Cli;MA.Builtins=qme;MA.Option=Jme});var YG=y((J$e,GG)=>{"use strict";GG.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var cf=y((W$e,sx)=>{"use strict";var Wme=YG(),jG=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Wme(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};sx.exports=jG;sx.exports.default=jG});var Nd=y((V$e,qG)=>{var zme="2.0.0",Vme=Number.MAX_SAFE_INTEGER||9007199254740991,Xme=16;qG.exports={SEMVER_SPEC_VERSION:zme,MAX_LENGTH:256,MAX_SAFE_INTEGER:Vme,MAX_SAFE_COMPONENT_LENGTH:Xme}});var Td=y((X$e,JG)=>{var _me=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};JG.exports=_me});var Sc=y((KA,WG)=>{var{MAX_SAFE_COMPONENT_LENGTH:ox}=Nd(),Zme=Td();KA=WG.exports={};var $me=KA.re=[],_e=KA.src=[],Ze=KA.t={},eEe=0,St=(r,e,t)=>{let i=eEe++;Zme(i,e),Ze[r]=i,_e[i]=e,$me[i]=new RegExp(e,t?"g":void 0)};St("NUMERICIDENTIFIER","0|[1-9]\\d*");St("NUMERICIDENTIFIERLOOSE","[0-9]+");St("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");St("MAINVERSION",`(${_e[Ze.NUMERICIDENTIFIER]})\\.(${_e[Ze.NUMERICIDENTIFIER]})\\.(${_e[Ze.NUMERICIDENTIFIER]})`);St("MAINVERSIONLOOSE",`(${_e[Ze.NUMERICIDENTIFIERLOOSE]})\\.(${_e[Ze.NUMERICIDENTIFIERLOOSE]})\\.(${_e[Ze.NUMERICIDENTIFIERLOOSE]})`);St("PRERELEASEIDENTIFIER",`(?:${_e[Ze.NUMERICIDENTIFIER]}|${_e[Ze.NONNUMERICIDENTIFIER]})`);St("PRERELEASEIDENTIFIERLOOSE",`(?:${_e[Ze.NUMERICIDENTIFIERLOOSE]}|${_e[Ze.NONNUMERICIDENTIFIER]})`);St("PRERELEASE",`(?:-(${_e[Ze.PRERELEASEIDENTIFIER]}(?:\\.${_e[Ze.PRERELEASEIDENTIFIER]})*))`);St("PRERELEASELOOSE",`(?:-?(${_e[Ze.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${_e[Ze.PRERELEASEIDENTIFIERLOOSE]})*))`);St("BUILDIDENTIFIER","[0-9A-Za-z-]+");St("BUILD",`(?:\\+(${_e[Ze.BUILDIDENTIFIER]}(?:\\.${_e[Ze.BUILDIDENTIFIER]})*))`);St("FULLPLAIN",`v?${_e[Ze.MAINVERSION]}${_e[Ze.PRERELEASE]}?${_e[Ze.BUILD]}?`);St("FULL",`^${_e[Ze.FULLPLAIN]}$`);St("LOOSEPLAIN",`[v=\\s]*${_e[Ze.MAINVERSIONLOOSE]}${_e[Ze.PRERELEASELOOSE]}?${_e[Ze.BUILD]}?`);St("LOOSE",`^${_e[Ze.LOOSEPLAIN]}$`);St("GTLT","((?:<|>)?=?)");St("XRANGEIDENTIFIERLOOSE",`${_e[Ze.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);St("XRANGEIDENTIFIER",`${_e[Ze.NUMERICIDENTIFIER]}|x|X|\\*`);St("XRANGEPLAIN",`[v=\\s]*(${_e[Ze.XRANGEIDENTIFIER]})(?:\\.(${_e[Ze.XRANGEIDENTIFIER]})(?:\\.(${_e[Ze.XRANGEIDENTIFIER]})(?:${_e[Ze.PRERELEASE]})?${_e[Ze.BUILD]}?)?)?`);St("XRANGEPLAINLOOSE",`[v=\\s]*(${_e[Ze.XRANGEIDENTIFIERLOOSE]})(?:\\.(${_e[Ze.XRANGEIDENTIFIERLOOSE]})(?:\\.(${_e[Ze.XRANGEIDENTIFIERLOOSE]})(?:${_e[Ze.PRERELEASELOOSE]})?${_e[Ze.BUILD]}?)?)?`);St("XRANGE",`^${_e[Ze.GTLT]}\\s*${_e[Ze.XRANGEPLAIN]}$`);St("XRANGELOOSE",`^${_e[Ze.GTLT]}\\s*${_e[Ze.XRANGEPLAINLOOSE]}$`);St("COERCE",`(^|[^\\d])(\\d{1,${ox}})(?:\\.(\\d{1,${ox}}))?(?:\\.(\\d{1,${ox}}))?(?:$|[^\\d])`);St("COERCERTL",_e[Ze.COERCE],!0);St("LONETILDE","(?:~>?)");St("TILDETRIM",`(\\s*)${_e[Ze.LONETILDE]}\\s+`,!0);KA.tildeTrimReplace="$1~";St("TILDE",`^${_e[Ze.LONETILDE]}${_e[Ze.XRANGEPLAIN]}$`);St("TILDELOOSE",`^${_e[Ze.LONETILDE]}${_e[Ze.XRANGEPLAINLOOSE]}$`);St("LONECARET","(?:\\^)");St("CARETTRIM",`(\\s*)${_e[Ze.LONECARET]}\\s+`,!0);KA.caretTrimReplace="$1^";St("CARET",`^${_e[Ze.LONECARET]}${_e[Ze.XRANGEPLAIN]}$`);St("CARETLOOSE",`^${_e[Ze.LONECARET]}${_e[Ze.XRANGEPLAINLOOSE]}$`);St("COMPARATORLOOSE",`^${_e[Ze.GTLT]}\\s*(${_e[Ze.LOOSEPLAIN]})$|^$`);St("COMPARATOR",`^${_e[Ze.GTLT]}\\s*(${_e[Ze.FULLPLAIN]})$|^$`);St("COMPARATORTRIM",`(\\s*)${_e[Ze.GTLT]}\\s*(${_e[Ze.LOOSEPLAIN]}|${_e[Ze.XRANGEPLAIN]})`,!0);KA.comparatorTrimReplace="$1$2$3";St("HYPHENRANGE",`^\\s*(${_e[Ze.XRANGEPLAIN]})\\s+-\\s+(${_e[Ze.XRANGEPLAIN]})\\s*$`);St("HYPHENRANGELOOSE",`^\\s*(${_e[Ze.XRANGEPLAINLOOSE]})\\s+-\\s+(${_e[Ze.XRANGEPLAINLOOSE]})\\s*$`);St("STAR","(<|>)?=?\\s*\\*");St("GTE0","^\\s*>=\\s*0.0.0\\s*$");St("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var Ld=y((_$e,zG)=>{var tEe=["includePrerelease","loose","rtl"],rEe=r=>r?typeof r!="object"?{loose:!0}:tEe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};zG.exports=rEe});var hy=y((Z$e,_G)=>{var VG=/^[0-9]+$/,XG=(r,e)=>{let t=VG.test(r),i=VG.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rXG(e,r);_G.exports={compareIdentifiers:XG,rcompareIdentifiers:iEe}});var Oi=y(($$e,tY)=>{var py=Td(),{MAX_LENGTH:ZG,MAX_SAFE_INTEGER:dy}=Nd(),{re:$G,t:eY}=Sc(),nEe=Ld(),{compareIdentifiers:Od}=hy(),Kn=class{constructor(e,t){if(t=nEe(t),e instanceof Kn){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>ZG)throw new TypeError(`version is longer than ${ZG} characters`);py("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?$G[eY.LOOSE]:$G[eY.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>dy||this.major<0)throw new TypeError("Invalid major version");if(this.minor>dy||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>dy||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};tY.exports=Kn});var vc=y((eet,sY)=>{var{MAX_LENGTH:sEe}=Nd(),{re:rY,t:iY}=Sc(),nY=Oi(),oEe=Ld(),aEe=(r,e)=>{if(e=oEe(e),r instanceof nY)return r;if(typeof r!="string"||r.length>sEe||!(e.loose?rY[iY.LOOSE]:rY[iY.FULL]).test(r))return null;try{return new nY(r,e)}catch{return null}};sY.exports=aEe});var aY=y((tet,oY)=>{var AEe=vc(),lEe=(r,e)=>{let t=AEe(r,e);return t?t.version:null};oY.exports=lEe});var lY=y((ret,AY)=>{var cEe=vc(),uEe=(r,e)=>{let t=cEe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};AY.exports=uEe});var uY=y((iet,cY)=>{var gEe=Oi(),fEe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new gEe(r,t).inc(e,i).version}catch{return null}};cY.exports=fEe});var os=y((net,fY)=>{var gY=Oi(),hEe=(r,e,t)=>new gY(r,t).compare(new gY(e,t));fY.exports=hEe});var Cy=y((set,hY)=>{var pEe=os(),dEe=(r,e,t)=>pEe(r,e,t)===0;hY.exports=dEe});var CY=y((oet,dY)=>{var pY=vc(),CEe=Cy(),mEe=(r,e)=>{if(CEe(r,e))return null;{let t=pY(r),i=pY(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};dY.exports=mEe});var EY=y((aet,mY)=>{var EEe=Oi(),IEe=(r,e)=>new EEe(r,e).major;mY.exports=IEe});var yY=y((Aet,IY)=>{var yEe=Oi(),wEe=(r,e)=>new yEe(r,e).minor;IY.exports=wEe});var BY=y((cet,wY)=>{var BEe=Oi(),bEe=(r,e)=>new BEe(r,e).patch;wY.exports=bEe});var QY=y((uet,bY)=>{var QEe=vc(),SEe=(r,e)=>{let t=QEe(r,e);return t&&t.prerelease.length?t.prerelease:null};bY.exports=SEe});var vY=y((get,SY)=>{var vEe=os(),xEe=(r,e,t)=>vEe(e,r,t);SY.exports=xEe});var PY=y((fet,xY)=>{var PEe=os(),DEe=(r,e)=>PEe(r,e,!0);xY.exports=DEe});var my=y((het,kY)=>{var DY=Oi(),kEe=(r,e,t)=>{let i=new DY(r,t),n=new DY(e,t);return i.compare(n)||i.compareBuild(n)};kY.exports=kEe});var FY=y((pet,RY)=>{var REe=my(),FEe=(r,e)=>r.sort((t,i)=>REe(t,i,e));RY.exports=FEe});var TY=y((det,NY)=>{var NEe=my(),TEe=(r,e)=>r.sort((t,i)=>NEe(i,t,e));NY.exports=TEe});var Md=y((Cet,LY)=>{var LEe=os(),OEe=(r,e,t)=>LEe(r,e,t)>0;LY.exports=OEe});var Ey=y((met,OY)=>{var MEe=os(),UEe=(r,e,t)=>MEe(r,e,t)<0;OY.exports=UEe});var ax=y((Eet,MY)=>{var KEe=os(),HEe=(r,e,t)=>KEe(r,e,t)!==0;MY.exports=HEe});var Iy=y((Iet,UY)=>{var GEe=os(),YEe=(r,e,t)=>GEe(r,e,t)>=0;UY.exports=YEe});var yy=y((yet,KY)=>{var jEe=os(),qEe=(r,e,t)=>jEe(r,e,t)<=0;KY.exports=qEe});var Ax=y((wet,HY)=>{var JEe=Cy(),WEe=ax(),zEe=Md(),VEe=Iy(),XEe=Ey(),_Ee=yy(),ZEe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return JEe(r,t,i);case"!=":return WEe(r,t,i);case">":return zEe(r,t,i);case">=":return VEe(r,t,i);case"<":return XEe(r,t,i);case"<=":return _Ee(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};HY.exports=ZEe});var YY=y((Bet,GY)=>{var $Ee=Oi(),eIe=vc(),{re:wy,t:By}=Sc(),tIe=(r,e)=>{if(r instanceof $Ee)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(wy[By.COERCE]);else{let i;for(;(i=wy[By.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),wy[By.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;wy[By.COERCERTL].lastIndex=-1}return t===null?null:eIe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};GY.exports=tIe});var qY=y((bet,jY)=>{"use strict";jY.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Ud=y((Qet,JY)=>{"use strict";JY.exports=Ht;Ht.Node=xc;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var sIe=Ud(),Pc=Symbol("max"),Pa=Symbol("length"),uf=Symbol("lengthCalculator"),Hd=Symbol("allowStale"),Dc=Symbol("maxAge"),xa=Symbol("dispose"),WY=Symbol("noDisposeOnSet"),Ii=Symbol("lruList"),zs=Symbol("cache"),VY=Symbol("updateAgeOnGet"),lx=()=>1,ux=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[Pc]=e.max||1/0,i=e.length||lx;if(this[uf]=typeof i!="function"?lx:i,this[Hd]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[Dc]=e.maxAge||0,this[xa]=e.dispose,this[WY]=e.noDisposeOnSet||!1,this[VY]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[Pc]=e||1/0,Kd(this)}get max(){return this[Pc]}set allowStale(e){this[Hd]=!!e}get allowStale(){return this[Hd]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[Dc]=e,Kd(this)}get maxAge(){return this[Dc]}set lengthCalculator(e){typeof e!="function"&&(e=lx),e!==this[uf]&&(this[uf]=e,this[Pa]=0,this[Ii].forEach(t=>{t.length=this[uf](t.value,t.key),this[Pa]+=t.length})),Kd(this)}get lengthCalculator(){return this[uf]}get length(){return this[Pa]}get itemCount(){return this[Ii].length}rforEach(e,t){t=t||this;for(let i=this[Ii].tail;i!==null;){let n=i.prev;zY(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[Ii].head;i!==null;){let n=i.next;zY(this,e,i,t),i=n}}keys(){return this[Ii].toArray().map(e=>e.key)}values(){return this[Ii].toArray().map(e=>e.value)}reset(){this[xa]&&this[Ii]&&this[Ii].length&&this[Ii].forEach(e=>this[xa](e.key,e.value)),this[zs]=new Map,this[Ii]=new sIe,this[Pa]=0}dump(){return this[Ii].map(e=>by(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Ii]}set(e,t,i){if(i=i||this[Dc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[uf](t,e);if(this[zs].has(e)){if(s>this[Pc])return gf(this,this[zs].get(e)),!1;let l=this[zs].get(e).value;return this[xa]&&(this[WY]||this[xa](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Pa]+=s-l.length,l.length=s,this.get(e),Kd(this),!0}let o=new gx(e,t,s,n,i);return o.length>this[Pc]?(this[xa]&&this[xa](e,t),!1):(this[Pa]+=o.length,this[Ii].unshift(o),this[zs].set(e,this[Ii].head),Kd(this),!0)}has(e){if(!this[zs].has(e))return!1;let t=this[zs].get(e).value;return!by(this,t)}get(e){return cx(this,e,!0)}peek(e){return cx(this,e,!1)}pop(){let e=this[Ii].tail;return e?(gf(this,e),e.value):null}del(e){gf(this,this[zs].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[zs].forEach((e,t)=>cx(this,t,!1))}},cx=(r,e,t)=>{let i=r[zs].get(e);if(i){let n=i.value;if(by(r,n)){if(gf(r,i),!r[Hd])return}else t&&(r[VY]&&(i.value.now=Date.now()),r[Ii].unshiftNode(i));return n.value}},by=(r,e)=>{if(!e||!e.maxAge&&!r[Dc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[Dc]&&t>r[Dc]},Kd=r=>{if(r[Pa]>r[Pc])for(let e=r[Ii].tail;r[Pa]>r[Pc]&&e!==null;){let t=e.prev;gf(r,e),e=t}},gf=(r,e)=>{if(e){let t=e.value;r[xa]&&r[xa](t.key,t.value),r[Pa]-=t.length,r[zs].delete(t.key),r[Ii].removeNode(e)}},gx=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},zY=(r,e,t,i)=>{let n=t.value;by(r,n)&&(gf(r,t),r[Hd]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};XY.exports=ux});var as=y((xet,tj)=>{var kc=class{constructor(e,t){if(t=aIe(t),e instanceof kc)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new kc(e.raw,t);if(e instanceof fx)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!$Y(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&gIe(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=ZY.get(i);if(n)return n;let s=this.options.loose,o=s?Mi[Qi.HYPHENRANGELOOSE]:Mi[Qi.HYPHENRANGE];e=e.replace(o,wIe(this.options.includePrerelease)),jr("hyphen replace",e),e=e.replace(Mi[Qi.COMPARATORTRIM],lIe),jr("comparator trim",e,Mi[Qi.COMPARATORTRIM]),e=e.replace(Mi[Qi.TILDETRIM],cIe),e=e.replace(Mi[Qi.CARETTRIM],uIe),e=e.split(/\s+/).join(" ");let a=s?Mi[Qi.COMPARATORLOOSE]:Mi[Qi.COMPARATOR],l=e.split(" ").map(f=>fIe(f,this.options)).join(" ").split(/\s+/).map(f=>yIe(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new fx(f,this.options)),c=l.length,u=new Map;for(let f of l){if($Y(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return ZY.set(i,g),g}intersects(e,t){if(!(e instanceof kc))throw new TypeError("a Range is required");return this.set.some(i=>ej(i,t)&&e.set.some(n=>ej(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new AIe(e,this.options)}catch{return!1}for(let t=0;tr.value==="<0.0.0-0",gIe=r=>r.value==="",ej=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},fIe=(r,e)=>(jr("comp",r,e),r=dIe(r,e),jr("caret",r),r=hIe(r,e),jr("tildes",r),r=mIe(r,e),jr("xrange",r),r=IIe(r,e),jr("stars",r),r),Xi=r=>!r||r.toLowerCase()==="x"||r==="*",hIe=(r,e)=>r.trim().split(/\s+/).map(t=>pIe(t,e)).join(" "),pIe=(r,e)=>{let t=e.loose?Mi[Qi.TILDELOOSE]:Mi[Qi.TILDE];return r.replace(t,(i,n,s,o,a)=>{jr("tilde",r,i,n,s,o,a);let l;return Xi(n)?l="":Xi(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Xi(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(jr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,jr("tilde return",l),l})},dIe=(r,e)=>r.trim().split(/\s+/).map(t=>CIe(t,e)).join(" "),CIe=(r,e)=>{jr("caret",r,e);let t=e.loose?Mi[Qi.CARETLOOSE]:Mi[Qi.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{jr("caret",r,n,s,o,a,l);let c;return Xi(s)?c="":Xi(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Xi(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(jr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(jr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),jr("caret return",c),c})},mIe=(r,e)=>(jr("replaceXRanges",r,e),r.split(/\s+/).map(t=>EIe(t,e)).join(" ")),EIe=(r,e)=>{r=r.trim();let t=e.loose?Mi[Qi.XRANGELOOSE]:Mi[Qi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{jr("xRange",r,i,n,s,o,a,l);let c=Xi(s),u=c||Xi(o),g=u||Xi(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),jr("xRange return",i),i})},IIe=(r,e)=>(jr("replaceStars",r,e),r.trim().replace(Mi[Qi.STAR],"")),yIe=(r,e)=>(jr("replaceGTE0",r,e),r.trim().replace(Mi[e.includePrerelease?Qi.GTE0PRE:Qi.GTE0],"")),wIe=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(Xi(i)?t="":Xi(n)?t=`>=${i}.0.0${r?"-0":""}`:Xi(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,Xi(c)?l="":Xi(u)?l=`<${+c+1}.0.0-0`:Xi(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),BIe=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Gd=y((Pet,oj)=>{var Yd=Symbol("SemVer ANY"),ff=class{static get ANY(){return Yd}constructor(e,t){if(t=bIe(t),e instanceof ff){if(e.loose===!!t.loose)return e;e=e.value}px("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Yd?this.value="":this.value=this.operator+this.semver.version,px("comp",this)}parse(e){let t=this.options.loose?rj[ij.COMPARATORLOOSE]:rj[ij.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new nj(i[2],this.options.loose):this.semver=Yd}toString(){return this.value}test(e){if(px("Comparator.test",e,this.options.loose),this.semver===Yd||e===Yd)return!0;if(typeof e=="string")try{e=new nj(e,this.options)}catch{return!1}return hx(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof ff))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new sj(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new sj(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=hx(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=hx(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};oj.exports=ff;var bIe=Ld(),{re:rj,t:ij}=Sc(),hx=Ax(),px=Td(),nj=Oi(),sj=as()});var jd=y((Det,aj)=>{var QIe=as(),SIe=(r,e,t)=>{try{e=new QIe(e,t)}catch{return!1}return e.test(r)};aj.exports=SIe});var lj=y((ket,Aj)=>{var vIe=as(),xIe=(r,e)=>new vIe(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));Aj.exports=xIe});var uj=y((Ret,cj)=>{var PIe=Oi(),DIe=as(),kIe=(r,e,t)=>{let i=null,n=null,s=null;try{s=new DIe(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new PIe(i,t))}),i};cj.exports=kIe});var fj=y((Fet,gj)=>{var RIe=Oi(),FIe=as(),NIe=(r,e,t)=>{let i=null,n=null,s=null;try{s=new FIe(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new RIe(i,t))}),i};gj.exports=NIe});var dj=y((Net,pj)=>{var dx=Oi(),TIe=as(),hj=Md(),LIe=(r,e)=>{r=new TIe(r,e);let t=new dx("0.0.0");if(r.test(t)||(t=new dx("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new dx(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||hj(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||hj(t,s))&&(t=s)}return t&&r.test(t)?t:null};pj.exports=LIe});var mj=y((Tet,Cj)=>{var OIe=as(),MIe=(r,e)=>{try{return new OIe(r,e).range||"*"}catch{return null}};Cj.exports=MIe});var Qy=y((Let,wj)=>{var UIe=Oi(),yj=Gd(),{ANY:KIe}=yj,HIe=as(),GIe=jd(),Ej=Md(),Ij=Ey(),YIe=yy(),jIe=Iy(),qIe=(r,e,t,i)=>{r=new UIe(r,i),e=new HIe(e,i);let n,s,o,a,l;switch(t){case">":n=Ej,s=YIe,o=Ij,a=">",l=">=";break;case"<":n=Ij,s=jIe,o=Ej,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(GIe(r,e,i))return!1;for(let c=0;c{h.semver===KIe&&(h=new yj(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};wj.exports=qIe});var bj=y((Oet,Bj)=>{var JIe=Qy(),WIe=(r,e,t)=>JIe(r,e,">",t);Bj.exports=WIe});var Sj=y((Met,Qj)=>{var zIe=Qy(),VIe=(r,e,t)=>zIe(r,e,"<",t);Qj.exports=VIe});var Pj=y((Uet,xj)=>{var vj=as(),XIe=(r,e,t)=>(r=new vj(r,t),e=new vj(e,t),r.intersects(e));xj.exports=XIe});var kj=y((Ket,Dj)=>{var _Ie=jd(),ZIe=os();Dj.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>ZIe(u,g,t));for(let u of o)_Ie(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var Rj=as(),Sy=Gd(),{ANY:Cx}=Sy,qd=jd(),mx=os(),$Ie=(r,e,t={})=>{if(r===e)return!0;r=new Rj(r,t),e=new Rj(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=eye(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},eye=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===Cx){if(e.length===1&&e[0].semver===Cx)return!0;t.includePrerelease?r=[new Sy(">=0.0.0-0")]:r=[new Sy(">=0.0.0")]}if(e.length===1&&e[0].semver===Cx){if(t.includePrerelease)return!0;e=[new Sy(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=Fj(n,h,t):h.operator==="<"||h.operator==="<="?s=Nj(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=mx(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!qd(h,String(n),t)||s&&!qd(h,String(s),t))return null;for(let p of e)if(!qd(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=Fj(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!qd(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=Nj(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!qd(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},Fj=(r,e,t)=>{if(!r)return e;let i=mx(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},Nj=(r,e,t)=>{if(!r)return e;let i=mx(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};Tj.exports=$Ie});var $r=y((Get,Oj)=>{var Ex=Sc();Oj.exports={re:Ex.re,src:Ex.src,tokens:Ex.t,SEMVER_SPEC_VERSION:Nd().SEMVER_SPEC_VERSION,SemVer:Oi(),compareIdentifiers:hy().compareIdentifiers,rcompareIdentifiers:hy().rcompareIdentifiers,parse:vc(),valid:aY(),clean:lY(),inc:uY(),diff:CY(),major:EY(),minor:yY(),patch:BY(),prerelease:QY(),compare:os(),rcompare:vY(),compareLoose:PY(),compareBuild:my(),sort:FY(),rsort:TY(),gt:Md(),lt:Ey(),eq:Cy(),neq:ax(),gte:Iy(),lte:yy(),cmp:Ax(),coerce:YY(),Comparator:Gd(),Range:as(),satisfies:jd(),toComparators:lj(),maxSatisfying:uj(),minSatisfying:fj(),minVersion:dj(),validRange:mj(),outside:Qy(),gtr:bj(),ltr:Sj(),intersects:Pj(),simplifyRange:kj(),subset:Lj()}});var Ix=y(vy=>{"use strict";Object.defineProperty(vy,"__esModule",{value:!0});vy.VERSION=void 0;vy.VERSION="9.1.0"});var Gt=y((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof xy=="object"&&xy.exports?xy.exports=e():r.regexpToAst=e()})(typeof self<"u"?self:Mj,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var C=this.disjunction();this.consumeChar("/");for(var w={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(w,"global");break;case"i":o(w,"ignoreCase");break;case"m":o(w,"multiLine");break;case"u":o(w,"unicode");break;case"y":o(w,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:w,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var C;switch(this.popChar()){case"=":C="Lookahead";break;case"!":C="NegativeLookahead";break}a(C);var w=this.disjunction();return this.consumeChar(")"),{type:C,value:w,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,w=this.idx;switch(this.popChar()){case"*":C={atLeast:0,atMost:1/0};break;case"+":C={atLeast:1,atMost:1/0};break;case"?":C={atLeast:0,atMost:1};break;case"{":var B=this.integerIncludingZero();switch(this.popChar()){case"}":C={atLeast:B,atMost:B};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar("}");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)==="?"?(this.consumeChar("?"),C.greedy=!1):C.greedy=!0,C.type="Quantifier",C.loc=this.loc(w),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,C=!0;break;case"s":p=f;break;case"S":p=f,C=!0;break;case"w":p=g;break;case"W":p=g,C=!0;break}return a(p),{type:"Set",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var C=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),C=!0);this.isClassAtom();){var w=this.classAtom(),B=w.type==="Character";if(B&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),D=v.type==="Character";if(D){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(w){C.push(w)}):C.push(p)}function o(p,C){if(p[C]===!0)throw"duplicate flag "+C;p[C]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var w=p[C];p.hasOwnProperty(C)&&(w.type!==void 0?this.visit(w):Array.isArray(w)&&w.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var ky=y(hf=>{"use strict";Object.defineProperty(hf,"__esModule",{value:!0});hf.clearRegExpParserCache=hf.getRegExpAst=void 0;var tye=Py(),Dy={},rye=new tye.RegExpParser;function iye(r){var e=r.toString();if(Dy.hasOwnProperty(e))return Dy[e];var t=rye.pattern(e);return Dy[e]=t,t}hf.getRegExpAst=iye;function nye(){Dy={}}hf.clearRegExpParserCache=nye});var Yj=y(dn=>{"use strict";var sye=dn&&dn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dn,"__esModule",{value:!0});dn.canMatchCharCode=dn.firstCharOptimizedIndices=dn.getOptimizedStartCodesIndices=dn.failedOptimizationPrefixMsg=void 0;var Kj=Py(),As=Gt(),Hj=ky(),Da=wx(),Gj="Complement Sets are not supported for first char optimization";dn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function oye(r,e){e===void 0&&(e=!1);try{var t=(0,Hj.getRegExpAst)(r),i=Fy(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===Gj)e&&(0,As.PRINT_WARNING)(""+dn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,As.PRINT_ERROR)(dn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+r.toString()+` > -`)+(" Using the regexp-to-ast library version: "+Kj.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}dn.getOptimizedStartCodesIndices=oye;function Fy(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=Da.minOptimizationVal)for(var f=u.from>=Da.minOptimizationVal?u.from:Da.minOptimizationVal,h=u.to,p=(0,Da.charCodeToOptimizedIndex)(f),C=(0,Da.charCodeToOptimizedIndex)(h),w=p;w<=C;w++)e[w]=w}}});break;case"Group":Fy(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&yx(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,As.values)(e)}dn.firstCharOptimizedIndices=Fy;function Ry(r,e,t){var i=(0,Da.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&aye(r,e)}function aye(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,Da.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,Da.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function Uj(r,e){return(0,As.find)(r.value,function(t){if(typeof t=="number")return(0,As.contains)(e,t);var i=t;return(0,As.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function yx(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,As.isArray)(r.value)?(0,As.every)(r.value,yx):yx(r.value):!1}var Aye=function(r){sye(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,As.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?Uj(t,this.targetCharCodes)===void 0&&(this.found=!0):Uj(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(Kj.BaseRegExpVisitor);function lye(r,e){if(e instanceof RegExp){var t=(0,Hj.getRegExpAst)(e),i=new Aye(r);return i.visit(t),i.found}else return(0,As.find)(e,function(n){return(0,As.contains)(r,n.charCodeAt(0))})!==void 0}dn.canMatchCharCode=lye});var wx=y(Je=>{"use strict";var jj=Je&&Je.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Je,"__esModule",{value:!0});Je.charCodeToOptimizedIndex=Je.minOptimizationVal=Je.buildLineBreakIssueMessage=Je.LineTerminatorOptimizedTester=Je.isShortPattern=Je.isCustomPattern=Je.cloneEmptyGroups=Je.performWarningRuntimeChecks=Je.performRuntimeChecks=Je.addStickyFlag=Je.addStartOfInput=Je.findUnreachablePatterns=Je.findModesThatDoNotExist=Je.findInvalidGroupType=Je.findDuplicatePatterns=Je.findUnsupportedFlags=Je.findStartOfInputAnchor=Je.findEmptyMatchRegExps=Je.findEndOfInputAnchor=Je.findInvalidPatterns=Je.findMissingPatterns=Je.validatePatterns=Je.analyzeTokenTypes=Je.enableSticky=Je.disableSticky=Je.SUPPORT_STICKY=Je.MODES=Je.DEFAULT_MODE=void 0;var qj=Py(),ir=Jd(),Se=Gt(),pf=Yj(),Jj=ky(),Do="PATTERN";Je.DEFAULT_MODE="defaultMode";Je.MODES="modes";Je.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function cye(){Je.SUPPORT_STICKY=!1}Je.disableSticky=cye;function uye(){Je.SUPPORT_STICKY=!0}Je.enableSticky=uye;function gye(r,e){e=(0,Se.defaults)(e,{useSticky:Je.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(v,D){return D()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){wye()});var i;t("Reject Lexer.NA",function(){i=(0,Se.reject)(r,function(v){return v[Do]===ir.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,Se.map)(i,function(v){var D=v[Do];if((0,Se.isRegExp)(D)){var T=D.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!D.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,Se.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?Qx(D):bx(D)}else{if((0,Se.isFunction)(D))return n=!0,{exec:D};if((0,Se.has)(D,"exec"))return n=!0,D;if(typeof D=="string"){if(D.length===1)return D;var H=D.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),j=new RegExp(H);return e.useSticky?Qx(j):bx(j)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,Se.map)(i,function(v){return v.tokenTypeIdx}),a=(0,Se.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,Se.isString)(D))return D;if((0,Se.isUndefined)(D))return!1;throw Error("non exhaustive match")}}),l=(0,Se.map)(i,function(v){var D=v.LONGER_ALT;if(D){var T=(0,Se.isArray)(D)?(0,Se.map)(D,function(H){return(0,Se.indexOf)(i,H)}):[(0,Se.indexOf)(i,D)];return T}}),c=(0,Se.map)(i,function(v){return v.PUSH_MODE}),u=(0,Se.map)(i,function(v){return(0,Se.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=oq(e.lineTerminatorCharacters);g=(0,Se.map)(i,function(D){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Se.map)(i,function(D){if((0,Se.has)(D,"LINE_BREAKS"))return D.LINE_BREAKS;if(nq(D,v)===!1)return(0,pf.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t("Misc Mapping #2",function(){f=(0,Se.map)(i,vx),h=(0,Se.map)(s,iq),p=(0,Se.reduce)(i,function(v,D){var T=D.GROUP;return(0,Se.isString)(T)&&T!==ir.Lexer.SKIPPED&&(v[T]=[]),v},{}),C=(0,Se.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var w=!0,B=[];return e.safeMode||t("First Char Optimization",function(){B=(0,Se.reduce)(i,function(v,D,T){if(typeof D.PATTERN=="string"){var H=D.PATTERN.charCodeAt(0),j=Sx(H);Bx(v,j,C[T])}else if((0,Se.isArray)(D.START_CHARS_HINT)){var $;(0,Se.forEach)(D.START_CHARS_HINT,function(W){var Z=typeof W=="string"?W.charCodeAt(0):W,A=Sx(Z);$!==A&&($=A,Bx(v,A,C[T]))})}else if((0,Se.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)w=!1,e.ensureOptimizations&&(0,Se.PRINT_ERROR)(""+pf.failedOptimizationPrefixMsg+(" Unable to analyze < "+D.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,pf.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,Se.isEmpty)(V)&&(w=!1),(0,Se.forEach)(V,function(W){Bx(v,W,C[T])})}else e.ensureOptimizations&&(0,Se.PRINT_ERROR)(""+pf.failedOptimizationPrefixMsg+(" TokenType: <"+D.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),w=!1;return v},[])}),t("ArrayPacking",function(){B=(0,Se.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:w}}Je.analyzeTokenTypes=gye;function fye(r,e){var t=[],i=Wj(r);t=t.concat(i.errors);var n=zj(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(hye(s)),t=t.concat(eq(s)),t=t.concat(tq(s,e)),t=t.concat(rq(s)),t}Je.validatePatterns=fye;function hye(r){var e=[],t=(0,Se.filter)(r,function(i){return(0,Se.isRegExp)(i[Do])});return e=e.concat(Vj(t)),e=e.concat(_j(t)),e=e.concat(Zj(t)),e=e.concat($j(t)),e=e.concat(Xj(t)),e}function Wj(r){var e=(0,Se.filter)(r,function(n){return!(0,Se.has)(n,Do)}),t=(0,Se.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Se.difference)(r,e);return{errors:t,valid:i}}Je.findMissingPatterns=Wj;function zj(r){var e=(0,Se.filter)(r,function(n){var s=n[Do];return!(0,Se.isRegExp)(s)&&!(0,Se.isFunction)(s)&&!(0,Se.has)(s,"exec")&&!(0,Se.isString)(s)}),t=(0,Se.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Se.difference)(r,e);return{errors:t,valid:i}}Je.findInvalidPatterns=zj;var pye=/[^\\][\$]/;function Vj(r){var e=function(n){jj(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(qj.BaseRegExpVisitor),t=(0,Se.filter)(r,function(n){var s=n[Do];try{var o=(0,Jj.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return pye.test(s.source)}}),i=(0,Se.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Je.findEndOfInputAnchor=Vj;function Xj(r){var e=(0,Se.filter)(r,function(i){var n=i[Do];return n.test("")}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Je.findEmptyMatchRegExps=Xj;var dye=/[^\\[][\^]|^\^/;function _j(r){var e=function(n){jj(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(qj.BaseRegExpVisitor),t=(0,Se.filter)(r,function(n){var s=n[Do];try{var o=(0,Jj.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return dye.test(s.source)}}),i=(0,Se.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Je.findStartOfInputAnchor=_j;function Zj(r){var e=(0,Se.filter)(r,function(i){var n=i[Do];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Je.findUnsupportedFlags=Zj;function $j(r){var e=[],t=(0,Se.map)(r,function(s){return(0,Se.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Se.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,Se.compact)(t);var i=(0,Se.filter)(t,function(s){return s.length>1}),n=(0,Se.map)(i,function(s){var o=(0,Se.map)(s,function(l){return l.name}),a=(0,Se.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Je.findDuplicatePatterns=$j;function eq(r){var e=(0,Se.filter)(r,function(i){if(!(0,Se.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,Se.isString)(n)}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Je.findInvalidGroupType=eq;function tq(r,e){var t=(0,Se.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,Se.contains)(e,n.PUSH_MODE)}),i=(0,Se.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Je.findModesThatDoNotExist=tq;function rq(r){var e=[],t=(0,Se.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,Se.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Se.isRegExp)(o)&&mye(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Se.forEach)(r,function(i,n){(0,Se.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Je.findUnreachablePatterns=rq;function Cye(r,e){if((0,Se.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,Se.isFunction)(e))return e(r,0,[],{});if((0,Se.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function mye(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Se.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function bx(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Je.addStartOfInput=bx;function Qx(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Je.addStickyFlag=Qx;function Eye(r,e,t){var i=[];return(0,Se.has)(r,Je.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Je.DEFAULT_MODE+`> property in its definition -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Se.has)(r,Je.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Je.MODES+`> property in its definition -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Se.has)(r,Je.MODES)&&(0,Se.has)(r,Je.DEFAULT_MODE)&&!(0,Se.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Je.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Se.has)(r,Je.MODES)&&(0,Se.forEach)(r.modes,function(n,s){(0,Se.forEach)(n,function(o,a){(0,Se.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Je.performRuntimeChecks=Eye;function Iye(r,e,t){var i=[],n=!1,s=(0,Se.compact)((0,Se.flatten)((0,Se.mapValues)(r.modes,function(l){return l}))),o=(0,Se.reject)(s,function(l){return l[Do]===ir.Lexer.NA}),a=oq(t);return e&&(0,Se.forEach)(o,function(l){var c=nq(l,a);if(c!==!1){var u=sq(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Se.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,pf.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Je.performWarningRuntimeChecks=Iye;function yye(r){var e={},t=(0,Se.keys)(r);return(0,Se.forEach)(t,function(i){var n=r[i];if((0,Se.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Je.cloneEmptyGroups=yye;function vx(r){var e=r.PATTERN;if((0,Se.isRegExp)(e))return!1;if((0,Se.isFunction)(e))return!0;if((0,Se.has)(e,"exec"))return!0;if((0,Se.isString)(e))return!1;throw Error("non exhaustive match")}Je.isCustomPattern=vx;function iq(r){return(0,Se.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Je.isShortPattern=iq;Je.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+r.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Je.buildLineBreakIssueMessage=sq;function oq(r){var e=(0,Se.map)(r,function(t){return(0,Se.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function Bx(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Je.minOptimizationVal=256;var Ny=[];function Sx(r){return r255?255+~~(r/255):r}}});var df=y(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var ei=Gt();function Bye(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=Bye;function bye(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=bye;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function Qye(r){var e=aq(r);Aq(e),cq(e),lq(e),(0,ei.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=Qye;function aq(r){for(var e=(0,ei.cloneArr)(r),t=r,i=!0;i;){t=(0,ei.compact)((0,ei.flatten)((0,ei.map)(t,function(s){return s.CATEGORIES})));var n=(0,ei.difference)(t,e);e=e.concat(n),(0,ei.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=aq;function Aq(r){(0,ei.forEach)(r,function(e){uq(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),xx(e)&&!(0,ei.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),xx(e)||(e.CATEGORIES=[]),gq(e)||(e.categoryMatches=[]),fq(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=Aq;function lq(r){(0,ei.forEach)(r,function(e){e.categoryMatches=[],(0,ei.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=lq;function cq(r){(0,ei.forEach)(r,function(e){Px([],e)})}Nt.assignCategoriesMapProp=cq;function Px(r,e){(0,ei.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,ei.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,ei.contains)(i,t)||Px(i,t)})}Nt.singleAssignCategoriesToksMap=Px;function uq(r){return(0,ei.has)(r,"tokenTypeIdx")}Nt.hasShortKeyProperty=uq;function xx(r){return(0,ei.has)(r,"CATEGORIES")}Nt.hasCategoriesProperty=xx;function gq(r){return(0,ei.has)(r,"categoryMatches")}Nt.hasExtendingTokensTypesProperty=gq;function fq(r){return(0,ei.has)(r,"categoryMatchesMap")}Nt.hasExtendingTokensTypesMapProperty=fq;function Sye(r){return(0,ei.has)(r,"tokenTypeIdx")}Nt.isTokenType=Sye});var Dx=y(Ty=>{"use strict";Object.defineProperty(Ty,"__esModule",{value:!0});Ty.defaultLexerErrorProvider=void 0;Ty.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Jd=y(Rc=>{"use strict";Object.defineProperty(Rc,"__esModule",{value:!0});Rc.Lexer=Rc.LexerDefinitionErrorType=void 0;var Vs=wx(),nr=Gt(),vye=df(),xye=Dx(),Pye=ky(),Dye;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(Dye=Rc.LexerDefinitionErrorType||(Rc.LexerDefinitionErrorType={}));var Wd={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:xye.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Wd);var kye=function(){function r(e,t){var i=this;if(t===void 0&&(t=Wd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(Wd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===Wd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=Vs.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Wd.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[Vs.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[Vs.DEFAULT_MODE]=Vs.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Vs.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,Vs.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Vs.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,vye.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,Vs.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(Vs.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,Pye.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,w,B,v,D,T=e,H=T.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),Z=[],A=this.trackStartLines?1:void 0,ae=this.trackStartLines?1:void 0,ge=(0,Vs.cloneEmptyGroups)(this.emptyGroups),_=this.trackStartLines,L=this.config.lineTerminatorsPattern,N=0,ue=[],we=[],Te=[],Pe=[];Object.freeze(Pe);var Le=void 0;function se(){return ue}function Ae(dr){var Bi=(0,Vs.charCodeToOptimizedIndex)(dr),_n=we[Bi];return _n===void 0?Pe:_n}var be=function(dr){if(Te.length===1&&dr.tokenType.PUSH_MODE===void 0){var Bi=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(dr);Z.push({offset:dr.startOffset,line:dr.startLine!==void 0?dr.startLine:void 0,column:dr.startColumn!==void 0?dr.startColumn:void 0,length:dr.image.length,message:Bi})}else{Te.pop();var _n=(0,nr.last)(Te);ue=i.patternIdxToConfig[_n],we=i.charCodeToPatternIdxToConfig[_n],N=ue.length;var pa=i.canModeBeOptimized[_n]&&i.config.safeMode===!1;we&&pa?Le=Ae:Le=se}};function fe(dr){Te.push(dr),we=this.charCodeToPatternIdxToConfig[dr],ue=this.patternIdxToConfig[dr],N=ue.length,N=ue.length;var Bi=this.canModeBeOptimized[dr]&&this.config.safeMode===!1;we&&Bi?Le=Ae:Le=se}fe.call(this,t);for(var le;jc.length){c=a,u=g,le=tt;break}}}break}}if(c!==null){if(f=c.length,h=le.group,h!==void 0&&(p=le.tokenTypeIdx,C=this.createTokenInstance(c,j,p,le.tokenType,A,ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,ae=this.computeNewColumn(ae,f),_===!0&&le.canLineTerminator===!0){var It=0,Ur=void 0,oi=void 0;L.lastIndex=0;do Ur=L.test(c),Ur===!0&&(oi=L.lastIndex-1,It++);while(Ur===!0);It!==0&&(A=A+It,ae=f-oi,this.updateTokenEndLineColumnLocation(C,h,oi,It,A,ae,f))}this.handleModes(le,be,fe,C)}else{for(var pi=j,pr=A,di=ae,ai=!1;!ai&&j <"+e+">");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();Rc.Lexer=kye});var HA=y(Si=>{"use strict";Object.defineProperty(Si,"__esModule",{value:!0});Si.tokenMatcher=Si.createTokenInstance=Si.EOF=Si.createToken=Si.hasTokenLabel=Si.tokenName=Si.tokenLabel=void 0;var Xs=Gt(),Rye=Jd(),kx=df();function Fye(r){return wq(r)?r.LABEL:r.name}Si.tokenLabel=Fye;function Nye(r){return r.name}Si.tokenName=Nye;function wq(r){return(0,Xs.isString)(r.LABEL)&&r.LABEL!==""}Si.hasTokenLabel=wq;var Tye="parent",hq="categories",pq="label",dq="group",Cq="push_mode",mq="pop_mode",Eq="longer_alt",Iq="line_breaks",yq="start_chars_hint";function Bq(r){return Lye(r)}Si.createToken=Bq;function Lye(r){var e=r.pattern,t={};if(t.name=r.name,(0,Xs.isUndefined)(e)||(t.PATTERN=e),(0,Xs.has)(r,Tye))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Xs.has)(r,hq)&&(t.CATEGORIES=r[hq]),(0,kx.augmentTokenTypes)([t]),(0,Xs.has)(r,pq)&&(t.LABEL=r[pq]),(0,Xs.has)(r,dq)&&(t.GROUP=r[dq]),(0,Xs.has)(r,mq)&&(t.POP_MODE=r[mq]),(0,Xs.has)(r,Cq)&&(t.PUSH_MODE=r[Cq]),(0,Xs.has)(r,Eq)&&(t.LONGER_ALT=r[Eq]),(0,Xs.has)(r,Iq)&&(t.LINE_BREAKS=r[Iq]),(0,Xs.has)(r,yq)&&(t.START_CHARS_HINT=r[yq]),t}Si.EOF=Bq({name:"EOF",pattern:Rye.Lexer.NA});(0,kx.augmentTokenTypes)([Si.EOF]);function Oye(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Si.createTokenInstance=Oye;function Mye(r,e){return(0,kx.tokenStructuredMatcher)(r,e)}Si.tokenMatcher=Mye});var Cn=y(Wt=>{"use strict";var ka=Wt&&Wt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Wt,"__esModule",{value:!0});Wt.serializeProduction=Wt.serializeGrammar=Wt.Terminal=Wt.Alternation=Wt.RepetitionWithSeparator=Wt.Repetition=Wt.RepetitionMandatoryWithSeparator=Wt.RepetitionMandatory=Wt.Option=Wt.Alternative=Wt.Rule=Wt.NonTerminal=Wt.AbstractProduction=void 0;var lr=Gt(),Uye=HA(),ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,lr.forEach)(this.definition,function(t){t.accept(e)})},r}();Wt.AbstractProduction=ko;var bq=function(r){ka(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(ko);Wt.NonTerminal=bq;var Qq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Rule=Qq;var Sq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Alternative=Sq;var vq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Option=vq;var xq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.RepetitionMandatory=xq;var Pq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.RepetitionMandatoryWithSeparator=Pq;var Dq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.Repetition=Dq;var kq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return e}(ko);Wt.RepetitionWithSeparator=kq;var Rq=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,lr.assign)(i,(0,lr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(ko);Wt.Alternation=Rq;var Ly=function(){function r(e){this.idx=1,(0,lr.assign)(this,(0,lr.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Wt.Terminal=Ly;function Kye(r){return(0,lr.map)(r,zd)}Wt.serializeGrammar=Kye;function zd(r){function e(s){return(0,lr.map)(s,zd)}if(r instanceof bq){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,lr.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof Sq)return{type:"Alternative",definition:e(r.definition)};if(r instanceof vq)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof xq)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Pq)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:zd(new Ly({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof kq)return{type:"RepetitionWithSeparator",idx:r.idx,separator:zd(new Ly({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Dq)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Rq)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof Ly){var i={type:"Terminal",name:r.terminalType.name,label:(0,Uye.tokenLabel)(r.terminalType),idx:r.idx};(0,lr.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,lr.isRegExp)(n)?n.source:n),i}else{if(r instanceof Qq)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Wt.serializeProduction=zd});var My=y(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});Oy.RestWalker=void 0;var Rx=Gt(),mn=Cn(),Hye=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,Rx.forEach)(e.definition,function(n,s){var o=(0,Rx.drop)(e.definition,s+1);if(n instanceof mn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof mn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof mn.Alternative)i.walkFlat(n,o,t);else if(n instanceof mn.Option)i.walkOption(n,o,t);else if(n instanceof mn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof mn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof mn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof mn.Repetition)i.walkMany(n,o,t);else if(n instanceof mn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new mn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=Fq(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new mn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=Fq(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,Rx.forEach)(e.definition,function(o){var a=new mn.Alternative({definition:[o]});n.walk(a,s)})},r}();Oy.RestWalker=Hye;function Fq(r,e,t){var i=[new mn.Option({definition:[new mn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Cf=y(Uy=>{"use strict";Object.defineProperty(Uy,"__esModule",{value:!0});Uy.GAstVisitor=void 0;var Ro=Cn(),Gye=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Ro.NonTerminal:return this.visitNonTerminal(t);case Ro.Alternative:return this.visitAlternative(t);case Ro.Option:return this.visitOption(t);case Ro.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Ro.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Ro.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Ro.Repetition:return this.visitRepetition(t);case Ro.Alternation:return this.visitAlternation(t);case Ro.Terminal:return this.visitTerminal(t);case Ro.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();Uy.GAstVisitor=Gye});var Xd=y(Ui=>{"use strict";var Yye=Ui&&Ui.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ui,"__esModule",{value:!0});Ui.collectMethods=Ui.DslMethodsCollectorVisitor=Ui.getProductionDslName=Ui.isBranchingProd=Ui.isOptionalProd=Ui.isSequenceProd=void 0;var Vd=Gt(),Qr=Cn(),jye=Cf();function qye(r){return r instanceof Qr.Alternative||r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionMandatory||r instanceof Qr.RepetitionMandatoryWithSeparator||r instanceof Qr.RepetitionWithSeparator||r instanceof Qr.Terminal||r instanceof Qr.Rule}Ui.isSequenceProd=qye;function Fx(r,e){e===void 0&&(e=[]);var t=r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionWithSeparator;return t?!0:r instanceof Qr.Alternation?(0,Vd.some)(r.definition,function(i){return Fx(i,e)}):r instanceof Qr.NonTerminal&&(0,Vd.contains)(e,r)?!1:r instanceof Qr.AbstractProduction?(r instanceof Qr.NonTerminal&&e.push(r),(0,Vd.every)(r.definition,function(i){return Fx(i,e)})):!1}Ui.isOptionalProd=Fx;function Jye(r){return r instanceof Qr.Alternation}Ui.isBranchingProd=Jye;function Wye(r){if(r instanceof Qr.NonTerminal)return"SUBRULE";if(r instanceof Qr.Option)return"OPTION";if(r instanceof Qr.Alternation)return"OR";if(r instanceof Qr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof Qr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof Qr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof Qr.Repetition)return"MANY";if(r instanceof Qr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Ui.getProductionDslName=Wye;var Nq=function(r){Yye(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Vd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Vd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(jye.GAstVisitor);Ui.DslMethodsCollectorVisitor=Nq;var Ky=new Nq;function zye(r){Ky.reset(),r.accept(Ky);var e=Ky.dslMethods;return Ky.reset(),e}Ui.collectMethods=zye});var Tx=y(Fo=>{"use strict";Object.defineProperty(Fo,"__esModule",{value:!0});Fo.firstForTerminal=Fo.firstForBranching=Fo.firstForSequence=Fo.first=void 0;var Hy=Gt(),Tq=Cn(),Nx=Xd();function Gy(r){if(r instanceof Tq.NonTerminal)return Gy(r.referencedRule);if(r instanceof Tq.Terminal)return Mq(r);if((0,Nx.isSequenceProd)(r))return Lq(r);if((0,Nx.isBranchingProd)(r))return Oq(r);throw Error("non exhaustive match")}Fo.first=Gy;function Lq(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,Nx.isOptionalProd)(s),e=e.concat(Gy(s)),i=i+1,n=t.length>i;return(0,Hy.uniq)(e)}Fo.firstForSequence=Lq;function Oq(r){var e=(0,Hy.map)(r.definition,function(t){return Gy(t)});return(0,Hy.uniq)((0,Hy.flatten)(e))}Fo.firstForBranching=Oq;function Mq(r){return[r.terminalType]}Fo.firstForTerminal=Mq});var Lx=y(Yy=>{"use strict";Object.defineProperty(Yy,"__esModule",{value:!0});Yy.IN=void 0;Yy.IN="_~IN~_"});var Yq=y(ls=>{"use strict";var Vye=ls&&ls.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(ls,"__esModule",{value:!0});ls.buildInProdFollowPrefix=ls.buildBetweenProdsFollowPrefix=ls.computeAllProdsFollows=ls.ResyncFollowsWalker=void 0;var Xye=My(),_ye=Tx(),Uq=Gt(),Kq=Lx(),Zye=Cn(),Hq=function(r){Vye(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=Gq(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new Zye.Alternative({definition:o}),l=(0,_ye.first)(a);this.follows[s]=l},e}(Xye.RestWalker);ls.ResyncFollowsWalker=Hq;function $ye(r){var e={};return(0,Uq.forEach)(r,function(t){var i=new Hq(t).startWalking();(0,Uq.assign)(e,i)}),e}ls.computeAllProdsFollows=$ye;function Gq(r,e){return r.name+e+Kq.IN}ls.buildBetweenProdsFollowPrefix=Gq;function ewe(r){var e=r.terminalType.name;return e+r.idx+Kq.IN}ls.buildInProdFollowPrefix=ewe});var _d=y(Ra=>{"use strict";Object.defineProperty(Ra,"__esModule",{value:!0});Ra.defaultGrammarValidatorErrorProvider=Ra.defaultGrammarResolverErrorProvider=Ra.defaultParserErrorProvider=void 0;var mf=HA(),twe=Gt(),_s=Gt(),Ox=Cn(),jq=Xd();Ra.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,mf.hasTokenLabel)(e),o=s?"--> "+(0,mf.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,_s.first)(t).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,_s.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,_s.map)(c,function(h){return"["+(0,_s.map)(h,function(p){return(0,mf.tokenLabel)(p)}).join(", ")+"]"}),g=(0,_s.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,_s.first)(t).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,_s.map)(e,function(u){return"["+(0,_s.map)(u,function(g){return(0,mf.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ra.defaultParserErrorProvider);Ra.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+r.name+"<-";return t}};Ra.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Ox.Terminal?u.terminalType.name:u instanceof Ox.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,_s.first)(e),s=n.idx,o=(0,jq.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,_s.map)(r.prefixPath,function(n){return(0,mf.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,_s.map)(r.prefixPath,function(n){return(0,mf.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,jq.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+r.topLevelRule.name+`> Rule. - has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=twe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Ox.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Wq=y(GA=>{"use strict";var rwe=GA&&GA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(GA,"__esModule",{value:!0});GA.GastRefResolverVisitor=GA.resolveGrammar=void 0;var iwe=Hn(),qq=Gt(),nwe=Cf();function swe(r,e){var t=new Jq(r,e);return t.resolveRefs(),t.errors}GA.resolveGrammar=swe;var Jq=function(r){rwe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,qq.forEach)((0,qq.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:iwe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(nwe.GAstVisitor);GA.GastRefResolverVisitor=Jq});var $d=y(Lr=>{"use strict";var Fc=Lr&&Lr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Lr,"__esModule",{value:!0});Lr.nextPossibleTokensAfter=Lr.possiblePathsFrom=Lr.NextTerminalAfterAtLeastOneSepWalker=Lr.NextTerminalAfterAtLeastOneWalker=Lr.NextTerminalAfterManySepWalker=Lr.NextTerminalAfterManyWalker=Lr.AbstractNextTerminalAfterProductionWalker=Lr.NextAfterTokenWalker=Lr.AbstractNextPossibleTokensWalker=void 0;var zq=My(),Ut=Gt(),owe=Tx(),Dt=Cn(),Vq=function(r){Fc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Ut.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Ut.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Ut.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(zq.RestWalker);Lr.AbstractNextPossibleTokensWalker=Vq;var awe=function(r){Fc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Dt.Alternative({definition:s});this.possibleTokTypes=(0,owe.first)(o),this.found=!0}},e}(Vq);Lr.NextAfterTokenWalker=awe;var Zd=function(r){Fc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(zq.RestWalker);Lr.AbstractNextTerminalAfterProductionWalker=Zd;var Awe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterManyWalker=Awe;var lwe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterManySepWalker=lwe;var cwe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterAtLeastOneWalker=cwe;var uwe=function(r){Fc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Zd);Lr.NextTerminalAfterAtLeastOneSepWalker=uwe;function Xq(r,e,t){t===void 0&&(t=[]),t=(0,Ut.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Ut.drop)(r,n+1))}function o(c){var u=Xq(s(c),e,t);return i.concat(u)}for(;t.length=0;ge--){var _=B.definition[ge],L={idx:p,def:_.definition.concat((0,Ut.drop)(h)),ruleStack:C,occurrenceStack:w};g.push(L),g.push(o)}else if(B instanceof Dt.Alternative)g.push({idx:p,def:B.definition.concat((0,Ut.drop)(h)),ruleStack:C,occurrenceStack:w});else if(B instanceof Dt.Rule)g.push(fwe(B,p,C,w));else throw Error("non exhaustive match")}}return u}Lr.nextPossibleTokensAfter=gwe;function fwe(r,e,t,i){var n=(0,Ut.cloneArr)(t);n.push(r.name);var s=(0,Ut.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var eC=y(_t=>{"use strict";var $q=_t&&_t.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(_t,"__esModule",{value:!0});_t.areTokenCategoriesNotUsed=_t.isStrictPrefixOfPath=_t.containsPath=_t.getLookaheadPathsForOptionalProd=_t.getLookaheadPathsForOr=_t.lookAheadSequenceFromAlternatives=_t.buildSingleAlternativeLookaheadFunction=_t.buildAlternativesLookAheadFunc=_t.buildLookaheadFuncForOptionalProd=_t.buildLookaheadFuncForOr=_t.getProdType=_t.PROD_TYPE=void 0;var sr=Gt(),_q=$d(),hwe=My(),jy=df(),YA=Cn(),pwe=Cf(),li;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(li=_t.PROD_TYPE||(_t.PROD_TYPE={}));function dwe(r){if(r instanceof YA.Option)return li.OPTION;if(r instanceof YA.Repetition)return li.REPETITION;if(r instanceof YA.RepetitionMandatory)return li.REPETITION_MANDATORY;if(r instanceof YA.RepetitionMandatoryWithSeparator)return li.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof YA.RepetitionWithSeparator)return li.REPETITION_WITH_SEPARATOR;if(r instanceof YA.Alternation)return li.ALTERNATION;throw Error("non exhaustive match")}_t.getProdType=dwe;function Cwe(r,e,t,i,n,s){var o=tJ(r,e,t),a=Kx(o)?jy.tokenStructuredMatcherNoCategories:jy.tokenStructuredMatcher;return s(o,i,a,n)}_t.buildLookaheadFuncForOr=Cwe;function mwe(r,e,t,i,n,s){var o=rJ(r,e,n,t),a=Kx(o)?jy.tokenStructuredMatcherNoCategories:jy.tokenStructuredMatcher;return s(o[0],a,i)}_t.buildLookaheadFuncForOptionalProd=mwe;function Ewe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u{"use strict";var Hx=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,"__esModule",{value:!0});zt.checkPrefixAlternativesAmbiguities=zt.validateSomeNonEmptyLookaheadPath=zt.validateTooManyAlts=zt.RepetionCollector=zt.validateAmbiguousAlternationAlternatives=zt.validateEmptyOrAlternative=zt.getFirstNoneTerminal=zt.validateNoLeftRecursion=zt.validateRuleIsOverridden=zt.validateRuleDoesNotAlreadyExist=zt.OccurrenceValidationCollector=zt.identifyProductionForDuplicates=zt.validateGrammar=void 0;var er=Gt(),Sr=Gt(),No=Hn(),Gx=Xd(),Ef=eC(),bwe=$d(),Zs=Cn(),Yx=Cf();function Qwe(r,e,t,i,n){var s=er.map(r,function(h){return Swe(h,i)}),o=er.map(r,function(h){return jx(h,h,i)}),a=[],l=[],c=[];(0,Sr.every)(o,Sr.isEmpty)&&(a=(0,Sr.map)(r,function(h){return AJ(h,i)}),l=(0,Sr.map)(r,function(h){return lJ(h,e,i)}),c=gJ(r,e,i));var u=Pwe(r,t,i),g=(0,Sr.map)(r,function(h){return uJ(h,i)}),f=(0,Sr.map)(r,function(h){return aJ(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}zt.validateGrammar=Qwe;function Swe(r,e){var t=new oJ;r.accept(t);var i=t.allProductions,n=er.groupBy(i,nJ),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,Gx.getProductionDslName)(l),g={message:c,type:No.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=sJ(l);return f&&(g.parameter=f),g});return o}function nJ(r){return(0,Gx.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+sJ(r)}zt.identifyProductionForDuplicates=nJ;function sJ(r){return r instanceof Zs.Terminal?r.terminalType.name:r instanceof Zs.NonTerminal?r.nonTerminalName:""}var oJ=function(r){Hx(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(Yx.GAstVisitor);zt.OccurrenceValidationCollector=oJ;function aJ(r,e,t,i){var n=[],s=(0,Sr.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:No.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}zt.validateRuleDoesNotAlreadyExist=aJ;function vwe(r,e,t){var i=[],n;return er.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:No.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}zt.validateRuleIsOverridden=vwe;function jx(r,e,t,i){i===void 0&&(i=[]);var n=[],s=tC(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:No.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),jx(r,u,t,g)});return n.concat(er.flatten(c))}zt.validateNoLeftRecursion=jx;function tC(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof Zs.NonTerminal)e.push(t.referencedRule);else if(t instanceof Zs.Alternative||t instanceof Zs.Option||t instanceof Zs.RepetitionMandatory||t instanceof Zs.RepetitionMandatoryWithSeparator||t instanceof Zs.RepetitionWithSeparator||t instanceof Zs.Repetition)e=e.concat(tC(t.definition));else if(t instanceof Zs.Alternation)e=er.flatten(er.map(t.definition,function(o){return tC(o.definition)}));else if(!(t instanceof Zs.Terminal))throw Error("non exhaustive match");var i=(0,Gx.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(tC(s))}else return e}zt.getFirstNoneTerminal=tC;var qx=function(r){Hx(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(Yx.GAstVisitor);function AJ(r,e){var t=new qx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,bwe.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:No.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}zt.validateEmptyOrAlternative=AJ;function lJ(r,e,t){var i=new qx;r.accept(i);var n=i.alternations;n=(0,Sr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,Ef.getLookaheadPathsForOr)(l,r,c,a),g=xwe(u,a,r,t),f=fJ(u,a,r,t);return o.concat(g,f)},[]);return s}zt.validateAmbiguousAlternationAlternatives=lJ;var cJ=function(r){Hx(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(Yx.GAstVisitor);zt.RepetionCollector=cJ;function uJ(r,e){var t=new qx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:No.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}zt.validateTooManyAlts=uJ;function gJ(r,e,t){var i=[];return(0,Sr.forEach)(r,function(n){var s=new cJ;n.accept(s);var o=s.allProductions;(0,Sr.forEach)(o,function(a){var l=(0,Ef.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,Ef.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,Sr.isEmpty)((0,Sr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:No.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}zt.validateSomeNonEmptyLookaheadPath=gJ;function xwe(r,e,t,i){var n=[],s=(0,Sr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Sr.forEach)(l,function(u){var g=[c];(0,Sr.forEach)(r,function(f,h){c!==h&&(0,Ef.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,Ef.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,Sr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:No.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function fJ(r,e,t,i){var n=[],s=(0,Sr.reduce)(r,function(o,a,l){var c=(0,Sr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Sr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Sr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(If,"__esModule",{value:!0});If.validateGrammar=If.resolveGrammar=void 0;var Wx=Gt(),Dwe=Wq(),kwe=Jx(),hJ=_d();function Rwe(r){r=(0,Wx.defaults)(r,{errMsgProvider:hJ.defaultGrammarResolverErrorProvider});var e={};return(0,Wx.forEach)(r.rules,function(t){e[t.name]=t}),(0,Dwe.resolveGrammar)(e,r.errMsgProvider)}If.resolveGrammar=Rwe;function Fwe(r){return r=(0,Wx.defaults)(r,{errMsgProvider:hJ.defaultGrammarValidatorErrorProvider}),(0,kwe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}If.validateGrammar=Fwe});var yf=y(En=>{"use strict";var rC=En&&En.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(En,"__esModule",{value:!0});En.EarlyExitException=En.NotAllInputParsedException=En.NoViableAltException=En.MismatchedTokenException=En.isRecognitionException=void 0;var Nwe=Gt(),dJ="MismatchedTokenException",CJ="NoViableAltException",mJ="EarlyExitException",EJ="NotAllInputParsedException",IJ=[dJ,CJ,mJ,EJ];Object.freeze(IJ);function Twe(r){return(0,Nwe.contains)(IJ,r.name)}En.isRecognitionException=Twe;var qy=function(r){rC(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),Lwe=function(r){rC(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=dJ,s}return e}(qy);En.MismatchedTokenException=Lwe;var Owe=function(r){rC(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=CJ,s}return e}(qy);En.NoViableAltException=Owe;var Mwe=function(r){rC(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=EJ,n}return e}(qy);En.NotAllInputParsedException=Mwe;var Uwe=function(r){rC(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=mJ,s}return e}(qy);En.EarlyExitException=Uwe});var Vx=y(Ki=>{"use strict";Object.defineProperty(Ki,"__esModule",{value:!0});Ki.attemptInRepetitionRecovery=Ki.Recoverable=Ki.InRuleRecoveryException=Ki.IN_RULE_RECOVERY_EXCEPTION=Ki.EOF_FOLLOW_KEY=void 0;var Jy=HA(),cs=Gt(),Kwe=yf(),Hwe=Lx(),Gwe=Hn();Ki.EOF_FOLLOW_KEY={};Ki.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function zx(r){this.name=Ki.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Ki.InRuleRecoveryException=zx;zx.prototype=Error.prototype;var Ywe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,cs.has)(e,"recoveryEnabled")?e.recoveryEnabled:Gwe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=yJ)},r.prototype.getTokenToInsert=function(e){var t=(0,Jy.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new Kwe.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,cs.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new zx("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,cs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,cs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,cs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,cs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Ki.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,cs.map)(t,function(n,s){return s===0?Ki.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,cs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,cs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Ki.EOF_FOLLOW_KEY)return[Jy.EOF];var t=e.ruleName+e.idxInCallingRule+Hwe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,Jy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,cs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,cs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,cs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Ki.Recoverable=Ywe;function yJ(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=Jy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Ki.attemptInRepetitionRecovery=yJ});var Wy=y(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.getKeyForAutomaticLookahead=qt.AT_LEAST_ONE_SEP_IDX=qt.MANY_SEP_IDX=qt.AT_LEAST_ONE_IDX=qt.MANY_IDX=qt.OPTION_IDX=qt.OR_IDX=qt.BITS_FOR_ALT_IDX=qt.BITS_FOR_RULE_IDX=qt.BITS_FOR_OCCURRENCE_IDX=qt.BITS_FOR_METHOD_TYPE=void 0;qt.BITS_FOR_METHOD_TYPE=4;qt.BITS_FOR_OCCURRENCE_IDX=8;qt.BITS_FOR_RULE_IDX=12;qt.BITS_FOR_ALT_IDX=8;qt.OR_IDX=1<{"use strict";Object.defineProperty(zy,"__esModule",{value:!0});zy.LooksAhead=void 0;var Fa=eC(),$s=Gt(),wJ=Hn(),Na=Wy(),Nc=Xd(),qwe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,$s.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:wJ.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,$s.has)(e,"maxLookahead")?e.maxLookahead:wJ.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,$s.isES2015MapSupported)()?new Map:[],(0,$s.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,$s.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Nc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,$s.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,Nc.getProductionDslName)(g)+f,function(){var h=(0,Fa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Na.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Na.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,$s.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Na.MANY_IDX,Fa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Na.OPTION_IDX,Fa.PROD_TYPE.OPTION,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Na.AT_LEAST_ONE_IDX,Fa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Na.AT_LEAST_ONE_SEP_IDX,Fa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Nc.getProductionDslName)(g))}),(0,$s.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Na.MANY_SEP_IDX,Fa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Nc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,Fa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Na.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,Fa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,Fa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Na.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();zy.LooksAhead=qwe});var bJ=y(To=>{"use strict";Object.defineProperty(To,"__esModule",{value:!0});To.addNoneTerminalToCst=To.addTerminalToCst=To.setNodeLocationFull=To.setNodeLocationOnlyOffset=void 0;function Jwe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(jA,"__esModule",{value:!0});jA.defineNameProp=jA.functionName=jA.classNameFromInstance=void 0;var Xwe=Gt();function _we(r){return SJ(r.constructor)}jA.classNameFromInstance=_we;var QJ="name";function SJ(r){var e=r.name;return e||"anonymous"}jA.functionName=SJ;function Zwe(r,e){var t=Object.getOwnPropertyDescriptor(r,QJ);return(0,Xwe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,QJ,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}jA.defineNameProp=Zwe});var kJ=y(vi=>{"use strict";Object.defineProperty(vi,"__esModule",{value:!0});vi.validateRedundantMethods=vi.validateMissingCstMethods=vi.validateVisitor=vi.CstVisitorDefinitionError=vi.createBaseVisitorConstructorWithDefaults=vi.createBaseSemanticVisitorConstructor=vi.defaultVisit=void 0;var us=Gt(),iC=Xx();function vJ(r,e){for(var t=(0,us.keys)(r),i=t.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}vi.createBaseSemanticVisitorConstructor=$we;function eBe(r,e,t){var i=function(){};(0,iC.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,us.forEach)(e,function(s){n[s]=vJ}),i.prototype=n,i.prototype.constructor=i,i}vi.createBaseVisitorConstructorWithDefaults=eBe;var _x;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(_x=vi.CstVisitorDefinitionError||(vi.CstVisitorDefinitionError={}));function xJ(r,e){var t=PJ(r,e),i=DJ(r,e);return t.concat(i)}vi.validateVisitor=xJ;function PJ(r,e){var t=(0,us.map)(e,function(i){if(!(0,us.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,iC.functionName)(r.constructor)+" CST Visitor.",type:_x.MISSING_METHOD,methodName:i}});return(0,us.compact)(t)}vi.validateMissingCstMethods=PJ;var tBe=["constructor","visit","validateVisitor"];function DJ(r,e){var t=[];for(var i in r)(0,us.isFunction)(r[i])&&!(0,us.contains)(tBe,i)&&!(0,us.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,iC.functionName)(r.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:_x.REDUNDANT_METHOD,methodName:i});return t}vi.validateRedundantMethods=DJ});var FJ=y(Vy=>{"use strict";Object.defineProperty(Vy,"__esModule",{value:!0});Vy.TreeBuilder=void 0;var wf=bJ(),ti=Gt(),RJ=kJ(),rBe=Hn(),iBe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,ti.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:rBe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ti.NOOP,this.cstFinallyStateUpdate=ti.NOOP,this.cstPostTerminal=ti.NOOP,this.cstPostNonTerminal=ti.NOOP,this.cstPostRule=ti.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=wf.setNodeLocationFull,this.setNodeLocationFromNode=wf.setNodeLocationFull,this.cstPostRule=ti.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ti.NOOP,this.setNodeLocationFromNode=ti.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=wf.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=wf.setNodeLocationOnlyOffset,this.cstPostRule=ti.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ti.NOOP,this.setNodeLocationFromNode=ti.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ti.NOOP,this.setNodeLocationFromNode=ti.NOOP,this.cstPostRule=ti.NOOP,this.setInitialNodeLocation=ti.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,wf.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,wf.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,ti.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,RJ.createBaseSemanticVisitorConstructor)(this.className,(0,ti.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,ti.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,RJ.createBaseVisitorConstructorWithDefaults)(this.className,(0,ti.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();Vy.TreeBuilder=iBe});var TJ=y(Xy=>{"use strict";Object.defineProperty(Xy,"__esModule",{value:!0});Xy.LexerAdapter=void 0;var NJ=Hn(),nBe=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):NJ.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?NJ.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();Xy.LexerAdapter=nBe});var OJ=y(_y=>{"use strict";Object.defineProperty(_y,"__esModule",{value:!0});_y.RecognizerApi=void 0;var LJ=Gt(),sBe=yf(),Zx=Hn(),oBe=_d(),aBe=Jx(),ABe=Cn(),lBe=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Zx.DEFAULT_RULE_CONFIG),(0,LJ.contains)(this.definedRulesNames,e)){var n=oBe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Zx.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Zx.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,aBe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,sBe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,ABe.serializeGrammar)((0,LJ.values)(this.gastProductionsCache))},r}();_y.RecognizerApi=lBe});var HJ=y($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});$y.RecognizerEngine=void 0;var kr=Gt(),Gn=Wy(),Zy=yf(),MJ=eC(),Bf=$d(),UJ=Hn(),cBe=Vx(),KJ=HA(),nC=df(),uBe=Xx(),gBe=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,uBe.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=nC.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,kr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,kr.isArray)(e)){if((0,kr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,kr.isArray)(e))this.tokensMap=(0,kr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,kr.has)(e,"modes")&&(0,kr.every)((0,kr.flatten)((0,kr.values)(e.modes)),nC.isTokenType)){var i=(0,kr.flatten)((0,kr.values)(e.modes)),n=(0,kr.uniq)(i);this.tokensMap=(0,kr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,kr.isObject)(e))this.tokensMap=(0,kr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=KJ.EOF;var s=(0,kr.every)((0,kr.values)(e),function(o){return(0,kr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?nC.tokenStructuredMatcherNoCategories:nC.tokenStructuredMatcher,(0,nC.augmentTokenTypes)((0,kr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,kr.has)(i,"resyncEnabled")?i.resyncEnabled:UJ.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,kr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:UJ.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(Gn.OR_IDX,t),n=(0,kr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new Zy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,Zy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Zy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===cBe.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,kr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),KJ.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();$y.RecognizerEngine=gBe});var YJ=y(ew=>{"use strict";Object.defineProperty(ew,"__esModule",{value:!0});ew.ErrorHandler=void 0;var $x=yf(),eP=Gt(),GJ=eC(),fBe=Hn(),hBe=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,eP.has)(e,"errorMessageProvider")?e.errorMessageProvider:fBe.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,$x.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,eP.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,eP.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,GJ.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new $x.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,GJ.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new $x.NoViableAltException(c,this.LA(1),l))},r}();ew.ErrorHandler=hBe});var JJ=y(tw=>{"use strict";Object.defineProperty(tw,"__esModule",{value:!0});tw.ContentAssist=void 0;var jJ=$d(),qJ=Gt(),pBe=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,qJ.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,jJ.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,qJ.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new jJ.NextAfterTokenWalker(n,e).startWalking();return s},r}();tw.ContentAssist=pBe});var e3=y(nw=>{"use strict";Object.defineProperty(nw,"__esModule",{value:!0});nw.GastRecorder=void 0;var In=Gt(),Lo=Cn(),dBe=Jd(),XJ=df(),_J=HA(),CBe=Hn(),mBe=Wy(),iw={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(iw);var WJ=!0,zJ=Math.pow(2,mBe.BITS_FOR_OCCURRENCE_IDX)-1,ZJ=(0,_J.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:dBe.Lexer.NA});(0,XJ.augmentTokenTypes)([ZJ]);var $J=(0,_J.createTokenInstance)(ZJ,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze($J);var EBe={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},IBe=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return CBe.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Lo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return sC.call(this,Lo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){sC.call(this,Lo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){sC.call(this,Lo.RepetitionMandatoryWithSeparator,t,e,WJ)},r.prototype.manyInternalRecord=function(e,t){sC.call(this,Lo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){sC.call(this,Lo.RepetitionWithSeparator,t,e,WJ)},r.prototype.orInternalRecord=function(e,t){return yBe.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(rw(t),!e||(0,In.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,In.peek)(this.recordingProdStack),o=e.ruleName,a=new Lo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?EBe:iw},r.prototype.consumeInternalRecord=function(e,t,i){if(rw(t),!(0,XJ.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,In.peek)(this.recordingProdStack),o=new Lo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),$J},r}();nw.GastRecorder=IBe;function sC(r,e,t,i){i===void 0&&(i=!1),rw(t);var n=(0,In.peek)(this.recordingProdStack),s=(0,In.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,In.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),iw}function yBe(r,e){var t=this;rw(e);var i=(0,In.peek)(this.recordingProdStack),n=(0,In.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Lo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,In.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,In.some)(s,function(l){return(0,In.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,In.forEach)(s,function(l){var c=new Lo.Alternative({definition:[]});o.definition.push(c),(0,In.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,In.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),iw}function VJ(r){return r===0?"":""+r}function rw(r){if(r<0||r>zJ){var e=new Error("Invalid DSL Method idx value: <"+r+`> - `+("Idx value must be a none negative value smaller than "+(zJ+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var r3=y(sw=>{"use strict";Object.defineProperty(sw,"__esModule",{value:!0});sw.PerformanceTracer=void 0;var t3=Gt(),wBe=Hn(),BBe=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,t3.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=wBe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,t3.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();sw.PerformanceTracer=BBe});var i3=y(ow=>{"use strict";Object.defineProperty(ow,"__esModule",{value:!0});ow.applyMixins=void 0;function bBe(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}ow.applyMixins=bBe});var Hn=y(Cr=>{"use strict";var o3=Cr&&Cr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Cr,"__esModule",{value:!0});Cr.EmbeddedActionsParser=Cr.CstParser=Cr.Parser=Cr.EMPTY_ALT=Cr.ParserDefinitionErrorType=Cr.DEFAULT_RULE_CONFIG=Cr.DEFAULT_PARSER_CONFIG=Cr.END_OF_FILE=void 0;var _i=Gt(),QBe=Yq(),n3=HA(),a3=_d(),s3=pJ(),SBe=Vx(),vBe=BJ(),xBe=FJ(),PBe=TJ(),DBe=OJ(),kBe=HJ(),RBe=YJ(),FBe=JJ(),NBe=e3(),TBe=r3(),LBe=i3();Cr.END_OF_FILE=(0,n3.createTokenInstance)(n3.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Cr.END_OF_FILE);Cr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:a3.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});Cr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var OBe;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(OBe=Cr.ParserDefinitionErrorType||(Cr.ParserDefinitionErrorType={}));function MBe(r){return r===void 0&&(r=void 0),function(){return r}}Cr.EMPTY_ALT=MBe;var aw=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,_i.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,_i.has)(t,"skipValidations")?t.skipValidations:Cr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,_i.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,_i.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,s3.resolveGrammar)({rules:(0,_i.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,_i.isEmpty)(n)&&e.skipValidations===!1){var s=(0,s3.validateGrammar)({rules:(0,_i.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,_i.values)(e.tokensMap),errMsgProvider:a3.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,_i.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,QBe.computeAllProdsFollows)((0,_i.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,_i.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,_i.isEmpty)(e.definitionErrors))throw t=(0,_i.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+t.join(` -------------------------------- -`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();Cr.Parser=aw;(0,LBe.applyMixins)(aw,[SBe.Recoverable,vBe.LooksAhead,xBe.TreeBuilder,PBe.LexerAdapter,kBe.RecognizerEngine,DBe.RecognizerApi,RBe.ErrorHandler,FBe.ContentAssist,NBe.GastRecorder,TBe.PerformanceTracer]);var UBe=function(r){o3(e,r);function e(t,i){i===void 0&&(i=Cr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,_i.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(aw);Cr.CstParser=UBe;var KBe=function(r){o3(e,r);function e(t,i){i===void 0&&(i=Cr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,_i.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(aw);Cr.EmbeddedActionsParser=KBe});var l3=y(Aw=>{"use strict";Object.defineProperty(Aw,"__esModule",{value:!0});Aw.createSyntaxDiagramsCode=void 0;var A3=Ix();function HBe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+A3.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+A3.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` -